@x-wave/blog 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-wave/blog",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -19,6 +19,10 @@
19
19
  "import": "./types/index.js",
20
20
  "types": "./types/index.d.ts"
21
21
  },
22
+ "./vite-config": {
23
+ "import": "./vite-config/index.ts",
24
+ "types": "./vite-config/index.ts"
25
+ },
22
26
  "./styles": {
23
27
  "import": "./styles/index.css"
24
28
  }
@@ -32,17 +36,16 @@
32
36
  "dependencies": {
33
37
  "@phosphor-icons/react": "^2.1.7",
34
38
  "i18next": "^25.8.8",
35
- "next-themes": "^0.4.6",
36
39
  "react-markdown": "^10.1.0",
37
40
  "remark-gfm": "^4.0.1",
38
41
  "styles": "workspace:*",
39
42
  "types": "workspace:*"
40
43
  },
41
44
  "peerDependencies": {
42
- "next": ">=15.0.0",
43
45
  "react": "^19.0.0",
44
46
  "react-dom": "^19.0.0",
45
- "react-i18next": "^15.7.3"
47
+ "react-i18next": "^15.7.3",
48
+ "react-router-dom": "^7.9.1"
46
49
  },
47
50
  "devDependencies": {
48
51
  "@vitejs/plugin-react-swc": "^3.10.1",
package/styles/index.css CHANGED
@@ -180,7 +180,7 @@
180
180
  /*
181
181
  Dark mode
182
182
  */
183
- .theme-dark {
183
+ .dark {
184
184
  --xw-background: oklch(0.145 0 0);
185
185
  --xw-foreground: oklch(0.985 0 0);
186
186
  --xw-card: oklch(0.205 0 0);
@@ -214,4 +214,4 @@
214
214
  --xw-sidebar-border: oklch(1 0 0 / 10%);
215
215
  --xw-sidebar-ring: oklch(0.556 0 0);
216
216
  }
217
- ._tabContainer_wncka_1{display:inline-flex;background-color:var(--xw-card);border:1px solid var(--xw-border);border-radius:.5rem;margin-top:.5rem;margin-bottom:.5rem;overflow:hidden}._tab_wncka_1{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._tab_wncka_1:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._tab_wncka_1:disabled{pointer-events:none;opacity:.5}._tab_wncka_1{padding:.5rem 1rem;font-size:.87rem;font-weight:500;background-color:transparent;border:none;border-radius:0;color:var(--xw-muted-foreground);cursor:pointer;white-space:nowrap}._tab_wncka_1:not(:last-child){border-right:1px solid var(--xw-border)}._tab_wncka_1._active_wncka_46{background-color:var(--xw-accent);color:var(--xw-accent-foreground)}._tab_wncka_1:hover:not(._active_wncka_46){background-color:var(--xw-muted);color:var(--xw-foreground)}._tab_wncka_1:focus-visible{outline:2px solid var(--xw-accent);outline-offset:-2px}._articleNavigation_kz84g_1{margin-top:3rem;padding-top:2rem;border-top:1px solid var(--xw-border)}._navContainer_kz84g_7{display:grid;grid-template-columns:1fr 1fr;gap:1rem}@media(max-width:767px){._navContainer_kz84g_7{grid-template-columns:1fr;gap:1rem}}@media(min-width:1024px){._navContainer_kz84g_7{gap:1.5rem}}._navLink_kz84g_24{display:flex;padding:1rem;border:1px solid var(--xw-border);border-radius:.5rem;text-decoration:none;color:var(--xw-foreground);background-color:var(--xw-background);transition:all .2s ease;box-shadow:0 1px 3px #0000000d}._navLink_kz84g_24:hover{border-color:var(--xw-ring);background-color:var(--xw-card);transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}._navLink_kz84g_24:first-child{justify-content:flex-start}@media(max-width:767px){._navLink_kz84g_24:first-child{justify-content:center;text-align:center}}._navLink_kz84g_24:last-child{justify-content:flex-end;text-align:right}@media(max-width:767px){._navLink_kz84g_24:last-child{justify-content:center;text-align:center}}._navLinkContent_kz84g_61{display:flex;align-items:center;gap:.75rem;min-width:0;width:100%}@media(max-width:767px){._navLinkContent_kz84g_61{justify-content:center;flex-direction:column;text-align:center}}._navIcon_kz84g_76{display:flex;align-items:center;color:var(--xw-primary);flex-shrink:0}._navText_kz84g_83{display:flex;flex-direction:column;gap:.25rem;min-width:0}._navLabel_kz84g_90{font-size:.75rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;color:var(--xw-muted-foreground)}._navTitle_kz84g_98{font-size:.875rem;font-weight:400;color:var(--xw-foreground);overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;line-height:1.4}@media(min-width:1024px){._navTitle_kz84g_98{font-size:.9rem}}._blogSidebar_1ik3q_1{position:sticky;top:0;align-self:flex-start;height:fit-content;max-height:calc(100vh - 8rem);overflow-y:auto;padding:0 0 2rem 1.5rem;margin-left:2rem;background:transparent;border-left:1px solid var(--xw-border);flex-shrink:0;width:250px}@media(max-width:1024px){._blogSidebar_1ik3q_1{display:none}}._section_1ik3q_21{margin-bottom:2rem}._section_1ik3q_21:last-child{margin-bottom:0}._sectionTitle_1ik3q_28{font-size:.75rem;font-weight:600;color:var(--xw-muted-foreground);letter-spacing:.05em;margin:0 0 1rem}._linksList_1ik3q_36{display:flex;flex-direction:column;gap:.25rem}._link_1ik3q_36{display:flex;align-items:center;gap:.5rem;padding:.5rem;color:var(--xw-foreground);text-decoration:none;border-radius:.25rem;transition:all .15s cubic-bezier(.4,0,.2,1);font-size:.875rem}._link_1ik3q_36:hover{color:var(--xw-primary)}._link_1ik3q_36 svg{flex-shrink:0}._breadcrumb_rarc4_1{margin-bottom:1rem}._breadcrumbList_rarc4_5{display:flex;align-items:center;list-style:none;margin:0;padding:0;font-size:.875rem;color:var(--xw-muted-foreground)}._breadcrumbItem_rarc4_15{display:flex;align-items:center;gap:.25rem}._breadcrumbLink_rarc4_21{background:none;border:none;cursor:pointer;color:var(--xw-link);text-decoration:none;font-size:inherit;padding:0;font-weight:500;transition:color .2s ease}._breadcrumbLink_rarc4_21:hover{color:var(--xw-primary);text-decoration:underline}._breadcrumbLink_rarc4_21:focus-visible{outline:2px solid var(--xw-primary);outline-offset:2px}._breadcrumbSeparator_rarc4_41{color:var(--xw-border);margin:0 .5rem}._breadcrumbCurrent_rarc4_46{color:var(--xw-foreground);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:20rem}@media(max-width:767px){._breadcrumbCurrent_rarc4_46{max-width:10rem}}._metadata_bsge0_1{display:flex;align-items:center;gap:1.5rem;margin-top:1rem;margin-bottom:1rem}._author_bsge0_9,._date_bsge0_10{display:flex;align-items:center;gap:.5rem;font-weight:500;font-size:.9rem}._author_bsge0_9 svg,._date_bsge0_10 svg{flex-shrink:0}._date_bsge0_10{color:var(--xw-text-secondary, #666)}._tableOfContents_9ofak_1{position:sticky;top:5rem;align-self:flex-start;height:fit-content;max-height:calc(100vh - 8rem);overflow-y:auto;padding:2rem 0 2rem 1.5rem;margin-left:2rem;background:transparent;border-left:1px solid var(--xw-border);flex-shrink:0;max-width:250px}@media(max-width:1024px){._tableOfContents_9ofak_1{display:none}}._header_9ofak_21{margin-bottom:1rem}._title_9ofak_25{font-size:.75rem;font-weight:500;color:var(--xw-muted-foreground);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem}._nav_9ofak_34 ul{margin:0;padding:0;list-style:none}._list_9ofak_40{display:flex;flex-direction:column;gap:.125rem;margin:0}._link_9ofak_47{display:block;width:100%;padding:.25rem 0;text-align:left;background:none;border:none;cursor:pointer;font-size:.875rem;line-height:1.4;color:var(--xw-muted-foreground);text-decoration:none;border-radius:.25rem;transition:all .15s cubic-bezier(.4,0,.2,1);position:relative;font-family:inherit}._link_9ofak_47:hover{color:var(--xw-foreground)}._link_9ofak_47:focus{outline:none;color:var(--xw-foreground)}._link_9ofak_47._active_9ofak_71{color:var(--xw-primary);font-weight:500}._link_9ofak_47._active_9ofak_71:before{content:"";position:absolute;left:-1.5rem;top:50%;transform:translateY(-50%);width:1px;height:1rem;background-color:var(--xw-primary);border-radius:.5px}._level1_9ofak_87{font-weight:500;padding-left:0;margin-bottom:.125rem}._level2_9ofak_93{padding-left:.5rem;margin-bottom:.0625rem}._level3_9ofak_98{padding-left:1rem;font-size:.8125rem;margin-bottom:.0625rem}._level4_9ofak_104{padding-left:1.5rem;font-size:.8125rem;margin-bottom:.0625rem}._level5_9ofak_110{padding-left:2rem;font-size:.75rem;margin-bottom:.0625rem}._level6_9ofak_116{padding-left:2.5rem;font-size:.75rem;margin-bottom:.0625rem}._tableOfContents_9ofak_1::-webkit-scrollbar{width:4px}._tableOfContents_9ofak_1::-webkit-scrollbar-track{background:transparent}._tableOfContents_9ofak_1::-webkit-scrollbar-thumb{background:var(--xw-border);border-radius:2px}._tableOfContents_9ofak_1::-webkit-scrollbar-thumb:hover{background:var(--xw-muted-foreground)}._overlay_1e1d4_1{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2000;display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;animation:_fadeIn_1e1d4_1 .2s ease;height:100vh}@keyframes _fadeIn_1e1d4_1{0%{opacity:0}to{opacity:1}}._modal_1e1d4_26{width:90%;max-width:600px;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.75rem;box-shadow:0 20px 60px #0000004d;animation:_slideIn_1e1d4_1 .2s ease;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}@keyframes _slideIn_1e1d4_1{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}._header_1e1d4_50{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid var(--xw-border)}._title_1e1d4_58{font-size:1.125rem;font-weight:600;color:var(--xw-foreground);margin:0}._closeButton_1e1d4_65{background:none;border:none;color:var(--xw-muted-foreground);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;border-radius:.25rem;transition:all .2s ease}._closeButton_1e1d4_65 svg{width:1.25rem;height:1.25rem}._closeButton_1e1d4_65:hover{background:var(--xw-secondary);color:var(--xw-foreground)}._results_1e1d4_86{flex:1;overflow-y:auto;padding:.5rem;min-height:200px;max-height:400px}._resultsList_1e1d4_94{list-style:none;padding:0;margin:0}._resultItem_1e1d4_100{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;width:100%;padding:.75rem 1rem;background:none;border:none;border-radius:.5rem;cursor:pointer;text-align:left;transition:all .15s ease;color:var(--xw-foreground)}._resultItem_1e1d4_100:hover{background:var(--xw-secondary)}._resultTitle_1e1d4_119{font-weight:500;font-size:.95rem}._resultSlug_1e1d4_124{font-size:.8rem;color:var(--xw-muted-foreground);opacity:.8}._noResults_1e1d4_130{padding:3rem 1rem;text-align:center;color:var(--xw-muted-foreground);font-size:.9rem}._tags_11t8a_1{display:flex;align-items:center;gap:.75rem;margin:2rem 0 1rem;padding:1rem 0 0;border-top:1px solid var(--xw-border)}._tags_11t8a_1._compact_11t8a_9{margin:2rem 0 1rem;padding:1rem 0 0;border-top:1px solid var(--xw-border)}._tagLabel_11t8a_15{display:flex;align-items:center;gap:.5rem;color:var(--xw-muted-foreground);font-size:.875rem;font-weight:500;white-space:nowrap}._tagIcon_11t8a_25{width:1.125rem;height:1.125rem}._tagList_11t8a_30{display:flex;flex-wrap:wrap;gap:.5rem}._tag_11t8a_1{display:inline-flex;align-items:center;padding:.25rem .75rem;background:none;border:1px solid var(--xw-border);border-radius:.75rem;color:var(--xw-muted-foreground);font-size:.8rem;font-weight:400;cursor:pointer;transition:all .2s ease}._tag_11t8a_1:hover{color:var(--xw-foreground);border-color:var(--xw-ring)}._contentPage_818m0_1{flex:1;max-width:48rem;margin:0;padding:0 0 2rem}@media(max-width:767px){._contentPage_818m0_1{padding:1rem;max-width:none}}@media(max-width:1024px){._contentPage_818m0_1{max-width:none;padding:2rem}}._metadata_818m0_20{display:flex;gap:1rem;align-items:center;padding:.5rem 0 1rem;color:var(--xw-muted-foreground);font-size:.875rem;border-bottom:1px solid var(--xw-border);margin-bottom:1rem}._metadata_818m0_20 ._author_818m0_30,._metadata_818m0_20 ._date_818m0_31{display:flex;align-items:center;gap:.5rem}._metadata_818m0_20 ._author_818m0_30{font-weight:500;color:var(--xw-foreground)}@media(max-width:767px){._metadata_818m0_20{flex-direction:column;align-items:flex-start;gap:.25rem}}._loadingContainer_818m0_48,._errorContainer_818m0_49{display:flex;align-items:center;justify-content:center;height:16rem}._loadingContainer_818m0_48{flex-direction:column;align-items:flex-start;gap:1.5rem;padding:2rem 0}@keyframes _shimmer_818m0_1{0%{background-position:-1000px 0}to{background-position:1000px 0}}._skeletonTitle_818m0_71{width:60%;height:2.5rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_818m0_1 2s infinite linear;border-radius:.5rem}._skeletonParagraph_818m0_80{width:100%;height:1rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_818m0_1 2s infinite linear;border-radius:.25rem;margin-bottom:.5rem}._skeletonParagraph_818m0_80:not(:last-child){margin-bottom:1rem}._skeletonParagraphShort_818m0_93{width:70%;height:1rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_818m0_1 2s infinite linear;border-radius:.25rem}._loadingText_818m0_102{color:var(--xw-muted-foreground);font-size:1rem}._errorText_818m0_107{color:var(--xw-destructive);font-size:1rem}._mdxContent_818m0_112{max-width:none}._mdxContent_818m0_112 h1{font-size:1.875rem;font-weight:600;letter-spacing:-.025em;margin-bottom:1.5rem;border-bottom:1px solid var(--xw-border);padding-bottom:.75rem;line-height:1.2;scroll-margin-top:5rem}._mdxContent_818m0_112 h1._withMetadata_818m0_125{border-bottom:none;padding-bottom:0;margin-bottom:.5rem}._mdxContent_818m0_112 h1 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h1 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h1 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h2{font-size:1.5rem;font-weight:500;letter-spacing:-.02em;margin-bottom:1rem;margin-top:2.5rem;border-bottom:1px solid var(--xw-border);padding-bottom:.5rem;line-height:1.3;scroll-margin-top:5rem}._mdxContent_818m0_112 h2 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h2 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h2 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h3{font-size:1.25rem;font-weight:500;letter-spacing:-.015em;margin-bottom:.75rem;margin-top:2rem;line-height:1.4;scroll-margin-top:5rem}._mdxContent_818m0_112 h3 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h3 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h3 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h4{font-size:1.125rem;font-weight:500;letter-spacing:-.01em;margin-bottom:.5rem;margin-top:1.5rem;line-height:1.4;scroll-margin-top:5rem}._mdxContent_818m0_112 h4 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h4 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h4 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h5{font-size:1rem;font-weight:500;margin-bottom:.5rem;margin-top:1.25rem;line-height:1.5}._mdxContent_818m0_112 h6{font-size:.875rem;font-weight:500;margin-bottom:.5rem;margin-top:1rem;line-height:1.5}._mdxContent_818m0_112 p{font-size:1rem;line-height:1.65;margin-bottom:1rem;color:var(--xw-foreground)}._mdxContent_818m0_112 ul,._mdxContent_818m0_112 ol{margin-bottom:1rem;padding-left:1.5rem}._mdxContent_818m0_112 ul li,._mdxContent_818m0_112 ol li{font-size:1rem;line-height:1.65;margin-bottom:.375rem}._mdxContent_818m0_112 ul ul,._mdxContent_818m0_112 ul ol,._mdxContent_818m0_112 ol ul,._mdxContent_818m0_112 ol ol{margin-top:.375rem;margin-bottom:.375rem}._mdxContent_818m0_112 ul{list-style-type:disc}._mdxContent_818m0_112 ol{list-style-type:decimal}._mdxContent_818m0_112 code{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.875rem;background-color:var(--xw-muted);padding:.1875rem .4375rem;border-radius:.25rem;color:var(--xw-foreground);font-weight:500}._mdxContent_818m0_112 pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;background-color:var(--xw-muted);padding:1.25rem;border-radius:.75rem;overflow-x:auto;margin:1.5rem 0;position:relative;border:1px solid var(--xw-border)}._mdxContent_818m0_112 pre code{background-color:transparent;padding:0;color:inherit;font-weight:400}._mdxContent_818m0_112 ._codeBlock_818m0_300{position:relative;margin-bottom:1.5rem}._mdxContent_818m0_112 ._codeLanguage_818m0_304{position:absolute;top:.5rem;right:.5rem;font-size:.75rem;color:var(--xw-muted-foreground);background-color:var(--xw-background);padding:.25rem .5rem;border-radius:.25rem;border:1px solid var(--xw-border)}._mdxContent_818m0_112 blockquote{border-left:3px solid var(--xw-accent);padding-left:1rem;font-style:italic;color:var(--xw-muted-foreground);margin-bottom:1rem;margin-top:1rem}._mdxContent_818m0_112 blockquote p{margin-bottom:.5rem}._mdxContent_818m0_112 blockquote p:last-child{margin-bottom:0}._mdxContent_818m0_112 a{color:var(--xw-link);text-decoration:none;transition:color .15s cubic-bezier(.4,0,.2,1);border-bottom:1px solid transparent}._mdxContent_818m0_112 a:hover{color:color-mix(in oklch,var(--xw-link) 80%,transparent);border-bottom-color:currentColor}._mdxContent_818m0_112 strong{font-weight:600}._mdxContent_818m0_112 em{font-style:italic}._mdxContent_818m0_112 table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.95rem}._mdxContent_818m0_112 table th,._mdxContent_818m0_112 table td{padding:.75rem 1rem;text-align:left;border-bottom:1px solid var(--xw-border);line-height:1.4}._mdxContent_818m0_112 table th{font-weight:500;background-color:var(--xw-muted);font-size:.875rem;letter-spacing:.025em}._mdxContent_818m0_112 table tbody tr:hover{background-color:color-mix(in oklch,var(--xw-muted) 50%,transparent)}._mdxContent_818m0_112 img{max-width:100%;height:auto;border-radius:.5rem;margin:1.5rem 0;border:1px solid var(--xw-border)}._mdxContent_818m0_112 hr{border:none;border-top:1px solid var(--xw-border);margin:2rem 0}._searchButton_1k9sl_1{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:.375rem;background:none;border:none;color:var(--xw-muted-foreground);cursor:pointer;transition:all .2s ease;font-size:.875rem}._searchButton_1k9sl_1:hover{border-color:var(--xw-input)}._searchButton_1k9sl_1 ._searchIcon_1k9sl_17{width:1rem;height:1rem;opacity:.6}@media(max-width:768px){._searchButton_1k9sl_1 ._searchHint_1k9sl_23{display:none}}._searchButton_1k9sl_1 ._kbd_1k9sl_27{display:none;padding:.125rem .375rem;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.25rem;font-size:.75rem;font-family:monospace}@media(min-width:768px){._searchButton_1k9sl_1 ._kbd_1k9sl_27{display:block}}._searchOverlay_1k9sl_42{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2000;display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;animation:_fadeIn_1k9sl_1 .2s ease;height:100vh}@keyframes _fadeIn_1k9sl_1{0%{opacity:0}to{opacity:1}}._searchModal_1k9sl_67{width:90%;max-width:600px;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.75rem;box-shadow:0 20px 60px #0000004d;animation:_slideIn_1k9sl_1 .2s ease;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}@keyframes _slideIn_1k9sl_1{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}._searchHeader_1k9sl_91{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;border-bottom:1px solid var(--xw-border)}._searchHeader_1k9sl_91 ._searchIcon_1k9sl_17{width:1.25rem;height:1.25rem;opacity:.5;flex-shrink:0}._searchInput_1k9sl_105{flex:1;border:none;background:transparent;color:var(--xw-foreground);font-size:1rem;outline:none}._searchInput_1k9sl_105:focus{border:none;outline:none;box-shadow:none}._searchInput_1k9sl_105::placeholder{color:var(--xw-muted-foreground);opacity:.6}._closeButton_1k9sl_123{background:none;border:none;color:var(--xw-muted-foreground);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;border-radius:.25rem;transition:all .2s ease}._closeButton_1k9sl_123 svg{width:1.25rem;height:1.25rem}._closeButton_1k9sl_123:hover{background:var(--xw-secondary);color:var(--xw-foreground)}._searchResults_1k9sl_144{flex:1;overflow-y:auto;padding:.5rem;min-height:200px;max-height:400px}._resultsList_1k9sl_152{list-style:none;padding:0;margin:0}._resultItem_1k9sl_158{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;width:100%;padding:.75rem 1rem;background:none;border:none;border-radius:.5rem;cursor:pointer;text-align:left;transition:all .15s ease;color:var(--xw-foreground)}._resultItem_1k9sl_158:hover,._resultItem_1k9sl_158._selected_1k9sl_173{background:var(--xw-secondary)}._resultItem_1k9sl_158 ._resultTitle_1k9sl_176{font-weight:500;font-size:.95rem}._resultItem_1k9sl_158 ._resultSlug_1k9sl_180{font-size:.8rem;color:var(--xw-muted-foreground);opacity:.8}._noResults_1k9sl_186{padding:3rem 1rem;text-align:center;color:var(--xw-muted-foreground);font-size:.9rem}._searchHints_1k9sl_193{display:flex;align-items:center;gap:1.5rem;padding:.75rem 1.25rem;border-top:1px solid var(--xw-border);background:var(--xw-secondary);font-size:.8rem;color:var(--xw-muted-foreground)}@media(max-width:768px){._searchHints_1k9sl_193{flex-direction:column;align-items:flex-start;gap:.5rem}}._searchHints_1k9sl_193 ._hint_1k9sl_210{display:flex;align-items:center;gap:.5rem}._searchHints_1k9sl_193 ._hint_1k9sl_210 kbd{padding:.125rem .375rem;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.25rem;font-size:.75rem;font-family:monospace;min-width:1.5rem;text-align:center}._header_ztexv_1{position:sticky;top:0;z-index:1020;background-color:#fffc;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);height:3.5rem;padding-left:16rem}.theme-dark ._header_ztexv_1{background-color:#2020201a}@supports not (backdrop-filter: blur(12px)){._header_ztexv_1{background-color:var(--xw-background)}}@media(max-width:767px){._header_ztexv_1{padding:0}}._container_ztexv_24{width:100%;max-width:1400px;margin:0 auto;padding:0 1.5rem}@media(max-width:767px){._container_ztexv_24{padding:0 1rem}}._content_ztexv_36{display:flex;align-items:center;justify-content:space-between;height:3.5rem}._leftSection_ztexv_43{display:flex;align-items:center;gap:1rem}._mobileMenuButton_ztexv_49{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._mobileMenuButton_ztexv_49:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._mobileMenuButton_ztexv_49:disabled{pointer-events:none;opacity:.5}._mobileMenuButton_ztexv_49{padding:.5rem;background-color:transparent;color:var(--xw-muted-foreground);border-radius:.5rem;display:none}._mobileMenuButton_ztexv_49:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}@media(max-width:767px){._mobileMenuButton_ztexv_49{display:flex}}._burgerIcon_ztexv_87{width:1.25rem;height:1.25rem}._logo_ztexv_92,._nav_ztexv_98{display:flex;align-items:center;gap:.5rem}@media(max-width:767px){._nav_ztexv_98{gap:.25rem}}._navLink_ztexv_109{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:.5rem;font-size:.875rem;font-weight:500;color:var(--xw-muted-foreground);text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1)}._navLink_ztexv_109:hover{color:var(--xw-foreground)}._navLink_ztexv_109:focus{outline:none}._githubIcon_ztexv_128{width:1rem;height:1rem;flex-shrink:0;transition:transform .15s cubic-bezier(.4,0,.2,1)}._externalIcon_ztexv_135{width:1rem;height:1rem;flex-shrink:0}._supportDropdown_ztexv_141,._themeDropdown_ztexv_145{position:relative}._themeButton_ztexv_149{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem;border-radius:.5rem;font-size:.875rem;font-weight:500;color:var(--xw-muted-foreground);background:none;border:none;cursor:pointer;transition:all .15s cubic-bezier(.4,0,.2,1)}._themeButton_ztexv_149:hover{color:var(--xw-foreground);background-color:var(--xw-muted)}._themeButton_ztexv_149:focus{outline:none}._themeIcon_ztexv_171{width:1.125rem;height:1.125rem;flex-shrink:0}._supportButton_ztexv_177{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:.5rem;font-size:.875rem;font-weight:500;color:var(--xw-muted-foreground);background:none;border:none;cursor:pointer;transition:all .15s cubic-bezier(.4,0,.2,1)}._supportButton_ztexv_177:hover{color:var(--xw-foreground)}._supportButton_ztexv_177:focus{outline:none}._caretIcon_ztexv_198{width:.875rem;height:.875rem;flex-shrink:0;transition:transform .15s cubic-bezier(.4,0,.2,1)}button[aria-expanded=true] ._caretIcon_ztexv_198{transform:rotate(180deg)}._dropdownMenu_ztexv_208{position:absolute;top:calc(100% + .25rem);right:0;min-width:10rem;background-color:var(--xw-popover);border:1px solid var(--xw-border);border-radius:.5rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:1000;overflow:hidden}._dropdownItem_ztexv_221{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--xw-popover-foreground);text-decoration:none;background:none;border:none;cursor:pointer;text-align:left;transition:background-color .15s cubic-bezier(.4,0,.2,1)}._dropdownItem_ztexv_221:hover{background-color:var(--xw-muted)}._dropdownItem_ztexv_221:focus{outline:none;background-color:var(--xw-muted)}._dropdownIcon_ztexv_244{width:1rem;height:1rem;flex-shrink:0}@media(max-width:767px){._logoText_ztexv_251{font-size:1rem}._navLink_ztexv_109{padding:.25rem .5rem;font-size:.8rem;gap:.25rem}._githubIcon_ztexv_128{width:.875rem;height:.875rem}}._backdrop_1a7pu_1{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:1040;opacity:0;visibility:hidden;transition:all .15s cubic-bezier(.4,0,.2,1)}._backdrop_1a7pu_1._open_1a7pu_13{opacity:1;visibility:visible}._mobileMenu_1a7pu_18{position:fixed;top:0;left:0;width:320px;height:100vh;background-color:var(--xw-background);border-right:1px solid var(--xw-border);z-index:1050;transform:translate(-100%);transition:transform .15s cubic-bezier(.4,0,.2,1);display:flex;flex-direction:column;overflow:hidden}._mobileMenu_1a7pu_18._open_1a7pu_13{transform:translate(0)}._header_1a7pu_37{display:flex;align-items:center;justify-content:space-between;padding:1.5rem;border-bottom:1px solid var(--xw-border);flex-shrink:0}._brand_1a7pu_46{flex:1;display:flex;align-items:center;gap:.5rem}._cloudIcon_1a7pu_53{width:1.5rem;height:1.5rem;flex-shrink:0}._cloudIcon_1a7pu_53 .accent{fill:#d33079}._title_1a7pu_62{font-size:1.125rem;font-weight:600;color:var(--xw-foreground);margin:0}._closeButton_1a7pu_69{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._closeButton_1a7pu_69:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._closeButton_1a7pu_69:disabled{pointer-events:none;opacity:.5}._closeButton_1a7pu_69{padding:.5rem;background-color:transparent;color:var(--xw-muted-foreground);border-radius:.5rem}._closeButton_1a7pu_69:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}._closeIcon_1a7pu_101{width:1.25rem;height:1.25rem}._languageSection_1a7pu_106{padding:1.5rem;border-bottom:1px solid var(--xw-border);flex-shrink:0}._languageSelect_1a7pu_112{position:relative;width:100%}._languageButton_1a7pu_117{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._languageButton_1a7pu_117:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._languageButton_1a7pu_117:disabled{pointer-events:none;opacity:.5}._languageButton_1a7pu_117{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.5rem 1rem;background-color:var(--xw-background);border:1px solid var(--xw-border);color:var(--xw-foreground);gap:.5rem}._languageButton_1a7pu_117:hover,._languageButton_1a7pu_117[aria-expanded=true]{background-color:var(--xw-muted)}._icon_1a7pu_156{width:1rem;height:1rem;flex-shrink:0}._chevron_1a7pu_162{width:1rem;height:1rem;transition:transform .15s cubic-bezier(.4,0,.2,1);margin-left:auto}._languageButton_1a7pu_117[aria-expanded=true] ._chevron_1a7pu_162{transform:rotate(180deg)}._languageDropdown_1a7pu_172{position:absolute;top:100%;left:0;right:0;background-color:var(--xw-popover);border:1px solid var(--xw-border);border-radius:.5rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:1000;margin-top:.25rem}._languageOption_1a7pu_185{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._languageOption_1a7pu_185:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._languageOption_1a7pu_185:disabled{pointer-events:none;opacity:.5}._languageOption_1a7pu_185{width:100%;padding:.5rem 1rem;background-color:transparent;color:var(--xw-foreground);text-align:left;justify-content:flex-start;border-radius:0}._languageOption_1a7pu_185:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}._languageOption_1a7pu_185:last-child{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}._languageOption_1a7pu_185:hover{background-color:var(--xw-muted)}._languageOption_1a7pu_185._selected_1a7pu_226{background-color:var(--xw-accent);color:var(--xw-accent-foreground)}._scrollArea_1a7pu_231{flex:1;overflow-y:auto;padding:1.5rem 0}._navigation_1a7pu_237{padding:0 1.5rem}._section_1a7pu_241{margin-bottom:1rem}._sectionButton_1a7pu_245{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._sectionButton_1a7pu_245:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._sectionButton_1a7pu_245:disabled{pointer-events:none;opacity:.5}._sectionButton_1a7pu_245{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.5rem 1rem;background-color:transparent;color:var(--xw-foreground);font-weight:600;gap:.5rem;border-radius:.5rem}._sectionButton_1a7pu_245:hover{background-color:var(--xw-muted)}._sectionButton_1a7pu_245 ._icon_1a7pu_156{transition:transform .15s cubic-bezier(.4,0,.2,1);margin-left:auto}._sectionButton_1a7pu_245._expanded_1a7pu_285 ._icon_1a7pu_156{transform:rotate(90deg)}._sectionItems_1a7pu_289{margin-top:.5rem;margin-left:1rem;display:flex;flex-direction:column;gap:.25rem}._navItem_1a7pu_297{display:block;padding:.5rem 1rem;border-radius:.5rem;color:var(--xw-muted-foreground);text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1);font-size:.875rem}._navItem_1a7pu_297:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}._navItem_1a7pu_297._active_1a7pu_310{background-color:var(--xw-accent);color:var(--xw-accent-foreground);font-weight:500}._navItemContent_1a7pu_316{display:flex;align-items:center;gap:.5rem}._navItemTitle_1a7pu_322{flex:1}@media(min-width:1024px){._mobileMenu_1a7pu_18,._backdrop_1a7pu_1{display:none}}._sidebar_10z71_1{position:fixed;top:0;left:0;width:16rem;height:100vh;background-color:var(--xw-sidebar);overflow-y:auto;z-index:1020}@media(max-width:767px){._sidebar_10z71_1{display:none}}._header_10z71_17{position:sticky;top:0;z-index:1020;padding:1rem;background-color:var(--xw-sidebar);display:flex;flex-direction:column;gap:.5rem;padding-bottom:0}._brand_10z71_29{display:flex;align-items:center;gap:.5rem}._cloudIcon_10z71_35{width:1.5rem;height:1.5rem;flex-shrink:0}._cloudIcon_10z71_35 .accent{fill:#d33079}._title_10z71_44{font-size:1rem;font-weight:600;line-height:1.5;margin:0;letter-spacing:-.02em;color:var(--xw-foreground)}._languageSelect_10z71_55{position:relative;margin-top:.25rem;width:100%}._languageButton_10z71_61{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._languageButton_10z71_61:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._languageButton_10z71_61:disabled{pointer-events:none;opacity:.5}._languageButton_10z71_61{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;width:100%;gap:.25rem;font-size:.8rem;background:transparent;border:1px solid var(--xw-border);border-radius:.25rem;color:var(--xw-muted-foreground)}._languageButton_10z71_61:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}._languageButton_10z71_61 ._icon_10z71_99{width:.875rem;height:.875rem;flex-shrink:0}._languageButton_10z71_61 ._chevron_10z71_104{width:.875rem;height:.875rem;flex-shrink:0;transition:transform .15s cubic-bezier(.4,0,.2,1)}._languageButton_10z71_61[aria-expanded=true] ._chevron_10z71_104{transform:rotate(180deg)}._languageDropdown_10z71_114{position:absolute;top:100%;left:0;right:0;margin-top:.25rem;background-color:var(--xw-popover);border:1px solid var(--xw-border);border-radius:.5rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:1000;overflow:hidden}._languageOption_10z71_128{display:block;width:100%;padding:.25rem .5rem;text-align:left;background:none;border:none;color:var(--xw-popover-foreground);font-size:.85rem;cursor:pointer;transition:background-color .15s cubic-bezier(.4,0,.2,1)}._languageOption_10z71_128:hover{background-color:var(--xw-muted)}._languageOption_10z71_128:focus{outline:none;background-color:var(--xw-muted)}._languageOption_10z71_128._selected_10z71_147{background-color:var(--xw-muted);color:var(--xw-foreground)}._scrollArea_10z71_152{height:calc(100vh - 120px);padding:1rem .5rem 1rem 1rem;overflow-y:auto}._navigation_10z71_158{display:flex;flex-direction:column;gap:.125rem}._skeletonPulse_10z71_164{background:var(--xw-border);border-radius:.25rem;animation:_skeleton-pulse_10z71_1 1.4s ease-in-out infinite}._skeletonSectionTitle_10z71_170{height:.85rem;margin:.25rem .5rem;width:65%}._skeletonItem_10z71_176{height:.85rem;margin:.25rem .5rem;width:85%}._section_10z71_182{display:flex;flex-direction:column;gap:0}._sectionButton_10z71_188{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._sectionButton_10z71_188:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._sectionButton_10z71_188:disabled{pointer-events:none;opacity:.5}._sectionButton_10z71_188{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.25rem .5rem;font-weight:500;font-size:.85rem;color:var(--xw-muted-foreground);background:transparent;text-align:left;letter-spacing:-.01em;border:none}._sectionButton_10z71_188:hover{color:var(--xw-foreground)}._sectionButton_10z71_188 ._icon_10z71_99{width:.875rem;height:.875rem;transition:transform .15s cubic-bezier(.4,0,.2,1)}._sectionButton_10z71_188._expanded_10z71_231 ._icon_10z71_99{transform:rotate(90deg)}._sectionItems_10z71_235{margin-top:.25rem;padding-left:1rem;display:flex;flex-direction:column;gap:.125rem}._navItem_10z71_243{display:block;width:100%;padding:.25rem .5rem;border-radius:.25rem;font-size:.85rem;color:var(--xw-muted-foreground);text-decoration:none;transition:color .15s cubic-bezier(.4,0,.2,1)}._navItem_10z71_243:hover{color:var(--xw-foreground)}._navItem_10z71_243._active_10z71_256{color:var(--xw-foreground);font-weight:500}._navItemContent_10z71_261{display:flex;align-items:center;justify-content:space-between;width:100%}@keyframes _skeleton-pulse_10z71_1{0%{opacity:.35}50%{opacity:.75}to{opacity:.35}}._sidebar_10z71_1::-webkit-scrollbar{width:6px}._sidebar_10z71_1::-webkit-scrollbar-track{background:transparent}._sidebar_10z71_1::-webkit-scrollbar-thumb{background:var(--xw-muted-foreground);border-radius:9999px;opacity:.3}._sidebar_10z71_1::-webkit-scrollbar-thumb:hover{opacity:.6}._app_wf6ni_1{min-height:100vh;background-color:var(--xw-background);color:var(--xw-foreground);display:flex;flex-direction:column}._layout_wf6ni_9{display:flex;flex:1;min-height:calc(100vh - 3.5rem)}._main_wf6ni_15{flex:1;display:flex;flex-direction:column;margin-left:16rem}._main_wf6ni_15._fullWidth_wf6ni_21{margin-left:0}@media(max-width:767px){._main_wf6ni_15{margin-left:0}}._contentWrapper_wf6ni_30{display:flex;flex:1;position:relative;width:100%;max-width:80rem;margin:0 auto;padding:2rem}._main_wf6ni_15._fullWidth_wf6ni_21 ._contentWrapper_wf6ni_30{width:auto}@media(max-width:1024px){._contentWrapper_wf6ni_30{padding:1.5rem}}@media(max-width:767px){._contentWrapper_wf6ni_30{padding:1rem}}._homePage_10e4f_1{flex:1;max-width:48rem;margin:0;padding:0 0 2rem}@media(max-width:767px){._homePage_10e4f_1{padding:1rem;max-width:none}}@media(max-width:1024px){._homePage_10e4f_1{max-width:none;padding:2rem}}._header_10e4f_20{margin-bottom:1.5rem}._title_10e4f_24{font-size:2rem;font-weight:700;color:var(--xw-foreground);margin-bottom:0!important}._articlesList_10e4f_31{display:flex;flex-direction:column;gap:1rem}._articleCard_10e4f_37{padding:1rem;border:1px solid var(--xw-border);border-radius:.5rem;background:transparent;cursor:pointer;text-align:left;transition:all .2s ease-in-out}._articleCard_10e4f_37:hover{border-color:var(--xw-primary);background-color:var(--xw-card);transform:translateY(-2px)}._articleCard_10e4f_37:focus-visible{outline:2px solid var(--xw-primary);outline-offset:2px}._articleTitle_10e4f_56{font-size:1.25rem;font-weight:600;margin:0 0 .5rem;color:var(--xw-foreground)}._articleDescription_10e4f_63{font-size:.9rem;color:var(--xw-muted-foreground);margin:0 0 .5rem;line-height:1.5}._loading_10e4f_70,._empty_10e4f_71{padding:2rem;text-align:center;color:var(--xw-muted-foreground)}@keyframes _shimmer_10e4f_1{0%{background-position:-1000px 0}to{background-position:1000px 0}}._skeletonCard_10e4f_85{padding:1rem;border:1px solid var(--xw-border);border-radius:.5rem;background:transparent;display:flex;flex-direction:column;gap:.5rem}._skeletonTitle_10e4f_95{width:70%;height:1.5rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_10e4f_1 2s infinite linear;border-radius:.5rem}._skeletonText_10e4f_104{width:100%;height:1rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_10e4f_1 2s infinite linear;border-radius:.25rem}._skeletonMetadata_10e4f_113{width:40%;height:.875rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_10e4f_1 2s infinite linear;border-radius:.25rem;margin-top:.25rem}
217
+ ._tabContainer_zk6h4_1{display:inline-flex;background-color:var(--xw-card);border:1px solid var(--xw-border);border-radius:.5rem;margin-bottom:2rem;overflow:hidden}._tab_zk6h4_1{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._tab_zk6h4_1:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._tab_zk6h4_1:disabled{pointer-events:none;opacity:.5}._tab_zk6h4_1{padding:.5rem 1rem;font-size:.87rem;font-weight:500;background-color:transparent;border:none;border-radius:0;color:var(--xw-muted-foreground);cursor:pointer;white-space:nowrap}._tab_zk6h4_1:not(:last-child){border-right:1px solid var(--xw-border)}._tab_zk6h4_1._active_zk6h4_45{background-color:var(--xw-accent);color:var(--xw-accent-foreground)}._tab_zk6h4_1:hover:not(._active_zk6h4_45){background-color:var(--xw-muted);color:var(--xw-foreground)}._tab_zk6h4_1:focus-visible{outline:2px solid var(--xw-accent);outline-offset:-2px}._articleNavigation_kz84g_1{margin-top:3rem;padding-top:2rem;border-top:1px solid var(--xw-border)}._navContainer_kz84g_7{display:grid;grid-template-columns:1fr 1fr;gap:1rem}@media(max-width:767px){._navContainer_kz84g_7{grid-template-columns:1fr;gap:1rem}}@media(min-width:1024px){._navContainer_kz84g_7{gap:1.5rem}}._navLink_kz84g_24{display:flex;padding:1rem;border:1px solid var(--xw-border);border-radius:.5rem;text-decoration:none;color:var(--xw-foreground);background-color:var(--xw-background);transition:all .2s ease;box-shadow:0 1px 3px #0000000d}._navLink_kz84g_24:hover{border-color:var(--xw-ring);background-color:var(--xw-card);transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}._navLink_kz84g_24:first-child{justify-content:flex-start}@media(max-width:767px){._navLink_kz84g_24:first-child{justify-content:center;text-align:center}}._navLink_kz84g_24:last-child{justify-content:flex-end;text-align:right}@media(max-width:767px){._navLink_kz84g_24:last-child{justify-content:center;text-align:center}}._navLinkContent_kz84g_61{display:flex;align-items:center;gap:.75rem;min-width:0;width:100%}@media(max-width:767px){._navLinkContent_kz84g_61{justify-content:center;flex-direction:column;text-align:center}}._navIcon_kz84g_76{display:flex;align-items:center;color:var(--xw-primary);flex-shrink:0}._navText_kz84g_83{display:flex;flex-direction:column;gap:.25rem;min-width:0}._navLabel_kz84g_90{font-size:.75rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;color:var(--xw-muted-foreground)}._navTitle_kz84g_98{font-size:.875rem;font-weight:400;color:var(--xw-foreground);overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;line-height:1.4}@media(min-width:1024px){._navTitle_kz84g_98{font-size:.9rem}}._blogSidebar_1ik3q_1{position:sticky;top:0;align-self:flex-start;height:fit-content;max-height:calc(100vh - 8rem);overflow-y:auto;padding:0 0 2rem 1.5rem;margin-left:2rem;background:transparent;border-left:1px solid var(--xw-border);flex-shrink:0;width:250px}@media(max-width:1024px){._blogSidebar_1ik3q_1{display:none}}._section_1ik3q_21{margin-bottom:2rem}._section_1ik3q_21:last-child{margin-bottom:0}._sectionTitle_1ik3q_28{font-size:.75rem;font-weight:600;color:var(--xw-muted-foreground);letter-spacing:.05em;margin:0 0 1rem}._linksList_1ik3q_36{display:flex;flex-direction:column;gap:.25rem}._link_1ik3q_36{display:flex;align-items:center;gap:.5rem;padding:.5rem;color:var(--xw-foreground);text-decoration:none;border-radius:.25rem;transition:all .15s cubic-bezier(.4,0,.2,1);font-size:.875rem}._link_1ik3q_36:hover{color:var(--xw-primary)}._link_1ik3q_36 svg{flex-shrink:0}._breadcrumb_rarc4_1{margin-bottom:1rem}._breadcrumbList_rarc4_5{display:flex;align-items:center;list-style:none;margin:0;padding:0;font-size:.875rem;color:var(--xw-muted-foreground)}._breadcrumbItem_rarc4_15{display:flex;align-items:center;gap:.25rem}._breadcrumbLink_rarc4_21{background:none;border:none;cursor:pointer;color:var(--xw-link);text-decoration:none;font-size:inherit;padding:0;font-weight:500;transition:color .2s ease}._breadcrumbLink_rarc4_21:hover{color:var(--xw-primary);text-decoration:underline}._breadcrumbLink_rarc4_21:focus-visible{outline:2px solid var(--xw-primary);outline-offset:2px}._breadcrumbSeparator_rarc4_41{color:var(--xw-border);margin:0 .5rem}._breadcrumbCurrent_rarc4_46{color:var(--xw-foreground);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:20rem}@media(max-width:767px){._breadcrumbCurrent_rarc4_46{max-width:10rem}}._metadata_bsge0_1{display:flex;align-items:center;gap:1.5rem;margin-top:1rem;margin-bottom:1rem}._author_bsge0_9,._date_bsge0_10{display:flex;align-items:center;gap:.5rem;font-weight:500;font-size:.9rem}._author_bsge0_9 svg,._date_bsge0_10 svg{flex-shrink:0}._date_bsge0_10{color:var(--xw-text-secondary, #666)}._tableOfContents_9ofak_1{position:sticky;top:5rem;align-self:flex-start;height:fit-content;max-height:calc(100vh - 8rem);overflow-y:auto;padding:2rem 0 2rem 1.5rem;margin-left:2rem;background:transparent;border-left:1px solid var(--xw-border);flex-shrink:0;max-width:250px}@media(max-width:1024px){._tableOfContents_9ofak_1{display:none}}._header_9ofak_21{margin-bottom:1rem}._title_9ofak_25{font-size:.75rem;font-weight:500;color:var(--xw-muted-foreground);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem}._nav_9ofak_34 ul{margin:0;padding:0;list-style:none}._list_9ofak_40{display:flex;flex-direction:column;gap:.125rem;margin:0}._link_9ofak_47{display:block;width:100%;padding:.25rem 0;text-align:left;background:none;border:none;cursor:pointer;font-size:.875rem;line-height:1.4;color:var(--xw-muted-foreground);text-decoration:none;border-radius:.25rem;transition:all .15s cubic-bezier(.4,0,.2,1);position:relative;font-family:inherit}._link_9ofak_47:hover{color:var(--xw-foreground)}._link_9ofak_47:focus{outline:none;color:var(--xw-foreground)}._link_9ofak_47._active_9ofak_71{color:var(--xw-primary);font-weight:500}._link_9ofak_47._active_9ofak_71:before{content:"";position:absolute;left:-1.5rem;top:50%;transform:translateY(-50%);width:1px;height:1rem;background-color:var(--xw-primary);border-radius:.5px}._level1_9ofak_87{font-weight:500;padding-left:0;margin-bottom:.125rem}._level2_9ofak_93{padding-left:.5rem;margin-bottom:.0625rem}._level3_9ofak_98{padding-left:1rem;font-size:.8125rem;margin-bottom:.0625rem}._level4_9ofak_104{padding-left:1.5rem;font-size:.8125rem;margin-bottom:.0625rem}._level5_9ofak_110{padding-left:2rem;font-size:.75rem;margin-bottom:.0625rem}._level6_9ofak_116{padding-left:2.5rem;font-size:.75rem;margin-bottom:.0625rem}._tableOfContents_9ofak_1::-webkit-scrollbar{width:4px}._tableOfContents_9ofak_1::-webkit-scrollbar-track{background:transparent}._tableOfContents_9ofak_1::-webkit-scrollbar-thumb{background:var(--xw-border);border-radius:2px}._tableOfContents_9ofak_1::-webkit-scrollbar-thumb:hover{background:var(--xw-muted-foreground)}._overlay_1e1d4_1{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2000;display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;animation:_fadeIn_1e1d4_1 .2s ease;height:100vh}@keyframes _fadeIn_1e1d4_1{0%{opacity:0}to{opacity:1}}._modal_1e1d4_26{width:90%;max-width:600px;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.75rem;box-shadow:0 20px 60px #0000004d;animation:_slideIn_1e1d4_1 .2s ease;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}@keyframes _slideIn_1e1d4_1{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}._header_1e1d4_50{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid var(--xw-border)}._title_1e1d4_58{font-size:1.125rem;font-weight:600;color:var(--xw-foreground);margin:0}._closeButton_1e1d4_65{background:none;border:none;color:var(--xw-muted-foreground);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;border-radius:.25rem;transition:all .2s ease}._closeButton_1e1d4_65 svg{width:1.25rem;height:1.25rem}._closeButton_1e1d4_65:hover{background:var(--xw-secondary);color:var(--xw-foreground)}._results_1e1d4_86{flex:1;overflow-y:auto;padding:.5rem;min-height:200px;max-height:400px}._resultsList_1e1d4_94{list-style:none;padding:0;margin:0}._resultItem_1e1d4_100{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;width:100%;padding:.75rem 1rem;background:none;border:none;border-radius:.5rem;cursor:pointer;text-align:left;transition:all .15s ease;color:var(--xw-foreground)}._resultItem_1e1d4_100:hover{background:var(--xw-secondary)}._resultTitle_1e1d4_119{font-weight:500;font-size:.95rem}._resultSlug_1e1d4_124{font-size:.8rem;color:var(--xw-muted-foreground);opacity:.8}._noResults_1e1d4_130{padding:3rem 1rem;text-align:center;color:var(--xw-muted-foreground);font-size:.9rem}._tags_11t8a_1{display:flex;align-items:center;gap:.75rem;margin:2rem 0 1rem;padding:1rem 0 0;border-top:1px solid var(--xw-border)}._tags_11t8a_1._compact_11t8a_9{margin:2rem 0 1rem;padding:1rem 0 0;border-top:1px solid var(--xw-border)}._tagLabel_11t8a_15{display:flex;align-items:center;gap:.5rem;color:var(--xw-muted-foreground);font-size:.875rem;font-weight:500;white-space:nowrap}._tagIcon_11t8a_25{width:1.125rem;height:1.125rem}._tagList_11t8a_30{display:flex;flex-wrap:wrap;gap:.5rem}._tag_11t8a_1{display:inline-flex;align-items:center;padding:.25rem .75rem;background:none;border:1px solid var(--xw-border);border-radius:.75rem;color:var(--xw-muted-foreground);font-size:.8rem;font-weight:400;cursor:pointer;transition:all .2s ease}._tag_11t8a_1:hover{color:var(--xw-foreground);border-color:var(--xw-ring)}._contentPage_818m0_1{flex:1;max-width:48rem;margin:0;padding:0 0 2rem}@media(max-width:767px){._contentPage_818m0_1{padding:1rem;max-width:none}}@media(max-width:1024px){._contentPage_818m0_1{max-width:none;padding:2rem}}._metadata_818m0_20{display:flex;gap:1rem;align-items:center;padding:.5rem 0 1rem;color:var(--xw-muted-foreground);font-size:.875rem;border-bottom:1px solid var(--xw-border);margin-bottom:1rem}._metadata_818m0_20 ._author_818m0_30,._metadata_818m0_20 ._date_818m0_31{display:flex;align-items:center;gap:.5rem}._metadata_818m0_20 ._author_818m0_30{font-weight:500;color:var(--xw-foreground)}@media(max-width:767px){._metadata_818m0_20{flex-direction:column;align-items:flex-start;gap:.25rem}}._loadingContainer_818m0_48,._errorContainer_818m0_49{display:flex;align-items:center;justify-content:center;height:16rem}._loadingContainer_818m0_48{flex-direction:column;align-items:flex-start;gap:1.5rem;padding:2rem 0}@keyframes _shimmer_818m0_1{0%{background-position:-1000px 0}to{background-position:1000px 0}}._skeletonTitle_818m0_71{width:60%;height:2.5rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_818m0_1 2s infinite linear;border-radius:.5rem}._skeletonParagraph_818m0_80{width:100%;height:1rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_818m0_1 2s infinite linear;border-radius:.25rem;margin-bottom:.5rem}._skeletonParagraph_818m0_80:not(:last-child){margin-bottom:1rem}._skeletonParagraphShort_818m0_93{width:70%;height:1rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_818m0_1 2s infinite linear;border-radius:.25rem}._loadingText_818m0_102{color:var(--xw-muted-foreground);font-size:1rem}._errorText_818m0_107{color:var(--xw-destructive);font-size:1rem}._mdxContent_818m0_112{max-width:none}._mdxContent_818m0_112 h1{font-size:1.875rem;font-weight:600;letter-spacing:-.025em;margin-bottom:1.5rem;border-bottom:1px solid var(--xw-border);padding-bottom:.75rem;line-height:1.2;scroll-margin-top:5rem}._mdxContent_818m0_112 h1._withMetadata_818m0_125{border-bottom:none;padding-bottom:0;margin-bottom:.5rem}._mdxContent_818m0_112 h1 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h1 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h1 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h2{font-size:1.5rem;font-weight:500;letter-spacing:-.02em;margin-bottom:1rem;margin-top:2.5rem;border-bottom:1px solid var(--xw-border);padding-bottom:.5rem;line-height:1.3;scroll-margin-top:5rem}._mdxContent_818m0_112 h2 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h2 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h2 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h3{font-size:1.25rem;font-weight:500;letter-spacing:-.015em;margin-bottom:.75rem;margin-top:2rem;line-height:1.4;scroll-margin-top:5rem}._mdxContent_818m0_112 h3 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h3 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h3 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h4{font-size:1.125rem;font-weight:500;letter-spacing:-.01em;margin-bottom:.5rem;margin-top:1.5rem;line-height:1.4;scroll-margin-top:5rem}._mdxContent_818m0_112 h4 a{color:inherit;text-decoration:none;border:none;position:relative}._mdxContent_818m0_112 h4 a:hover{color:inherit;border:none}._mdxContent_818m0_112 h4 a:hover:before{content:"#";position:absolute;left:-1.5rem;color:var(--xw-link);opacity:.7;font-weight:400}._mdxContent_818m0_112 h5{font-size:1rem;font-weight:500;margin-bottom:.5rem;margin-top:1.25rem;line-height:1.5}._mdxContent_818m0_112 h6{font-size:.875rem;font-weight:500;margin-bottom:.5rem;margin-top:1rem;line-height:1.5}._mdxContent_818m0_112 p{font-size:1rem;line-height:1.65;margin-bottom:1rem;color:var(--xw-foreground)}._mdxContent_818m0_112 ul,._mdxContent_818m0_112 ol{margin-bottom:1rem;padding-left:1.5rem}._mdxContent_818m0_112 ul li,._mdxContent_818m0_112 ol li{font-size:1rem;line-height:1.65;margin-bottom:.375rem}._mdxContent_818m0_112 ul ul,._mdxContent_818m0_112 ul ol,._mdxContent_818m0_112 ol ul,._mdxContent_818m0_112 ol ol{margin-top:.375rem;margin-bottom:.375rem}._mdxContent_818m0_112 ul{list-style-type:disc}._mdxContent_818m0_112 ol{list-style-type:decimal}._mdxContent_818m0_112 code{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.875rem;background-color:var(--xw-muted);padding:.1875rem .4375rem;border-radius:.25rem;color:var(--xw-foreground);font-weight:500}._mdxContent_818m0_112 pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;background-color:var(--xw-muted);padding:1.25rem;border-radius:.75rem;overflow-x:auto;margin:1.5rem 0;position:relative;border:1px solid var(--xw-border)}._mdxContent_818m0_112 pre code{background-color:transparent;padding:0;color:inherit;font-weight:400}._mdxContent_818m0_112 ._codeBlock_818m0_300{position:relative;margin-bottom:1.5rem}._mdxContent_818m0_112 ._codeLanguage_818m0_304{position:absolute;top:.5rem;right:.5rem;font-size:.75rem;color:var(--xw-muted-foreground);background-color:var(--xw-background);padding:.25rem .5rem;border-radius:.25rem;border:1px solid var(--xw-border)}._mdxContent_818m0_112 blockquote{border-left:3px solid var(--xw-accent);padding-left:1rem;font-style:italic;color:var(--xw-muted-foreground);margin-bottom:1rem;margin-top:1rem}._mdxContent_818m0_112 blockquote p{margin-bottom:.5rem}._mdxContent_818m0_112 blockquote p:last-child{margin-bottom:0}._mdxContent_818m0_112 a{color:var(--xw-link);text-decoration:none;transition:color .15s cubic-bezier(.4,0,.2,1);border-bottom:1px solid transparent}._mdxContent_818m0_112 a:hover{color:color-mix(in oklch,var(--xw-link) 80%,transparent);border-bottom-color:currentColor}._mdxContent_818m0_112 strong{font-weight:600}._mdxContent_818m0_112 em{font-style:italic}._mdxContent_818m0_112 table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.95rem}._mdxContent_818m0_112 table th,._mdxContent_818m0_112 table td{padding:.75rem 1rem;text-align:left;border-bottom:1px solid var(--xw-border);line-height:1.4}._mdxContent_818m0_112 table th{font-weight:500;background-color:var(--xw-muted);font-size:.875rem;letter-spacing:.025em}._mdxContent_818m0_112 table tbody tr:hover{background-color:color-mix(in oklch,var(--xw-muted) 50%,transparent)}._mdxContent_818m0_112 img{max-width:100%;height:auto;border-radius:.5rem;margin:1.5rem 0;border:1px solid var(--xw-border)}._mdxContent_818m0_112 hr{border:none;border-top:1px solid var(--xw-border);margin:2rem 0}._searchButton_1k9sl_1{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:.375rem;background:none;border:none;color:var(--xw-muted-foreground);cursor:pointer;transition:all .2s ease;font-size:.875rem}._searchButton_1k9sl_1:hover{border-color:var(--xw-input)}._searchButton_1k9sl_1 ._searchIcon_1k9sl_17{width:1rem;height:1rem;opacity:.6}@media(max-width:768px){._searchButton_1k9sl_1 ._searchHint_1k9sl_23{display:none}}._searchButton_1k9sl_1 ._kbd_1k9sl_27{display:none;padding:.125rem .375rem;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.25rem;font-size:.75rem;font-family:monospace}@media(min-width:768px){._searchButton_1k9sl_1 ._kbd_1k9sl_27{display:block}}._searchOverlay_1k9sl_42{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2000;display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;animation:_fadeIn_1k9sl_1 .2s ease;height:100vh}@keyframes _fadeIn_1k9sl_1{0%{opacity:0}to{opacity:1}}._searchModal_1k9sl_67{width:90%;max-width:600px;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.75rem;box-shadow:0 20px 60px #0000004d;animation:_slideIn_1k9sl_1 .2s ease;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}@keyframes _slideIn_1k9sl_1{0%{transform:translateY(-20px);opacity:0}to{transform:translateY(0);opacity:1}}._searchHeader_1k9sl_91{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;border-bottom:1px solid var(--xw-border)}._searchHeader_1k9sl_91 ._searchIcon_1k9sl_17{width:1.25rem;height:1.25rem;opacity:.5;flex-shrink:0}._searchInput_1k9sl_105{flex:1;border:none;background:transparent;color:var(--xw-foreground);font-size:1rem;outline:none}._searchInput_1k9sl_105:focus{border:none;outline:none;box-shadow:none}._searchInput_1k9sl_105::placeholder{color:var(--xw-muted-foreground);opacity:.6}._closeButton_1k9sl_123{background:none;border:none;color:var(--xw-muted-foreground);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;border-radius:.25rem;transition:all .2s ease}._closeButton_1k9sl_123 svg{width:1.25rem;height:1.25rem}._closeButton_1k9sl_123:hover{background:var(--xw-secondary);color:var(--xw-foreground)}._searchResults_1k9sl_144{flex:1;overflow-y:auto;padding:.5rem;min-height:200px;max-height:400px}._resultsList_1k9sl_152{list-style:none;padding:0;margin:0}._resultItem_1k9sl_158{display:flex;flex-direction:column;align-items:flex-start;gap:.25rem;width:100%;padding:.75rem 1rem;background:none;border:none;border-radius:.5rem;cursor:pointer;text-align:left;transition:all .15s ease;color:var(--xw-foreground)}._resultItem_1k9sl_158:hover,._resultItem_1k9sl_158._selected_1k9sl_173{background:var(--xw-secondary)}._resultItem_1k9sl_158 ._resultTitle_1k9sl_176{font-weight:500;font-size:.95rem}._resultItem_1k9sl_158 ._resultSlug_1k9sl_180{font-size:.8rem;color:var(--xw-muted-foreground);opacity:.8}._noResults_1k9sl_186{padding:3rem 1rem;text-align:center;color:var(--xw-muted-foreground);font-size:.9rem}._searchHints_1k9sl_193{display:flex;align-items:center;gap:1.5rem;padding:.75rem 1.25rem;border-top:1px solid var(--xw-border);background:var(--xw-secondary);font-size:.8rem;color:var(--xw-muted-foreground)}@media(max-width:768px){._searchHints_1k9sl_193{flex-direction:column;align-items:flex-start;gap:.5rem}}._searchHints_1k9sl_193 ._hint_1k9sl_210{display:flex;align-items:center;gap:.5rem}._searchHints_1k9sl_193 ._hint_1k9sl_210 kbd{padding:.125rem .375rem;background:var(--xw-card);border:1px solid var(--xw-border);border-radius:.25rem;font-size:.75rem;font-family:monospace;min-width:1.5rem;text-align:center}._header_jrobc_1{position:sticky;top:0;z-index:1020;background-color:#fffc;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);height:3.5rem;padding-left:16rem}.dark ._header_jrobc_1{background-color:#2020201a}@supports not (backdrop-filter: blur(12px)){._header_jrobc_1{background-color:var(--xw-background)}}@media(max-width:767px){._header_jrobc_1{padding:0}}._container_jrobc_24{width:100%;max-width:1400px;margin:0 auto;padding:0 1.5rem}@media(max-width:767px){._container_jrobc_24{padding:0 1rem}}._content_jrobc_36{display:flex;align-items:center;justify-content:space-between;height:3.5rem}._leftSection_jrobc_43{display:flex;align-items:center;gap:1rem}._mobileMenuButton_jrobc_49{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._mobileMenuButton_jrobc_49:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._mobileMenuButton_jrobc_49:disabled{pointer-events:none;opacity:.5}._mobileMenuButton_jrobc_49{padding:.5rem;background-color:transparent;color:var(--xw-muted-foreground);border-radius:.5rem;display:none}._mobileMenuButton_jrobc_49:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}@media(max-width:767px){._mobileMenuButton_jrobc_49{display:flex}}._burgerIcon_jrobc_87{width:1.25rem;height:1.25rem}._logo_jrobc_92,._nav_jrobc_98{display:flex;align-items:center;gap:.5rem}@media(max-width:767px){._nav_jrobc_98{gap:.25rem}}._navLink_jrobc_109{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:.5rem;font-size:.875rem;font-weight:500;color:var(--xw-muted-foreground);text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1)}._navLink_jrobc_109:hover{color:var(--xw-foreground)}._navLink_jrobc_109:focus{outline:none}._githubIcon_jrobc_128{width:1rem;height:1rem;flex-shrink:0;transition:transform .15s cubic-bezier(.4,0,.2,1)}._externalIcon_jrobc_135{width:1rem;height:1rem;flex-shrink:0}._supportDropdown_jrobc_141,._themeDropdown_jrobc_145{position:relative}._themeButton_jrobc_149{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem;border-radius:.5rem;font-size:.875rem;font-weight:500;color:var(--xw-muted-foreground);background:none;border:none;cursor:pointer;transition:all .15s cubic-bezier(.4,0,.2,1)}._themeButton_jrobc_149:hover{color:var(--xw-foreground);background-color:var(--xw-muted)}._themeButton_jrobc_149:focus{outline:none}._themeIcon_jrobc_171{width:1.125rem;height:1.125rem;flex-shrink:0}._supportButton_jrobc_177{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:.5rem;font-size:.875rem;font-weight:500;color:var(--xw-muted-foreground);background:none;border:none;cursor:pointer;transition:all .15s cubic-bezier(.4,0,.2,1)}._supportButton_jrobc_177:hover{color:var(--xw-foreground)}._supportButton_jrobc_177:focus{outline:none}._caretIcon_jrobc_198{width:.875rem;height:.875rem;flex-shrink:0;transition:transform .15s cubic-bezier(.4,0,.2,1)}button[aria-expanded=true] ._caretIcon_jrobc_198{transform:rotate(180deg)}._dropdownMenu_jrobc_208{position:absolute;top:calc(100% + .25rem);right:0;min-width:10rem;background-color:var(--xw-popover);border:1px solid var(--xw-border);border-radius:.5rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:1000;overflow:hidden}._dropdownItem_jrobc_221{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem 1rem;font-size:.875rem;color:var(--xw-popover-foreground);text-decoration:none;background:none;border:none;cursor:pointer;text-align:left;transition:background-color .15s cubic-bezier(.4,0,.2,1)}._dropdownItem_jrobc_221:hover{background-color:var(--xw-muted)}._dropdownItem_jrobc_221:focus{outline:none;background-color:var(--xw-muted)}._dropdownIcon_jrobc_244{width:1rem;height:1rem;flex-shrink:0}@media(max-width:767px){._logoText_jrobc_251{font-size:1rem}._navLink_jrobc_109{padding:.25rem .5rem;font-size:.8rem;gap:.25rem}._githubIcon_jrobc_128{width:.875rem;height:.875rem}}._backdrop_1a7pu_1{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:1040;opacity:0;visibility:hidden;transition:all .15s cubic-bezier(.4,0,.2,1)}._backdrop_1a7pu_1._open_1a7pu_13{opacity:1;visibility:visible}._mobileMenu_1a7pu_18{position:fixed;top:0;left:0;width:320px;height:100vh;background-color:var(--xw-background);border-right:1px solid var(--xw-border);z-index:1050;transform:translate(-100%);transition:transform .15s cubic-bezier(.4,0,.2,1);display:flex;flex-direction:column;overflow:hidden}._mobileMenu_1a7pu_18._open_1a7pu_13{transform:translate(0)}._header_1a7pu_37{display:flex;align-items:center;justify-content:space-between;padding:1.5rem;border-bottom:1px solid var(--xw-border);flex-shrink:0}._brand_1a7pu_46{flex:1;display:flex;align-items:center;gap:.5rem}._cloudIcon_1a7pu_53{width:1.5rem;height:1.5rem;flex-shrink:0}._cloudIcon_1a7pu_53 .accent{fill:#d33079}._title_1a7pu_62{font-size:1.125rem;font-weight:600;color:var(--xw-foreground);margin:0}._closeButton_1a7pu_69{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._closeButton_1a7pu_69:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._closeButton_1a7pu_69:disabled{pointer-events:none;opacity:.5}._closeButton_1a7pu_69{padding:.5rem;background-color:transparent;color:var(--xw-muted-foreground);border-radius:.5rem}._closeButton_1a7pu_69:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}._closeIcon_1a7pu_101{width:1.25rem;height:1.25rem}._languageSection_1a7pu_106{padding:1.5rem;border-bottom:1px solid var(--xw-border);flex-shrink:0}._languageSelect_1a7pu_112{position:relative;width:100%}._languageButton_1a7pu_117{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._languageButton_1a7pu_117:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._languageButton_1a7pu_117:disabled{pointer-events:none;opacity:.5}._languageButton_1a7pu_117{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.5rem 1rem;background-color:var(--xw-background);border:1px solid var(--xw-border);color:var(--xw-foreground);gap:.5rem}._languageButton_1a7pu_117:hover,._languageButton_1a7pu_117[aria-expanded=true]{background-color:var(--xw-muted)}._icon_1a7pu_156{width:1rem;height:1rem;flex-shrink:0}._chevron_1a7pu_162{width:1rem;height:1rem;transition:transform .15s cubic-bezier(.4,0,.2,1);margin-left:auto}._languageButton_1a7pu_117[aria-expanded=true] ._chevron_1a7pu_162{transform:rotate(180deg)}._languageDropdown_1a7pu_172{position:absolute;top:100%;left:0;right:0;background-color:var(--xw-popover);border:1px solid var(--xw-border);border-radius:.5rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:1000;margin-top:.25rem}._languageOption_1a7pu_185{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._languageOption_1a7pu_185:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._languageOption_1a7pu_185:disabled{pointer-events:none;opacity:.5}._languageOption_1a7pu_185{width:100%;padding:.5rem 1rem;background-color:transparent;color:var(--xw-foreground);text-align:left;justify-content:flex-start;border-radius:0}._languageOption_1a7pu_185:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}._languageOption_1a7pu_185:last-child{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}._languageOption_1a7pu_185:hover{background-color:var(--xw-muted)}._languageOption_1a7pu_185._selected_1a7pu_226{background-color:var(--xw-accent);color:var(--xw-accent-foreground)}._scrollArea_1a7pu_231{flex:1;overflow-y:auto;padding:1.5rem 0}._navigation_1a7pu_237{padding:0 1.5rem}._section_1a7pu_241{margin-bottom:1rem}._sectionButton_1a7pu_245{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._sectionButton_1a7pu_245:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._sectionButton_1a7pu_245:disabled{pointer-events:none;opacity:.5}._sectionButton_1a7pu_245{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.5rem 1rem;background-color:transparent;color:var(--xw-foreground);font-weight:600;gap:.5rem;border-radius:.5rem}._sectionButton_1a7pu_245:hover{background-color:var(--xw-muted)}._sectionButton_1a7pu_245 ._icon_1a7pu_156{transition:transform .15s cubic-bezier(.4,0,.2,1);margin-left:auto}._sectionButton_1a7pu_245._expanded_1a7pu_285 ._icon_1a7pu_156{transform:rotate(90deg)}._sectionItems_1a7pu_289{margin-top:.5rem;margin-left:1rem;display:flex;flex-direction:column;gap:.25rem}._navItem_1a7pu_297{display:block;padding:.5rem 1rem;border-radius:.5rem;color:var(--xw-muted-foreground);text-decoration:none;transition:all .15s cubic-bezier(.4,0,.2,1);font-size:.875rem}._navItem_1a7pu_297:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}._navItem_1a7pu_297._active_1a7pu_310{background-color:var(--xw-accent);color:var(--xw-accent-foreground);font-weight:500}._navItemContent_1a7pu_316{display:flex;align-items:center;gap:.5rem}._navItemTitle_1a7pu_322{flex:1}@media(min-width:1024px){._mobileMenu_1a7pu_18,._backdrop_1a7pu_1{display:none}}._sidebar_1tdxt_1{position:fixed;top:0;left:0;width:16rem;height:100vh;background-color:var(--xw-sidebar);overflow-y:auto;z-index:1020}@media(max-width:767px){._sidebar_1tdxt_1{display:none}}._header_1tdxt_17{position:sticky;top:0;z-index:1020;padding:1rem;background-color:var(--xw-sidebar);display:flex;flex-direction:column;gap:.5rem;padding-bottom:0}._brand_1tdxt_29{display:flex;align-items:center;gap:.5rem}._cloudIcon_1tdxt_35{width:1.5rem;height:1.5rem;flex-shrink:0}._cloudIcon_1tdxt_35 .accent{fill:#d33079}._title_1tdxt_44{font-size:1rem;font-weight:600;line-height:1.5;margin:0;letter-spacing:-.02em;color:var(--xw-foreground)}._languageSelect_1tdxt_55{position:relative;margin-top:.25rem;width:100%}._languageButton_1tdxt_61{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._languageButton_1tdxt_61:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._languageButton_1tdxt_61:disabled{pointer-events:none;opacity:.5}._languageButton_1tdxt_61{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;width:100%;gap:.25rem;font-size:.8rem;background:transparent;border:1px solid var(--xw-border);border-radius:.25rem;color:var(--xw-muted-foreground)}._languageButton_1tdxt_61:hover{background-color:var(--xw-muted);color:var(--xw-foreground)}._languageButton_1tdxt_61 ._icon_1tdxt_99{width:.875rem;height:.875rem;flex-shrink:0}._languageButton_1tdxt_61 ._chevron_1tdxt_104{width:.875rem;height:.875rem;flex-shrink:0;transition:transform .15s cubic-bezier(.4,0,.2,1)}._languageButton_1tdxt_61[aria-expanded=true] ._chevron_1tdxt_104{transform:rotate(180deg)}._languageDropdown_1tdxt_114{position:absolute;top:100%;left:0;right:0;margin-top:.25rem;background-color:var(--xw-popover);border:1px solid var(--xw-border);border-radius:.5rem;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;z-index:1000;overflow:hidden}._languageOption_1tdxt_128{display:block;width:100%;padding:.25rem .5rem;text-align:left;background:none;border:none;color:var(--xw-popover-foreground);font-size:.85rem;cursor:pointer;transition:background-color .15s cubic-bezier(.4,0,.2,1)}._languageOption_1tdxt_128:hover{background-color:var(--xw-muted)}._languageOption_1tdxt_128:focus{outline:none;background-color:var(--xw-muted)}._languageOption_1tdxt_128._selected_1tdxt_147{background-color:var(--xw-muted);color:var(--xw-foreground)}._scrollArea_1tdxt_152{height:calc(100vh - 120px);padding:1rem .5rem 1rem 1rem;overflow-y:auto}._navigation_1tdxt_158{display:flex;flex-direction:column;gap:.125rem}._section_1tdxt_164{display:flex;flex-direction:column;gap:0}._sectionButton_1tdxt_170{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;border-radius:.5rem;font-size:.875rem;font-weight:500;transition:.15s cubic-bezier(.4,0,.2,1);cursor:pointer;border:none;outline:none}._sectionButton_1tdxt_170:focus-visible{outline:2px solid var(--xw-ring);outline-offset:2px}._sectionButton_1tdxt_170:disabled{pointer-events:none;opacity:.5}._sectionButton_1tdxt_170{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.25rem .5rem;font-weight:500;font-size:.85rem;color:var(--xw-muted-foreground);background:transparent;text-align:left;letter-spacing:-.01em;border:none}._sectionButton_1tdxt_170:hover{color:var(--xw-foreground)}._sectionButton_1tdxt_170 ._icon_1tdxt_99{width:.875rem;height:.875rem;transition:transform .15s cubic-bezier(.4,0,.2,1)}._sectionButton_1tdxt_170._expanded_1tdxt_213 ._icon_1tdxt_99{transform:rotate(90deg)}._sectionItems_1tdxt_217{margin-top:.25rem;padding-left:1rem;display:flex;flex-direction:column;gap:.125rem}._navItem_1tdxt_225{display:block;width:100%;padding:.25rem .5rem;border-radius:.25rem;font-size:.85rem;color:var(--xw-muted-foreground);text-decoration:none;transition:color .15s cubic-bezier(.4,0,.2,1)}._navItem_1tdxt_225:hover{color:var(--xw-foreground)}._navItem_1tdxt_225._active_1tdxt_238{color:var(--xw-foreground);font-weight:500}._navItemContent_1tdxt_243{display:flex;align-items:center;justify-content:space-between;width:100%}._sidebar_1tdxt_1::-webkit-scrollbar{width:6px}._sidebar_1tdxt_1::-webkit-scrollbar-track{background:transparent}._sidebar_1tdxt_1::-webkit-scrollbar-thumb{background:var(--xw-muted-foreground);border-radius:9999px;opacity:.3}._sidebar_1tdxt_1::-webkit-scrollbar-thumb:hover{opacity:.6}._app_wf6ni_1{min-height:100vh;background-color:var(--xw-background);color:var(--xw-foreground);display:flex;flex-direction:column}._layout_wf6ni_9{display:flex;flex:1;min-height:calc(100vh - 3.5rem)}._main_wf6ni_15{flex:1;display:flex;flex-direction:column;margin-left:16rem}._main_wf6ni_15._fullWidth_wf6ni_21{margin-left:0}@media(max-width:767px){._main_wf6ni_15{margin-left:0}}._contentWrapper_wf6ni_30{display:flex;flex:1;position:relative;width:100%;max-width:80rem;margin:0 auto;padding:2rem}._main_wf6ni_15._fullWidth_wf6ni_21 ._contentWrapper_wf6ni_30{width:auto}@media(max-width:1024px){._contentWrapper_wf6ni_30{padding:1.5rem}}@media(max-width:767px){._contentWrapper_wf6ni_30{padding:1rem}}._homePage_10e4f_1{flex:1;max-width:48rem;margin:0;padding:0 0 2rem}@media(max-width:767px){._homePage_10e4f_1{padding:1rem;max-width:none}}@media(max-width:1024px){._homePage_10e4f_1{max-width:none;padding:2rem}}._header_10e4f_20{margin-bottom:1.5rem}._title_10e4f_24{font-size:2rem;font-weight:700;color:var(--xw-foreground);margin-bottom:0!important}._articlesList_10e4f_31{display:flex;flex-direction:column;gap:1rem}._articleCard_10e4f_37{padding:1rem;border:1px solid var(--xw-border);border-radius:.5rem;background:transparent;cursor:pointer;text-align:left;transition:all .2s ease-in-out}._articleCard_10e4f_37:hover{border-color:var(--xw-primary);background-color:var(--xw-card);transform:translateY(-2px)}._articleCard_10e4f_37:focus-visible{outline:2px solid var(--xw-primary);outline-offset:2px}._articleTitle_10e4f_56{font-size:1.25rem;font-weight:600;margin:0 0 .5rem;color:var(--xw-foreground)}._articleDescription_10e4f_63{font-size:.9rem;color:var(--xw-muted-foreground);margin:0 0 .5rem;line-height:1.5}._loading_10e4f_70,._empty_10e4f_71{padding:2rem;text-align:center;color:var(--xw-muted-foreground)}@keyframes _shimmer_10e4f_1{0%{background-position:-1000px 0}to{background-position:1000px 0}}._skeletonCard_10e4f_85{padding:1rem;border:1px solid var(--xw-border);border-radius:.5rem;background:transparent;display:flex;flex-direction:column;gap:.5rem}._skeletonTitle_10e4f_95{width:70%;height:1.5rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_10e4f_1 2s infinite linear;border-radius:.5rem}._skeletonText_10e4f_104{width:100%;height:1rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_10e4f_1 2s infinite linear;border-radius:.25rem}._skeletonMetadata_10e4f_113{width:40%;height:.875rem;background:linear-gradient(90deg,var(--xw-muted) 0%,color-mix(in oklch,var(--xw-muted) 50%,white) 50%,var(--xw-muted) 100%);background-size:1000px 100%;animation:_shimmer_10e4f_1 2s infinite linear;border-radius:.25rem;margin-top:.25rem}
@@ -0,0 +1,160 @@
1
+ import path from 'node:path'
2
+ import type {
3
+ BlogDiscoveryResult,
4
+ BlogPostMetadata,
5
+ BlogSSGConfig,
6
+ } from './types.ts'
7
+
8
+ /**
9
+ * Parse YAML frontmatter from MDX content
10
+ */
11
+ function parseFrontmatter(content: string): Record<string, unknown> {
12
+ const match = content.match(/^---\s*\n([\s\S]*?)\n---\s*\n/)
13
+
14
+ if (!match) return {}
15
+
16
+ const frontmatter: Record<string, unknown> = {}
17
+ const frontmatterText = match[1]
18
+ let currentKey = ''
19
+ let isArrayContext = false
20
+ const arrayValues: string[] = []
21
+
22
+ for (const line of frontmatterText.split('\n')) {
23
+ const trimmed = line.trim()
24
+
25
+ // Handle array items (lines starting with -)
26
+ if (trimmed.startsWith('-')) {
27
+ if (isArrayContext) {
28
+ const value = trimmed.substring(1).trim()
29
+ arrayValues.push(value)
30
+ }
31
+ continue
32
+ }
33
+
34
+ // If we were in array context and hit a non-array line, save the array
35
+ if (isArrayContext && !trimmed.startsWith('-')) {
36
+ frontmatter[currentKey] = arrayValues.slice()
37
+ arrayValues.length = 0
38
+ isArrayContext = false
39
+ }
40
+
41
+ // Handle key-value pairs
42
+ if (trimmed?.includes(':')) {
43
+ const [key, ...valueParts] = trimmed.split(':')
44
+ const value = valueParts.join(':').trim()
45
+ currentKey = key.trim()
46
+
47
+ // If value is empty, this might be an array declaration
48
+ if (!value) {
49
+ isArrayContext = true
50
+ continue
51
+ }
52
+
53
+ // Parse boolean values
54
+ if (value === 'true') frontmatter[currentKey] = true
55
+ else if (value === 'false') frontmatter[currentKey] = false
56
+ else frontmatter[currentKey] = value
57
+ }
58
+ }
59
+
60
+ // Save any remaining array
61
+ if (isArrayContext) {
62
+ frontmatter[currentKey] = arrayValues.slice()
63
+ }
64
+
65
+ return frontmatter
66
+ }
67
+
68
+ /**
69
+ * Extract language from file path based on doc structure
70
+ * Expected: docs/[language]/[slug].mdx
71
+ */
72
+ function extractLanguageFromPath(filePath: string): string {
73
+ const match = filePath.match(/\/docs\/([a-z]{2})\//)
74
+ return match ? match[1] : 'en'
75
+ }
76
+
77
+ /**
78
+ * Extract slug from file path
79
+ * Expected: docs/[language]/[slug].mdx
80
+ */
81
+ function extractSlugFromPath(filePath: string): string {
82
+ const match = filePath.match(/\/([a-z0-9-]+)\.mdx$/)
83
+ return match ? match[1] : ''
84
+ }
85
+
86
+ /**
87
+ * Discover all blog posts from Vite glob import
88
+ *
89
+ * @param mdxFiles - Object from import.meta.glob('./docs/**\/*.mdx', { query: '?raw', import: 'default', eager: false })
90
+ * @param config - SSG configuration options
91
+ * @returns Collection of discovered blog posts organized by language and slug
92
+ */
93
+ export async function discoverBlogPosts(
94
+ mdxFiles: Record<string, () => Promise<unknown>>,
95
+ config: BlogSSGConfig = {},
96
+ ): Promise<BlogDiscoveryResult> {
97
+ const posts: BlogPostMetadata[] = []
98
+ const postsByLanguage: Record<string, BlogPostMetadata[]> = {}
99
+ const postsBySlug: Record<string, BlogPostMetadata> = {}
100
+
101
+ // Iterate through all MDX files
102
+ for (const [filePath, getContent] of Object.entries(mdxFiles)) {
103
+ try {
104
+ // Load content
105
+ const content = (await getContent()) as string
106
+
107
+ // Extract language and slug
108
+ const language = extractLanguageFromPath(filePath)
109
+ const slug = extractSlugFromPath(filePath)
110
+
111
+ if (!slug) continue
112
+
113
+ // Parse frontmatter
114
+ const frontmatter = parseFrontmatter(content)
115
+
116
+ // Create metadata object
117
+ const metadata: BlogPostMetadata = {
118
+ slug,
119
+ title: (frontmatter.title as string) || slug,
120
+ description: frontmatter.description as string | undefined,
121
+ ogImage: frontmatter.ogImage as string | undefined,
122
+ keywords: frontmatter.keywords as string[] | string | undefined,
123
+ date: frontmatter.date as string | undefined,
124
+ author: frontmatter.author as string | undefined,
125
+ language,
126
+ filePath,
127
+ }
128
+
129
+ posts.push(metadata)
130
+
131
+ // Index by language
132
+ if (!postsByLanguage[language]) {
133
+ postsByLanguage[language] = []
134
+ }
135
+ postsByLanguage[language].push(metadata)
136
+
137
+ // Index by slug (use [language-slug] composite key to avoid conflicts)
138
+ postsBySlug[`${language}:${slug}`] = metadata
139
+ } catch (error) {
140
+ console.warn(`Warning: Failed to process ${filePath}:`, error)
141
+ }
142
+ }
143
+
144
+ return {
145
+ posts,
146
+ postsByLanguage,
147
+ postsBySlug,
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Filter blog posts by specific criteria
153
+ * Useful for separating blog posts from docs
154
+ */
155
+ export function filterBlogPosts(
156
+ posts: BlogPostMetadata[],
157
+ predicate: (post: BlogPostMetadata) => boolean,
158
+ ): BlogPostMetadata[] {
159
+ return posts.filter(predicate)
160
+ }
@@ -0,0 +1,17 @@
1
+ // Blog discovery
2
+ export { discoverBlogPosts, filterBlogPosts } from './blog-discovery.ts'
3
+
4
+ // Meta tag generation
5
+ export {
6
+ generateHtmlWithMetaTags,
7
+ generateMetaTags,
8
+ generateMetaTagsObject,
9
+ type MetaTagsOptions,
10
+ } from './meta-tags.ts'
11
+ // SSG setup utilities (recommended for consumers)
12
+ export { type SetupSSGOptions, setupSSG } from './setup-ssg.ts'
13
+ // Vite plugin
14
+ export {
15
+ createStaticGenPlugin,
16
+ type StaticGenPluginOptions,
17
+ } from './static-gen-plugin.ts'
@@ -0,0 +1,184 @@
1
+ import type { BlogPostMetadata } from './types.ts'
2
+
3
+ export interface MetaTagsOptions {
4
+ /** Base URL for absolute OG image URLs */
5
+ baseUrl?: string
6
+ /** Default OG image URL if post doesn't have one */
7
+ defaultOgImage?: string
8
+ /** Site title for Twitter Card */
9
+ siteTitle?: string
10
+ /** Site name for OG tags */
11
+ siteName?: string
12
+ /** Twitter handle for Twitter Card */
13
+ twitterHandle?: string
14
+ }
15
+
16
+ /**
17
+ * Generate meta tags HTML string from blog post metadata
18
+ */
19
+ export function generateMetaTags(
20
+ post: BlogPostMetadata,
21
+ options: MetaTagsOptions = {},
22
+ ): string {
23
+ const {
24
+ baseUrl = 'https://docs.staking.polkadot.cloud',
25
+ defaultOgImage = '/img/og-image.png',
26
+ siteTitle = 'Polkadot Cloud Staking',
27
+ siteName = 'Polkadot Cloud Staking Documentation',
28
+ twitterHandle = '@PolkadotCloud',
29
+ } = options
30
+
31
+ const postUrl = `${baseUrl}/${post.language}/docs/${post.slug}`
32
+ const ogImage = post.ogImage
33
+ ? `${baseUrl}${post.ogImage.startsWith('/') ? '' : '/'}${post.ogImage}`
34
+ : `${baseUrl}${defaultOgImage}`
35
+
36
+ // Normalize keywords
37
+ let keywordsString = ''
38
+ if (post.keywords) {
39
+ if (Array.isArray(post.keywords)) {
40
+ keywordsString = post.keywords.join(', ')
41
+ } else {
42
+ keywordsString = post.keywords
43
+ }
44
+ }
45
+
46
+ const tags: string[] = [
47
+ // Basic meta tags
48
+ `<meta name="description" content="${escapeHtml(post.description || siteTitle)}">`,
49
+ `<meta name="viewport" content="width=device-width, initial-scale=1.0">`,
50
+
51
+ // Open Graph (OG) tags
52
+ `<meta property="og:type" content="article">`,
53
+ `<meta property="og:title" content="${escapeHtml(post.title)} | ${escapeHtml(siteName)}">`,
54
+ `<meta property="og:description" content="${escapeHtml(post.description || siteTitle)}">`,
55
+ `<meta property="og:url" content="${escapeHtml(postUrl)}">`,
56
+ `<meta property="og:image" content="${escapeHtml(ogImage)}">`,
57
+ `<meta property="og:site_name" content="${escapeHtml(siteName)}">`,
58
+
59
+ // Article-specific meta tags
60
+ `<meta property="article:published_time" content="${post.date || new Date().toISOString()}">`,
61
+ post.author
62
+ ? `<meta property="article:author" content="${escapeHtml(post.author)}">`
63
+ : '',
64
+
65
+ // Twitter Card tags
66
+ `<meta name="twitter:card" content="summary_large_image">`,
67
+ `<meta name="twitter:site" content="${twitterHandle}">`,
68
+ `<meta name="twitter:title" content="${escapeHtml(post.title)} | ${escapeHtml(siteName)}">`,
69
+ `<meta name="twitter:description" content="${escapeHtml(post.description || siteTitle)}">`,
70
+ `<meta name="twitter:image" content="${escapeHtml(ogImage)}">`,
71
+
72
+ // Keywords
73
+ keywordsString
74
+ ? `<meta name="keywords" content="${escapeHtml(keywordsString)}">`
75
+ : '',
76
+
77
+ // Canonical URL
78
+ `<link rel="canonical" href="${escapeHtml(postUrl)}">`,
79
+ ]
80
+
81
+ return tags.filter(Boolean).join('\n\t')
82
+ }
83
+
84
+ /**
85
+ * Escape HTML special characters in attribute values
86
+ */
87
+ function escapeHtml(text: string): string {
88
+ const map: Record<string, string> = {
89
+ '&': '&amp;',
90
+ '<': '&lt;',
91
+ '>': '&gt;',
92
+ '"': '&quot;',
93
+ "'": '&#039;',
94
+ }
95
+ return text.replace(/[&<>"']/g, (char) => map[char])
96
+ }
97
+
98
+ /**
99
+ * Generate an HTML template with injected meta tags
100
+ * Used for static page generation
101
+ */
102
+ export function generateHtmlWithMetaTags(
103
+ baseHtml: string,
104
+ post: BlogPostMetadata,
105
+ options: MetaTagsOptions = {},
106
+ ): string {
107
+ const metaTags = generateMetaTags(post, options)
108
+
109
+ // Remove default OG and Twitter meta tags to replace them with custom ones
110
+ let html = baseHtml
111
+ // Remove default og:* meta tags (handles multiline)
112
+ .replace(/<meta\s+property="og:[^"]*"[^>]*>/gis, '')
113
+ // Remove default article:* meta tags (handles multiline)
114
+ .replace(/<meta\s+property="article:[^"]*"[^>]*>/gis, '')
115
+ // Remove default twitter:* meta tags with either 'name' or 'property' attribute (handles multiline)
116
+ .replace(/<meta\s+(?:name|property)="twitter:[^"]*"[^>]*>/gis, '')
117
+ // Remove default description tag
118
+ .replace(/<meta\s+name="description"[^>]*>/gis, '')
119
+ // Remove canonical link if present
120
+ .replace(/<link\s+rel="canonical"[^>]*>/gis, '')
121
+
122
+ // Clean up excess blank lines left by removed tags
123
+ html = html.replace(/\n\s*\n\s*\n/g, '\n\n')
124
+
125
+ // Remove orphaned section comments followed by blank lines
126
+ html = html.replace(
127
+ /\s*<!--\s*(?:Open Graph|Facebook|Twitter)[^>]*-->\s*\n/g,
128
+ '',
129
+ )
130
+
131
+ // Final cleanup: remove any remaining multiple blank lines
132
+ html = html.replace(/\n\s*\n\s*\n/g, '\n\n')
133
+
134
+ // Inject custom meta tags before closing </head> tag
135
+ return html.replace('</head>', `\t${metaTags}\n</head>`)
136
+ }
137
+
138
+ /**
139
+ * Generate meta tags as a JSON object for dynamic injection
140
+ * Useful if you want to update meta tags on client-side navigation
141
+ */
142
+ export function generateMetaTagsObject(
143
+ post: BlogPostMetadata,
144
+ options: MetaTagsOptions = {},
145
+ ): Record<string, string> {
146
+ const {
147
+ baseUrl = 'https://docs.staking.polkadot.cloud',
148
+ defaultOgImage = '/img/og-image.png',
149
+ siteName = 'Polkadot Cloud Staking Documentation',
150
+ } = options
151
+
152
+ const postUrl = `${baseUrl}/${post.language}/docs/${post.slug}`
153
+ const ogImage = post.ogImage
154
+ ? `${baseUrl}${post.ogImage.startsWith('/') ? '' : '/'}${post.ogImage}`
155
+ : `${baseUrl}${defaultOgImage}`
156
+
157
+ // Normalize keywords
158
+ let keywordsArray: string[] = []
159
+ if (post.keywords) {
160
+ if (Array.isArray(post.keywords)) {
161
+ keywordsArray = post.keywords
162
+ } else {
163
+ keywordsArray = post.keywords.split(',').map((k) => k.trim())
164
+ }
165
+ }
166
+
167
+ return {
168
+ description: post.description || siteName,
169
+ 'og:type': 'article',
170
+ 'og:title': `${post.title} | ${siteName}`,
171
+ 'og:description': post.description || siteName,
172
+ 'og:url': postUrl,
173
+ 'og:image': ogImage,
174
+ 'og:site_name': siteName,
175
+ 'article:published_time': post.date || new Date().toISOString(),
176
+ ...(post.author && { 'article:author': post.author }),
177
+ 'twitter:card': 'summary_large_image',
178
+ 'twitter:title': `${post.title} | ${siteName}`,
179
+ 'twitter:description': post.description || siteName,
180
+ 'twitter:image': ogImage,
181
+ ...(keywordsArray.length > 0 && { keywords: keywordsArray.join(', ') }),
182
+ canonical: postUrl,
183
+ }
184
+ }