thibaud frere commited on
Commit
fee9c1e
·
1 Parent(s): 7f3278b
.gitattributes CHANGED
@@ -1,3 +1,4 @@
1
  app/assets/images/*.png filter=lfs diff=lfs merge=lfs -text
2
  app/src/assets/images/*.png filter=lfs diff=lfs merge=lfs -text
3
  *.png filter=lfs diff=lfs merge=lfs -text
 
 
1
  app/assets/images/*.png filter=lfs diff=lfs merge=lfs -text
2
  app/src/assets/images/*.png filter=lfs diff=lfs merge=lfs -text
3
  *.png filter=lfs diff=lfs merge=lfs -text
4
+ *.wav filter=lfs diff=lfs merge=lfs -text
app/.astro/astro/content.d.ts ADDED
File without changes
app/.astro/settings.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "_variables": {
3
+ "lastUpdateCheck": 1756115195405
4
+ }
5
+ }
app/.astro/types.d.ts CHANGED
@@ -1 +1,2 @@
1
  /// <reference types="astro/client" />
 
 
1
  /// <reference types="astro/client" />
2
+ /// <reference path="astro/content.d.ts" />
app/astro.config.mjs CHANGED
@@ -1,8 +1,33 @@
1
  import { defineConfig } from 'astro/config';
 
 
 
 
 
 
 
 
2
 
3
  export default defineConfig({
4
  output: 'static',
5
- integrations: []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  });
7
 
8
 
 
1
  import { defineConfig } from 'astro/config';
2
+ import mdx from '@astrojs/mdx';
3
+ import remarkMath from 'remark-math';
4
+ import rehypeKatex from 'rehype-katex';
5
+ import remarkToc from 'remark-toc';
6
+ import remarkFootnotes from 'remark-footnotes';
7
+ import rehypeSlug from 'rehype-slug';
8
+ import rehypeAutolinkHeadings from 'rehype-autolink-headings';
9
+ import rehypeCitation from 'rehype-citation';
10
 
11
  export default defineConfig({
12
  output: 'static',
13
+ integrations: [mdx()]
14
+ ,
15
+ markdown: {
16
+ remarkPlugins: [
17
+ [remarkToc, { heading: 'Table of Contents', maxDepth: 3 }],
18
+ remarkMath,
19
+ [remarkFootnotes, { inlineNotes: true }]
20
+ ],
21
+ rehypePlugins: [
22
+ rehypeSlug,
23
+ [rehypeAutolinkHeadings, { behavior: 'wrap' }],
24
+ rehypeKatex,
25
+ [rehypeCitation, {
26
+ bibliography: 'src/content/bibliography.bib',
27
+ linkCitations: true
28
+ }]
29
+ ]
30
+ }
31
  });
32
 
33
 
app/package-lock.json CHANGED
Binary files a/app/package-lock.json and b/app/package-lock.json differ
 
app/package.json CHANGED
Binary files a/app/package.json and b/app/package.json differ
 
app/src/assets/audio/audio-example.wav ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:552f71aef82738f9b5c9f1d6be495e0f83cec0eabf485066628badb3283cb4b8
3
+ size 48830444
app/src/assets/images/moon.svg ADDED
app/src/assets/images/{banner.png → placeholder.png} RENAMED
File without changes
app/src/assets/images/sun.svg ADDED
app/src/assets/images/visual-vocabulary-poster.png ADDED

Git LFS Details

  • SHA256: 62f72a7eeabc611d4b312c882589bae9369d49e39dd40e2d17e68c77399efc11
  • Pointer size: 131 Bytes
  • Size of remote file: 915 kB
app/src/components/Aside.astro ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ ---
3
+ <div class="margin-aside">
4
+ <div class="margin-aside__main">
5
+ <slot />
6
+ </div>
7
+ <aside class="margin-aside__aside">
8
+ <slot name="aside" />
9
+ </aside>
10
+ </div>
11
+
12
+ <style>
13
+ .margin-aside { display: grid; grid-template-columns: minmax(0, 1fr) 240px; gap: 16px; align-items: start; margin: 12px 0; }
14
+ .margin-aside__aside { background: var(--surface-bg); border: 1px solid var(--border-color); border-radius: 8px; padding: 10px; font-size: 0.9rem; color: var(--text-color); }
15
+ @media (max-width: 1100px) { .margin-aside { grid-template-columns: 1fr; } }
16
+ </style>
17
+
18
+
app/src/components/Footer.astro ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ interface Props {
3
+ citationText: string;
4
+ bibtex: string;
5
+ }
6
+ const { citationText, bibtex } = Astro.props as Props;
7
+ ---
8
+ <footer class="distill-footer">
9
+ <div class="footer-inner">
10
+ <section class="citation-block">
11
+ <h3>Citation</h3>
12
+ <p>For attribution in academic contexts, please cite this work as</p>
13
+ <textarea readonly class="citation-text">{citationText}</textarea>
14
+
15
+ <h4>BibTeX citation</h4>
16
+ <textarea readonly class="citation-bibtex">{bibtex}</textarea>
17
+ </section>
18
+ <section class="references-block">
19
+ <slot />
20
+ </section>
21
+ </div>
22
+ </footer>
23
+
24
+ <style>
25
+ .distill-footer { margin-top: 40px; border-top: 1px solid var(--border-color); }
26
+ .footer-inner { max-width: 680px; margin: 0 auto; padding: 24px 16px; }
27
+ .citation-block h3 { margin: 0 0 8px; }
28
+ .citation-block h4 { margin: 16px 0 8px; font-size: 14px; text-transform: uppercase; color: var(--muted-color); }
29
+ .citation-text, .citation-bibtex { width: 100%; min-height: 44px; border: 1px solid var(--border-color); border-radius: 6px; background: var(--surface-bg); padding: 8px; resize: none; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 13px; color: var(--text-color); }
30
+ </style>
31
+
32
+
app/src/components/Header.astro ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ interface Props {
3
+ title: string;
4
+ description?: string;
5
+ }
6
+ const { title, description } = Astro.props as Props;
7
+ ---
8
+ <section class="hero">
9
+ <h1 class="hero-title">{title}</h1>
10
+ <div class="hero-banner">
11
+ <slot name="banner" />
12
+ {description && <p class="hero-desc">{description}</p>}
13
+ </div>
14
+ </section>
15
+
16
+
app/src/components/HtmlFragment.astro CHANGED
@@ -3,7 +3,7 @@ interface Props { src: string }
3
  const { src } = Astro.props as Props;
4
 
5
  // Charge tous les fragments .html sous src/fragments/** en tant que string (dev & build)
6
- const fragments = import.meta.glob('../fragments/**/*.html', { as: 'raw', eager: true }) as Record<string, string>;
7
 
8
  function resolveFragment(requested: string): string | null {
9
  // Autorise "banner.html" ou "fragments/banner.html"
@@ -17,11 +17,43 @@ function resolveFragment(requested: string): string | null {
17
  }
18
 
19
  const html = resolveFragment(src);
 
20
  ---
21
  { html ? (
22
- <div set:html={html} />
23
  ) : (
24
  <div><!-- Fragment introuvable: {src} --></div>
25
  ) }
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
 
3
  const { src } = Astro.props as Props;
4
 
5
  // Charge tous les fragments .html sous src/fragments/** en tant que string (dev & build)
6
+ const fragments = import.meta.glob('../fragments/**/*.html', { query: '?raw', import: 'default', eager: true }) as Record<string, string>;
7
 
8
  function resolveFragment(requested: string): string | null {
9
  // Autorise "banner.html" ou "fragments/banner.html"
 
17
  }
18
 
19
  const html = resolveFragment(src);
20
+ const mountId = `frag-${Math.random().toString(36).slice(2)}`;
21
  ---
22
  { html ? (
23
+ <div id={mountId} set:html={html} />
24
  ) : (
25
  <div><!-- Fragment introuvable: {src} --></div>
26
  ) }
27
 
28
+ <script>
29
+ // Ré-exécuter les <script> présents dans le fragment injecté (innerHTML n'exécute pas les scripts)
30
+ const scriptEl = document.currentScript;
31
+ const mount = scriptEl ? scriptEl.previousElementSibling : null;
32
+ const execute = () => {
33
+ if (!mount) return;
34
+ const scripts = mount.querySelectorAll('script');
35
+ scripts.forEach(old => {
36
+ // ignorer les types non exécutables (ex: application/json)
37
+ if (old.type && old.type !== 'text/javascript' && old.type !== 'module' && old.type !== '') return;
38
+ if (old.dataset.executed === 'true') return;
39
+ old.dataset.executed = 'true';
40
+ if (old.src) {
41
+ const s = document.createElement('script');
42
+ Array.from(old.attributes).forEach(({ name, value }) => s.setAttribute(name, value));
43
+ document.body.appendChild(s);
44
+ } else {
45
+ try {
46
+ // exécuter inline
47
+ (0, eval)(old.text || '');
48
+ } catch (e) {
49
+ console.error('HtmlFragment inline script error:', e);
50
+ }
51
+ }
52
+ });
53
+ };
54
+ // Si Plotly n'est pas encore chargé, attendre l'événement load
55
+ if (window.Plotly) execute();
56
+ else window.addEventListener('load', execute, { once: true });
57
+ </script>
58
+
59
 
app/src/components/Meta.astro ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ interface Props {
3
+ title: string;
4
+ authors?: string[];
5
+ affiliation?: string;
6
+ published?: string;
7
+ }
8
+ const { title, authors = [], affiliation, published } = Astro.props as Props;
9
+ ---
10
+ <header class="meta">
11
+ <div class="meta-container">
12
+ {authors.length > 0 && (
13
+ <div class="meta-container-cell">
14
+ <h3>Authors</h3>
15
+ <p>{authors.join(', ')}</p>
16
+ </div>
17
+ )}
18
+ {affiliation && (
19
+ <div class="meta-container-cell">
20
+ <h3>Affiliation</h3>
21
+ <p>{affiliation}</p>
22
+ </div>
23
+ )}
24
+ {published && (
25
+ <div class="meta-container-cell">
26
+ <h3>Published</h3>
27
+ <p>{published}</p>
28
+ </div>
29
+ )}
30
+ </div>
31
+ </header>
32
+
app/src/components/SeoHead.astro ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ interface Props {
3
+ title: string;
4
+ description?: string;
5
+ authors?: string[];
6
+ published?: string;
7
+ tags?: string[];
8
+ image?: string; // URL absolue préférée
9
+ }
10
+
11
+ const { title, description = '', authors = [], published, tags = [], image } = Astro.props as Props;
12
+
13
+ const url = Astro.url?.toString?.() ?? '';
14
+ const site = (Astro.site ? String(Astro.site) : '') as string;
15
+
16
+ const ogImage = image && image.length > 0
17
+ ? (image.startsWith('http') ? image : (site ? new URL(image, site).toString() : image))
18
+ : undefined;
19
+
20
+ const jsonLd = {
21
+ '@context': 'https://schema.org',
22
+ '@type': 'Article',
23
+ headline: title,
24
+ description: description || undefined,
25
+ datePublished: published || undefined,
26
+ author: authors.map((name) => ({ '@type': 'Person', name })),
27
+ keywords: tags.length ? tags.join(', ') : undefined,
28
+ mainEntityOfPage: url || undefined,
29
+ image: ogImage ? [ogImage] : undefined,
30
+ };
31
+ ---
32
+ <meta name="description" content={description} />
33
+ <link rel="canonical" href={url} />
34
+
35
+ <meta property="og:type" content="article" />
36
+ <meta property="og:title" content={title} />
37
+ {description && <meta property="og:description" content={description} />}
38
+ <meta property="og:url" content={url} />
39
+ {ogImage && <meta property="og:image" content={ogImage} />}
40
+ {published && <meta property="article:published_time" content={published} />}
41
+ {authors.map(a => <meta property="article:author" content={a} />)}
42
+
43
+ <meta name="twitter:card" content={ogImage ? 'summary_large_image' : 'summary'} />
44
+ <meta name="twitter:title" content={title} />
45
+ {description && <meta name="twitter:description" content={description} />}
46
+ {ogImage && <meta name="twitter:image" content={ogImage} />}
47
+
48
+ <script type="application/ld+json" set:html={JSON.stringify(jsonLd)} />
49
+
50
+
app/src/components/ThemeToggle.astro ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ import sunIconUrl from "../assets/images/sun.svg?url";
3
+ import moonIconUrl from "../assets/images/moon.svg?url";
4
+ ---
5
+ <button id="theme-toggle" aria-label="Toggle color theme">
6
+ <img class="icon light" src={sunIconUrl} alt="light" width="20" height="20" />
7
+ <img class="icon dark" src={moonIconUrl} alt="dark" width="20" height="20" />
8
+ <script>
9
+ const btn = document.getElementById('theme-toggle');
10
+ const media = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');
11
+ const prefersDark = media && media.matches;
12
+ const saved = localStorage.getItem('theme'); // 'light' | 'dark' | null
13
+
14
+ const apply = (mode) => {
15
+ document.documentElement.dataset.theme = mode;
16
+ };
17
+
18
+ // Initial mode: localStorage overrides system preference
19
+ apply(saved || (prefersDark ? 'dark' : 'light'));
20
+
21
+ // If user hasn't chosen manually, follow system changes
22
+ if (!saved && media) {
23
+ const syncWithSystem = (e) => apply(e.matches ? 'dark' : 'light');
24
+ if (media.addEventListener) media.addEventListener('change', syncWithSystem);
25
+ else if (media.addListener) media.addListener(syncWithSystem);
26
+ }
27
+
28
+ btn.addEventListener('click', () => {
29
+ const next = (document.documentElement.dataset.theme === 'dark') ? 'light' : 'dark';
30
+ localStorage.setItem('theme', next);
31
+ apply(next);
32
+ });
33
+ </script>
34
+ </button>
35
+
36
+
app/src/content/bibliography.bib ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @inproceedings{vaswani2017attention,
2
+ title={Attention Is All You Need},
3
+ author={Vaswani, Ashish and Shazeer, Noam and Parmar, Niki and Uszkoreit, Jakob and Jones, Llion and Gomez, Aidan N and Kaiser, {
4
+ }Lukasz and Polosukhin, Illia},
5
+ booktitle={Advances in Neural Information Processing Systems},
6
+ year={2017}
7
+ }
8
+
9
+ @article{example2023,
10
+ title={Example Paper Title},
11
+ author={Example, A. and Another, A.},
12
+ journal={Journal of Examples},
13
+ volume={1},
14
+ number={1},
15
+ pages={1--10},
16
+ year={2023},
17
+ publisher={Example Publisher}
18
+ }
19
+
20
+
app/src/fragments/banner.html CHANGED
The diff for this file is too large to render. See raw diff
 
app/src/fragments/bar.html ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div> <div id="fd0d6e2f-9418-45a8-acf0-f9bc9952180e" class="plotly-graph-div" style="height:100%; width:100%;"></div> <script type="text/javascript"> window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("fd0d6e2f-9418-45a8-acf0-f9bc9952180e")) { Plotly.newPlot( "fd0d6e2f-9418-45a8-acf0-f9bc9952180e", [{"hovertemplate":"\u003cb\u003e%{x}\u003c\u002fb\u003e\u003cbr\u003e%{fullData.name}: %{y:.3f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"#64748b"},"name":"Baseline","offsetgroup":"grp","x":["A","B","C","D","E"],"y":[0.52,0.61,0.67,0.73,0.78],"type":"bar"},{"hovertemplate":"\u003cb\u003e%{x}\u003c\u002fb\u003e\u003cbr\u003e%{fullData.name}: %{y:.3f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"#2563eb"},"name":"Improved","offsetgroup":"grp","x":["A","B","C","D","E"],"y":[0.58,0.66,0.72,0.79,0.86],"type":"bar"},{"hovertemplate":"\u003cb\u003e%{x}\u003c\u002fb\u003e\u003cbr\u003e%{fullData.name}: %{y:.3f}\u003cextra\u003e\u003c\u002fextra\u003e","marker":{"color":"#4b5563","line":{"color":"#4b5563","width":1},"opacity":0.65},"name":"Target","offsetgroup":"grp","x":["A","B","C","D","E"],"y":[0.6,0.68,0.75,0.82,0.9],"type":"bar"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}}},"margin":{"l":28,"r":12,"t":8,"b":28},"legend":{"orientation":"h","yanchor":"bottom","y":1.02,"xanchor":"left","x":0},"xaxis":{"tickfont":{"size":12,"color":"rgba(0,0,0,0.65)"},"showgrid":false,"zeroline":false,"showline":true,"linecolor":"rgba(0,0,0,0.25)","linewidth":1,"ticks":"outside","ticklen":6,"tickcolor":"rgba(0,0,0,0.25)","title":{},"automargin":true,"fixedrange":true},"yaxis":{"tickfont":{"size":12,"color":"rgba(0,0,0,0.65)"},"showgrid":false,"zeroline":false,"showline":true,"linecolor":"rgba(0,0,0,0.25)","linewidth":1,"ticks":"outside","ticklen":6,"tickcolor":"rgba(0,0,0,0.25)","title":{},"tickformat":".2f","automargin":true,"fixedrange":true},"barmode":"group","autosize":true,"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified"}, {"displayModeBar": false, "responsive": true, "scrollZoom": false, "doubleClick": false, "modeBarButtonsToRemove": ["zoom2d", "pan2d", "select2d", "lasso2d", "zoomIn2d", "zoomOut2d", "autoScale2d", "resetScale2d", "toggleSpikelines"]} ).then(function(){
2
+
3
+ (function(){
4
+ var plots = document.querySelectorAll('.js-plotly-plot');
5
+ plots.forEach(function(gd){
6
+ function round(){
7
+ try {
8
+ var root = gd && gd.parentNode ? gd.parentNode : document;
9
+ var rects = root.querySelectorAll('.hoverlayer .hovertext rect');
10
+ rects.forEach(function(r){ r.setAttribute('rx', 8); r.setAttribute('ry', 8); });
11
+ } catch(e) {}
12
+ }
13
+ if (gd && gd.on){
14
+ gd.on('plotly_hover', round);
15
+ gd.on('plotly_unhover', round);
16
+ gd.on('plotly_relayout', round);
17
+ }
18
+ setTimeout(round, 0);
19
+ });
20
+ })();
21
+
22
+ }) }; </script> </div>
app/src/fragments/heatmap.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <div> <div id="47076730-9b36-4ef3-9cd9-80fa6f5baf65" class="plotly-graph-div" style="height:100%; width:100%;"></div> <script type="text/javascript"> window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("47076730-9b36-4ef3-9cd9-80fa6f5baf65")) { Plotly.newPlot( "47076730-9b36-4ef3-9cd9-80fa6f5baf65", [{"colorscale":[[0.0,"#e5e7eb"],[0.4,"#64748b"],[0.75,"#2563eb"],[1.0,"#4b5563"]],"customdata":[["2024-09-02","2024-09-09","2024-09-16","2024-09-23","2024-09-30","2024-10-07","2024-10-14","2024-10-21","2024-10-28","2024-11-04","2024-11-11","2024-11-18","2024-11-25","2024-12-02","2024-12-09","2024-12-16","2024-12-23","2024-12-30","2025-01-06","2025-01-13","2025-01-20","2025-01-27","2025-02-03","2025-02-10","2025-02-17","2025-02-24","2025-03-03","2025-03-10","2025-03-17","2025-03-24","2025-03-31","2025-04-07","2025-04-14","2025-04-21","2025-04-28","2025-05-05","2025-05-12","2025-05-19","2025-05-26","2025-06-02","2025-06-09","2025-06-16","2025-06-23","2025-06-30","2025-07-07","2025-07-14","2025-07-21","2025-07-28","2025-08-04","2025-08-11","2025-08-18","2025-08-25"],["2024-09-03","2024-09-10","2024-09-17","2024-09-24","2024-10-01","2024-10-08","2024-10-15","2024-10-22","2024-10-29","2024-11-05","2024-11-12","2024-11-19","2024-11-26","2024-12-03","2024-12-10","2024-12-17","2024-12-24","2024-12-31","2025-01-07","2025-01-14","2025-01-21","2025-01-28","2025-02-04","2025-02-11","2025-02-18","2025-02-25","2025-03-04","2025-03-11","2025-03-18","2025-03-25","2025-04-01","2025-04-08","2025-04-15","2025-04-22","2025-04-29","2025-05-06","2025-05-13","2025-05-20","2025-05-27","2025-06-03","2025-06-10","2025-06-17","2025-06-24","2025-07-01","2025-07-08","2025-07-15","2025-07-22","2025-07-29","2025-08-05","2025-08-12","2025-08-19","2025-08-26"],["2024-09-04","2024-09-11","2024-09-18","2024-09-25","2024-10-02","2024-10-09","2024-10-16","2024-10-23","2024-10-30","2024-11-06","2024-11-13","2024-11-20","2024-11-27","2024-12-04","2024-12-11","2024-12-18","2024-12-25","2025-01-01","2025-01-08","2025-01-15","2025-01-22","2025-01-29","2025-02-05","2025-02-12","2025-02-19","2025-02-26","2025-03-05","2025-03-12","2025-03-19","2025-03-26","2025-04-02","2025-04-09","2025-04-16","2025-04-23","2025-04-30","2025-05-07","2025-05-14","2025-05-21","2025-05-28","2025-06-04","2025-06-11","2025-06-18","2025-06-25","2025-07-02","2025-07-09","2025-07-16","2025-07-23","2025-07-30","2025-08-06","2025-08-13","2025-08-20","2025-08-27"],["2024-09-05","2024-09-12","2024-09-19","2024-09-26","2024-10-03","2024-10-10","2024-10-17","2024-10-24","2024-10-31","2024-11-07","2024-11-14","2024-11-21","2024-11-28","2024-12-05","2024-12-12","2024-12-19","2024-12-26","2025-01-02","2025-01-09","2025-01-16","2025-01-23","2025-01-30","2025-02-06","2025-02-13","2025-02-20","2025-02-27","2025-03-06","2025-03-13","2025-03-20","2025-03-27","2025-04-03","2025-04-10","2025-04-17","2025-04-24","2025-05-01","2025-05-08","2025-05-15","2025-05-22","2025-05-29","2025-06-05","2025-06-12","2025-06-19","2025-06-26","2025-07-03","2025-07-10","2025-07-17","2025-07-24","2025-07-31","2025-08-07","2025-08-14","2025-08-21","2025-08-28"],["2024-09-06","2024-09-13","2024-09-20","2024-09-27","2024-10-04","2024-10-11","2024-10-18","2024-10-25","2024-11-01","2024-11-08","2024-11-15","2024-11-22","2024-11-29","2024-12-06","2024-12-13","2024-12-20","2024-12-27","2025-01-03","2025-01-10","2025-01-17","2025-01-24","2025-01-31","2025-02-07","2025-02-14","2025-02-21","2025-02-28","2025-03-07","2025-03-14","2025-03-21","2025-03-28","2025-04-04","2025-04-11","2025-04-18","2025-04-25","2025-05-02","2025-05-09","2025-05-16","2025-05-23","2025-05-30","2025-06-06","2025-06-13","2025-06-20","2025-06-27","2025-07-04","2025-07-11","2025-07-18","2025-07-25","2025-08-01","2025-08-08","2025-08-15","2025-08-22","2025-08-29"],["2024-09-07","2024-09-14","2024-09-21","2024-09-28","2024-10-05","2024-10-12","2024-10-19","2024-10-26","2024-11-02","2024-11-09","2024-11-16","2024-11-23","2024-11-30","2024-12-07","2024-12-14","2024-12-21","2024-12-28","2025-01-04","2025-01-11","2025-01-18","2025-01-25","2025-02-01","2025-02-08","2025-02-15","2025-02-22","2025-03-01","2025-03-08","2025-03-15","2025-03-22","2025-03-29","2025-04-05","2025-04-12","2025-04-19","2025-04-26","2025-05-03","2025-05-10","2025-05-17","2025-05-24","2025-05-31","2025-06-07","2025-06-14","2025-06-21","2025-06-28","2025-07-05","2025-07-12","2025-07-19","2025-07-26","2025-08-02","2025-08-09","2025-08-16","2025-08-23","2025-08-30"],["2024-09-08","2024-09-15","2024-09-22","2024-09-29","2024-10-06","2024-10-13","2024-10-20","2024-10-27","2024-11-03","2024-11-10","2024-11-17","2024-11-24","2024-12-01","2024-12-08","2024-12-15","2024-12-22","2024-12-29","2025-01-05","2025-01-12","2025-01-19","2025-01-26","2025-02-02","2025-02-09","2025-02-16","2025-02-23","2025-03-02","2025-03-09","2025-03-16","2025-03-23","2025-03-30","2025-04-06","2025-04-13","2025-04-20","2025-04-27","2025-05-04","2025-05-11","2025-05-18","2025-05-25","2025-06-01","2025-06-08","2025-06-15","2025-06-22","2025-06-29","2025-07-06","2025-07-13","2025-07-20","2025-07-27","2025-08-03","2025-08-10","2025-08-17","2025-08-24","2025-08-31"]],"hovertemplate":"Date: %{customdata}\u003cbr\u003eValue: %{z:.2f}\u003cextra\u003e\u003c\u002fextra\u003e","showscale":false,"x":["2024-09-02","2024-09-09","2024-09-16","2024-09-23","2024-09-30","2024-10-07","2024-10-14","2024-10-21","2024-10-28","2024-11-04","2024-11-11","2024-11-18","2024-11-25","2024-12-02","2024-12-09","2024-12-16","2024-12-23","2024-12-30","2025-01-06","2025-01-13","2025-01-20","2025-01-27","2025-02-03","2025-02-10","2025-02-17","2025-02-24","2025-03-03","2025-03-10","2025-03-17","2025-03-24","2025-03-31","2025-04-07","2025-04-14","2025-04-21","2025-04-28","2025-05-05","2025-05-12","2025-05-19","2025-05-26","2025-06-02","2025-06-09","2025-06-16","2025-06-23","2025-06-30","2025-07-07","2025-07-14","2025-07-21","2025-07-28","2025-08-04","2025-08-11","2025-08-18","2025-08-25"],"xgap":2,"y":["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],"ygap":2,"z":[[0.13459901272105057,0.07144037267686924,0.0,0.02567169542484793,0.1943701957602955,0.0,0.10315424053432098,0.2223869321144732,0.0101747131633462,0.04624564471870697,0.1866248629409762,0.1619588952957143,0.10179656128853301,0.28127388190834635,0.24363532332682114,0.38314067714644795,0.3904396470156554,0.5871417623089922,0.4494512420063476,0.7075867892330924,0.5854536843986621,0.6749419514555224,0.7305655930672372,0.897409823215684,0.8918983512872566,0.9209354080279966,0.9308865657264072,0.8059584841797863,1.0,0.898048571887148,1.0,1.0,0.8590184058919965,1.0,1.0,0.7732387178889825,0.8912170907522784,0.8184163384586197,0.822475204602678,0.7642543483018442,0.5431644942315057,0.6355115517973967,0.7015969114652315,0.5460237405196436,0.4879670174082411,0.4675485058035454,0.42809456698479686,0.2911841791176736,0.1481675433317543,0.13923730763227324,0.1766461423778808,0.1699281866099175],[0.0,0.0,0.0017899698622748927,0.0,0.09677158638116767,0.12479477625677105,0.10895777790688227,0.15189044557185855,0.09654580653607348,0.1795492865957899,0.3052268504010917,0.32596436590345157,0.18411123726736778,0.35977527304759266,0.35252652681600993,0.5427417269194631,0.5651562981702217,0.47750647994960754,0.4561350741573436,0.7417137309609516,0.5102953771880667,0.8241126373750014,0.7797236509747064,0.9332037061153636,0.9824394294545304,0.8289995839250157,1.0,0.7913308880046568,0.8189055068633593,1.0,0.8223965509972967,0.8348974442606938,0.9564174304426082,0.8985185636493014,1.0,0.8604991326856607,0.9758735705615857,0.6558932159815902,0.7000147719646015,0.5799408830216487,0.7035151530934022,0.7478886919490498,0.6337798522620632,0.4941685362991634,0.4092062677590119,0.4232057215920778,0.2300237268973226,0.3526820715419722,0.3679596483947415,0.10802723932902636,0.25227992652493664,0.13091171870017465],[0.18654843761315884,0.02424509841700278,0.0,0.03388313524346659,0.0,0.12125378247595983,0.0,0.0,0.13088917701073183,0.16910681233669253,0.10310100475666693,0.20052186435225497,0.3816697335862501,0.22282049255664288,0.28520333869041986,0.40340313228078245,0.3690761124240207,0.6115883706700836,0.47033965930665544,0.6007036424693509,0.7598327462235945,0.5773116058876002,0.6237534811100747,0.8691407726978946,0.7375919944566651,0.941330162011735,0.8014934674635664,0.8458330455003304,0.9611035861419381,0.8463915521310343,1.0,1.0,1.0,1.0,1.0,0.7932695891537325,0.9596482462801176,0.915947343178816,0.6136511921161285,0.5624943289814737,0.5541252690852431,0.5344741327070746,0.5169619710495121,0.46374855539511284,0.47539824510653705,0.24291414204185113,0.2543250806739876,0.31026724130890454,0.16093385741803784,0.17923375751178566,0.28907858857606483,0.09118081773759709],[0.04274285618353736,0.16773213722549252,0.0,0.027348236792497493,0.19678388324323698,0.0,0.0,0.0,0.0,0.0067895255930027765,0.2289109950080088,0.12593408541693593,0.11541624142573209,0.17043612043585676,0.4096860328972915,0.5574474536390003,0.484527060997471,0.3920676804861751,0.5784662869674918,0.6995971109532144,0.6467757589136034,0.8109481639584317,0.7425226445007554,0.7478239359283666,0.9666926185706564,0.9587154359758231,0.7863943022510236,0.7986686327668135,1.0,1.0,1.0,1.0,0.8091532345633923,0.9558433252238909,0.8031303542172052,0.8725859202971921,0.7566835148011993,0.7778067221045616,0.8077718658444186,0.7050984538121973,0.6791435853965506,0.7315047589823398,0.6274606401446008,0.6090447486281656,0.47565459019472395,0.3626444151812243,0.3781788689164846,0.1428027187105927,0.13024918340438868,0.24538136440926647,0.25413551726238914,0.2638681222155129],[0.16631123049192714,0.21393461748259215,0.17443172320155878,0.16030598440664023,0.008372431838735095,0.048590697685584064,0.12304248758475622,0.05962196841028138,0.04021069416966182,0.19139690202159018,0.19091509263961848,0.33755767564372935,0.26222784209855,0.3836164558963834,0.4951442089456719,0.42861473393542787,0.6191816151803766,0.6337521044168415,0.5006396943655522,0.613622934507656,0.5840928534076,0.6852784052867706,0.7425115550483108,0.7805104874379335,0.8068752071639289,0.8268975901194805,0.8083965524738981,0.970997420540351,1.0,0.835199310773221,0.8451380333804511,0.8935781712143693,0.9260453704963016,1.0,0.8279150004605469,1.0,0.8523959398966388,0.7719099661835359,0.881081537171595,0.6749144766088301,0.6107016930483002,0.6206214151930902,0.41410447536673967,0.5191072714001534,0.5213551688304456,0.4247676354556676,0.4396179366988354,0.368866379134083,0.16339728503322348,0.1173613402559649,0.09602005004734745,0.07480784435331583],[0.046590987334549576,0.10123262009753725,0.02093213312475304,0.0,0.07125379358885636,0.11217969099637068,0.0,0.04223494562109133,0.0,0.2407179325890179,0.10427870014018772,0.16707365585204992,0.1793360141618333,0.44441581083681436,0.5015112790992493,0.324885132203605,0.4145937619787646,0.5945489220423629,0.49092001333284074,0.7608613987453299,0.62750715549575,0.8547015477375716,0.8346531778992586,0.9684788887645426,1.0,0.8136483326914014,0.807430828663213,0.9557997633645948,0.9341359236245382,0.8658706292175599,0.7999512579226341,0.8315899109479433,1.0,0.7834447149945696,0.821791956125248,0.8837193194656598,0.7717628566232109,0.800652279919202,0.6248520681660523,0.7382895308902923,0.6921482346155182,0.5893888952931976,0.4496816205443064,0.38499598068827606,0.28076008234368877,0.2359389188931954,0.21120429234963584,0.21097085986745998,0.3105027222666124,0.15148478367041826,0.1346761632737261,0.012262819186755189],[0.009666345383968863,0.11116647068498314,0.09294877334825495,0.0,0.0,0.2011845639304187,0.1746125923167111,0.16006896670795023,0.0,0.28572584519939537,0.2106947405688844,0.24717486234760797,0.28443580982016986,0.46446650959504143,0.331714655444355,0.43317910390302933,0.5322084048261323,0.6040016380656543,0.5272867409409122,0.6326146082611722,0.7481764440823108,0.6032879101358065,0.8983906824318192,0.8272461712741,0.7697692673827646,0.7968738421076039,0.8931913970024197,0.9329148302840636,0.904554090664641,0.8543001086485396,0.8838775248978465,0.8560252873023545,0.8122001360665569,1.0,0.7616937704042586,0.9029733179243924,0.8776848090469377,0.9202037297571337,0.6884370069119261,0.8140845758855468,0.7631365695720691,0.5410474299147227,0.6587768738699801,0.5594767226752763,0.39462779575958423,0.4973245647686208,0.23374565469040598,0.14285601938377673,0.0893905690513131,0.320572013689418,0.16675392505723788,0.039142897242472996]],"type":"heatmap"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}}},"margin":{"l":28,"r":12,"t":8,"b":28},"xaxis":{"showgrid":false,"zeroline":false,"showline":false,"ticks":"","showticklabels":false,"fixedrange":true},"yaxis":{"tickfont":{"size":12,"color":"rgba(0,0,0,0.65)"},"showgrid":false,"zeroline":false,"showline":false,"ticks":"","fixedrange":true},"autosize":true,"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)"}, {"displayModeBar": false, "responsive": true, "scrollZoom": false} ) }; </script> </div>
app/src/fragments/line.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <div> <div id="9ede8c7f-7b5c-4431-8616-891d85efdf07" class="plotly-graph-div" style="height:100%; width:100%;"></div> <script type="text/javascript"> window.PLOTLYENV=window.PLOTLYENV || {}; if (document.getElementById("9ede8c7f-7b5c-4431-8616-891d85efdf07")) { Plotly.newPlot( "9ede8c7f-7b5c-4431-8616-891d85efdf07", [{"hovertemplate":"\u003cb\u003e%{fullData.name}\u003c\u002fb\u003e\u003cbr\u003ex=%{x:.2f}\u003cbr\u003ey=%{y:.3f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"#64748b","shape":"spline","smoothing":0.6,"width":2},"mode":"lines","name":"Baseline","showlegend":true,"x":[0.0,0.0041841004184100415,0.008368200836820083,0.012552301255230124,0.016736401673640166,0.02092050209205021,0.025104602510460247,0.02928870292887029,0.03347280334728033,0.03765690376569037,0.04184100418410042,0.046025104602510455,0.050209205020920494,0.05439330543933054,0.05857740585774058,0.06276150627615062,0.06694560669456066,0.0711297071129707,0.07531380753138074,0.0794979079497908,0.08368200836820083,0.08786610878661087,0.09205020920502091,0.09623430962343095,0.10041841004184099,0.10460251046025104,0.10878661087866108,0.11297071129707112,0.11715481171548116,0.1213389121338912,0.12552301255230125,0.12970711297071127,0.13389121338912133,0.13807531380753138,0.1422594142259414,0.14644351464435146,0.15062761506276148,0.15481171548117154,0.1589958158995816,0.1631799163179916,0.16736401673640167,0.1715481171548117,0.17573221757322174,0.1799163179916318,0.18410041841004182,0.18828451882845187,0.1924686192468619,0.19665271966527195,0.20083682008368198,0.20502092050209203,0.20920502092050208,0.2133891213389121,0.21757322175732216,0.22175732217573219,0.22594142259414224,0.2301255230125523,0.23430962343096232,0.23849372384937237,0.2426778242677824,0.24686192468619245,0.2510460251046025,0.25523012552301255,0.25941422594142255,0.2635983263598326,0.26778242677824265,0.2719665271966527,0.27615062761506276,0.28033472803347276,0.2845188284518828,0.28870292887029286,0.2928870292887029,0.29707112970711297,0.30125523012552297,0.305439330543933,0.30962343096234307,0.3138075313807531,0.3179916317991632,0.3221757322175732,0.3263598326359832,0.3305439330543933,0.33472803347280333,0.3389121338912134,0.3430962343096234,0.34728033472803344,0.3514644351464435,0.35564853556485354,0.3598326359832636,0.3640167364016736,0.36820083682008364,0.3723849372384937,0.37656903765690375,0.3807531380753138,0.3849372384937238,0.38912133891213385,0.3933054393305439,0.39748953974895396,0.40167364016736395,0.405857740585774,0.41004184100418406,0.4142259414225941,0.41841004184100417,0.42259414225941416,0.4267782426778242,0.43096234309623427,0.4351464435146443,0.4393305439330544,0.44351464435146437,0.4476987447698744,0.4518828451882845,0.45606694560669453,0.4602510460251046,0.4644351464435146,0.46861924686192463,0.4728033472803347,0.47698744769874474,0.4811715481171548,0.4853556485355648,0.48953974895397484,0.4937238493723849,0.49790794979079495,0.502092050209205,0.506276150627615,0.5104602510460251,0.5146443514644351,0.5188284518828451,0.5230125523012552,0.5271966527196652,0.5313807531380753,0.5355648535564853,0.5397489539748953,0.5439330543933054,0.5481171548117154,0.5523012552301255,0.5564853556485355,0.5606694560669455,0.5648535564853556,0.5690376569037656,0.5732217573221757,0.5774058577405857,0.5815899581589957,0.5857740585774058,0.5899581589958158,0.5941422594142259,0.5983263598326359,0.6025104602510459,0.606694560669456,0.610878661087866,0.6150627615062761,0.6192468619246861,0.6234309623430961,0.6276150627615062,0.6317991631799162,0.6359832635983264,0.6401673640167364,0.6443514644351463,0.6485355648535565,0.6527196652719665,0.6569037656903766,0.6610878661087866,0.6652719665271966,0.6694560669456067,0.6736401673640167,0.6778242677824268,0.6820083682008368,0.6861924686192468,0.6903765690376569,0.6945606694560669,0.698744769874477,0.702928870292887,0.707112970711297,0.7112970711297071,0.7154811715481171,0.7196652719665272,0.7238493723849372,0.7280334728033472,0.7322175732217573,0.7364016736401673,0.7405857740585774,0.7447698744769874,0.7489539748953974,0.7531380753138075,0.7573221757322175,0.7615062761506276,0.7656903765690376,0.7698744769874476,0.7740585774058577,0.7782426778242677,0.7824267782426778,0.7866108786610878,0.7907949790794978,0.7949790794979079,0.7991631799163179,0.8033472803347279,0.807531380753138,0.811715481171548,0.8158995815899581,0.8200836820083681,0.8242677824267781,0.8284518828451882,0.8326359832635982,0.8368200836820083,0.8410041841004183,0.8451882845188283,0.8493723849372384,0.8535564853556484,0.8577405857740585,0.8619246861924685,0.8661087866108785,0.8702928870292886,0.8744769874476986,0.8786610878661087,0.8828451882845187,0.8870292887029287,0.8912133891213389,0.8953974895397488,0.899581589958159,0.903765690376569,0.907949790794979,0.9121338912133891,0.9163179916317991,0.9205020920502092,0.9246861924686192,0.9288702928870292,0.9330543933054393,0.9372384937238493,0.9414225941422594,0.9456066945606694,0.9497907949790794,0.9539748953974895,0.9581589958158995,0.9623430962343096,0.9665271966527196,0.9707112970711296,0.9748953974895397,0.9790794979079497,0.9832635983263598,0.9874476987447698,0.9916317991631798,0.9958158995815899,1.0],"y":[0.2,0.20251046025104605,0.20502092050209206,0.2075313807531381,0.2100418410041841,0.21255230125523014,0.21506276150627615,0.2175732217573222,0.2200836820083682,0.22259414225941423,0.22510460251046027,0.22761506276150628,0.2301255230125523,0.23263598326359833,0.23514644351464437,0.23765690376569037,0.2401673640167364,0.24267782426778242,0.24518828451882846,0.2476987447698745,0.25020920502092053,0.25271966527196654,0.25523012552301255,0.25774058577405856,0.2602510460251046,0.26276150627615064,0.26527196652719665,0.2677824267782427,0.2702928870292887,0.27280334728033473,0.27531380753138074,0.27782426778242675,0.2803347280334728,0.2828451882845188,0.28535564853556483,0.2878661087866109,0.2903765690376569,0.2928870292887029,0.295397489539749,0.297907949790795,0.300418410041841,0.302928870292887,0.3054393305439331,0.3079497907949791,0.3104602510460251,0.3129707112970711,0.31548117154811717,0.3179916317991632,0.3205020920502092,0.32301255230125525,0.32552301255230126,0.32803347280334727,0.33054393305439334,0.3330543933054393,0.33556485355648535,0.3380753138075314,0.3405857740585774,0.34309623430962344,0.34560669456066945,0.34811715481171546,0.3506276150627615,0.35313807531380753,0.35564853556485354,0.3581589958158996,0.36066945606694556,0.3631799163179916,0.3656903765690377,0.36820083682008364,0.3707112970711297,0.3732217573221757,0.3757322175732217,0.3782426778242678,0.38075313807531375,0.3832635983263598,0.3857740585774059,0.3882845188284519,0.3907949790794979,0.3933054393305439,0.3958158995815899,0.398326359832636,0.40083682008368204,0.403347280334728,0.40585774058577406,0.40836820083682007,0.4108786610878661,0.41338912133891215,0.41589958158995816,0.41841004184100417,0.42092050209205023,0.4234309623430962,0.42594142259414225,0.4284518828451883,0.43096234309623427,0.43347280334728033,0.43598326359832634,0.43849372384937235,0.44100418410041836,0.44351464435146437,0.44602510460251044,0.4485355648535565,0.4510460251046025,0.4535564853556485,0.45606694560669453,0.45857740585774054,0.4610878661087866,0.4635983263598326,0.4661087866108786,0.46861924686192463,0.4711297071129707,0.4736401673640167,0.47615062761506277,0.4786610878661087,0.4811715481171548,0.4836820083682008,0.48619246861924686,0.4887029288702929,0.4912133891213389,0.4937238493723849,0.49623430962343096,0.49874476987447697,0.501255230125523,0.503765690376569,0.506276150627615,0.5087866108786611,0.5112970711297071,0.5138075313807531,0.5163179916317991,0.5188284518828452,0.5213389121338912,0.5238493723849371,0.5263598326359833,0.5288702928870292,0.5313807531380753,0.5338912133891214,0.5364016736401673,0.5389121338912134,0.5414225941422594,0.5439330543933054,0.5464435146443514,0.5489539748953974,0.5514644351464435,0.5539748953974895,0.5564853556485356,0.5589958158995816,0.5615062761506275,0.5640167364016736,0.5665271966527197,0.5690376569037656,0.5715481171548117,0.5740585774058578,0.5765690376569037,0.5790794979079498,0.5815899581589958,0.5841004184100418,0.5866108786610877,0.5891213389121339,0.5916317991631799,0.5941422594142259,0.596652719665272,0.599163179916318,0.601673640167364,0.60418410041841,0.606694560669456,0.609205020920502,0.6117154811715481,0.6142259414225941,0.6167364016736401,0.6192468619246863,0.6217573221757322,0.6242677824267782,0.6267782426778242,0.6292887029288703,0.6317991631799162,0.6343096234309623,0.6368200836820084,0.6393305439330543,0.6418410041841004,0.6443514644351465,0.6468619246861924,0.6493723849372384,0.6518828451882845,0.6543933054393305,0.6569037656903766,0.6594142259414226,0.6619246861924686,0.6644351464435145,0.6669456066945606,0.6694560669456067,0.6719665271966526,0.6744769874476987,0.6769874476987447,0.6794979079497907,0.6820083682008367,0.6845188284518828,0.6870292887029288,0.6895397489539749,0.6920502092050209,0.6945606694560669,0.6970711297071129,0.699581589958159,0.702092050209205,0.7046025104602509,0.7071129707112971,0.709623430962343,0.712133891213389,0.7146443514644352,0.7171548117154811,0.7196652719665271,0.7221757322175733,0.7246861924686192,0.7271966527196652,0.7297071129707113,0.7322175732217573,0.7347280334728032,0.7372384937238492,0.7397489539748954,0.7422594142259413,0.7447698744769873,0.7472803347280335,0.7497907949790794,0.7523012552301256,0.7548117154811715,0.7573221757322175,0.7598326359832634,0.7623430962343096,0.7648535564853556,0.7673640167364015,0.7698744769874477,0.7723849372384937,0.7748953974895396,0.7774058577405858,0.7799163179916317,0.7824267782426777,0.7849372384937239,0.7874476987447698,0.7899581589958158,0.792468619246862,0.7949790794979079,0.7974895397489539,0.8],"type":"scatter"},{"hovertemplate":"\u003cb\u003e%{fullData.name}\u003c\u002fb\u003e\u003cbr\u003ex=%{x:.2f}\u003cbr\u003ey=%{y:.3f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"#2563eb","shape":"spline","smoothing":0.6,"width":2},"mode":"lines","name":"Improved","showlegend":true,"x":[0.0,0.0041841004184100415,0.008368200836820083,0.012552301255230124,0.016736401673640166,0.02092050209205021,0.025104602510460247,0.02928870292887029,0.03347280334728033,0.03765690376569037,0.04184100418410042,0.046025104602510455,0.050209205020920494,0.05439330543933054,0.05857740585774058,0.06276150627615062,0.06694560669456066,0.0711297071129707,0.07531380753138074,0.0794979079497908,0.08368200836820083,0.08786610878661087,0.09205020920502091,0.09623430962343095,0.10041841004184099,0.10460251046025104,0.10878661087866108,0.11297071129707112,0.11715481171548116,0.1213389121338912,0.12552301255230125,0.12970711297071127,0.13389121338912133,0.13807531380753138,0.1422594142259414,0.14644351464435146,0.15062761506276148,0.15481171548117154,0.1589958158995816,0.1631799163179916,0.16736401673640167,0.1715481171548117,0.17573221757322174,0.1799163179916318,0.18410041841004182,0.18828451882845187,0.1924686192468619,0.19665271966527195,0.20083682008368198,0.20502092050209203,0.20920502092050208,0.2133891213389121,0.21757322175732216,0.22175732217573219,0.22594142259414224,0.2301255230125523,0.23430962343096232,0.23849372384937237,0.2426778242677824,0.24686192468619245,0.2510460251046025,0.25523012552301255,0.25941422594142255,0.2635983263598326,0.26778242677824265,0.2719665271966527,0.27615062761506276,0.28033472803347276,0.2845188284518828,0.28870292887029286,0.2928870292887029,0.29707112970711297,0.30125523012552297,0.305439330543933,0.30962343096234307,0.3138075313807531,0.3179916317991632,0.3221757322175732,0.3263598326359832,0.3305439330543933,0.33472803347280333,0.3389121338912134,0.3430962343096234,0.34728033472803344,0.3514644351464435,0.35564853556485354,0.3598326359832636,0.3640167364016736,0.36820083682008364,0.3723849372384937,0.37656903765690375,0.3807531380753138,0.3849372384937238,0.38912133891213385,0.3933054393305439,0.39748953974895396,0.40167364016736395,0.405857740585774,0.41004184100418406,0.4142259414225941,0.41841004184100417,0.42259414225941416,0.4267782426778242,0.43096234309623427,0.4351464435146443,0.4393305439330544,0.44351464435146437,0.4476987447698744,0.4518828451882845,0.45606694560669453,0.4602510460251046,0.4644351464435146,0.46861924686192463,0.4728033472803347,0.47698744769874474,0.4811715481171548,0.4853556485355648,0.48953974895397484,0.4937238493723849,0.49790794979079495,0.502092050209205,0.506276150627615,0.5104602510460251,0.5146443514644351,0.5188284518828451,0.5230125523012552,0.5271966527196652,0.5313807531380753,0.5355648535564853,0.5397489539748953,0.5439330543933054,0.5481171548117154,0.5523012552301255,0.5564853556485355,0.5606694560669455,0.5648535564853556,0.5690376569037656,0.5732217573221757,0.5774058577405857,0.5815899581589957,0.5857740585774058,0.5899581589958158,0.5941422594142259,0.5983263598326359,0.6025104602510459,0.606694560669456,0.610878661087866,0.6150627615062761,0.6192468619246861,0.6234309623430961,0.6276150627615062,0.6317991631799162,0.6359832635983264,0.6401673640167364,0.6443514644351463,0.6485355648535565,0.6527196652719665,0.6569037656903766,0.6610878661087866,0.6652719665271966,0.6694560669456067,0.6736401673640167,0.6778242677824268,0.6820083682008368,0.6861924686192468,0.6903765690376569,0.6945606694560669,0.698744769874477,0.702928870292887,0.707112970711297,0.7112970711297071,0.7154811715481171,0.7196652719665272,0.7238493723849372,0.7280334728033472,0.7322175732217573,0.7364016736401673,0.7405857740585774,0.7447698744769874,0.7489539748953974,0.7531380753138075,0.7573221757322175,0.7615062761506276,0.7656903765690376,0.7698744769874476,0.7740585774058577,0.7782426778242677,0.7824267782426778,0.7866108786610878,0.7907949790794978,0.7949790794979079,0.7991631799163179,0.8033472803347279,0.807531380753138,0.811715481171548,0.8158995815899581,0.8200836820083681,0.8242677824267781,0.8284518828451882,0.8326359832635982,0.8368200836820083,0.8410041841004183,0.8451882845188283,0.8493723849372384,0.8535564853556484,0.8577405857740585,0.8619246861924685,0.8661087866108785,0.8702928870292886,0.8744769874476986,0.8786610878661087,0.8828451882845187,0.8870292887029287,0.8912133891213389,0.8953974895397488,0.899581589958159,0.903765690376569,0.907949790794979,0.9121338912133891,0.9163179916317991,0.9205020920502092,0.9246861924686192,0.9288702928870292,0.9330543933054393,0.9372384937238493,0.9414225941422594,0.9456066945606694,0.9497907949790794,0.9539748953974895,0.9581589958158995,0.9623430962343096,0.9665271966527196,0.9707112970711296,0.9748953974895397,0.9790794979079497,0.9832635983263598,0.9874476987447698,0.9916317991631798,0.9958158995815899,1.0],"y":[0.15,0.15292887029288701,0.15585774058577406,0.15878661087866108,0.1617154811715481,0.16464435146443515,0.16757322175732217,0.1705020920502092,0.17343096234309624,0.17635983263598326,0.17928870292887028,0.1822175732217573,0.18514644351464432,0.18807531380753137,0.1910041841004184,0.19393305439330544,0.19686192468619246,0.19979079497907948,0.2027196652719665,0.20564853556485355,0.20857740585774057,0.21150627615062761,0.21443514644351463,0.21736401673640166,0.22029288702928868,0.22322175732217572,0.22615062761506274,0.2290794979079498,0.2320083682008368,0.23493723849372383,0.23786610878661085,0.24079497907949787,0.24372384937238492,0.24665271966527197,0.249581589958159,0.252510460251046,0.25543933054393303,0.25836820083682005,0.2612970711297071,0.26422594142259415,0.26715481171548117,0.2700836820083682,0.2730125523012552,0.2759414225941422,0.27887029288702925,0.28179916317991627,0.2847280334728033,0.28765690376569036,0.29058577405857733,0.2935146443514644,0.2964435146443515,0.2993723849372385,0.3023012552301255,0.30523012552301254,0.30815899581589956,0.3110878661087866,0.3140167364016736,0.3169456066945606,0.31987447698744764,0.32280334728033466,0.32573221757322174,0.32866108786610876,0.3315899581589958,0.3345188284518828,0.3374476987447699,0.3403765690376569,0.3433054393305439,0.34623430962343094,0.34916317991631796,0.352092050209205,0.355020920502092,0.3579497907949791,0.36087866108786604,0.36380753138075306,0.36673640167364013,0.36966527196652715,0.37259414225941423,0.3755230125523012,0.37845188284518827,0.3813807531380753,0.3843096234309623,0.38723849372384933,0.39016736401673635,0.39309623430962337,0.3960251046025104,0.39895397489539747,0.40188284518828454,0.40481171548117145,0.4077405857740586,0.4106694560669456,0.4135983263598326,0.41652719665271964,0.41945606694560666,0.4223849372384937,0.4253138075313807,0.4282426778242677,0.43117154811715475,0.43410041841004177,0.4370292887029288,0.4399581589958158,0.44288702928870294,0.44581589958158985,0.448744769874477,0.451673640167364,0.454602510460251,0.45753138075313804,0.46046025104602506,0.4633891213389121,0.4663179916317991,0.4692468619246861,0.47217573221757314,0.47510460251046016,0.4780334728033472,0.4809623430962342,0.48389121338912133,0.48682008368200835,0.4897489539748954,0.4926778242677824,0.4956066945606694,0.49853556485355643,0.5014644351464435,0.5043933054393305,0.5073221757322175,0.5102510460251045,0.5131799163179915,0.5161087866108787,0.5190376569037656,0.5219665271966527,0.5248953974895397,0.5278242677824266,0.5307531380753138,0.5336820083682008,0.5366108786610878,0.5395397489539748,0.5424686192468618,0.5453974895397489,0.5483263598326359,0.551255230125523,0.5541841004184099,0.557112970711297,0.5600418410041841,0.5629707112970711,0.5658995815899581,0.5688284518828451,0.5717573221757322,0.5746861924686192,0.5776150627615062,0.5805439330543932,0.5834728033472802,0.5864016736401673,0.5893305439330543,0.5922594142259413,0.5951882845188284,0.5981171548117155,0.6010460251046024,0.6039748953974895,0.6069037656903765,0.6098326359832635,0.6127615062761506,0.6156903765690376,0.6186192468619246,0.6215481171548116,0.6244769874476988,0.6274058577405857,0.6303347280334727,0.6332635983263598,0.6361924686192467,0.6391213389121339,0.6420502092050209,0.6449790794979079,0.6479079497907949,0.6508368200836819,0.6537656903765691,0.656694560669456,0.659623430962343,0.6625523012552301,0.6654811715481171,0.6684100418410042,0.6713389121338912,0.6742677824267782,0.6771966527196652,0.6801255230125522,0.6830543933054393,0.6859832635983263,0.6889121338912133,0.6918410041841003,0.6947698744769873,0.6976987447698745,0.7006276150627615,0.7035564853556484,0.7064853556485355,0.7094142259414226,0.7123430962343095,0.7152719665271966,0.7182008368200836,0.7211297071129706,0.7240585774058577,0.7269874476987447,0.7299163179916317,0.7328451882845187,0.7357740585774059,0.7387029288702928,0.7416317991631798,0.7445606694560669,0.7474895397489539,0.750418410041841,0.753347280334728,0.756276150627615,0.759205020920502,0.762133891213389,0.7650627615062761,0.7679916317991631,0.7709205020920501,0.7738493723849372,0.7767782426778241,0.7797071129707113,0.7826359832635983,0.7855648535564852,0.7884937238493723,0.7914225941422594,0.7943514644351464,0.7972803347280334,0.8002092050209204,0.8031380753138074,0.8060669456066945,0.8089958158995816,0.8119246861924685,0.8148535564853555,0.8177824267782426,0.8207112970711297,0.8236401673640167,0.8265690376569037,0.8294979079497907,0.8324267782426777,0.8353556485355648,0.8382845188284518,0.8412133891213388,0.8441422594142258,0.847071129707113,0.85],"type":"scatter"},{"hovertemplate":"\u003cb\u003e%{fullData.name}\u003c\u002fb\u003e\u003cbr\u003ex=%{x:.2f}\u003cbr\u003ey=%{y:.3f}\u003cextra\u003e\u003c\u002fextra\u003e","line":{"color":"#4b5563","dash":"dash","width":2},"mode":"lines","name":"Target","showlegend":true,"x":[0.0,0.0041841004184100415,0.008368200836820083,0.012552301255230124,0.016736401673640166,0.02092050209205021,0.025104602510460247,0.02928870292887029,0.03347280334728033,0.03765690376569037,0.04184100418410042,0.046025104602510455,0.050209205020920494,0.05439330543933054,0.05857740585774058,0.06276150627615062,0.06694560669456066,0.0711297071129707,0.07531380753138074,0.0794979079497908,0.08368200836820083,0.08786610878661087,0.09205020920502091,0.09623430962343095,0.10041841004184099,0.10460251046025104,0.10878661087866108,0.11297071129707112,0.11715481171548116,0.1213389121338912,0.12552301255230125,0.12970711297071127,0.13389121338912133,0.13807531380753138,0.1422594142259414,0.14644351464435146,0.15062761506276148,0.15481171548117154,0.1589958158995816,0.1631799163179916,0.16736401673640167,0.1715481171548117,0.17573221757322174,0.1799163179916318,0.18410041841004182,0.18828451882845187,0.1924686192468619,0.19665271966527195,0.20083682008368198,0.20502092050209203,0.20920502092050208,0.2133891213389121,0.21757322175732216,0.22175732217573219,0.22594142259414224,0.2301255230125523,0.23430962343096232,0.23849372384937237,0.2426778242677824,0.24686192468619245,0.2510460251046025,0.25523012552301255,0.25941422594142255,0.2635983263598326,0.26778242677824265,0.2719665271966527,0.27615062761506276,0.28033472803347276,0.2845188284518828,0.28870292887029286,0.2928870292887029,0.29707112970711297,0.30125523012552297,0.305439330543933,0.30962343096234307,0.3138075313807531,0.3179916317991632,0.3221757322175732,0.3263598326359832,0.3305439330543933,0.33472803347280333,0.3389121338912134,0.3430962343096234,0.34728033472803344,0.3514644351464435,0.35564853556485354,0.3598326359832636,0.3640167364016736,0.36820083682008364,0.3723849372384937,0.37656903765690375,0.3807531380753138,0.3849372384937238,0.38912133891213385,0.3933054393305439,0.39748953974895396,0.40167364016736395,0.405857740585774,0.41004184100418406,0.4142259414225941,0.41841004184100417,0.42259414225941416,0.4267782426778242,0.43096234309623427,0.4351464435146443,0.4393305439330544,0.44351464435146437,0.4476987447698744,0.4518828451882845,0.45606694560669453,0.4602510460251046,0.4644351464435146,0.46861924686192463,0.4728033472803347,0.47698744769874474,0.4811715481171548,0.4853556485355648,0.48953974895397484,0.4937238493723849,0.49790794979079495,0.502092050209205,0.506276150627615,0.5104602510460251,0.5146443514644351,0.5188284518828451,0.5230125523012552,0.5271966527196652,0.5313807531380753,0.5355648535564853,0.5397489539748953,0.5439330543933054,0.5481171548117154,0.5523012552301255,0.5564853556485355,0.5606694560669455,0.5648535564853556,0.5690376569037656,0.5732217573221757,0.5774058577405857,0.5815899581589957,0.5857740585774058,0.5899581589958158,0.5941422594142259,0.5983263598326359,0.6025104602510459,0.606694560669456,0.610878661087866,0.6150627615062761,0.6192468619246861,0.6234309623430961,0.6276150627615062,0.6317991631799162,0.6359832635983264,0.6401673640167364,0.6443514644351463,0.6485355648535565,0.6527196652719665,0.6569037656903766,0.6610878661087866,0.6652719665271966,0.6694560669456067,0.6736401673640167,0.6778242677824268,0.6820083682008368,0.6861924686192468,0.6903765690376569,0.6945606694560669,0.698744769874477,0.702928870292887,0.707112970711297,0.7112970711297071,0.7154811715481171,0.7196652719665272,0.7238493723849372,0.7280334728033472,0.7322175732217573,0.7364016736401673,0.7405857740585774,0.7447698744769874,0.7489539748953974,0.7531380753138075,0.7573221757322175,0.7615062761506276,0.7656903765690376,0.7698744769874476,0.7740585774058577,0.7782426778242677,0.7824267782426778,0.7866108786610878,0.7907949790794978,0.7949790794979079,0.7991631799163179,0.8033472803347279,0.807531380753138,0.811715481171548,0.8158995815899581,0.8200836820083681,0.8242677824267781,0.8284518828451882,0.8326359832635982,0.8368200836820083,0.8410041841004183,0.8451882845188283,0.8493723849372384,0.8535564853556484,0.8577405857740585,0.8619246861924685,0.8661087866108785,0.8702928870292886,0.8744769874476986,0.8786610878661087,0.8828451882845187,0.8870292887029287,0.8912133891213389,0.8953974895397488,0.899581589958159,0.903765690376569,0.907949790794979,0.9121338912133891,0.9163179916317991,0.9205020920502092,0.9246861924686192,0.9288702928870292,0.9330543933054393,0.9372384937238493,0.9414225941422594,0.9456066945606694,0.9497907949790794,0.9539748953974895,0.9581589958158995,0.9623430962343096,0.9665271966527196,0.9707112970711296,0.9748953974895397,0.9790794979079497,0.9832635983263598,0.9874476987447698,0.9916317991631798,0.9958158995815899,1.0],"y":[0.1,0.10334728033472804,0.10669456066945607,0.1100418410041841,0.11338912133891214,0.11673640167364017,0.1200836820083682,0.12343096234309624,0.12677824267782428,0.1301255230125523,0.13347280334728034,0.13682008368200838,0.1401673640167364,0.14351464435146444,0.14686192468619247,0.1502092050209205,0.15355648535564853,0.15690376569037656,0.1602510460251046,0.16359832635983262,0.16694560669456066,0.1702928870292887,0.17364016736401672,0.17698744769874478,0.1803347280334728,0.18368200836820084,0.18702928870292887,0.1903765690376569,0.19372384937238493,0.19707112970711296,0.20041841004184102,0.20376569037656903,0.20711297071129708,0.21046025104602512,0.21380753138075315,0.21715481171548118,0.2205020920502092,0.22384937238493724,0.22719665271966527,0.2305439330543933,0.23389121338912133,0.23723849372384936,0.2405857740585774,0.24393305439330545,0.24728033472803346,0.25062761506276154,0.2539748953974895,0.2573221757322176,0.2606694560669456,0.26401673640167367,0.26736401673640164,0.27071129707112973,0.2740585774058577,0.2774058577405858,0.28075313807531377,0.28410041841004186,0.28744769874476983,0.2907949790794979,0.2941422594142259,0.297489539748954,0.300836820083682,0.30418410041841004,0.307531380753138,0.3108786610878661,0.31422594142259413,0.31757322175732217,0.32092050209205025,0.32426778242677823,0.32761506276150626,0.3309623430962343,0.3343096234309624,0.33765690376569035,0.3410041841004184,0.3443514644351464,0.3476987447698745,0.3510460251046025,0.35439330543933056,0.35774058577405854,0.3610878661087866,0.3644351464435146,0.3677824267782427,0.3711297071129708,0.37447698744769875,0.3778242677824267,0.3811715481171548,0.3845188284518829,0.3878661087866109,0.39121338912133885,0.39456066945606694,0.397907949790795,0.401255230125523,0.4046025104602511,0.40794979079497906,0.41129707112970715,0.4146443514644351,0.4179916317991632,0.4213389121338912,0.4246861924686193,0.42803347280334725,0.43138075313807533,0.4347280334728033,0.4380753138075314,0.4414225941422594,0.44476987447698746,0.44811715481171543,0.4514644351464435,0.4548117154811715,0.4581589958158996,0.46150627615062756,0.46485355648535565,0.46820083682008373,0.4715481171548117,0.4748953974895397,0.47824267782426777,0.48158995815899586,0.48493723849372383,0.4882845188284518,0.4916317991631799,0.494979079497908,0.49832635983263596,0.501673640167364,0.505020920502092,0.5083682008368201,0.5117154811715481,0.5150627615062761,0.5184100418410041,0.5217573221757322,0.5251046025104603,0.5284518828451883,0.5317991631799163,0.5351464435146444,0.5384937238493723,0.5418410041841004,0.5451882845188284,0.5485355648535565,0.5518828451882846,0.5552301255230125,0.5585774058577406,0.5619246861924686,0.5652719665271966,0.5686192468619247,0.5719665271966526,0.5753138075313807,0.5786610878661088,0.5820083682008368,0.5853556485355649,0.5887029288702929,0.5920502092050209,0.5953974895397489,0.5987447698744769,0.602092050209205,0.605439330543933,0.608786610878661,0.6121338912133891,0.6154811715481171,0.6188284518828452,0.6221757322175732,0.6255230125523012,0.6288702928870292,0.6322175732217572,0.6355648535564853,0.6389121338912134,0.6422594142259415,0.6456066945606694,0.6489539748953974,0.6523012552301255,0.6556485355648535,0.6589958158995816,0.6623430962343095,0.6656903765690376,0.6690376569037657,0.6723849372384937,0.6757322175732218,0.6790794979079497,0.6824267782426777,0.6857740585774058,0.6891213389121338,0.6924686192468619,0.69581589958159,0.6991631799163179,0.702510460251046,0.705857740585774,0.7092050209205021,0.7125523012552301,0.7158995815899581,0.7192468619246862,0.7225941422594142,0.7259414225941423,0.7292887029288703,0.7326359832635982,0.7359832635983263,0.7393305439330543,0.7426778242677824,0.7460251046025105,0.7493723849372385,0.7527196652719665,0.7560669456066945,0.7594142259414225,0.7627615062761506,0.7661087866108786,0.7694560669456066,0.7728033472803347,0.7761506276150627,0.7794979079497908,0.7828451882845188,0.7861924686192469,0.7895397489539748,0.7928870292887028,0.7962343096234309,0.799581589958159,0.8029288702928871,0.806276150627615,0.809623430962343,0.8129707112970711,0.8163179916317991,0.8196652719665272,0.8230125523012551,0.8263598326359832,0.8297071129707113,0.8330543933054393,0.8364016736401674,0.8397489539748954,0.8430962343096233,0.8464435146443514,0.8497907949790794,0.8531380753138075,0.8564853556485356,0.8598326359832635,0.8631799163179916,0.8665271966527196,0.8698744769874477,0.8732217573221757,0.8765690376569036,0.8799163179916317,0.8832635983263598,0.8866108786610879,0.8899581589958159,0.8933054393305438,0.8966527196652719,0.9],"type":"scatter"}], {"template":{"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmapgl":[{"type":"heatmapgl","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"white","linecolor":"white","minorgridcolor":"white","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"#E5ECF6","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]},"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"#E5ECF6","polar":{"bgcolor":"#E5ECF6","angularaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"radialaxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"ternary":{"bgcolor":"#E5ECF6","aaxis":{"gridcolor":"white","linecolor":"white","ticks":""},"baxis":{"gridcolor":"white","linecolor":"white","ticks":""},"caxis":{"gridcolor":"white","linecolor":"white","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"white","linecolor":"white","ticks":"","title":{"standoff":15},"zerolinecolor":"white","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"yaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2},"zaxis":{"backgroundcolor":"#E5ECF6","gridcolor":"white","linecolor":"white","showbackground":true,"ticks":"","zerolinecolor":"white","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"#E5ECF6","subunitcolor":"white","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}}},"margin":{"l":28,"r":12,"t":8,"b":28},"hoverlabel":{"font":{"color":"#111827","size":12},"bgcolor":"white","bordercolor":"rgba(0,0,0,0.15)","align":"left","namelength":-1},"xaxis":{"tickfont":{"size":12,"color":"rgba(0,0,0,0.55)"},"showgrid":false,"zeroline":false,"showline":true,"linecolor":"rgba(0,0,0,0.25)","linewidth":1,"ticks":"outside","ticklen":6,"tickcolor":"rgba(0,0,0,0.25)","title":{},"automargin":true,"fixedrange":true},"yaxis":{"tickfont":{"size":12,"color":"rgba(0,0,0,0.55)"},"showgrid":false,"zeroline":false,"showline":true,"linecolor":"rgba(0,0,0,0.25)","linewidth":1,"ticks":"outside","ticklen":6,"tickcolor":"rgba(0,0,0,0.25)","title":{},"tickformat":".2f","rangemode":"tozero","automargin":true,"fixedrange":true},"autosize":true,"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified"}, {"displayModeBar": false, "responsive": true, "scrollZoom": false} ) }; </script> </div>
app/src/layouts/ArticleLayout.astro ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ import type { APIContext } from 'astro';
3
+
4
+ interface Props {
5
+ title: string;
6
+ description?: string;
7
+ authors?: string[];
8
+ published?: string; // ISO ou lisible
9
+ tags?: string[];
10
+ image?: string; // URL absolue recommandée
11
+ }
12
+
13
+ const {
14
+ title,
15
+ description = '',
16
+ authors = [],
17
+ published,
18
+ tags = [],
19
+ image,
20
+ } = Astro.props as Props;
21
+
22
+ const url = Astro.url?.toString?.() ?? '';
23
+ const site = (Astro.site ? String(Astro.site) : '') as string;
24
+ const ogImage = image && image.length > 0
25
+ ? (image.startsWith('http') ? image : (site ? new URL(image, site).toString() : image))
26
+ : undefined;
27
+
28
+ const jsonLd = {
29
+ '@context': 'https://schema.org',
30
+ '@type': 'Article',
31
+ headline: title,
32
+ description: description || undefined,
33
+ datePublished: published || undefined,
34
+ author: authors.map((name) => ({ '@type': 'Person', name })),
35
+ keywords: tags.length ? tags.join(', ') : undefined,
36
+ mainEntityOfPage: url || undefined,
37
+ image: ogImage ? [ogImage] : undefined,
38
+ };
39
+ ---
40
+ <html lang="en">
41
+ <head>
42
+ <meta charset="utf-8" />
43
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
44
+
45
+ <title>{title}</title>
46
+ {description && <meta name="description" content={description} />}
47
+
48
+ <link rel="canonical" href={url} />
49
+
50
+ <meta property="og:type" content="article" />
51
+ <meta property="og:title" content={title} />
52
+ {description && <meta property="og:description" content={description} />}
53
+ <meta property="og:url" content={url} />
54
+ {ogImage && <meta property="og:image" content={ogImage} />}
55
+ {published && <meta property="article:published_time" content={published} />}
56
+ {authors.map(a => <meta property="article:author" content={a} />)}
57
+
58
+ <meta name="twitter:card" content={ogImage ? 'summary_large_image' : 'summary'} />
59
+ <meta name="twitter:title" content={title} />
60
+ {description && <meta name="twitter:description" content={description} />}
61
+ {ogImage && <meta name="twitter:image" content={ogImage} />}
62
+
63
+ <script type="application/ld+json" set:html={JSON.stringify(jsonLd)} />
64
+ </head>
65
+ <body>
66
+ <slot />
67
+ </body>
68
+ </html>
69
+
70
+
app/src/pages/article.mdx ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: "The science Template:\nCraft Beautiful Blogs"
3
+ description: "A modern, MDX-first research article template with math, citations, and interactive figures."
4
+ authors:
5
+ - "Hynek Kydlíček"
6
+ - "Guilherme Penedo"
7
+ - "Clémentine Fourier"
8
+ affiliation: "Hugging Face"
9
+ published: "Feb 19, 2025"
10
+ tags:
11
+ - research
12
+ - template
13
+ ogImage: "https://example.com/your-og-image.png"
14
+ ---
15
+
16
+ import HtmlFragment from "../components/HtmlFragment.astro";
17
+ import { Image } from 'astro:assets';
18
+ import placeholder from "../assets/images/placeholder.png";
19
+ import audioDemo from "../assets/audio/audio-example.wav";
20
+ import Aside from "../components/Aside.astro";
21
+ import visualPoster from "../assets/images/visual-vocabulary-poster.png";
22
+
23
+
24
+ Welcome to this single-page research article template built with Astro and MDX. It’s designed to help you write clear, modern, and interactive technical articles with minimal setup. Whether you cover machine learning, data science, physics, or software topics, this template keeps the authoring flow simple while offering robust features out of the box.
25
+
26
+ Reading time: 10–15 minutes.
27
+
28
+ In this guide, you’ll learn how to install the template, write content (math, citations, images, code, asides, interactive fragments), customize styles and behavior, and follow a few best practices for publishing.
29
+
30
+ ## Features
31
+
32
+ - Math via KaTeX (remark-math/rehype-katex)
33
+ - Citations and footnotes
34
+ - Responsive images with `astro:assets`
35
+ - Anchored headings and a generated table of contents
36
+ - Dark/light theme toggle
37
+ - HTML fragments for self-contained visualizations (e.g., Plotly)
38
+
39
+ ## Getting Started
40
+
41
+ Installation:
42
+
43
+ ```bash
44
+ npm install
45
+ npm run dev
46
+ ```
47
+
48
+ Build for production:
49
+
50
+ ```bash
51
+ npm run build
52
+ ```
53
+
54
+ Deployment: serve the `dist/` directory on any static host. A Docker/Nginx setup is included and works well on Spaces or similar environments.
55
+
56
+ Large assets: track binaries (e.g., `.png`, `.wav`) with Git LFS to keep the repository lean. This project is preconfigured to store such files via LFS.
57
+
58
+ ## Writing Your Content
59
+
60
+ Author content in MDX. Below are minimal examples for the core elements.
61
+
62
+ ### Math
63
+
64
+ Inline example: $x^2 + y^2 = z^2$.
65
+
66
+ Block (scaled dot-product attention):
67
+
68
+ $$
69
+ \mathrm{Attention}(Q, K, V) = \mathrm{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_k}}\right) V
70
+ $$
71
+
72
+ ```mdx
73
+ Inline: $x^2 + y^2 = z^2$
74
+
75
+ Block:
76
+ $$
77
+ \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right) V
78
+ $$
79
+ ```
80
+
81
+ ### Images
82
+
83
+ Responsive image using `astro:assets`:
84
+
85
+ <Image src={placeholder} alt="Responsive example image" />
86
+
87
+ ```mdx
88
+ import { Image } from 'astro:assets'
89
+ import myImage from '../assets/images/placeholder.png'
90
+
91
+ <Image src={myImage} alt="Responsive example image" />
92
+ ```
93
+
94
+ ### Citations and notes
95
+
96
+ A short citation [@example2023]. A footnote[^note].
97
+
98
+ [^note]: Example footnote.
99
+
100
+ ```mdx
101
+ As shown in [@example2023]. A footnote[^note].
102
+
103
+ [^note]: Example footnote.
104
+ ```
105
+
106
+ ### Interactive fragments
107
+
108
+ Plotly example (line):
109
+
110
+ <div className="plot-card">
111
+ <HtmlFragment src="line.html" />
112
+ </div>
113
+
114
+ ```mdx
115
+ import HtmlFragment from '../components/HtmlFragment.astro'
116
+
117
+ <HtmlFragment src="line.html" />
118
+ ```
119
+
120
+ ### Asides
121
+
122
+ <Aside>
123
+ This paragraph presents a key idea concisely.
124
+ <Fragment slot="aside">
125
+ Side note for brief context or a definition.
126
+ </Fragment>
127
+ </Aside>
128
+
129
+ ```mdx
130
+ import Aside from '../components/Aside.astro'
131
+
132
+ <Aside>
133
+ Main paragraph with the core idea.
134
+ <Fragment slot="aside">Short side note.</Fragment>
135
+ </Aside>
136
+ ```
137
+
138
+ ### Minimal table
139
+
140
+ | Method | Score |
141
+ |---|---|
142
+ | A | 0.78 |
143
+ | B | 0.86 |
144
+
145
+ ```mdx
146
+ | Method | Score |
147
+ | --- | --- |
148
+ | A | 0.78 |
149
+ | B | 0.86 |
150
+ ```
151
+
152
+ ### Audio
153
+
154
+ <audio controls src={audioDemo}>
155
+ Your browser does not support the audio element.
156
+ </audio>
157
+
158
+ ```mdx
159
+ import audioDemo from '../assets/audio/audio-example.wav'
160
+
161
+ <audio controls src={audioDemo}>
162
+ Your browser does not support the audio element.
163
+ </audio>
164
+ ```
165
+
166
+ ## Advanced Customization
167
+
168
+ - Styling: customize `src/styles/global.scss` for layout, typography, color scheme, and dark mode variables.
169
+ - Headings/TOC: tweak the TOC builder in `src/pages/index.astro` to match your preferred levels and behavior.
170
+ - Components: extend `components/` with bespoke MDX-friendly blocks (callouts, figures, widgets).
171
+ - Fragments: generate self-contained HTML fragments (e.g., Plotly) and include them via `<HtmlFragment src="..." />`.
172
+
173
+ ## Best Practices
174
+
175
+ - Keep sections short and focused.
176
+ - Prefer vector or optimized images; use `astro:assets` for responsive delivery.
177
+ - Annotate figures and code minimally but clearly.
178
+ - Use math sparingly; explain notation on first use.
179
+
180
+ ### Choosing the right chart
181
+
182
+ Picking the right visualization depends on your goal (compare values, show distribution, part-to-whole, trends, relationships, etc.). The Visual Vocabulary poster below provides a concise mapping from analytical task to chart types.
183
+
184
+ <figure>
185
+ <Image src={visualPoster} alt="Visual Vocabulary: choosing the right chart by task" />
186
+ <figcaption>
187
+ Visual Vocabulary: a handy reference to select chart types by purpose (comparison, distribution, part-to-whole, correlation, and more).
188
+ </figcaption>
189
+ </figure>
190
+
191
+
192
+ ## Conclusions
193
+
194
+ This template provides a practical baseline for writing and sharing technical articles with math, citations, and interactive figures. Start simple, iterate on structure and style, and keep content maintainable for future readers and collaborators.
195
+
app/src/pages/index.astro CHANGED
@@ -1,157 +1,194 @@
1
  ---
2
- import { Image } from 'astro:assets';
3
- import banner from "../assets/images/banner.png";
4
- import HtmlFragment from "../components/HtmlFragment.astro";
5
- const title = 'The Distill Blog Template (Astro)';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  ---
7
  <html lang="en">
8
  <head>
9
  <meta charset="utf-8" />
10
  <meta name="viewport" content="width=device-width, initial-scale=1" />
11
- <base target="_blank" />
12
- <title>{title}</title>
 
13
  <script src="https://cdn.plot.ly/plotly-3.0.0.min.js" charset="utf-8"></script>
14
- <style>
15
- :root { --page-width: 980px; }
16
- body { margin:0; font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji; }
17
- main { max-width: var(--page-width); margin: 24px auto; padding: 16px; }
18
- .l-page { max-width: var(--page-width); margin: 0 auto; }
19
- .l-screen { width: 100%; }
20
- figure { margin: 16px 0; }
21
- /* Assurer que les images ne dépassent jamais le conteneur */
22
- :where(picture, img) { max-width: 100%; width: 100%; height: auto; display: block; }
23
- .figcaption, figcaption { color: rgba(0,0,0,.6); font-size: 12px; }
24
- .plot-card { background: #fff; border: 1px solid rgba(0,0,0,.1); border-radius: 8px; padding: 12px; }
25
- d-contents nav { border-left: 1px solid rgba(0,0,0,.1); padding-left: 16px; margin: 16px 0; }
26
- .toc-header { display:flex; align-items:center; gap: 8px; cursor: pointer; user-select:none; }
27
- .toc-title { font-weight: 600; }
28
- .toggle-icon { transition: transform .2s ease; display:inline-block; }
29
- .toggle-icon.collapsed { transform: rotate(-90deg); }
30
- .toc-content.collapsed { display:none; }
31
- d-article pre, d-code[block] { overflow:auto; background:#f6f8fa; border:1px solid #d0d7de; border-radius:6px; padding:12px; }
32
- d-article table { border-collapse: collapse; width: 100%; }
33
- d-article th, d-article td { border-bottom: 1px solid rgba(0,0,0,.1); padding: 6px 8px; text-align: left; }
34
- aside { color: rgba(0,0,0,.6); font-size: 14px; }
35
- </style>
36
  </head>
37
  <body>
38
- <main>
39
- <d-front-matter>
40
- <script id='distill-front-matter' type="application/json">{ "title": "The Distill Blog Template", "description": "Building beautiful blog posts.", "published": "Feb 19, 2025", "affiliation": {"name": "YourCompany"}, "authors": [ { "author":"The Author (you!)", "authorURL":"https://huggingface.co/" } ] }</script>
41
- </d-front-matter>
42
-
43
- <d-title>
44
- <h1 class="l-page" style="text-align: center;">The Distill Template:<br/>Craft Beautiful Blogs</h1>
45
- <div id="title-plot" class="main-plot-container l-screen" style="overflow-x: hidden; width: 100%; text-align: center;">
46
- <div style="display: flex; justify-content: center; position: relative;">
47
- <figure class="l-page" style="margin:0;">
48
- <Image src={banner} alt="Banner" widths={[480,768,1080,1440]} formats={["avif","webp","png"]} sizes="(max-width: 768px) 100vw, var(--page-width)" loading="eager" />
49
- </figure>
50
- </div>
51
- <div class="l-page" style="margin-top:12px;">
52
- <HtmlFragment src="banner.html" />
53
- </div>
54
- <p style="text-align: center; font-style: italic; margin-top: 10px; max-width: 900px; margin-left: auto; margin-right: auto;">It's nice to have a cute interactive banner!</p>
55
- </div>
56
- </d-title>
57
-
58
- <d-byline></d-byline>
59
-
60
- <d-article>
61
- <d-contents></d-contents>
62
-
63
- <p>Welcome to the Distill Blog Template! This framework is based on the <a href="https://distill.pub/">distill.pub</a> design and has been adapted to make it easy for you to create beautiful, interactive technical blogs.</p>
64
- <aside>Reading time: 10-15 minutes.</aside>
65
- <p>This template includes support for mathematics, interactive visualizations, citations, footnotes, and more.</p>
66
-
67
- <h2>Getting Started with the Template</h2>
68
- <h3>Installation and Setup</h3>
69
- <d-code block language="bash">npm install\nnpm run dev</d-code>
70
-
71
- <h3>Mathematical Equations</h3>
72
- <p>You can include inline math using <code>x^2 + y^2 = z^2</code>.</p>
73
-
74
- <h3>Figures and Images</h3>
75
- <figure>
76
- <Image src={banner} alt="Example figure" widths={[480,768,1080]} formats={["avif","webp","png"]} sizes="(max-width: 768px) 100vw, var(--page-width)" />
77
- <figcaption>Caption for your figure</figcaption>
78
- </figure>
79
-
80
- <h3>Tables</h3>
81
- <table>
82
- <thead>
83
- <tr><th><strong>Model</strong></th><th><strong>Accuracy</strong></th><th><strong>Speed</strong></th></tr>
84
- </thead>
85
- <tbody>
86
- <tr><td>Model A</td><td>95%</td><td>Fast</td></tr>
87
- <tr><td>Model B</td><td>98%</td><td>Medium</td></tr>
88
- <tr><td>Model C</td><td>99%</td><td>Slow</td></tr>
89
- </tbody>
90
- </table>
91
-
92
- <h2>Interactive Components</h2>
93
- <div class="plot-card">
94
- <HtmlFragment src="banner.html" />
95
- </div>
96
-
97
- </d-article>
98
-
99
- <d-appendix>
100
- <h3 id="citation">Citation</h3>
101
- <pre class="citation short">"The Distill Blog Template", 2025.</pre>
102
- </d-appendix>
103
-
104
- <script>
105
- function toggleTOC() {
106
- const content = document.querySelector('.toc-content');
107
- const icon = document.querySelector('.toggle-icon');
108
- if (content) content.classList.toggle('collapsed');
109
- if (icon) icon.classList.toggle('collapsed');
110
- }
111
- </script>
112
-
113
- <script>
114
- const article = document.querySelector('d-article');
115
- const toc = document.querySelector('d-contents');
116
- if (toc && article) {
117
- const headings = article.querySelectorAll('h2, h3, h4');
118
- let ToC = `<nav role="navigation" class="l-text figcaption"><div class="toc-header" onclick="toggleTOC()"><span class="toc-title">Table of Contents</span><span class="toggle-icon">▼</span></div><div class="toc-content">`;
119
- let prevLevel = 0;
120
- for (const el of headings) {
121
- const isInTitle = el.parentElement.tagName == 'D-TITLE';
122
- const isException = el.getAttribute('no-toc');
123
- if (isInTitle || isException) continue;
124
- el.setAttribute('id', el.textContent.toLowerCase().replaceAll(" ", "_"));
125
- const link = '<a target="_self" href="#' + el.getAttribute('id') + '">' + el.textContent + '</a>';
126
- const level = el.tagName === 'H2' ? 0 : (el.tagName === 'H3' ? 1 : 2);
127
- while (prevLevel < level) { ToC += '<ul>'; prevLevel++; }
128
- while (prevLevel > level) { ToC += '</ul>'; prevLevel--; }
129
- if (level === 0) ToC += '<div>' + link + '</div>'; else ToC += '<li>' + link + '</li>';
 
 
 
130
  }
131
- while (prevLevel > 0) { ToC += '</ul>'; prevLevel--; }
132
- ToC += '</div></nav>';
133
- toc.innerHTML = ToC;
134
- toc.setAttribute('prerendered', 'true');
135
- const toc_links = document.querySelectorAll('d-contents > nav div a');
136
- window.addEventListener('scroll', () => {
137
- if (!headings || !toc_links) return;
138
- for (let i = headings.length - 1; i >= 0; i--) {
139
- const heading = headings[i];
140
- if (heading.parentElement.tagName == 'D-TITLE' || heading.getAttribute('no-toc')) continue;
141
- if (heading.getBoundingClientRect().top - 50 <= 0) {
142
- const headingId = heading.getAttribute('id');
143
- const activeLink = Array.from(toc_links).find(link => link.getAttribute('href') === '#' + headingId);
144
- if (activeLink && !activeLink.classList.contains('active')) {
145
- toc_links.forEach(link => link.classList.remove('active'));
146
- activeLink.classList.add('active');
147
- }
148
- break;
149
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
151
- });
152
- }
153
- </script>
154
- </main>
 
 
 
 
 
 
155
  </body>
156
  </html>
157
 
 
1
  ---
2
+ import Article, { frontmatter as articleFM } from './article.mdx';
3
+ import Meta from '../components/Meta.astro';
4
+ import HtmlFragment from '../components/HtmlFragment.astro';
5
+ import Footer from '../components/Footer.astro';
6
+ import ThemeToggle from '../components/ThemeToggle.astro';
7
+ import SeoHead from '../components/SeoHead.astro';
8
+ import ogDefault from '../assets/images/visual-vocabulary-poster.png';
9
+ import '../styles/global.scss';
10
+ const docTitle = articleFM?.title ?? 'Untitled article';
11
+ // Autoriser un retour à la ligne dans le titre via "\n" ou sauts de ligne YAML
12
+ const docTitleHtml = (articleFM?.title ?? 'Untitled article')
13
+ .replace(/\\n/g, '<br/>')
14
+ .replace(/\n/g, '<br/>');
15
+ const description = articleFM?.description ?? '';
16
+ const authors = articleFM?.authors ?? [];
17
+ const published = articleFM?.published ?? undefined;
18
+ const tags = articleFM?.tags ?? [];
19
+ // Prefer ogImage from frontmatter if provided
20
+ const fmOg = articleFM?.ogImage as string | undefined;
21
+ const imageAbs = fmOg && fmOg.startsWith('http')
22
+ ? fmOg
23
+ : (Astro.site ? new URL((fmOg ?? ogDefault.src), Astro.site).toString() : (fmOg ?? ogDefault.src));
24
  ---
25
  <html lang="en">
26
  <head>
27
  <meta charset="utf-8" />
28
  <meta name="viewport" content="width=device-width, initial-scale=1" />
29
+ <title>{docTitle}</title>
30
+ <SeoHead title={docTitle} description={description} authors={authors} published={published} tags={tags} image={imageAbs} />
31
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" crossorigin="anonymous" />
32
  <script src="https://cdn.plot.ly/plotly-3.0.0.min.js" charset="utf-8"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  </head>
34
  <body>
35
+ <ThemeToggle />
36
+ <section class="hero">
37
+ <h1 class="hero-title" set:html={docTitleHtml}></h1>
38
+ <div class="hero-banner">
39
+ <HtmlFragment src="banner.html" />
40
+ <p class="hero-desc">It's nice to have a cute interactive banner!</p>
41
+ </div>
42
+ </section>
43
+
44
+ <section class="article-header">
45
+ <Meta title={docTitle} authors={articleFM?.authors} affiliation={articleFM?.affiliation} published={articleFM?.published} />
46
+ </section>
47
+
48
+ <section class="content-grid">
49
+ <aside class="toc">
50
+ <div class="title">Table of Contents</div>
51
+ <div id="toc-placeholder"></div>
52
+ </aside>
53
+ <main>
54
+ <Article />
55
+ <style is:inline>
56
+ /* Inline tweak for details blocks used in MDX */
57
+ details { background: var(--code-bg) !important; border: 1px solid var(--border-color) !important; border-radius: 6px; margin: 1em 0; padding: .5em .75em; }
58
+ </style>
59
+ </main>
60
+ </section>
61
+
62
+ <Footer citationText='"The Distill Blog Template", 2025.' bibtex={`@misc{distill_blog_template,
63
+ title={The Distill Blog Template},
64
+ author={Some Authors et al},
65
+ year={2025},
66
+ }`}
67
+ >
68
+ <div class="references"><h3>References</h3></div>
69
+ </Footer>
70
+
71
+ <!-- Medium-like image zoom (lightbox) -->
72
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/medium-zoom.min.js"></script>
73
+ <script>
74
+ // Init zoom on data-zoomable images, close on scroll/move like Medium
75
+ const initMediumZoom = () => {
76
+ if (!window.mediumZoom) return;
77
+ const isDark = document.documentElement.getAttribute('data-theme') === 'dark';
78
+ const background = isDark ? 'rgba(0,0,0,.9)' : 'rgba(0,0,0,.85)';
79
+ const zoom = window.mediumZoom('section.content-grid main img[data-zoomable]', {
80
+ background,
81
+ margin: 24,
82
+ scrollOffset: 0
83
+ });
84
+
85
+ let onMove;
86
+ const attachCloseOnMove = () => {
87
+ if (onMove) return;
88
+ onMove = () => { zoom.close(); };
89
+ window.addEventListener('mousemove', onMove, { passive: true });
90
+ window.addEventListener('wheel', onMove, { passive: true });
91
+ window.addEventListener('touchmove', onMove, { passive: true });
92
+ };
93
+ const detachCloseOnMove = () => {
94
+ if (!onMove) return;
95
+ window.removeEventListener('mousemove', onMove);
96
+ window.removeEventListener('wheel', onMove);
97
+ window.removeEventListener('touchmove', onMove);
98
+ onMove = null;
99
+ };
100
+
101
+ zoom.on('open', attachCloseOnMove);
102
+ zoom.on('close', detachCloseOnMove);
103
+
104
+ // React to theme toggle
105
+ const observer = new MutationObserver(() => {
106
+ const dark = document.documentElement.getAttribute('data-theme') === 'dark';
107
+ zoom.update({ background: dark ? 'rgba(0,0,0,.9)' : 'rgba(0,0,0,.85)' });
108
+ });
109
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
110
+ };
111
+
112
+ if (document.readyState === 'loading') {
113
+ document.addEventListener('DOMContentLoaded', initMediumZoom, { once: true });
114
+ } else { initMediumZoom(); }
115
+ </script>
116
+ <script>
117
+ // Open external links in a new tab; keep internal anchors in-page
118
+ const setExternalTargets = () => {
119
+ const isExternal = (href) => {
120
+ try { const u = new URL(href, location.href); return u.origin !== location.origin; } catch { return false; }
121
+ };
122
+ document.querySelectorAll('a[href]').forEach(a => {
123
+ const href = a.getAttribute('href');
124
+ if (!href) return;
125
+ if (isExternal(href)) {
126
+ a.setAttribute('target', '_blank');
127
+ a.setAttribute('rel', 'noopener noreferrer');
128
+ } else {
129
+ a.removeAttribute('target');
130
  }
131
+ });
132
+ };
133
+ if (document.readyState === 'loading') {
134
+ document.addEventListener('DOMContentLoaded', setExternalTargets, { once: true });
135
+ } else { setExternalTargets(); }
136
+ </script>
137
+
138
+ <script>
139
+ // Build TOC from article headings (h2/h3/h4) and render into the sticky aside
140
+ const buildTOC = () => {
141
+ const holder = document.getElementById('toc-placeholder');
142
+ if (!holder || holder.children.length) return;
143
+ const articleRoot = document.querySelector('section.content-grid main');
144
+ if (!articleRoot) return;
145
+ const headings = articleRoot.querySelectorAll('h2, h3, h4');
146
+ if (!headings.length) return;
147
+
148
+ const nav = document.createElement('nav');
149
+ let ulStack = [document.createElement('ul')];
150
+ nav.appendChild(ulStack[0]);
151
+
152
+ const levelOf = (tag) => tag === 'H2' ? 2 : tag === 'H3' ? 3 : 4;
153
+ let prev = 2;
154
+ headings.forEach((h) => {
155
+ const lvl = levelOf(h.tagName);
156
+ // ensure id exists
157
+ if (!h.id) h.id = h.textContent.toLowerCase().replace(/\s+/g, '_');
158
+ // adjust depth
159
+ while (lvl > prev) { const ul = document.createElement('ul'); ulStack[ulStack.length-1].lastElementChild?.appendChild(ul); ulStack.push(ul); prev++; }
160
+ while (lvl < prev) { ulStack.pop(); prev--; }
161
+ const li = document.createElement('li');
162
+ const a = document.createElement('a');
163
+ a.href = '#' + h.id; a.textContent = h.textContent; a.target = '_self';
164
+ li.appendChild(a);
165
+ ulStack[ulStack.length-1].appendChild(li);
166
+ });
167
+
168
+ holder.appendChild(nav);
169
+
170
+ // active link on scroll
171
+ const links = holder.querySelectorAll('a');
172
+ const onScroll = () => {
173
+ for (let i = headings.length - 1; i >= 0; i--) {
174
+ const top = headings[i].getBoundingClientRect().top;
175
+ if (top - 60 <= 0) {
176
+ links.forEach(l => l.classList.remove('active'));
177
+ const id = '#' + headings[i].id;
178
+ const active = Array.from(links).find(l => l.getAttribute('href') === id);
179
+ active && active.classList.add('active');
180
+ break;
181
  }
182
+ }
183
+ };
184
+ window.addEventListener('scroll', onScroll);
185
+ onScroll();
186
+ };
187
+
188
+ if (document.readyState === 'loading') {
189
+ document.addEventListener('DOMContentLoaded', buildTOC, { once: true });
190
+ } else { buildTOC(); }
191
+ </script>
192
  </body>
193
  </html>
194
 
app/src/styles/global.scss ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // ============================================================================
2
+ // Theme Variables (inspired by Distill)
3
+ // ============================================================================
4
+ :root {
5
+ --distill-gray: rgb(107, 114, 128);
6
+ --distill-gray-light: rgb(185, 185, 185);
7
+ --distill-gray-lighter: rgb(228, 228, 228);
8
+ --distill-gray-lightest: rgb(245, 245, 245);
9
+ --distill-blue: #007BFF;
10
+
11
+ --text-color: rgba(0,0,0,.85);
12
+ --muted-color: rgba(0,0,0,.6);
13
+ --border-color: rgba(0,0,0,.1);
14
+
15
+ /* Light surfaces & links */
16
+ --surface-bg: #fafafa;
17
+ --code-bg: #f6f8fa;
18
+ --link-underline: rgba(0,0,0,.4);
19
+ --link-underline-hover: rgba(0,0,0,.8);
20
+
21
+ --spacing-1: 8px;
22
+ --spacing-2: 12px;
23
+ --spacing-3: 16px;
24
+ --spacing-4: 24px;
25
+ --spacing-5: 32px;
26
+ }
27
+ // Theme tokens for dark mode
28
+ [data-theme="dark"] {
29
+ --text-color: rgba(255,255,255,.9);
30
+ --muted-color: rgba(255,255,255,.7);
31
+ --border-color: rgba(255,255,255,.15);
32
+ --surface-bg: #12151b;
33
+ --code-bg: #12151b;
34
+ --link-underline: rgba(255,255,255,.5);
35
+ --link-underline-hover: rgba(255,255,255,.9);
36
+ color-scheme: dark;
37
+ background: #0f1115;
38
+ }
39
+ /* Dark-mode form tweak */
40
+ [data-theme="dark"] .plotly_input_container > select { background-color: #1a1f27; border-color: var(--border-color); color: var(--text-color); }
41
+
42
+ [data-theme="dark"] .plot-card { background: #12151b; border-color: rgba(255,255,255,.15); }
43
+ [data-theme="dark"] .right-aside .aside-card { background: #12151b; border-color: rgba(255,255,255,.15); }
44
+ [data-theme="dark"] .content-grid main pre { background: #12151b; border-color: rgba(255,255,255,.15); }
45
+ [data-theme="dark"] .toc nav { border-left-color: rgba(255,255,255,.15); }
46
+ [data-theme="dark"] .distill-footer { border-top-color: rgba(255,255,255,.15); }
47
+ [data-theme="dark"] .citation-text,
48
+ [data-theme="dark"] .citation-bibtex { background: #12151b; border-color: rgba(255,255,255,.15); color: var(--text-color); }
49
+
50
+ // ============================================================================
51
+ // Base / Reset
52
+ // ============================================================================
53
+ html { box-sizing: border-box; }
54
+ *, *::before, *::after { box-sizing: inherit; }
55
+ body { margin: 0; font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji; color: var(--text-color); }
56
+
57
+ /* Avoid constraining <main> inside grid; scope container sizing elsewhere if needed */
58
+ /* main { max-width: 980px; margin: 24px auto; padding: 16px; } */
59
+
60
+ // ============================================================================
61
+ // Typography (inspired by Distill)
62
+ // ============================================================================
63
+ html { font-size: 14px; line-height: 1.6; }
64
+ @media (min-width: 768px) { html { font-size: 16px; } }
65
+ @media (min-width: 1024px) { html { font-size: 17px; } }
66
+
67
+ .content-grid main { color: var(--text-color); }
68
+ .content-grid main p { margin: 0 0 var(--spacing-3); }
69
+
70
+ .content-grid main h2 {
71
+ font-weight: 600;
72
+ font-size: clamp(22px, 2.6vw, 32px);
73
+ line-height: 1.2;
74
+ margin: var(--spacing-5) 0 var(--spacing-3);
75
+ padding-bottom: var(--spacing-2);
76
+ border-bottom: 1px solid var(--border-color);
77
+ }
78
+
79
+ .content-grid main h3 {
80
+ font-weight: 700;
81
+ font-size: clamp(18px, 2.1vw, 22px);
82
+ line-height: 1.25;
83
+ margin: var(--spacing-4) 0 var(--spacing-2);
84
+ }
85
+
86
+ .content-grid main h4 {
87
+ font-weight: 600;
88
+ text-transform: uppercase;
89
+ font-size: 14px;
90
+ line-height: 1.2;
91
+ margin: var(--spacing-3) 0 var(--spacing-2);
92
+ }
93
+
94
+ .content-grid main a { color: inherit; text-decoration: none; border-bottom: 1px solid var(--link-underline); }
95
+ .content-grid main a:hover { border-bottom: 1px solid var(--link-underline-hover); }
96
+
97
+ /* Ne pas souligner les liens de titres dans l'article (pas le TOC) */
98
+ .content-grid main h2 a,
99
+ .content-grid main h3 a,
100
+ .content-grid main h4 a { border-bottom: none; text-decoration: none; }
101
+ .content-grid main h2 a:hover,
102
+ .content-grid main h3 a:hover,
103
+ .content-grid main h4 a:hover { border-bottom: none; text-decoration: none; }
104
+
105
+ .content-grid main ul,
106
+ .content-grid main ol { padding-left: 24px; margin: 0 0 var(--spacing-3); }
107
+ .content-grid main li { margin-bottom: var(--spacing-2); }
108
+ .content-grid main li:last-child { margin-bottom: 0; }
109
+
110
+ .content-grid main blockquote {
111
+ border-left: 2px solid var(--border-color);
112
+ padding-left: var(--spacing-4);
113
+ font-style: italic;
114
+ color: var(--muted-color);
115
+ margin: var(--spacing-4) 0;
116
+ }
117
+
118
+ .content-grid main pre { background: var(--code-bg); border: 1px solid var(--border-color); border-radius: 6px; padding: var(--spacing-3); font-size: 14px; overflow: auto; }
119
+ .content-grid main code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
120
+
121
+ .content-grid main table { border-collapse: collapse; width: 100%; margin: 0 0 var(--spacing-4); }
122
+ .content-grid main th, .content-grid main td { border-bottom: 1px solid var(--border-color); padding: 6px 8px; text-align: left; font-size: 15px; }
123
+ .content-grid main thead th { border-bottom: 1px solid var(--border-color); }
124
+
125
+ .content-grid main hr { border: none; border-bottom: 1px solid var(--border-color); margin: var(--spacing-5) 0; }
126
+
127
+ // ============================================================================
128
+ // Media / Figures
129
+ // ============================================================================
130
+ :where(picture, img) {
131
+ max-width: 100%;
132
+ width: 100%;
133
+ height: auto;
134
+ display: block;
135
+ }
136
+
137
+ figure { margin: 16px 0; }
138
+ figcaption { color: var(--muted-color); font-size: 12px; }
139
+
140
+ // ============================================================================
141
+ // Hero (full-bleed)
142
+ // ============================================================================
143
+ .hero { width: 100%; padding: 48px 16px 16px; text-align: center; }
144
+ .hero-title { font-size: clamp(28px, 4vw, 48px); font-weight: 800; line-height: 1.1; margin: 0 0 8px;
145
+
146
+ max-width: 60%;
147
+ margin: auto;}
148
+ .hero-banner { max-width: 980px; margin: 0 auto; }
149
+ .hero-desc { color: var(--muted-color); font-style: italic; margin: 0 0 16px 0; }
150
+
151
+ // ============================================================================
152
+ // Meta (byline-like header)
153
+ // ============================================================================
154
+
155
+ .meta {
156
+ border-top: 1px solid var(--border-color);
157
+ border-bottom: 1px solid var(--border-color);
158
+ padding: 1rem 0;
159
+ font-size: 0.9rem;
160
+ line-height: 1.8em;
161
+ }
162
+ .meta-container {
163
+ max-width: 720px;
164
+ display: flex;
165
+ flex-direction: row;
166
+ justify-content: space-between;
167
+ margin: 0 auto;
168
+ gap: 8px;
169
+ }
170
+ .meta-container-cell {
171
+ display: flex;
172
+ flex-direction: column;
173
+ gap: 8px;
174
+ }
175
+ .meta-container-cell h3 {
176
+ margin: 0;
177
+ font-size: 12px;
178
+ font-weight: 400;
179
+ color: var(--muted-color);
180
+ text-transform: uppercase;
181
+ letter-spacing: .02em;
182
+ }
183
+ .meta-container-cell p { margin: 0; }
184
+
185
+ // ============================================================================
186
+ // Layout – 3-column grid (TOC / Article / Aside)
187
+ // ============================================================================
188
+ .content-grid { max-width: 1280px; margin: 0 auto; padding: 0 16px; margin-top: 40px; display: grid; grid-template-columns: 220px minmax(0, 680px) 260px; gap: 32px; align-items: start; }
189
+ .content-grid > main { max-width: 100%; margin: 0; padding: 0; }
190
+
191
+ // TOC (left column)
192
+ .toc { position: sticky; top: 24px; }
193
+ .toc nav { border-left: 1px solid var(--border-color); padding-left: 16px; font-size: 13px; }
194
+ .toc .title { font-weight: 600; font-size: 14px; margin-bottom: 8px; }
195
+
196
+ // Hide in-article TOC (duplicated by sticky aside)
197
+ main > nav:first-of-type { display: none; }
198
+
199
+ // TOC look & feel
200
+ .toc nav ul { margin: 0 0 6px; padding-left: 1em; }
201
+ .toc nav li { list-style: none; margin: .25em 0; }
202
+ .toc nav a { color: var(--text-color); text-decoration: none; border-bottom: none; }
203
+ .toc nav > ul > li > a { font-weight: 700; }
204
+ .toc nav a:hover { text-decoration: underline solid var(--muted-color); }
205
+ .toc nav a.active { text-decoration: underline; }
206
+
207
+ // Right aside (notes)
208
+ .right-aside { position: sticky; top: 24px; }
209
+ .right-aside .aside-card { background: var(--surface-bg); border: 1px solid var(--border-color); border-radius: 8px; padding: 10px; margin-bottom: 10px; font-size: 0.9rem; color: var(--text-color); }
210
+
211
+ // Responsive – collapse to single column
212
+ @media (max-width: 1100px) {
213
+ .content-grid { grid-template-columns: 1fr; }
214
+ .toc { position: static; }
215
+ .right-aside { display: none; }
216
+ main > nav:first-of-type { display: block; }
217
+ }
218
+
219
+ // ============================================================================
220
+ // Plotly – fragments & controls
221
+ // ============================================================================
222
+ .plot-card { background: var(--code-bg); border: 1px solid var(--border-color); border-radius: 10px; padding: 8px; margin: 8px 0; }
223
+ .plotly-graph-div { width: 100% !important; min-height: 320px; }
224
+ @media (max-width: 768px) { .plotly-graph-div { min-height: 260px; } }
225
+ [id^="plot-"] { display: flex; flex-direction: column; align-items: center; gap: 15px; }
226
+ .plotly_caption { font-style: italic; margin-top: 10px; }
227
+ .plotly_controls { display: flex; flex-wrap: wrap; justify-content: center; gap: 30px; }
228
+ .plotly_input_container { display: flex; align-items: center; flex-direction: column; gap: 10px; }
229
+ .plotly_input_container > select { padding: 2px 4px; line-height: 1.5em; text-align: center; border-radius: 4px; font-size: 12px; background-color: var(--distill-gray-lightest); outline: none; border: 1px solid var(--distill-gray-lighter); }
230
+ .plotly_slider { display: flex; align-items: center; gap: 10px; }
231
+ .plotly_slider > input[type="range"] { -webkit-appearance: none; appearance: none; height: 2px; background: var(--distill-gray-light); border-radius: 5px; outline: none; }
232
+ .plotly_slider > input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--distill-blue); cursor: pointer; }
233
+ .plotly_slider > input[type="range"]::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: var(--distill-blue); cursor: pointer; }
234
+ .plotly_slider > span { font-size: 14px; line-height: 1.6em; min-width: 16px; }
235
+
236
+ // ============================================================================
237
+ // Theme Toggle button (moved from component)
238
+ // ============================================================================
239
+ #theme-toggle { display: inline-flex; align-items: center; gap: 8px; border: none; background: transparent; padding: 6px 10px; border-radius: 8px; cursor: pointer; margin: 12px 16px; }
240
+ #theme-toggle .icon.dark { display: none; }
241
+ [data-theme="dark"] #theme-toggle .icon.light { display: none; }
242
+ [data-theme="dark"] #theme-toggle .icon.dark { display: inline; }
243
+ [data-theme="dark"] #theme-toggle .icon { filter: invert(1) brightness(1.2); }
package-lock.json ADDED
Binary file (16.3 kB). View file
 
package.json ADDED
Binary file (53 Bytes). View file
 
python/fragments/banner.py CHANGED
@@ -2,50 +2,92 @@ import plotly.graph_objects as go
2
  import numpy as np
3
  import pandas as pd
4
 
5
- # Paramètres de l'ellipse (galaxie) et échantillonnage
6
- num_points = 512
7
- cx, cy = 1.5, 0.5 # centre (au milieu des ranges actuels)
8
- a, b = 1.3, 0.45 # demi‑axes (ellipse horizontale)
9
 
10
- # Échantillonnage en coordonnées polaires puis transformation elliptique
11
- # r concentré vers le centre (alpha>1) pour densité centrale façon galaxie
12
- theta = 2*np.pi*np.random.rand(num_points)
13
- r_base = np.random.rand(num_points)**2
 
 
14
 
15
- # Légère irrégularité pour un aspect plus naturel
16
- noise_x = 0.015*np.random.randn(num_points)
17
- noise_y = 0.015*np.random.randn(num_points)
 
18
 
19
- x = cx + a * r_base * np.cos(theta) + noise_x
20
- y = cy + b * r_base * np.sin(theta) + noise_y
21
 
22
- # Taille plus grande au centre, plus petite en périphérie
23
- # On conserve la même échelle finale qu'avant: (valeur in [0,1]) -> (val+1)*5
24
- z_raw = 1 - r_base # 1 au centre, 0 au bord
25
- sizes = (z_raw + 1) * 5 # 5..10, comme précédemment
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
  df = pd.DataFrame({
28
  "x": x,
29
  "y": y,
30
- "z": sizes, # réutilisé pour size+color comme avant
31
  })
32
 
33
  def get_label(z):
34
- if z<0.25:
35
  return "smol dot"
36
- if z<0.5:
37
  return "ok-ish dot"
38
- if z<0.75:
39
  return "a dot"
40
  else:
41
  return "biiig dot"
42
 
43
- # Les labels sont fondés sur l'intensité centrale (z_raw en [0,1])
44
  df["label"] = pd.Series(z_raw).apply(get_label)
45
 
46
  fig = go.Figure()
47
 
48
- fig.add_trace(go.Scatter(
49
  x=df['x'],
50
  y=df['y'],
51
  mode='markers',
@@ -53,19 +95,18 @@ fig.add_trace(go.Scatter(
53
  size=df['z'],
54
  color=df['z'],
55
  colorscale=[
56
- [0, 'rgb(78, 165, 183)'], # Light blue
57
- [0.5, 'rgb(206, 192, 250)'], # Purple
58
- [1, 'rgb(232, 137, 171)'] # Pink
59
  ],
60
  opacity=0.9,
61
  ),
62
- customdata=df[["label"]],
63
  hovertemplate="Dot category: %{customdata[0]}",
64
  hoverlabel=dict(namelength=0),
65
  showlegend=False
66
  ))
67
 
68
-
69
  fig.update_layout(
70
  autosize=True,
71
  paper_bgcolor='rgba(0,0,0,0)',
@@ -88,13 +129,15 @@ fig.update_layout(
88
  )
89
  )
90
 
91
- fig.show()
92
 
93
- fig.write_html("../../src/fragments/banner.html",
94
- include_plotlyjs=False,
95
- full_html=False,
96
- config={
97
- 'displayModeBar': False,
98
- 'responsive': True,
99
- 'scrollZoom': False,
100
- })
 
 
 
2
  import numpy as np
3
  import pandas as pd
4
 
5
+ # Paramètres de la scène (mêmes ranges que l'intégration Astro)
6
+ cx, cy = 1.5, 0.5 # centre
7
+ a, b = 1.3, 0.45 # étendue max en x/y (ellipse pour l'anisotropie)
 
8
 
9
+ # Paramètres de la galaxie en spirale
10
+ num_points = 3000 # plus de dots
11
+ num_arms = 3 # nombre de bras spiraux
12
+ num_turns = 2.1 # nombre de tours par bras
13
+ angle_jitter = 0.12 # écart angulaire pour évaser les bras
14
+ pos_noise = 0.015 # bruit de position global
15
 
16
+ # Génération des points sur des bras spiraux (spirale d'Archimède)
17
+ t = np.random.rand(num_points) * (2 * np.pi * num_turns) # progression le long du bras
18
+ arm_indices = np.random.randint(0, num_arms, size=num_points)
19
+ arm_offsets = arm_indices * (2 * np.pi / num_arms)
20
 
21
+ theta = t + arm_offsets + np.random.randn(num_points) * angle_jitter
 
22
 
23
+ # Rayon normalisé (0->centre, 1->bord). Puissance <1 pour densifier le centre
24
+ r_norm = (t / (2 * np.pi * num_turns)) ** 0.9
25
+
26
+ # Bruit radial/lateral qui augmente légèrement avec le rayon
27
+ noise_x = pos_noise * (0.8 + 0.6 * r_norm) * np.random.randn(num_points)
28
+ noise_y = pos_noise * (0.8 + 0.6 * r_norm) * np.random.randn(num_points)
29
+
30
+ # Projection elliptique
31
+ x_spiral = cx + a * r_norm * np.cos(theta) + noise_x
32
+ y_spiral = cy + b * r_norm * np.sin(theta) + noise_y
33
+
34
+ # Bulbe central (points supplémentaires très proches du centre)
35
+ bulge_points = int(0.18 * num_points)
36
+ phi_b = 2 * np.pi * np.random.rand(bulge_points)
37
+ r_b = (np.random.rand(bulge_points) ** 2.2) * 0.22 # bulbe compact
38
+ noise_x_b = (pos_noise * 0.6) * np.random.randn(bulge_points)
39
+ noise_y_b = (pos_noise * 0.6) * np.random.randn(bulge_points)
40
+ x_bulge = cx + a * r_b * np.cos(phi_b) + noise_x_b
41
+ y_bulge = cy + b * r_b * np.sin(phi_b) + noise_y_b
42
+
43
+ # Concaténation
44
+ x = np.concatenate([x_spiral, x_bulge])
45
+ y = np.concatenate([y_spiral, y_bulge])
46
+
47
+ # Intensité centrale (pour tailles/couleurs). 1 au centre, ~0 au bord
48
+ z_spiral = 1 - r_norm
49
+ z_bulge = 1 - (r_b / max(r_b.max(), 1e-6)) # bulbe très lumineux
50
+ z_raw = np.concatenate([z_spiral, z_bulge])
51
+
52
+ # Tailles: conserver l'échelle 5..10 pour cohérence
53
+ sizes = (z_raw + 1) * 5
54
+
55
+ # Filtrer les petits points proches du centre (esthétique du bulbe)
56
+ # - on calcule le rayon elliptique normalisé
57
+ # - on retire les points de petite taille situés trop près du centre
58
+ central_radius_cut = 0.18
59
+ min_size_center = 7.5
60
+ r_total = np.sqrt(((x - cx) / a) ** 2 + ((y - cy) / b) ** 2)
61
+ mask = ~((r_total <= central_radius_cut) & (sizes < min_size_center))
62
+
63
+ # Appliquer le masque
64
+ x = x[mask]
65
+ y = y[mask]
66
+ z_raw = z_raw[mask]
67
+ sizes = sizes[mask]
68
 
69
  df = pd.DataFrame({
70
  "x": x,
71
  "y": y,
72
+ "z": sizes, # réutilisé pour size+color comme avant
73
  })
74
 
75
  def get_label(z):
76
+ if z < 0.25:
77
  return "smol dot"
78
+ if z < 0.5:
79
  return "ok-ish dot"
80
+ if z < 0.75:
81
  return "a dot"
82
  else:
83
  return "biiig dot"
84
 
85
+ # Labels basés sur l'intensité centrale
86
  df["label"] = pd.Series(z_raw).apply(get_label)
87
 
88
  fig = go.Figure()
89
 
90
+ fig.add_trace(go.Scattergl(
91
  x=df['x'],
92
  y=df['y'],
93
  mode='markers',
 
95
  size=df['z'],
96
  color=df['z'],
97
  colorscale=[
98
+ [0, 'rgb(78, 165, 183)'],
99
+ [0.5, 'rgb(206, 192, 250)'],
100
+ [1, 'rgb(232, 137, 171)']
101
  ],
102
  opacity=0.9,
103
  ),
104
+ customdata=df[["label"]],
105
  hovertemplate="Dot category: %{customdata[0]}",
106
  hoverlabel=dict(namelength=0),
107
  showlegend=False
108
  ))
109
 
 
110
  fig.update_layout(
111
  autosize=True,
112
  paper_bgcolor='rgba(0,0,0,0)',
 
129
  )
130
  )
131
 
132
+ # fig.show()
133
 
134
+ fig.write_html(
135
+ "../app/src/fragments/banner.html",
136
+ include_plotlyjs=False,
137
+ full_html=False,
138
+ config={
139
+ 'displayModeBar': False,
140
+ 'responsive': True,
141
+ 'scrollZoom': False,
142
+ }
143
+ )
python/fragments/bar.py CHANGED
@@ -105,27 +105,12 @@ post_script = """
105
  })();
106
  """
107
 
108
- html = pio.to_html(
109
- fig,
110
- include_plotlyjs=False,
111
- full_html=False,
112
- post_script=post_script,
113
- config={
114
- "displayModeBar": False,
115
- "responsive": True,
116
- "scrollZoom": False,
117
- "doubleClick": False,
118
- "modeBarButtonsToRemove": [
119
- "zoom2d", "pan2d", "select2d", "lasso2d",
120
- "zoomIn2d", "zoomOut2d", "autoScale2d", "resetScale2d",
121
- "toggleSpikelines"
122
- ],
123
- },
124
- )
125
-
126
- output_path = os.path.join(os.path.dirname(__file__), "fragments", "bar.html")
127
- os.makedirs(os.path.dirname(output_path), exist_ok=True)
128
- with open(output_path, "w", encoding="utf-8") as f:
129
- f.write(html)
130
-
131
 
 
105
  })();
106
  """
107
 
108
+ fig.write_html("../app/src/fragments/bar.html",
109
+ include_plotlyjs=False,
110
+ full_html=False,
111
+ config={
112
+ 'displayModeBar': False,
113
+ 'responsive': True,
114
+ 'scrollZoom': False,
115
+ })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
python/fragments/heatmap.py CHANGED
@@ -114,9 +114,12 @@ html = pio.to_html(
114
  },
115
  )
116
 
117
- output_path = os.path.join(os.path.dirname(__file__), "fragments", "heatmap.html")
118
- os.makedirs(os.path.dirname(output_path), exist_ok=True)
119
- with open(output_path, "w", encoding="utf-8") as f:
120
- f.write(html)
121
-
 
 
 
122
 
 
114
  },
115
  )
116
 
117
+ fig.write_html("../app/src/fragments/heatmap.html",
118
+ include_plotlyjs=False,
119
+ full_html=False,
120
+ config={
121
+ 'displayModeBar': False,
122
+ 'responsive': True,
123
+ 'scrollZoom': False,
124
+ })
125
 
python/fragments/line.py CHANGED
@@ -237,7 +237,12 @@ slider_html = (slider_tpl
237
  .replace('__PLOT__', html_plot)
238
  )
239
 
240
- with open(output_path, 'w', encoding='utf-8') as f:
241
- f.write(slider_html)
242
-
 
 
 
 
 
243
 
 
237
  .replace('__PLOT__', html_plot)
238
  )
239
 
240
+ fig.write_html("../app/src/fragments/line.html",
241
+ include_plotlyjs=False,
242
+ full_html=False,
243
+ config={
244
+ 'displayModeBar': False,
245
+ 'responsive': True,
246
+ 'scrollZoom': False,
247
+ })
248
 
python/poetry.lock ADDED
@@ -0,0 +1,511 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
2
+
3
+ [[package]]
4
+ name = "certifi"
5
+ version = "2025.8.3"
6
+ description = "Python package for providing Mozilla's CA Bundle."
7
+ optional = false
8
+ python-versions = ">=3.7"
9
+ groups = ["main"]
10
+ files = [
11
+ {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"},
12
+ {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"},
13
+ ]
14
+
15
+ [[package]]
16
+ name = "charset-normalizer"
17
+ version = "3.4.3"
18
+ description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
19
+ optional = false
20
+ python-versions = ">=3.7"
21
+ groups = ["main"]
22
+ files = [
23
+ {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"},
24
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"},
25
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"},
26
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"},
27
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"},
28
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"},
29
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"},
30
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"},
31
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"},
32
+ {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"},
33
+ {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"},
34
+ {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"},
35
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"},
36
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"},
37
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"},
38
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"},
39
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"},
40
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"},
41
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"},
42
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"},
43
+ {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"},
44
+ {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"},
45
+ {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"},
46
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"},
47
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"},
48
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"},
49
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"},
50
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"},
51
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"},
52
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"},
53
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"},
54
+ {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"},
55
+ {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"},
56
+ {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"},
57
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"},
58
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"},
59
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"},
60
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"},
61
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"},
62
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"},
63
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"},
64
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"},
65
+ {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"},
66
+ {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"},
67
+ {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"},
68
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"},
69
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"},
70
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"},
71
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"},
72
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"},
73
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"},
74
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"},
75
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"},
76
+ {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"},
77
+ {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"},
78
+ {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"},
79
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"},
80
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"},
81
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"},
82
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"},
83
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"},
84
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"},
85
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"},
86
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"},
87
+ {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"},
88
+ {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"},
89
+ {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"},
90
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"},
91
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"},
92
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"},
93
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"},
94
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"},
95
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"},
96
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"},
97
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"},
98
+ {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"},
99
+ {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"},
100
+ {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"},
101
+ {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"},
102
+ ]
103
+
104
+ [[package]]
105
+ name = "idna"
106
+ version = "3.10"
107
+ description = "Internationalized Domain Names in Applications (IDNA)"
108
+ optional = false
109
+ python-versions = ">=3.6"
110
+ groups = ["main"]
111
+ files = [
112
+ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
113
+ {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
114
+ ]
115
+
116
+ [package.extras]
117
+ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
118
+
119
+ [[package]]
120
+ name = "markdown"
121
+ version = "3.8.2"
122
+ description = "Python implementation of John Gruber's Markdown."
123
+ optional = false
124
+ python-versions = ">=3.9"
125
+ groups = ["main"]
126
+ files = [
127
+ {file = "markdown-3.8.2-py3-none-any.whl", hash = "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24"},
128
+ {file = "markdown-3.8.2.tar.gz", hash = "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45"},
129
+ ]
130
+
131
+ [package.extras]
132
+ docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
133
+ testing = ["coverage", "pyyaml"]
134
+
135
+ [[package]]
136
+ name = "numpy"
137
+ version = "2.2.6"
138
+ description = "Fundamental package for array computing in Python"
139
+ optional = false
140
+ python-versions = ">=3.10"
141
+ groups = ["main"]
142
+ markers = "python_version == \"3.10\""
143
+ files = [
144
+ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"},
145
+ {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"},
146
+ {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163"},
147
+ {file = "numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf"},
148
+ {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83"},
149
+ {file = "numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915"},
150
+ {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680"},
151
+ {file = "numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289"},
152
+ {file = "numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d"},
153
+ {file = "numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3"},
154
+ {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"},
155
+ {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"},
156
+ {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"},
157
+ {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"},
158
+ {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"},
159
+ {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"},
160
+ {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"},
161
+ {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"},
162
+ {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"},
163
+ {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"},
164
+ {file = "numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff"},
165
+ {file = "numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c"},
166
+ {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3"},
167
+ {file = "numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282"},
168
+ {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87"},
169
+ {file = "numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249"},
170
+ {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49"},
171
+ {file = "numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de"},
172
+ {file = "numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4"},
173
+ {file = "numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2"},
174
+ {file = "numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84"},
175
+ {file = "numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b"},
176
+ {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d"},
177
+ {file = "numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566"},
178
+ {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f"},
179
+ {file = "numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f"},
180
+ {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868"},
181
+ {file = "numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d"},
182
+ {file = "numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd"},
183
+ {file = "numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c"},
184
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6"},
185
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda"},
186
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40"},
187
+ {file = "numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8"},
188
+ {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f"},
189
+ {file = "numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa"},
190
+ {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571"},
191
+ {file = "numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1"},
192
+ {file = "numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff"},
193
+ {file = "numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06"},
194
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d"},
195
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db"},
196
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543"},
197
+ {file = "numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00"},
198
+ {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"},
199
+ ]
200
+
201
+ [[package]]
202
+ name = "numpy"
203
+ version = "2.3.2"
204
+ description = "Fundamental package for array computing in Python"
205
+ optional = false
206
+ python-versions = ">=3.11"
207
+ groups = ["main"]
208
+ markers = "python_version >= \"3.11\""
209
+ files = [
210
+ {file = "numpy-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:852ae5bed3478b92f093e30f785c98e0cb62fa0a939ed057c31716e18a7a22b9"},
211
+ {file = "numpy-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a0e27186e781a69959d0230dd9909b5e26024f8da10683bd6344baea1885168"},
212
+ {file = "numpy-2.3.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f0a1a8476ad77a228e41619af2fa9505cf69df928e9aaa165746584ea17fed2b"},
213
+ {file = "numpy-2.3.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cbc95b3813920145032412f7e33d12080f11dc776262df1712e1638207dde9e8"},
214
+ {file = "numpy-2.3.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75018be4980a7324edc5930fe39aa391d5734531b1926968605416ff58c332d"},
215
+ {file = "numpy-2.3.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20b8200721840f5621b7bd03f8dcd78de33ec522fc40dc2641aa09537df010c3"},
216
+ {file = "numpy-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f91e5c028504660d606340a084db4b216567ded1056ea2b4be4f9d10b67197f"},
217
+ {file = "numpy-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fb1752a3bb9a3ad2d6b090b88a9a0ae1cd6f004ef95f75825e2f382c183b2097"},
218
+ {file = "numpy-2.3.2-cp311-cp311-win32.whl", hash = "sha256:4ae6863868aaee2f57503c7a5052b3a2807cf7a3914475e637a0ecd366ced220"},
219
+ {file = "numpy-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:240259d6564f1c65424bcd10f435145a7644a65a6811cfc3201c4a429ba79170"},
220
+ {file = "numpy-2.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:4209f874d45f921bde2cff1ffcd8a3695f545ad2ffbef6d3d3c6768162efab89"},
221
+ {file = "numpy-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bc3186bea41fae9d8e90c2b4fb5f0a1f5a690682da79b92574d63f56b529080b"},
222
+ {file = "numpy-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f4f0215edb189048a3c03bd5b19345bdfa7b45a7a6f72ae5945d2a28272727f"},
223
+ {file = "numpy-2.3.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b1224a734cd509f70816455c3cffe13a4f599b1bf7130f913ba0e2c0b2006c0"},
224
+ {file = "numpy-2.3.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3dcf02866b977a38ba3ec10215220609ab9667378a9e2150615673f3ffd6c73b"},
225
+ {file = "numpy-2.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:572d5512df5470f50ada8d1972c5f1082d9a0b7aa5944db8084077570cf98370"},
226
+ {file = "numpy-2.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8145dd6d10df13c559d1e4314df29695613575183fa2e2d11fac4c208c8a1f73"},
227
+ {file = "numpy-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:103ea7063fa624af04a791c39f97070bf93b96d7af7eb23530cd087dc8dbe9dc"},
228
+ {file = "numpy-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc927d7f289d14f5e037be917539620603294454130b6de200091e23d27dc9be"},
229
+ {file = "numpy-2.3.2-cp312-cp312-win32.whl", hash = "sha256:d95f59afe7f808c103be692175008bab926b59309ade3e6d25009e9a171f7036"},
230
+ {file = "numpy-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:9e196ade2400c0c737d93465327d1ae7c06c7cb8a1756121ebf54b06ca183c7f"},
231
+ {file = "numpy-2.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:ee807923782faaf60d0d7331f5e86da7d5e3079e28b291973c545476c2b00d07"},
232
+ {file = "numpy-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c8d9727f5316a256425892b043736d63e89ed15bbfe6556c5ff4d9d4448ff3b3"},
233
+ {file = "numpy-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:efc81393f25f14d11c9d161e46e6ee348637c0a1e8a54bf9dedc472a3fae993b"},
234
+ {file = "numpy-2.3.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dd937f088a2df683cbb79dda9a772b62a3e5a8a7e76690612c2737f38c6ef1b6"},
235
+ {file = "numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:11e58218c0c46c80509186e460d79fbdc9ca1eb8d8aee39d8f2dc768eb781089"},
236
+ {file = "numpy-2.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5ad4ebcb683a1f99f4f392cc522ee20a18b2bb12a2c1c42c3d48d5a1adc9d3d2"},
237
+ {file = "numpy-2.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:938065908d1d869c7d75d8ec45f735a034771c6ea07088867f713d1cd3bbbe4f"},
238
+ {file = "numpy-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66459dccc65d8ec98cc7df61307b64bf9e08101f9598755d42d8ae65d9a7a6ee"},
239
+ {file = "numpy-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7af9ed2aa9ec5950daf05bb11abc4076a108bd3c7db9aa7251d5f107079b6a6"},
240
+ {file = "numpy-2.3.2-cp313-cp313-win32.whl", hash = "sha256:906a30249315f9c8e17b085cc5f87d3f369b35fedd0051d4a84686967bdbbd0b"},
241
+ {file = "numpy-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:c63d95dc9d67b676e9108fe0d2182987ccb0f11933c1e8959f42fa0da8d4fa56"},
242
+ {file = "numpy-2.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:b05a89f2fb84d21235f93de47129dd4f11c16f64c87c33f5e284e6a3a54e43f2"},
243
+ {file = "numpy-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e6ecfeddfa83b02318f4d84acf15fbdbf9ded18e46989a15a8b6995dfbf85ab"},
244
+ {file = "numpy-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:508b0eada3eded10a3b55725b40806a4b855961040180028f52580c4729916a2"},
245
+ {file = "numpy-2.3.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:754d6755d9a7588bdc6ac47dc4ee97867271b17cee39cb87aef079574366db0a"},
246
+ {file = "numpy-2.3.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f66e7d2b2d7712410d3bc5684149040ef5f19856f20277cd17ea83e5006286"},
247
+ {file = "numpy-2.3.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de6ea4e5a65d5a90c7d286ddff2b87f3f4ad61faa3db8dabe936b34c2275b6f8"},
248
+ {file = "numpy-2.3.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3ef07ec8cbc8fc9e369c8dcd52019510c12da4de81367d8b20bc692aa07573a"},
249
+ {file = "numpy-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:27c9f90e7481275c7800dc9c24b7cc40ace3fdb970ae4d21eaff983a32f70c91"},
250
+ {file = "numpy-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:07b62978075b67eee4065b166d000d457c82a1efe726cce608b9db9dd66a73a5"},
251
+ {file = "numpy-2.3.2-cp313-cp313t-win32.whl", hash = "sha256:c771cfac34a4f2c0de8e8c97312d07d64fd8f8ed45bc9f5726a7e947270152b5"},
252
+ {file = "numpy-2.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:72dbebb2dcc8305c431b2836bcc66af967df91be793d63a24e3d9b741374c450"},
253
+ {file = "numpy-2.3.2-cp313-cp313t-win_arm64.whl", hash = "sha256:72c6df2267e926a6d5286b0a6d556ebe49eae261062059317837fda12ddf0c1a"},
254
+ {file = "numpy-2.3.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:448a66d052d0cf14ce9865d159bfc403282c9bc7bb2a31b03cc18b651eca8b1a"},
255
+ {file = "numpy-2.3.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:546aaf78e81b4081b2eba1d105c3b34064783027a06b3ab20b6eba21fb64132b"},
256
+ {file = "numpy-2.3.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:87c930d52f45df092f7578889711a0768094debf73cfcde105e2d66954358125"},
257
+ {file = "numpy-2.3.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:8dc082ea901a62edb8f59713c6a7e28a85daddcb67454c839de57656478f5b19"},
258
+ {file = "numpy-2.3.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af58de8745f7fa9ca1c0c7c943616c6fe28e75d0c81f5c295810e3c83b5be92f"},
259
+ {file = "numpy-2.3.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed5527c4cf10f16c6d0b6bee1f89958bccb0ad2522c8cadc2efd318bcd545f5"},
260
+ {file = "numpy-2.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:095737ed986e00393ec18ec0b21b47c22889ae4b0cd2d5e88342e08b01141f58"},
261
+ {file = "numpy-2.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5e40e80299607f597e1a8a247ff8d71d79c5b52baa11cc1cce30aa92d2da6e0"},
262
+ {file = "numpy-2.3.2-cp314-cp314-win32.whl", hash = "sha256:7d6e390423cc1f76e1b8108c9b6889d20a7a1f59d9a60cac4a050fa734d6c1e2"},
263
+ {file = "numpy-2.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:b9d0878b21e3918d76d2209c924ebb272340da1fb51abc00f986c258cd5e957b"},
264
+ {file = "numpy-2.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:2738534837c6a1d0c39340a190177d7d66fdf432894f469728da901f8f6dc910"},
265
+ {file = "numpy-2.3.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4d002ecf7c9b53240be3bb69d80f86ddbd34078bae04d87be81c1f58466f264e"},
266
+ {file = "numpy-2.3.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:293b2192c6bcce487dbc6326de5853787f870aeb6c43f8f9c6496db5b1781e45"},
267
+ {file = "numpy-2.3.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0a4f2021a6da53a0d580d6ef5db29947025ae8b35b3250141805ea9a32bbe86b"},
268
+ {file = "numpy-2.3.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9c144440db4bf3bb6372d2c3e49834cc0ff7bb4c24975ab33e01199e645416f2"},
269
+ {file = "numpy-2.3.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f92d6c2a8535dc4fe4419562294ff957f83a16ebdec66df0805e473ffaad8bd0"},
270
+ {file = "numpy-2.3.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cefc2219baa48e468e3db7e706305fcd0c095534a192a08f31e98d83a7d45fb0"},
271
+ {file = "numpy-2.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:76c3e9501ceb50b2ff3824c3589d5d1ab4ac857b0ee3f8f49629d0de55ecf7c2"},
272
+ {file = "numpy-2.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:122bf5ed9a0221b3419672493878ba4967121514b1d7d4656a7580cd11dddcbf"},
273
+ {file = "numpy-2.3.2-cp314-cp314t-win32.whl", hash = "sha256:6f1ae3dcb840edccc45af496f312528c15b1f79ac318169d094e85e4bb35fdf1"},
274
+ {file = "numpy-2.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:087ffc25890d89a43536f75c5fe8770922008758e8eeeef61733957041ed2f9b"},
275
+ {file = "numpy-2.3.2-cp314-cp314t-win_arm64.whl", hash = "sha256:092aeb3449833ea9c0bf0089d70c29ae480685dd2377ec9cdbbb620257f84631"},
276
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:14a91ebac98813a49bc6aa1a0dfc09513dcec1d97eaf31ca21a87221a1cdcb15"},
277
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:71669b5daae692189540cffc4c439468d35a3f84f0c88b078ecd94337f6cb0ec"},
278
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:69779198d9caee6e547adb933941ed7520f896fd9656834c300bdf4dd8642712"},
279
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2c3271cc4097beb5a60f010bcc1cc204b300bb3eafb4399376418a83a1c6373c"},
280
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8446acd11fe3dc1830568c941d44449fd5cb83068e5c70bd5a470d323d448296"},
281
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa098a5ab53fa407fded5870865c6275a5cd4101cfdef8d6fafc48286a96e981"},
282
+ {file = "numpy-2.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6936aff90dda378c09bea075af0d9c675fe3a977a9d2402f95a87f440f59f619"},
283
+ {file = "numpy-2.3.2.tar.gz", hash = "sha256:e0486a11ec30cdecb53f184d496d1c6a20786c81e55e41640270130056f8ee48"},
284
+ ]
285
+
286
+ [[package]]
287
+ name = "packaging"
288
+ version = "25.0"
289
+ description = "Core utilities for Python packages"
290
+ optional = false
291
+ python-versions = ">=3.8"
292
+ groups = ["main"]
293
+ files = [
294
+ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
295
+ {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
296
+ ]
297
+
298
+ [[package]]
299
+ name = "pandas"
300
+ version = "2.3.2"
301
+ description = "Powerful data structures for data analysis, time series, and statistics"
302
+ optional = false
303
+ python-versions = ">=3.9"
304
+ groups = ["main"]
305
+ files = [
306
+ {file = "pandas-2.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52bc29a946304c360561974c6542d1dd628ddafa69134a7131fdfd6a5d7a1a35"},
307
+ {file = "pandas-2.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:220cc5c35ffaa764dd5bb17cf42df283b5cb7fdf49e10a7b053a06c9cb48ee2b"},
308
+ {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c05e15111221384019897df20c6fe893b2f697d03c811ee67ec9e0bb5a3424"},
309
+ {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc03acc273c5515ab69f898df99d9d4f12c4d70dbfc24c3acc6203751d0804cf"},
310
+ {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d25c20a03e8870f6339bcf67281b946bd20b86f1a544ebbebb87e66a8d642cba"},
311
+ {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21bb612d148bb5860b7eb2c10faacf1a810799245afd342cf297d7551513fbb6"},
312
+ {file = "pandas-2.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:b62d586eb25cb8cb70a5746a378fc3194cb7f11ea77170d59f889f5dfe3cec7a"},
313
+ {file = "pandas-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1333e9c299adcbb68ee89a9bb568fc3f20f9cbb419f1dd5225071e6cddb2a743"},
314
+ {file = "pandas-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76972bcbd7de8e91ad5f0ca884a9f2c477a2125354af624e022c49e5bd0dfff4"},
315
+ {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98bdd7c456a05eef7cd21fd6b29e3ca243591fe531c62be94a2cc987efb5ac2"},
316
+ {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d81573b3f7db40d020983f78721e9bfc425f411e616ef019a10ebf597aedb2e"},
317
+ {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e190b738675a73b581736cc8ec71ae113d6c3768d0bd18bffa5b9a0927b0b6ea"},
318
+ {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c253828cb08f47488d60f43c5fc95114c771bbfff085da54bfc79cb4f9e3a372"},
319
+ {file = "pandas-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9467697b8083f9667b212633ad6aa4ab32436dcbaf4cd57325debb0ddef2012f"},
320
+ {file = "pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9"},
321
+ {file = "pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b"},
322
+ {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175"},
323
+ {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9"},
324
+ {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4"},
325
+ {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811"},
326
+ {file = "pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae"},
327
+ {file = "pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e"},
328
+ {file = "pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9"},
329
+ {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a"},
330
+ {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b"},
331
+ {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6"},
332
+ {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a"},
333
+ {file = "pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b"},
334
+ {file = "pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57"},
335
+ {file = "pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2"},
336
+ {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9"},
337
+ {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2"},
338
+ {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012"},
339
+ {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370"},
340
+ {file = "pandas-2.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88080a0ff8a55eac9c84e3ff3c7665b3b5476c6fbc484775ca1910ce1c3e0b87"},
341
+ {file = "pandas-2.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4a558c7620340a0931828d8065688b3cc5b4c8eb674bcaf33d18ff4a6870b4a"},
342
+ {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45178cf09d1858a1509dc73ec261bf5b25a625a389b65be2e47b559905f0ab6a"},
343
+ {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77cefe00e1b210f9c76c697fedd8fdb8d3dd86563e9c8adc9fa72b90f5e9e4c2"},
344
+ {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:13bd629c653856f00c53dc495191baa59bcafbbf54860a46ecc50d3a88421a96"},
345
+ {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:36d627906fd44b5fd63c943264e11e96e923f8de77d6016dc2f667b9ad193438"},
346
+ {file = "pandas-2.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a9d7ec92d71a420185dec44909c32e9a362248c4ae2238234b76d5be37f208cc"},
347
+ {file = "pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb"},
348
+ ]
349
+
350
+ [package.dependencies]
351
+ numpy = [
352
+ {version = ">=1.22.4", markers = "python_version < \"3.11\""},
353
+ {version = ">=1.23.2", markers = "python_version == \"3.11\""},
354
+ {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
355
+ ]
356
+ python-dateutil = ">=2.8.2"
357
+ pytz = ">=2020.1"
358
+ tzdata = ">=2022.7"
359
+
360
+ [package.extras]
361
+ all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
362
+ aws = ["s3fs (>=2022.11.0)"]
363
+ clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
364
+ compression = ["zstandard (>=0.19.0)"]
365
+ computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
366
+ consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
367
+ excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
368
+ feather = ["pyarrow (>=10.0.1)"]
369
+ fss = ["fsspec (>=2022.11.0)"]
370
+ gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
371
+ hdf5 = ["tables (>=3.8.0)"]
372
+ html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
373
+ mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
374
+ output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
375
+ parquet = ["pyarrow (>=10.0.1)"]
376
+ performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
377
+ plot = ["matplotlib (>=3.6.3)"]
378
+ postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
379
+ pyarrow = ["pyarrow (>=10.0.1)"]
380
+ spss = ["pyreadstat (>=1.2.0)"]
381
+ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
382
+ test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
383
+ xml = ["lxml (>=4.9.2)"]
384
+
385
+ [[package]]
386
+ name = "plotly"
387
+ version = "5.24.1"
388
+ description = "An open-source, interactive data visualization library for Python"
389
+ optional = false
390
+ python-versions = ">=3.8"
391
+ groups = ["main"]
392
+ files = [
393
+ {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"},
394
+ {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"},
395
+ ]
396
+
397
+ [package.dependencies]
398
+ packaging = "*"
399
+ tenacity = ">=6.2.0"
400
+
401
+ [[package]]
402
+ name = "python-dateutil"
403
+ version = "2.9.0.post0"
404
+ description = "Extensions to the standard Python datetime module"
405
+ optional = false
406
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
407
+ groups = ["main"]
408
+ files = [
409
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
410
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
411
+ ]
412
+
413
+ [package.dependencies]
414
+ six = ">=1.5"
415
+
416
+ [[package]]
417
+ name = "pytz"
418
+ version = "2025.2"
419
+ description = "World timezone definitions, modern and historical"
420
+ optional = false
421
+ python-versions = "*"
422
+ groups = ["main"]
423
+ files = [
424
+ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
425
+ {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
426
+ ]
427
+
428
+ [[package]]
429
+ name = "requests"
430
+ version = "2.32.5"
431
+ description = "Python HTTP for Humans."
432
+ optional = false
433
+ python-versions = ">=3.9"
434
+ groups = ["main"]
435
+ files = [
436
+ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"},
437
+ {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"},
438
+ ]
439
+
440
+ [package.dependencies]
441
+ certifi = ">=2017.4.17"
442
+ charset_normalizer = ">=2,<4"
443
+ idna = ">=2.5,<4"
444
+ urllib3 = ">=1.21.1,<3"
445
+
446
+ [package.extras]
447
+ socks = ["PySocks (>=1.5.6,!=1.5.7)"]
448
+ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
449
+
450
+ [[package]]
451
+ name = "six"
452
+ version = "1.17.0"
453
+ description = "Python 2 and 3 compatibility utilities"
454
+ optional = false
455
+ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
456
+ groups = ["main"]
457
+ files = [
458
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
459
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
460
+ ]
461
+
462
+ [[package]]
463
+ name = "tenacity"
464
+ version = "9.1.2"
465
+ description = "Retry code until it succeeds"
466
+ optional = false
467
+ python-versions = ">=3.9"
468
+ groups = ["main"]
469
+ files = [
470
+ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"},
471
+ {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"},
472
+ ]
473
+
474
+ [package.extras]
475
+ doc = ["reno", "sphinx"]
476
+ test = ["pytest", "tornado (>=4.5)", "typeguard"]
477
+
478
+ [[package]]
479
+ name = "tzdata"
480
+ version = "2025.2"
481
+ description = "Provider of IANA time zone data"
482
+ optional = false
483
+ python-versions = ">=2"
484
+ groups = ["main"]
485
+ files = [
486
+ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
487
+ {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
488
+ ]
489
+
490
+ [[package]]
491
+ name = "urllib3"
492
+ version = "2.5.0"
493
+ description = "HTTP library with thread-safe connection pooling, file post, and more."
494
+ optional = false
495
+ python-versions = ">=3.9"
496
+ groups = ["main"]
497
+ files = [
498
+ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"},
499
+ {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"},
500
+ ]
501
+
502
+ [package.extras]
503
+ brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
504
+ h2 = ["h2 (>=4,<5)"]
505
+ socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
506
+ zstd = ["zstandard (>=0.18.0)"]
507
+
508
+ [metadata]
509
+ lock-version = "2.1"
510
+ python-versions = ">=3.10,<3.13"
511
+ content-hash = "a7f64c43efcba78952701498a72a8fe503e995841717b2d5de4c9aa20c9a996a"
python/pyproject.toml ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [tool.poetry]
2
+ name = "blogpost-fine-tasks-python"
3
+ version = "0.1.0"
4
+ description = "Scripts de génération de fragments Plotly et conversions HTML/Markdown pour le blogpost."
5
+ package-mode = false
6
+
7
+ [tool.poetry.dependencies]
8
+ python = ">=3.10,<3.13"
9
+ Markdown = "^3.6"
10
+ requests = "^2.32.3"
11
+ numpy = "^2.0.0"
12
+ pandas = "^2.2.2"
13
+ plotly = "^5.24.0"
14
+
15
+ [tool.poetry.scripts]
16
+ html-to-md = "convert_to_md:main"
17
+
18
+ [build-system]
19
+ requires = ["poetry-core>=1.5.0"]
20
+ build-backend = "poetry.core.masonry.api"