@sleetch/react 1.0.4

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.
Files changed (110) hide show
  1. package/dist/assets/button.css +1 -0
  2. package/dist/assets/content.css +1 -0
  3. package/dist/assets/content2.css +1 -0
  4. package/dist/assets/content3.css +1 -0
  5. package/dist/assets/file-system.css +1 -0
  6. package/dist/assets/header.css +1 -0
  7. package/dist/assets/layout.css +1 -0
  8. package/dist/assets/navigation.css +1 -0
  9. package/dist/assets/sidebar.css +1 -0
  10. package/dist/assets/toc.css +1 -0
  11. package/dist/button-B1pw1TFm.js +19 -0
  12. package/dist/button-B1pw1TFm.js.map +1 -0
  13. package/dist/button-DWM5D_of.cjs +2 -0
  14. package/dist/button-DWM5D_of.cjs.map +1 -0
  15. package/dist/clsx-CPcBvw4Z.cjs +2 -0
  16. package/dist/clsx-CPcBvw4Z.cjs.map +1 -0
  17. package/dist/clsx-CeX9s6vy.js +18 -0
  18. package/dist/clsx-CeX9s6vy.js.map +1 -0
  19. package/dist/components/button.cjs.js +1 -0
  20. package/dist/components/button.d.ts +5 -0
  21. package/dist/components/button.esm.js +2 -0
  22. package/dist/components/documentation/connected-header.cjs.js +2 -0
  23. package/dist/components/documentation/connected-header.cjs.js.map +1 -0
  24. package/dist/components/documentation/connected-header.d.ts +4 -0
  25. package/dist/components/documentation/connected-header.esm.js +15 -0
  26. package/dist/components/documentation/connected-header.esm.js.map +1 -0
  27. package/dist/components/documentation/connected-sidebar.cjs.js +2 -0
  28. package/dist/components/documentation/connected-sidebar.cjs.js.map +1 -0
  29. package/dist/components/documentation/connected-sidebar.d.ts +9 -0
  30. package/dist/components/documentation/connected-sidebar.esm.js +16 -0
  31. package/dist/components/documentation/connected-sidebar.esm.js.map +1 -0
  32. package/dist/components/documentation/content.cjs.js +1 -0
  33. package/dist/components/documentation/content.d.ts +4 -0
  34. package/dist/components/documentation/content.esm.js +2 -0
  35. package/dist/components/documentation/header.cjs.js +1 -0
  36. package/dist/components/documentation/header.d.ts +5 -0
  37. package/dist/components/documentation/header.esm.js +2 -0
  38. package/dist/components/documentation/layout.cjs.js +1 -0
  39. package/dist/components/documentation/layout.d.ts +11 -0
  40. package/dist/components/documentation/layout.esm.js +2 -0
  41. package/dist/components/documentation/page/content.cjs.js +1 -0
  42. package/dist/components/documentation/page/content.d.ts +7 -0
  43. package/dist/components/documentation/page/content.esm.js +2 -0
  44. package/dist/components/documentation/page/header.cjs.js +2 -0
  45. package/dist/components/documentation/page/header.cjs.js.map +1 -0
  46. package/dist/components/documentation/page/header.d.ts +6 -0
  47. package/dist/components/documentation/page/header.esm.js +31 -0
  48. package/dist/components/documentation/page/header.esm.js.map +1 -0
  49. package/dist/components/documentation/page/navigation.cjs.js +1 -0
  50. package/dist/components/documentation/page/navigation.d.ts +8 -0
  51. package/dist/components/documentation/page/navigation.esm.js +2 -0
  52. package/dist/components/documentation/sidebar/content.cjs.js +1 -0
  53. package/dist/components/documentation/sidebar/content.d.ts +4 -0
  54. package/dist/components/documentation/sidebar/content.esm.js +2 -0
  55. package/dist/components/documentation/sidebar/index.cjs.js +1 -0
  56. package/dist/components/documentation/sidebar/index.d.ts +11 -0
  57. package/dist/components/documentation/sidebar/index.esm.js +2 -0
  58. package/dist/components/documentation/toc/content.cjs.js +1 -0
  59. package/dist/components/documentation/toc/content.d.ts +4 -0
  60. package/dist/components/documentation/toc/content.esm.js +2 -0
  61. package/dist/components/documentation/toc/index.cjs.js +1 -0
  62. package/dist/components/documentation/toc/index.d.ts +6 -0
  63. package/dist/components/documentation/toc/index.esm.js +2 -0
  64. package/dist/components/file-system.cjs.js +1 -0
  65. package/dist/components/file-system.d.ts +20 -0
  66. package/dist/components/file-system.esm.js +2 -0
  67. package/dist/content-CRXZ7aLX.js +17 -0
  68. package/dist/content-CRXZ7aLX.js.map +1 -0
  69. package/dist/content-CePPkmqw.cjs +2 -0
  70. package/dist/content-CePPkmqw.cjs.map +1 -0
  71. package/dist/content-D_P9xOgL.cjs +2 -0
  72. package/dist/content-D_P9xOgL.cjs.map +1 -0
  73. package/dist/content-DusAp8Q6.js +32 -0
  74. package/dist/content-DusAp8Q6.js.map +1 -0
  75. package/dist/content-_OkOg-pq.cjs +2 -0
  76. package/dist/content-_OkOg-pq.cjs.map +1 -0
  77. package/dist/content-mbVWCXX0.js +17 -0
  78. package/dist/content-mbVWCXX0.js.map +1 -0
  79. package/dist/content-r8d8MkOf.cjs +2 -0
  80. package/dist/content-r8d8MkOf.cjs.map +1 -0
  81. package/dist/content-x_2bnG7q.js +17 -0
  82. package/dist/content-x_2bnG7q.js.map +1 -0
  83. package/dist/file-system-BtXBcLmT.js +101 -0
  84. package/dist/file-system-BtXBcLmT.js.map +1 -0
  85. package/dist/file-system-Dr4N-WNs.cjs +2 -0
  86. package/dist/file-system-Dr4N-WNs.cjs.map +1 -0
  87. package/dist/header-D59bdlay.js +55 -0
  88. package/dist/header-D59bdlay.js.map +1 -0
  89. package/dist/header-DbR9X4YP.cjs +2 -0
  90. package/dist/header-DbR9X4YP.cjs.map +1 -0
  91. package/dist/index.cjs.js +1 -0
  92. package/dist/index.d.ts +14 -0
  93. package/dist/index.esm.js +16 -0
  94. package/dist/layout-BRE4zrjG.js +29 -0
  95. package/dist/layout-BRE4zrjG.js.map +1 -0
  96. package/dist/layout-D6mjobyq.cjs +2 -0
  97. package/dist/layout-D6mjobyq.cjs.map +1 -0
  98. package/dist/navigation-BdVu1Uh-.cjs +2 -0
  99. package/dist/navigation-BdVu1Uh-.cjs.map +1 -0
  100. package/dist/navigation-kP1-q7Ux.js +141 -0
  101. package/dist/navigation-kP1-q7Ux.js.map +1 -0
  102. package/dist/sidebar-DGEZFbBi.cjs +2 -0
  103. package/dist/sidebar-DGEZFbBi.cjs.map +1 -0
  104. package/dist/sidebar-DgVlWEfQ.js +168 -0
  105. package/dist/sidebar-DgVlWEfQ.js.map +1 -0
  106. package/dist/toc-BuFdWsti.js +103 -0
  107. package/dist/toc-BuFdWsti.js.map +1 -0
  108. package/dist/toc-CMwm46RH.cjs +2 -0
  109. package/dist/toc-CMwm46RH.cjs.map +1 -0
  110. package/package.json +50 -0
@@ -0,0 +1,141 @@
1
+ import { t as e } from "./clsx-CeX9s6vy.js";
2
+ import { useMemo as t } from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ import './assets/navigation.css';var i = {
5
+ navigation: "_navigation_fckni_3",
6
+ slot: "_slot_fckni_12",
7
+ "slot-end": "_slot-end_fckni_16",
8
+ card: "_card_fckni_20",
9
+ next: "_next_fckni_47",
10
+ previous: "_previous_fckni_52",
11
+ meta: "_meta_fckni_57",
12
+ chevron: "_chevron_fckni_65",
13
+ title: "_title_fckni_71",
14
+ description: "_description_fckni_78"
15
+ }, a = (e) => e;
16
+ function o(e) {
17
+ return e.children.find((e) => e.type === "data");
18
+ }
19
+ function s(e) {
20
+ return e.children.find((e) => e.type === "page" && e.index === !0);
21
+ }
22
+ function c(e) {
23
+ return e.type === "category" ? o(e)?.frontmatter?.order ?? Infinity : e.type === "page" ? e.frontmatter.order ?? Infinity : Infinity;
24
+ }
25
+ function l(e) {
26
+ return e.map((e, t) => ({
27
+ node: e,
28
+ index: t
29
+ })).filter(({ node: e }) => e.type !== "data").sort((e, t) => {
30
+ let n = c(e.node) - c(t.node);
31
+ return n === 0 ? e.index - t.index : n;
32
+ }).map(({ node: e }) => e);
33
+ }
34
+ function u(e) {
35
+ let t = l(e), n = [];
36
+ for (let e of t) {
37
+ if (e.type === "page") {
38
+ n.push(e);
39
+ continue;
40
+ }
41
+ if (e.type === "category") {
42
+ let t = s(e);
43
+ t && n.push(t);
44
+ let r = e.children.filter((e) => e.type !== "data" && !(e.type === "page" && e.index === !0));
45
+ n.push(...u(r));
46
+ }
47
+ }
48
+ return n;
49
+ }
50
+ function d() {
51
+ return /* @__PURE__ */ n("svg", {
52
+ viewBox: "0 0 24 24",
53
+ width: "16",
54
+ height: "16",
55
+ fill: "none",
56
+ stroke: "currentColor",
57
+ strokeWidth: "2.5",
58
+ strokeLinecap: "round",
59
+ strokeLinejoin: "round",
60
+ className: i.chevron,
61
+ children: /* @__PURE__ */ n("polyline", { points: "15 18 9 12 15 6" })
62
+ });
63
+ }
64
+ function f() {
65
+ return /* @__PURE__ */ n("svg", {
66
+ viewBox: "0 0 24 24",
67
+ width: "16",
68
+ height: "16",
69
+ fill: "none",
70
+ stroke: "currentColor",
71
+ strokeWidth: "2.5",
72
+ strokeLinecap: "round",
73
+ strokeLinejoin: "round",
74
+ className: i.chevron,
75
+ children: /* @__PURE__ */ n("polyline", { points: "9 18 15 12 9 6" })
76
+ });
77
+ }
78
+ function p(e, t) {
79
+ return e && e !== "No title." ? e : t;
80
+ }
81
+ function m(e) {
82
+ return e && e !== "No description." ? e : void 0;
83
+ }
84
+ function h({ node: t, direction: a, hrefBuilder: o }) {
85
+ let s = p(t.frontmatter.title, t.path), c = m(t.frontmatter.description);
86
+ return /* @__PURE__ */ r("a", {
87
+ href: o(t.path),
88
+ className: e(i.card, i[a]),
89
+ "data-direction": a,
90
+ children: [/* @__PURE__ */ r("span", {
91
+ className: i.meta,
92
+ children: [
93
+ a === "previous" && /* @__PURE__ */ n(d, {}),
94
+ /* @__PURE__ */ n("span", {
95
+ className: i.title,
96
+ children: s
97
+ }),
98
+ a === "next" && /* @__PURE__ */ n(f, {})
99
+ ]
100
+ }), c && /* @__PURE__ */ n("span", {
101
+ className: i.description,
102
+ children: c
103
+ })]
104
+ });
105
+ }
106
+ function g({ className: o, tree: s, currentPath: c, hrefBuilder: l = a, ...d }) {
107
+ let { previous: f, next: p } = t(() => {
108
+ let e = u(s), t = e.findIndex((e) => e.path === c);
109
+ return t === -1 ? {
110
+ previous: void 0,
111
+ next: void 0
112
+ } : {
113
+ previous: e[t - 1],
114
+ next: e[t + 1]
115
+ };
116
+ }, [s, c]);
117
+ return !f && !p ? null : /* @__PURE__ */ r("nav", {
118
+ className: e(i.navigation, o),
119
+ "aria-label": "Pagination",
120
+ ...d,
121
+ children: [/* @__PURE__ */ n("div", {
122
+ className: i.slot,
123
+ children: f && /* @__PURE__ */ n(h, {
124
+ node: f,
125
+ direction: "previous",
126
+ hrefBuilder: l
127
+ })
128
+ }), /* @__PURE__ */ n("div", {
129
+ className: e(i.slot, i["slot-end"]),
130
+ children: p && /* @__PURE__ */ n(h, {
131
+ node: p,
132
+ direction: "next",
133
+ hrefBuilder: l
134
+ })
135
+ })]
136
+ });
137
+ }
138
+ //#endregion
139
+ export { g as t };
140
+
141
+ //# sourceMappingURL=navigation-kP1-q7Ux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-kP1-q7Ux.js","names":[],"sources":["../../styles/src/components/documentation/page/navigation.module.css","../src/components/documentation/page/navigation.tsx"],"sourcesContent":["@import '../../../variables.css';\n\n.navigation {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1em;\n padding: var(--_sleetch-padding-root);\n padding-top: 0px;\n font-family: var(--_sleetch-font-base);\n}\n\n.slot {\n display: flex;\n}\n\n.slot-end {\n justify-content: flex-end;\n}\n\n.card {\n display: flex;\n flex-direction: column;\n gap: 0.25em;\n width: 100%;\n max-width: 320px;\n padding: 1em 1em;\n border-radius: var(--_sleetch-radius);\n border: var(--_sleetch-hr-height) solid var(--_sleetch-color-muted);\n color: var(--_sleetch-color-text);\n text-decoration: none;\n transition:\n border-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.card:hover,\n.card:focus-visible {\n border-color: var(--_sleetch-color-text-primary);\n background-color: color-mix(in srgb, var(--_sleetch-color-text-primary) 8%, var(--_sleetch-color-card));\n}\n\n.card:focus-visible {\n outline: 2px solid var(--_sleetch-color-text-primary);\n outline-offset: 2px;\n}\n\n.next {\n align-items: flex-end;\n text-align: right;\n}\n\n.previous {\n align-items: flex-start;\n text-align: left;\n}\n\n.meta {\n display: flex;\n align-items: center;\n gap: 0.3em;\n font-size: var(--_sleetch-font-size-tiny);\n color: var(--_sleetch-color-muted-foreground);\n}\n\n.chevron {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n}\n\n.title {\n font-size: var(--_sleetch-font-size-base);\n font-weight: var(--_sleetch-font-weight-heading);\n line-height: var(--_sleetch-line-height-heading);\n color: var(--_sleetch-color-text);\n}\n\n.description {\n font-size: var(--_sleetch-font-size-tiny);\n line-height: var(--_sleetch-line-height);\n color: var(--_sleetch-color-muted-foreground);\n overflow: hidden;\n}\n\n@media (min-width: 769px) and (max-width: 1024px) {\n .navigation {\n padding: 1.5em 2em;\n }\n}\n\n@media (max-width: 768px) {\n .card {\n max-width: 100%;\n }\n\n .navigation {\n grid-template-columns: 1fr;\n\n padding: 1em 1em;\n }\n\n .slot-end {\n justify-content: flex-start;\n }\n\n .next {\n align-items: flex-start;\n text-align: left;\n }\n}\n","/*\n AI Generated :(\n Needs more testing\n*/\n\nimport { useMemo, type BaseHTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport styles from '@sleetch/styles/components/documentation/page/navigation.module.css';\nimport type { tree_object } from '@sleetch/core/compiler';\n\ntype category_node = Extract<tree_object, { type: 'category' }>;\ntype page_node = Extract<tree_object, { type: 'page' }>;\ntype data_node = Extract<tree_object, { type: 'data' }>;\n\nexport interface DocumentationNavigationProps extends BaseHTMLAttributes<HTMLDivElement> {\n tree: tree_object[];\n currentPath: string;\n hrefBuilder?: (path: string) => string;\n}\n\nconst defaultHrefBuilder = (path: string) => path;\n\n/*\n Meme logique de tri/priorite que la sidebar (getCategoryData, getCategoryIndex,\n getOrder, sortNodes) pour garantir que l'ordre de navigation prev/next\n corresponde exactement a l'ordre affiche dans la sidebar.\n*/\n\nfunction getCategoryData(category: category_node): data_node | undefined {\n return category.children.find((c): c is data_node => c.type === 'data');\n}\n\nfunction getCategoryIndex(category: category_node): page_node | undefined {\n return category.children.find((c): c is page_node => c.type === 'page' && c.index === true);\n}\n\nfunction getOrder(node: tree_object): number {\n if (node.type === 'category') {\n const data = getCategoryData(node);\n return data?.frontmatter?.order ?? Number.POSITIVE_INFINITY;\n }\n if (node.type === 'page') {\n return (node.frontmatter as { order?: number }).order ?? Number.POSITIVE_INFINITY;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction sortNodes(nodes: tree_object[]): tree_object[] {\n return nodes\n .map((node, index) => ({ node, index }))\n .filter(({ node }) => node.type !== 'data')\n .sort((a, b) => {\n const diff = getOrder(a.node) - getOrder(b.node);\n return diff !== 0 ? diff : a.index - b.index;\n })\n .map(({ node }) => node);\n}\n\n/*\n Aplatit l'arbre en une liste ordonnee de pages navigables :\n - l'index d'une categorie arrive en premier (c'est le point d'entree),\n - suivi de ses enfants tries recursivement.\n*/\nfunction flattenPages(nodes: tree_object[]): page_node[] {\n const sorted = sortNodes(nodes);\n const result: page_node[] = [];\n\n for (const node of sorted) {\n if (node.type === 'page') {\n result.push(node);\n continue;\n }\n\n if (node.type === 'category') {\n const indexPage = getCategoryIndex(node);\n if (indexPage) result.push(indexPage);\n\n const rest = node.children.filter((c) => c.type !== 'data' && !(c.type === 'page' && c.index === true));\n result.push(...flattenPages(rest));\n }\n }\n\n return result;\n}\n\nfunction ChevronLeft() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={styles['chevron']}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\nfunction ChevronRight() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={styles['chevron']}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nfunction resolveTitle(title: string, fallbackPath: string): string {\n return title && title !== 'No title.' ? title : fallbackPath;\n}\n\nfunction resolveDescription(description: string): string | undefined {\n return description && description !== 'No description.' ? description : undefined;\n}\n\ninterface NavigationCardProps {\n node: page_node;\n direction: 'previous' | 'next';\n hrefBuilder: (path: string) => string;\n}\n\nfunction NavigationCard({ node, direction, hrefBuilder }: NavigationCardProps) {\n const title = resolveTitle(node.frontmatter.title, node.path);\n const description = resolveDescription(node.frontmatter.description);\n\n return (\n <a href={hrefBuilder(node.path)} className={clsx(styles['card'], styles[direction])} data-direction={direction}>\n <span className={styles['meta']}>\n {direction === 'previous' && <ChevronLeft />}\n <span className={styles['title']}>{title}</span>\n {direction === 'next' && <ChevronRight />}\n </span>\n {description && <span className={styles['description']}>{description}</span>}\n </a>\n );\n}\n\nexport function PageNavigation({ className, tree, currentPath, hrefBuilder = defaultHrefBuilder, ...props }: DocumentationNavigationProps) {\n const { previous, next } = useMemo(() => {\n const pages = flattenPages(tree);\n const currentIndex = pages.findIndex((page) => page.path === currentPath);\n\n if (currentIndex === -1) {\n return { previous: undefined, next: undefined };\n }\n\n return {\n previous: pages[currentIndex - 1],\n next: pages[currentIndex + 1],\n };\n }, [tree, currentPath]);\n\n if (!previous && !next) return null;\n\n return (\n <nav className={clsx(styles['navigation'], className)} aria-label=\"Pagination\" {...props}>\n <div className={styles['slot']}>{previous && <NavigationCard node={previous} direction=\"previous\" hrefBuilder={hrefBuilder} />}</div>\n <div className={clsx(styles['slot'], styles['slot-end'])}>\n {next && <NavigationCard node={next} direction=\"next\" hrefBuilder={hrefBuilder} />}\n </div>\n </nav>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require('./assets/sidebar.css');const e=require("./clsx-CPcBvw4Z.cjs");let t=require("react"),n=require("react/jsx-runtime");var r={sidebar:`_sidebar_1370u_4`,overlay:`_overlay_1370u_36`,"sidebar-open":`_sidebar-open_1370u_58`,fadeIn:`_fadeIn_1370u_1`,nav:`_nav_1370u_92`,list:`_list_1370u_97`,item:`_item_1370u_106`,row:`_row_1370u_110`,link:`_link_1370u_115`,"category-label":`_category-label_1370u_116`,"category-link":`_category-link_1370u_150`,active:`_active_1370u_157`,toggle:`_toggle_1370u_168`,chevron:`_chevron_1370u_191`,"chevron-open":`_chevron-open_1370u_195`,icon:`_icon_1370u_199`,label:`_label_1370u_209`},i=e=>e,a=()=>null;function o({className:o,children:s,tree:c,currentPath:l,hrefBuilder:u=i,iconResolver:d=a,isOpen:f=!1,onClose:m,...h}){return(0,t.useEffect)(()=>(f?document.body.style.overflow=`hidden`:document.body.style.overflow=``,()=>{document.body.style.overflow=``}),[f]),(0,n.jsxs)(n.Fragment,{children:[f&&(0,n.jsx)(`div`,{className:r.overlay,onClick:m}),(0,n.jsxs)(`aside`,{className:e.t(r.sidebar,f&&r[`sidebar-open`],o),...h,children:[(0,n.jsx)(`nav`,{className:r.nav,children:(0,n.jsx)(p,{nodes:c,depth:1,currentPath:l,hrefBuilder:u,iconResolver:d,onLinkClick:m})}),s]})]})}function s(e){return e.children.find(e=>e.type===`data`)}function c(e){return e.children.find(e=>e.type===`page`&&e.index===!0)}function l(e){return e.type===`category`?s(e)?.frontmatter?.order??1/0:e.type===`page`?e.frontmatter.order??1/0:1/0}function u(e){return e.map((e,t)=>({node:e,index:t})).filter(({node:e})=>e.type!==`data`).sort((e,t)=>{let n=l(e.node)-l(t.node);return n===0?e.index-t.index:n}).map(({node:e})=>e)}function d(e,t){return e&&e!==`No title.`?e:t}function f({open:t}){return(0,n.jsx)(`svg`,{viewBox:`0 0 24 24`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.5`,strokeLinecap:`round`,strokeLinejoin:`round`,className:e.t(r.chevron,t&&r[`chevron-open`]),children:(0,n.jsx)(`polyline`,{points:`9 6 15 12 9 18`})})}function p({nodes:i,depth:a,currentPath:o,hrefBuilder:s,iconResolver:c,onLinkClick:l}){let f=(0,t.useMemo)(()=>u(i),[i]);return(0,n.jsx)(`ul`,{className:r.list,"data-depth":a,children:f.map(t=>{if(t.type===`page`){if(t.index)return null;let i=t.path===o,u=c(t.frontmatter.icon);return(0,n.jsx)(`li`,{className:r.item,children:(0,n.jsxs)(`a`,{href:s(t.path),className:e.t(r.link,i&&r.active),style:{"--depth":a},onClick:l,children:[u&&(0,n.jsx)(`span`,{className:r.icon,children:u}),(0,n.jsx)(`span`,{className:r.label,children:d(t.frontmatter.title,t.path)})]})},t.path)}return t.type===`category`?(0,n.jsx)(m,{category:t,depth:a,currentPath:o,hrefBuilder:s,iconResolver:c,onLinkClick:l},t.path):null})})}function m({category:i,depth:a,currentPath:o,hrefBuilder:l,iconResolver:u,onLinkClick:m}){let h=c(i),g=s(i),_=g?.frontmatter?.title??(h?d(h.frontmatter.title,i.path):i.path),v=u(g?.frontmatter?.icon??h?.frontmatter?.icon),y=i.children.filter(e=>e.type!==`data`&&!(e.type===`page`&&e.index===!0)),b=y.length>0,x=h?h.path===o:!1,[S,C]=(0,t.useState)(!0);return(0,n.jsxs)(`li`,{className:r.item,children:[(0,n.jsxs)(`div`,{className:r.row,children:[h?(0,n.jsxs)(`a`,{href:l(i.path),className:e.t(r.link,r[`category-link`],x&&r.active),style:{"--depth":a},onClick:m,children:[v&&(0,n.jsx)(`span`,{className:r.icon,children:v}),(0,n.jsx)(`span`,{className:r.label,children:_})]}):(0,n.jsxs)(`button`,{type:`button`,className:e.t(r.link,r[`category-label`]),style:{"--depth":a},onClick:()=>b&&C(e=>!e),children:[v&&(0,n.jsx)(`span`,{className:r.icon,children:v}),(0,n.jsx)(`span`,{className:r.label,children:_})]}),b&&(0,n.jsx)(`button`,{type:`button`,className:r.toggle,"aria-label":S?`Collapse`:`Expand`,"aria-expanded":S,onClick:()=>C(e=>!e),children:(0,n.jsx)(f,{open:S})})]}),b&&S&&(0,n.jsx)(p,{nodes:y,depth:a+1,currentPath:o,hrefBuilder:l,iconResolver:u,onLinkClick:m})]})}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
2
+ //# sourceMappingURL=sidebar-DGEZFbBi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-DGEZFbBi.cjs","names":[],"sources":["../../styles/src/components/documentation/sidebar/index.module.css","../src/components/documentation/sidebar/index.tsx"],"sourcesContent":["/* index.module.css */\n@import '../../../variables.css';\n\n.sidebar {\n min-width: var(--_sleetch-sidebar-width);\n height: calc(100vh - var(--_sleetch-header-height));\n position: sticky;\n top: var(--_sleetch-header-height);\n color: var(--_sleetch-color-text);\n padding: 4em 1.5em;\n border-right: 1px dashed var(--_sleetch-color-muted);\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--_sleetch-color-muted) transparent;\n}\n\n.sidebar::-webkit-scrollbar {\n width: 6px;\n}\n\n.sidebar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.sidebar::-webkit-scrollbar-thumb {\n background-color: var(--_sleetch-color-muted);\n border-radius: 3px;\n}\n\n.sidebar::-webkit-scrollbar-thumb:hover {\n background-color: var(--_sleetch-color-muted-foreground);\n}\n\n.overlay {\n display: none;\n}\n\n@media (max-width: 768px) {\n .sidebar {\n position: fixed;\n top: var(--_sleetch-header-height);\n left: 0;\n bottom: 0;\n width: 280px;\n min-width: 280px;\n max-width: 85vw;\n z-index: 90;\n background-color: var(--_sleetch-color-background);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n padding: 2em 1.5em;\n border-right: 1px solid var(--_sleetch-color-muted);\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.3);\n }\n\n .sidebar-open {\n transform: translateX(0);\n }\n\n .overlay {\n display: block;\n position: fixed;\n top: var(--_sleetch-header-height);\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 89;\n backdrop-filter: blur(2px);\n animation: fadeIn 0.3s ease;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n}\n\n@media (min-width: 769px) and (max-width: 1024px) {\n .sidebar {\n min-width: 260px;\n padding: 3em 1.2em;\n }\n}\n\n.nav {\n display: flex;\n flex-direction: column;\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.item {\n min-width: 0;\n}\n\n.row {\n display: flex;\n align-items: center;\n}\n\n.link,\n.category-label {\n --depth: 1;\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.55em;\n width: 100%;\n min-width: 0;\n margin-left: -1px;\n padding-block: 0.4em;\n padding-left: calc(1em + (var(--depth) - 1) * 1em);\n padding-right: 0.5em;\n border: none;\n border-left: 3px solid transparent;\n background: none;\n font-family: var(--_sleetch-font-base);\n font-size: calc(1em - (var(--depth) - 1) * 0.03em);\n line-height: 1.3;\n text-align: left;\n color: var(--_sleetch-color-muted-foreground);\n text-decoration: none;\n cursor: pointer;\n transition:\n color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n border-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n transform var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.link:hover,\n.category-label:hover {\n color: var(--_sleetch-color-text);\n}\n\n.category-link,\n.category-label {\n font-weight: var(--_sleetch-font-weight-heading);\n color: var(--_sleetch-color-text);\n padding-top: 0.5em;\n}\n\n.active {\n border-left-color: var(--_sleetch-color-text-primary);\n background: color-mix(in srgb, var(--_sleetch-color-text-underline) 35%, transparent);\n color: var(--_sleetch-color-text);\n transform: translateX(4px);\n}\n\n.active:hover {\n transform: translateX(6px);\n}\n\n.toggle {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.7em;\n height: 1.7em;\n margin-right: 0.2em;\n background: none;\n border: none;\n border-radius: var(--_sleetch-radius);\n color: var(--_sleetch-color-muted-foreground);\n cursor: pointer;\n transition:\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.toggle:hover {\n background-color: var(--_sleetch-color-card);\n color: var(--_sleetch-color-text);\n}\n\n.chevron {\n transition: transform var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.chevron-open {\n transform: rotate(90deg);\n}\n\n.icon {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.1em;\n height: 1.1em;\n opacity: 0.75;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","/*\n AI Generated :(\n Needs more testing\n*/\n\nimport type { BaseHTMLAttributes, ReactNode } from 'react';\nimport { useMemo, useState, useEffect } from 'react';\nimport clsx from 'clsx';\nimport styles from '@sleetch/styles/components/documentation/sidebar/index.module.css';\nimport type { tree_object } from '@sleetch/core/compiler';\n\nexport interface DocumentationSidebarProps extends BaseHTMLAttributes<HTMLBaseElement> {\n tree: tree_object[];\n currentPath?: string;\n hrefBuilder?: (path: string) => string;\n iconResolver?: (icon?: string) => ReactNode;\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nconst defaultHrefBuilder = (path: string) => path;\nconst defaultIconResolver = (): ReactNode => null;\n\nexport function DocumentationSidebar({\n className,\n children,\n tree,\n currentPath,\n hrefBuilder = defaultHrefBuilder,\n iconResolver = defaultIconResolver,\n isOpen = false,\n onClose,\n ...props\n}: DocumentationSidebarProps) {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n return (\n <>\n {isOpen && <div className={styles['overlay']} onClick={onClose} />}\n <aside className={clsx(styles['sidebar'], isOpen && styles['sidebar-open'], className)} {...props}>\n <nav className={styles['nav']}>\n <SidebarTree nodes={tree} depth={1} currentPath={currentPath} hrefBuilder={hrefBuilder} iconResolver={iconResolver} onLinkClick={onClose} />\n </nav>\n {children}\n </aside>\n </>\n );\n}\n\ntype category_node = Extract<tree_object, { type: 'category' }>;\ntype page_node = Extract<tree_object, { type: 'page' }>;\ntype data_node = Extract<tree_object, { type: 'data' }>;\n\nfunction getCategoryData(category: category_node): data_node | undefined {\n return category.children.find((c): c is data_node => c.type === 'data');\n}\n\nfunction getCategoryIndex(category: category_node): page_node | undefined {\n return category.children.find((c): c is page_node => c.type === 'page' && c.index === true);\n}\n\nfunction getOrder(node: tree_object): number {\n if (node.type === 'category') {\n const data = getCategoryData(node);\n return data?.frontmatter?.order ?? Number.POSITIVE_INFINITY;\n }\n if (node.type === 'page') {\n return (node.frontmatter as { order?: number }).order ?? Number.POSITIVE_INFINITY;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction sortNodes(nodes: tree_object[]): tree_object[] {\n return nodes\n .map((node, index) => ({ node, index }))\n .filter(({ node }) => node.type !== 'data')\n .sort((a, b) => {\n const diff = getOrder(a.node) - getOrder(b.node);\n return diff !== 0 ? diff : a.index - b.index;\n })\n .map(({ node }) => node);\n}\n\nfunction resolveTitle(title: string, fallbackPath: string): string {\n return title && title !== 'No title.' ? title : fallbackPath;\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"13\"\n height=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={clsx(styles['chevron'], open && styles['chevron-open'])}\n >\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n );\n}\n\ninterface HrefContext {\n currentPath?: string;\n hrefBuilder: (path: string) => string;\n iconResolver: (icon?: string) => ReactNode;\n onLinkClick?: () => void;\n}\n\ninterface SidebarTreeProps extends HrefContext {\n nodes: tree_object[];\n depth: number;\n}\n\nfunction SidebarTree({ nodes, depth, currentPath, hrefBuilder, iconResolver, onLinkClick }: SidebarTreeProps) {\n const sorted = useMemo(() => sortNodes(nodes), [nodes]);\n\n return (\n <ul className={styles['list']} data-depth={depth}>\n {sorted.map((node) => {\n if (node.type === 'page') {\n if (node.index) return null;\n\n const isActive = node.path === currentPath;\n const icon = iconResolver(node.frontmatter.icon);\n\n return (\n <li key={node.path} className={styles['item']}>\n <a\n href={hrefBuilder(node.path)}\n className={clsx(styles['link'], isActive && styles['active'])}\n style={{ '--depth': depth } as React.CSSProperties}\n onClick={onLinkClick}\n >\n {icon && <span className={styles['icon']}>{icon}</span>}\n <span className={styles['label']}>{resolveTitle(node.frontmatter.title, node.path)}</span>\n </a>\n </li>\n );\n }\n\n if (node.type === 'category') {\n return (\n <CategoryItem\n key={node.path}\n category={node}\n depth={depth}\n currentPath={currentPath}\n hrefBuilder={hrefBuilder}\n iconResolver={iconResolver}\n onLinkClick={onLinkClick}\n />\n );\n }\n\n return null;\n })}\n </ul>\n );\n}\n\ninterface CategoryItemProps extends HrefContext {\n category: category_node;\n depth: number;\n}\n\nfunction CategoryItem({ category, depth, currentPath, hrefBuilder, iconResolver, onLinkClick }: CategoryItemProps) {\n const indexPage = getCategoryIndex(category);\n const data = getCategoryData(category);\n\n const title = data?.frontmatter?.title ?? (indexPage ? resolveTitle(indexPage.frontmatter.title, category.path) : category.path);\n\n const iconName = data?.frontmatter?.icon ?? indexPage?.frontmatter?.icon;\n const icon = iconResolver(iconName);\n\n const childNodes = category.children.filter((c) => c.type !== 'data' && !(c.type === 'page' && c.index === true));\n\n const hasChildren = childNodes.length > 0;\n const isIndexActive = indexPage ? indexPage.path === currentPath : false;\n\n const [open, setOpen] = useState(true);\n\n return (\n <li className={styles['item']}>\n <div className={styles['row']}>\n {indexPage ? (\n <a\n href={hrefBuilder(category.path)}\n className={clsx(styles['link'], styles['category-link'], isIndexActive && styles['active'])}\n style={{ '--depth': depth } as React.CSSProperties}\n onClick={onLinkClick}\n >\n {icon && <span className={styles['icon']}>{icon}</span>}\n <span className={styles['label']}>{title}</span>\n </a>\n ) : (\n <button\n type=\"button\"\n className={clsx(styles['link'], styles['category-label'])}\n style={{ '--depth': depth } as React.CSSProperties}\n onClick={() => hasChildren && setOpen((o) => !o)}\n >\n {icon && <span className={styles['icon']}>{icon}</span>}\n <span className={styles['label']}>{title}</span>\n </button>\n )}\n\n {hasChildren && (\n <button\n type=\"button\"\n className={styles['toggle']}\n aria-label={open ? 'Collapse' : 'Expand'}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <Chevron open={open} />\n </button>\n )}\n </div>\n\n {hasChildren && open && (\n <SidebarTree\n nodes={childNodes}\n depth={depth + 1}\n currentPath={currentPath}\n hrefBuilder={hrefBuilder}\n iconResolver={iconResolver}\n onLinkClick={onLinkClick}\n />\n )}\n </li>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { t as e } from "./clsx-CeX9s6vy.js";
2
+ import { useEffect as t, useMemo as n, useState as r } from "react";
3
+ import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import './assets/sidebar.css';var s = {
5
+ sidebar: "_sidebar_1370u_4",
6
+ overlay: "_overlay_1370u_36",
7
+ "sidebar-open": "_sidebar-open_1370u_58",
8
+ fadeIn: "_fadeIn_1370u_1",
9
+ nav: "_nav_1370u_92",
10
+ list: "_list_1370u_97",
11
+ item: "_item_1370u_106",
12
+ row: "_row_1370u_110",
13
+ link: "_link_1370u_115",
14
+ "category-label": "_category-label_1370u_116",
15
+ "category-link": "_category-link_1370u_150",
16
+ active: "_active_1370u_157",
17
+ toggle: "_toggle_1370u_168",
18
+ chevron: "_chevron_1370u_191",
19
+ "chevron-open": "_chevron-open_1370u_195",
20
+ icon: "_icon_1370u_199",
21
+ label: "_label_1370u_209"
22
+ }, c = (e) => e, l = () => null;
23
+ function u({ className: n, children: r, tree: u, currentPath: d, hrefBuilder: f = c, iconResolver: p = l, isOpen: m = !1, onClose: h, ...g }) {
24
+ return t(() => (m ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
25
+ document.body.style.overflow = "";
26
+ }), [m]), /* @__PURE__ */ o(i, { children: [m && /* @__PURE__ */ a("div", {
27
+ className: s.overlay,
28
+ onClick: h
29
+ }), /* @__PURE__ */ o("aside", {
30
+ className: e(s.sidebar, m && s["sidebar-open"], n),
31
+ ...g,
32
+ children: [/* @__PURE__ */ a("nav", {
33
+ className: s.nav,
34
+ children: /* @__PURE__ */ a(_, {
35
+ nodes: u,
36
+ depth: 1,
37
+ currentPath: d,
38
+ hrefBuilder: f,
39
+ iconResolver: p,
40
+ onLinkClick: h
41
+ })
42
+ }), r]
43
+ })] });
44
+ }
45
+ function d(e) {
46
+ return e.children.find((e) => e.type === "data");
47
+ }
48
+ function f(e) {
49
+ return e.children.find((e) => e.type === "page" && e.index === !0);
50
+ }
51
+ function p(e) {
52
+ return e.type === "category" ? d(e)?.frontmatter?.order ?? Infinity : e.type === "page" ? e.frontmatter.order ?? Infinity : Infinity;
53
+ }
54
+ function m(e) {
55
+ return e.map((e, t) => ({
56
+ node: e,
57
+ index: t
58
+ })).filter(({ node: e }) => e.type !== "data").sort((e, t) => {
59
+ let n = p(e.node) - p(t.node);
60
+ return n === 0 ? e.index - t.index : n;
61
+ }).map(({ node: e }) => e);
62
+ }
63
+ function h(e, t) {
64
+ return e && e !== "No title." ? e : t;
65
+ }
66
+ function g({ open: t }) {
67
+ return /* @__PURE__ */ a("svg", {
68
+ viewBox: "0 0 24 24",
69
+ width: "13",
70
+ height: "13",
71
+ fill: "none",
72
+ stroke: "currentColor",
73
+ strokeWidth: "2.5",
74
+ strokeLinecap: "round",
75
+ strokeLinejoin: "round",
76
+ className: e(s.chevron, t && s["chevron-open"]),
77
+ children: /* @__PURE__ */ a("polyline", { points: "9 6 15 12 9 18" })
78
+ });
79
+ }
80
+ function _({ nodes: t, depth: r, currentPath: i, hrefBuilder: c, iconResolver: l, onLinkClick: u }) {
81
+ let d = n(() => m(t), [t]);
82
+ return /* @__PURE__ */ a("ul", {
83
+ className: s.list,
84
+ "data-depth": r,
85
+ children: d.map((t) => {
86
+ if (t.type === "page") {
87
+ if (t.index) return null;
88
+ let n = t.path === i, d = l(t.frontmatter.icon);
89
+ return /* @__PURE__ */ a("li", {
90
+ className: s.item,
91
+ children: /* @__PURE__ */ o("a", {
92
+ href: c(t.path),
93
+ className: e(s.link, n && s.active),
94
+ style: { "--depth": r },
95
+ onClick: u,
96
+ children: [d && /* @__PURE__ */ a("span", {
97
+ className: s.icon,
98
+ children: d
99
+ }), /* @__PURE__ */ a("span", {
100
+ className: s.label,
101
+ children: h(t.frontmatter.title, t.path)
102
+ })]
103
+ })
104
+ }, t.path);
105
+ }
106
+ return t.type === "category" ? /* @__PURE__ */ a(v, {
107
+ category: t,
108
+ depth: r,
109
+ currentPath: i,
110
+ hrefBuilder: c,
111
+ iconResolver: l,
112
+ onLinkClick: u
113
+ }, t.path) : null;
114
+ })
115
+ });
116
+ }
117
+ function v({ category: t, depth: n, currentPath: i, hrefBuilder: c, iconResolver: l, onLinkClick: u }) {
118
+ let p = f(t), m = d(t), v = m?.frontmatter?.title ?? (p ? h(p.frontmatter.title, t.path) : t.path), y = l(m?.frontmatter?.icon ?? p?.frontmatter?.icon), b = t.children.filter((e) => e.type !== "data" && !(e.type === "page" && e.index === !0)), x = b.length > 0, S = p ? p.path === i : !1, [C, w] = r(!0);
119
+ return /* @__PURE__ */ o("li", {
120
+ className: s.item,
121
+ children: [/* @__PURE__ */ o("div", {
122
+ className: s.row,
123
+ children: [p ? /* @__PURE__ */ o("a", {
124
+ href: c(t.path),
125
+ className: e(s.link, s["category-link"], S && s.active),
126
+ style: { "--depth": n },
127
+ onClick: u,
128
+ children: [y && /* @__PURE__ */ a("span", {
129
+ className: s.icon,
130
+ children: y
131
+ }), /* @__PURE__ */ a("span", {
132
+ className: s.label,
133
+ children: v
134
+ })]
135
+ }) : /* @__PURE__ */ o("button", {
136
+ type: "button",
137
+ className: e(s.link, s["category-label"]),
138
+ style: { "--depth": n },
139
+ onClick: () => x && w((e) => !e),
140
+ children: [y && /* @__PURE__ */ a("span", {
141
+ className: s.icon,
142
+ children: y
143
+ }), /* @__PURE__ */ a("span", {
144
+ className: s.label,
145
+ children: v
146
+ })]
147
+ }), x && /* @__PURE__ */ a("button", {
148
+ type: "button",
149
+ className: s.toggle,
150
+ "aria-label": C ? "Collapse" : "Expand",
151
+ "aria-expanded": C,
152
+ onClick: () => w((e) => !e),
153
+ children: /* @__PURE__ */ a(g, { open: C })
154
+ })]
155
+ }), x && C && /* @__PURE__ */ a(_, {
156
+ nodes: b,
157
+ depth: n + 1,
158
+ currentPath: i,
159
+ hrefBuilder: c,
160
+ iconResolver: l,
161
+ onLinkClick: u
162
+ })]
163
+ });
164
+ }
165
+ //#endregion
166
+ export { u as t };
167
+
168
+ //# sourceMappingURL=sidebar-DgVlWEfQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-DgVlWEfQ.js","names":[],"sources":["../../styles/src/components/documentation/sidebar/index.module.css","../src/components/documentation/sidebar/index.tsx"],"sourcesContent":["/* index.module.css */\n@import '../../../variables.css';\n\n.sidebar {\n min-width: var(--_sleetch-sidebar-width);\n height: calc(100vh - var(--_sleetch-header-height));\n position: sticky;\n top: var(--_sleetch-header-height);\n color: var(--_sleetch-color-text);\n padding: 4em 1.5em;\n border-right: 1px dashed var(--_sleetch-color-muted);\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--_sleetch-color-muted) transparent;\n}\n\n.sidebar::-webkit-scrollbar {\n width: 6px;\n}\n\n.sidebar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.sidebar::-webkit-scrollbar-thumb {\n background-color: var(--_sleetch-color-muted);\n border-radius: 3px;\n}\n\n.sidebar::-webkit-scrollbar-thumb:hover {\n background-color: var(--_sleetch-color-muted-foreground);\n}\n\n.overlay {\n display: none;\n}\n\n@media (max-width: 768px) {\n .sidebar {\n position: fixed;\n top: var(--_sleetch-header-height);\n left: 0;\n bottom: 0;\n width: 280px;\n min-width: 280px;\n max-width: 85vw;\n z-index: 90;\n background-color: var(--_sleetch-color-background);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n padding: 2em 1.5em;\n border-right: 1px solid var(--_sleetch-color-muted);\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.3);\n }\n\n .sidebar-open {\n transform: translateX(0);\n }\n\n .overlay {\n display: block;\n position: fixed;\n top: var(--_sleetch-header-height);\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 89;\n backdrop-filter: blur(2px);\n animation: fadeIn 0.3s ease;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n}\n\n@media (min-width: 769px) and (max-width: 1024px) {\n .sidebar {\n min-width: 260px;\n padding: 3em 1.2em;\n }\n}\n\n.nav {\n display: flex;\n flex-direction: column;\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.item {\n min-width: 0;\n}\n\n.row {\n display: flex;\n align-items: center;\n}\n\n.link,\n.category-label {\n --depth: 1;\n flex: 1;\n display: flex;\n align-items: center;\n gap: 0.55em;\n width: 100%;\n min-width: 0;\n margin-left: -1px;\n padding-block: 0.4em;\n padding-left: calc(1em + (var(--depth) - 1) * 1em);\n padding-right: 0.5em;\n border: none;\n border-left: 3px solid transparent;\n background: none;\n font-family: var(--_sleetch-font-base);\n font-size: calc(1em - (var(--depth) - 1) * 0.03em);\n line-height: 1.3;\n text-align: left;\n color: var(--_sleetch-color-muted-foreground);\n text-decoration: none;\n cursor: pointer;\n transition:\n color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n border-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n transform var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.link:hover,\n.category-label:hover {\n color: var(--_sleetch-color-text);\n}\n\n.category-link,\n.category-label {\n font-weight: var(--_sleetch-font-weight-heading);\n color: var(--_sleetch-color-text);\n padding-top: 0.5em;\n}\n\n.active {\n border-left-color: var(--_sleetch-color-text-primary);\n background: color-mix(in srgb, var(--_sleetch-color-text-underline) 35%, transparent);\n color: var(--_sleetch-color-text);\n transform: translateX(4px);\n}\n\n.active:hover {\n transform: translateX(6px);\n}\n\n.toggle {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.7em;\n height: 1.7em;\n margin-right: 0.2em;\n background: none;\n border: none;\n border-radius: var(--_sleetch-radius);\n color: var(--_sleetch-color-muted-foreground);\n cursor: pointer;\n transition:\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.toggle:hover {\n background-color: var(--_sleetch-color-card);\n color: var(--_sleetch-color-text);\n}\n\n.chevron {\n transition: transform var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.chevron-open {\n transform: rotate(90deg);\n}\n\n.icon {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.1em;\n height: 1.1em;\n opacity: 0.75;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","/*\n AI Generated :(\n Needs more testing\n*/\n\nimport type { BaseHTMLAttributes, ReactNode } from 'react';\nimport { useMemo, useState, useEffect } from 'react';\nimport clsx from 'clsx';\nimport styles from '@sleetch/styles/components/documentation/sidebar/index.module.css';\nimport type { tree_object } from '@sleetch/core/compiler';\n\nexport interface DocumentationSidebarProps extends BaseHTMLAttributes<HTMLBaseElement> {\n tree: tree_object[];\n currentPath?: string;\n hrefBuilder?: (path: string) => string;\n iconResolver?: (icon?: string) => ReactNode;\n isOpen?: boolean;\n onClose?: () => void;\n}\n\nconst defaultHrefBuilder = (path: string) => path;\nconst defaultIconResolver = (): ReactNode => null;\n\nexport function DocumentationSidebar({\n className,\n children,\n tree,\n currentPath,\n hrefBuilder = defaultHrefBuilder,\n iconResolver = defaultIconResolver,\n isOpen = false,\n onClose,\n ...props\n}: DocumentationSidebarProps) {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isOpen]);\n\n return (\n <>\n {isOpen && <div className={styles['overlay']} onClick={onClose} />}\n <aside className={clsx(styles['sidebar'], isOpen && styles['sidebar-open'], className)} {...props}>\n <nav className={styles['nav']}>\n <SidebarTree nodes={tree} depth={1} currentPath={currentPath} hrefBuilder={hrefBuilder} iconResolver={iconResolver} onLinkClick={onClose} />\n </nav>\n {children}\n </aside>\n </>\n );\n}\n\ntype category_node = Extract<tree_object, { type: 'category' }>;\ntype page_node = Extract<tree_object, { type: 'page' }>;\ntype data_node = Extract<tree_object, { type: 'data' }>;\n\nfunction getCategoryData(category: category_node): data_node | undefined {\n return category.children.find((c): c is data_node => c.type === 'data');\n}\n\nfunction getCategoryIndex(category: category_node): page_node | undefined {\n return category.children.find((c): c is page_node => c.type === 'page' && c.index === true);\n}\n\nfunction getOrder(node: tree_object): number {\n if (node.type === 'category') {\n const data = getCategoryData(node);\n return data?.frontmatter?.order ?? Number.POSITIVE_INFINITY;\n }\n if (node.type === 'page') {\n return (node.frontmatter as { order?: number }).order ?? Number.POSITIVE_INFINITY;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction sortNodes(nodes: tree_object[]): tree_object[] {\n return nodes\n .map((node, index) => ({ node, index }))\n .filter(({ node }) => node.type !== 'data')\n .sort((a, b) => {\n const diff = getOrder(a.node) - getOrder(b.node);\n return diff !== 0 ? diff : a.index - b.index;\n })\n .map(({ node }) => node);\n}\n\nfunction resolveTitle(title: string, fallbackPath: string): string {\n return title && title !== 'No title.' ? title : fallbackPath;\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"13\"\n height=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={clsx(styles['chevron'], open && styles['chevron-open'])}\n >\n <polyline points=\"9 6 15 12 9 18\" />\n </svg>\n );\n}\n\ninterface HrefContext {\n currentPath?: string;\n hrefBuilder: (path: string) => string;\n iconResolver: (icon?: string) => ReactNode;\n onLinkClick?: () => void;\n}\n\ninterface SidebarTreeProps extends HrefContext {\n nodes: tree_object[];\n depth: number;\n}\n\nfunction SidebarTree({ nodes, depth, currentPath, hrefBuilder, iconResolver, onLinkClick }: SidebarTreeProps) {\n const sorted = useMemo(() => sortNodes(nodes), [nodes]);\n\n return (\n <ul className={styles['list']} data-depth={depth}>\n {sorted.map((node) => {\n if (node.type === 'page') {\n if (node.index) return null;\n\n const isActive = node.path === currentPath;\n const icon = iconResolver(node.frontmatter.icon);\n\n return (\n <li key={node.path} className={styles['item']}>\n <a\n href={hrefBuilder(node.path)}\n className={clsx(styles['link'], isActive && styles['active'])}\n style={{ '--depth': depth } as React.CSSProperties}\n onClick={onLinkClick}\n >\n {icon && <span className={styles['icon']}>{icon}</span>}\n <span className={styles['label']}>{resolveTitle(node.frontmatter.title, node.path)}</span>\n </a>\n </li>\n );\n }\n\n if (node.type === 'category') {\n return (\n <CategoryItem\n key={node.path}\n category={node}\n depth={depth}\n currentPath={currentPath}\n hrefBuilder={hrefBuilder}\n iconResolver={iconResolver}\n onLinkClick={onLinkClick}\n />\n );\n }\n\n return null;\n })}\n </ul>\n );\n}\n\ninterface CategoryItemProps extends HrefContext {\n category: category_node;\n depth: number;\n}\n\nfunction CategoryItem({ category, depth, currentPath, hrefBuilder, iconResolver, onLinkClick }: CategoryItemProps) {\n const indexPage = getCategoryIndex(category);\n const data = getCategoryData(category);\n\n const title = data?.frontmatter?.title ?? (indexPage ? resolveTitle(indexPage.frontmatter.title, category.path) : category.path);\n\n const iconName = data?.frontmatter?.icon ?? indexPage?.frontmatter?.icon;\n const icon = iconResolver(iconName);\n\n const childNodes = category.children.filter((c) => c.type !== 'data' && !(c.type === 'page' && c.index === true));\n\n const hasChildren = childNodes.length > 0;\n const isIndexActive = indexPage ? indexPage.path === currentPath : false;\n\n const [open, setOpen] = useState(true);\n\n return (\n <li className={styles['item']}>\n <div className={styles['row']}>\n {indexPage ? (\n <a\n href={hrefBuilder(category.path)}\n className={clsx(styles['link'], styles['category-link'], isIndexActive && styles['active'])}\n style={{ '--depth': depth } as React.CSSProperties}\n onClick={onLinkClick}\n >\n {icon && <span className={styles['icon']}>{icon}</span>}\n <span className={styles['label']}>{title}</span>\n </a>\n ) : (\n <button\n type=\"button\"\n className={clsx(styles['link'], styles['category-label'])}\n style={{ '--depth': depth } as React.CSSProperties}\n onClick={() => hasChildren && setOpen((o) => !o)}\n >\n {icon && <span className={styles['icon']}>{icon}</span>}\n <span className={styles['label']}>{title}</span>\n </button>\n )}\n\n {hasChildren && (\n <button\n type=\"button\"\n className={styles['toggle']}\n aria-label={open ? 'Collapse' : 'Expand'}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <Chevron open={open} />\n </button>\n )}\n </div>\n\n {hasChildren && open && (\n <SidebarTree\n nodes={childNodes}\n depth={depth + 1}\n currentPath={currentPath}\n hrefBuilder={hrefBuilder}\n iconResolver={iconResolver}\n onLinkClick={onLinkClick}\n />\n )}\n </li>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { t as e } from "./clsx-CeX9s6vy.js";
2
+ import { use as t, useEffect as n, useRef as r, useState as i } from "react";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import './assets/toc.css';var s = {
5
+ default: "_default_2imtf_3",
6
+ title: "_title_2imtf_29",
7
+ track: "_track_2imtf_36",
8
+ line: "_line_2imtf_40",
9
+ gapDot: "_gapDot_2imtf_50",
10
+ list: "_list_2imtf_63",
11
+ item: "_item_2imtf_74",
12
+ link: "_link_2imtf_78",
13
+ active: "_active_2imtf_111"
14
+ };
15
+ //#endregion
16
+ //#region src/components/documentation/toc/index.tsx
17
+ function c({ className: c, children: l, page: u, ...d }) {
18
+ let f = t(u).default.toc;
19
+ if (f.length == 0) return null;
20
+ let [p, m] = i(/* @__PURE__ */ new Set()), [h, g] = i(null), _ = r(null), v = r(/* @__PURE__ */ new Map()), y = r(null);
21
+ return n(() => {
22
+ if (f.length === 0) return;
23
+ let e = f.map((e) => document.getElementById(e.id)).filter((e) => e !== null);
24
+ if (e.length === 0) return;
25
+ let t = new IntersectionObserver((e) => {
26
+ m((t) => {
27
+ let n = new Set(t);
28
+ for (let t of e) t.isIntersecting ? n.add(t.target.id) : n.delete(t.target.id);
29
+ return n;
30
+ });
31
+ }, {
32
+ rootMargin: "0px 0px -70% 0px",
33
+ threshold: 0
34
+ });
35
+ for (let n of e) t.observe(n);
36
+ return () => t.disconnect();
37
+ }, [f]), n(() => {
38
+ if (p.size > 0) {
39
+ let e = -1;
40
+ f.forEach((t, n) => {
41
+ p.has(t.id) && (e = n);
42
+ }), y.current = e, g(null);
43
+ return;
44
+ }
45
+ let e = _.current, t = y.current;
46
+ if (!e || t === null || t >= f.length - 1) {
47
+ g(null);
48
+ return;
49
+ }
50
+ let n = v.current.get(f[t].id), r = v.current.get(f[t + 1].id);
51
+ if (!n || !r) {
52
+ g(null);
53
+ return;
54
+ }
55
+ let i = e.getBoundingClientRect(), a = n.getBoundingClientRect(), o = r.getBoundingClientRect();
56
+ g((a.bottom - i.top + (o.top - i.top)) / 2);
57
+ }, [p, f]), /* @__PURE__ */ o("aside", {
58
+ className: e(s.default, c),
59
+ ...d,
60
+ children: [/* @__PURE__ */ a("h3", {
61
+ className: s.title,
62
+ children: "On this page"
63
+ }), /* @__PURE__ */ o("div", {
64
+ className: s.track,
65
+ ref: _,
66
+ children: [
67
+ /* @__PURE__ */ a("span", {
68
+ className: s.line,
69
+ "aria-hidden": "true"
70
+ }),
71
+ h !== null && /* @__PURE__ */ a("span", {
72
+ className: s.gapDot,
73
+ style: { top: h },
74
+ "aria-hidden": "true"
75
+ }),
76
+ /* @__PURE__ */ a("ul", {
77
+ className: s.list,
78
+ children: f.map((t) => {
79
+ let n = p.has(t.id), r = { "--depth": t.level };
80
+ return /* @__PURE__ */ a("li", {
81
+ className: s.item,
82
+ ref: (e) => {
83
+ e ? v.current.set(t.id, e) : v.current.delete(t.id);
84
+ },
85
+ children: /* @__PURE__ */ a("a", {
86
+ href: `#${t.id}`,
87
+ title: t.title,
88
+ "aria-current": n ? "location" : void 0,
89
+ className: e(s.link, n && s.active),
90
+ style: r,
91
+ children: t.title
92
+ })
93
+ }, t.id);
94
+ })
95
+ })
96
+ ]
97
+ })]
98
+ });
99
+ }
100
+ //#endregion
101
+ export { c as t };
102
+
103
+ //# sourceMappingURL=toc-BuFdWsti.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toc-BuFdWsti.js","names":[],"sources":["../../styles/src/components/documentation/toc/index.module.css","../src/components/documentation/toc/index.tsx"],"sourcesContent":["@import '../../../variables.css';\n\n.default {\n min-width: var(--_sleetch-toc-width);\n height: calc(100vh - var(--_sleetch-header-height));\n position: sticky;\n top: var(--_sleetch-header-height);\n color: var(--_sleetch-color-text);\n padding: 4em 2em;\n border-left: 1px dashed var(--_sleetch-color-muted);\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n@media (max-width: 1024px) {\n .default {\n display: none;\n }\n}\n\n@media (min-width: 1025px) and (max-width: 1280px) {\n .default {\n min-width: 220px;\n padding: 3em 1.5em;\n }\n}\n\n.title {\n margin: 0 0 0.5em;\n font-size: 0.9em;\n font-weight: var(--_sleetch-font-weight-heading);\n color: var(--_sleetch-color-text);\n}\n\n.track {\n position: relative;\n}\n\n.line {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 1px;\n background: var(--_sleetch-color-muted);\n z-index: 0;\n}\n\n.gapDot {\n position: absolute;\n left: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--_sleetch-color-muted-foreground);\n transform: translate(-50%, -50%);\n z-index: 1;\n pointer-events: none;\n transition: top var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.list {\n position: relative; /* nécessaire pour que le z-index prenne le dessus sur .line */\n z-index: 1;\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.item {\n min-width: 0; /* requis pour que l'ellipsis fonctionne dans un flex/grid parent */\n}\n\n.link {\n --depth: 1;\n\n display: block;\n width: 100%;\n margin-left: -1px; /* centre la bordure de 3px sur la ligne de 1px */\n padding-block: 0.4em;\n padding-left: calc(1em + (var(--depth) - 1) * 0.85em);\n padding-right: 0.5em;\n\n border-left: 3px solid transparent;\n\n font-family: var(--_sleetch-font-base);\n font-size: calc(0.85em - (var(--depth) - 1) * 0.03em);\n line-height: 1.3;\n color: var(--_sleetch-color-muted-foreground);\n text-decoration: none;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n transition:\n color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n border-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n transform var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.link:hover {\n color: var(--_sleetch-color-text);\n}\n\n.active {\n border-left-color: var(--_sleetch-color-text-primary);\n background: color-mix(in srgb, var(--_sleetch-color-text-underline) 35%, transparent);\n color: var(--_sleetch-color-text);\n transform: translateX(4px);\n}\n","/*\nAI Generated :(\nNeeds more testing\n*/\n\nimport { use, useEffect, useRef, useState, type BaseHTMLAttributes, type CSSProperties } from 'react';\nimport styles from '@sleetch/styles/components/documentation/toc/index.module.css';\nimport clsx from 'clsx';\nimport type { markdown_module } from '@sleetch/core/compiler';\n\nexport interface DocumentationTocProps extends BaseHTMLAttributes<HTMLBaseElement> {\n page: Promise<markdown_module>;\n}\n\ninterface TocLinkStyle extends CSSProperties {\n '--depth'?: number;\n}\n\nexport function DocumentationToc({ className, children, page, ...props }: DocumentationTocProps) {\n const value = use(page);\n const toc = value.default.toc;\n if (toc.length == 0) return null;\n\n const [activeIds, setActiveIds] = useState<Set<string>>(new Set());\n const [gapY, setGapY] = useState<number | null>(null);\n\n const trackRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<string, HTMLLIElement>>(new Map());\n const lastActiveIndexRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n const elements = toc.map((item) => document.getElementById(item.id)).filter((el): el is HTMLElement => el !== null);\n\n if (elements.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n setActiveIds((prev) => {\n const next = new Set(prev);\n for (const entry of entries) {\n if (entry.isIntersecting) {\n next.add(entry.target.id);\n } else {\n next.delete(entry.target.id);\n }\n }\n return next;\n });\n },\n {\n rootMargin: '0px 0px -70% 0px',\n threshold: 0,\n }\n );\n\n for (const el of elements) observer.observe(el);\n\n return () => observer.disconnect();\n }, [toc]);\n\n useEffect(() => {\n if (activeIds.size > 0) {\n let maxIndex = -1;\n toc.forEach((item, i) => {\n if (activeIds.has(item.id)) maxIndex = i;\n });\n lastActiveIndexRef.current = maxIndex;\n setGapY(null);\n return;\n }\n\n const track = trackRef.current;\n const lastIndex = lastActiveIndexRef.current;\n\n if (!track || lastIndex === null || lastIndex >= toc.length - 1) {\n setGapY(null);\n return;\n }\n\n const currentLi = itemRefs.current.get(toc[lastIndex].id);\n const nextLi = itemRefs.current.get(toc[lastIndex + 1].id);\n\n if (!currentLi || !nextLi) {\n setGapY(null);\n return;\n }\n\n const trackRect = track.getBoundingClientRect();\n const currentRect = currentLi.getBoundingClientRect();\n const nextRect = nextLi.getBoundingClientRect();\n\n const y = (currentRect.bottom - trackRect.top + (nextRect.top - trackRect.top)) / 2;\n\n setGapY(y);\n }, [activeIds, toc]);\n\n return (\n <aside className={clsx(styles['default'], className)} {...props}>\n <h3 className={styles['title']}>On this page</h3>\n <div className={styles['track']} ref={trackRef}>\n <span className={styles['line']} aria-hidden=\"true\" />\n {gapY !== null && <span className={styles['gapDot']} style={{ top: gapY }} aria-hidden=\"true\" />}\n <ul className={styles['list']}>\n {toc.map((item) => {\n const focused = activeIds.has(item.id);\n const linkStyle: TocLinkStyle = { '--depth': item.level };\n\n return (\n <li\n key={item.id}\n className={styles['item']}\n ref={(el) => {\n if (el) itemRefs.current.set(item.id, el);\n else itemRefs.current.delete(item.id);\n }}\n >\n <a\n href={`#${item.id}`}\n title={item.title}\n aria-current={focused ? 'location' : undefined}\n className={clsx(styles['link'], focused && styles['active'])}\n style={linkStyle}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n </aside>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require('./assets/toc.css');const e=require("./clsx-CPcBvw4Z.cjs");let t=require("react"),n=require("react/jsx-runtime");var r={default:`_default_2imtf_3`,title:`_title_2imtf_29`,track:`_track_2imtf_36`,line:`_line_2imtf_40`,gapDot:`_gapDot_2imtf_50`,list:`_list_2imtf_63`,item:`_item_2imtf_74`,link:`_link_2imtf_78`,active:`_active_2imtf_111`};function i({className:i,children:a,page:o,...s}){let c=(0,t.use)(o).default.toc;if(c.length==0)return null;let[l,u]=(0,t.useState)(new Set),[d,f]=(0,t.useState)(null),p=(0,t.useRef)(null),m=(0,t.useRef)(new Map),h=(0,t.useRef)(null);return(0,t.useEffect)(()=>{if(c.length===0)return;let e=c.map(e=>document.getElementById(e.id)).filter(e=>e!==null);if(e.length===0)return;let t=new IntersectionObserver(e=>{u(t=>{let n=new Set(t);for(let t of e)t.isIntersecting?n.add(t.target.id):n.delete(t.target.id);return n})},{rootMargin:`0px 0px -70% 0px`,threshold:0});for(let n of e)t.observe(n);return()=>t.disconnect()},[c]),(0,t.useEffect)(()=>{if(l.size>0){let e=-1;c.forEach((t,n)=>{l.has(t.id)&&(e=n)}),h.current=e,f(null);return}let e=p.current,t=h.current;if(!e||t===null||t>=c.length-1){f(null);return}let n=m.current.get(c[t].id),r=m.current.get(c[t+1].id);if(!n||!r){f(null);return}let i=e.getBoundingClientRect(),a=n.getBoundingClientRect(),o=r.getBoundingClientRect();f((a.bottom-i.top+(o.top-i.top))/2)},[l,c]),(0,n.jsxs)(`aside`,{className:e.t(r.default,i),...s,children:[(0,n.jsx)(`h3`,{className:r.title,children:`On this page`}),(0,n.jsxs)(`div`,{className:r.track,ref:p,children:[(0,n.jsx)(`span`,{className:r.line,"aria-hidden":`true`}),d!==null&&(0,n.jsx)(`span`,{className:r.gapDot,style:{top:d},"aria-hidden":`true`}),(0,n.jsx)(`ul`,{className:r.list,children:c.map(t=>{let i=l.has(t.id),a={"--depth":t.level};return(0,n.jsx)(`li`,{className:r.item,ref:e=>{e?m.current.set(t.id,e):m.current.delete(t.id)},children:(0,n.jsx)(`a`,{href:`#${t.id}`,title:t.title,"aria-current":i?`location`:void 0,className:e.t(r.link,i&&r.active),style:a,children:t.title})},t.id)})})]})]})}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
2
+ //# sourceMappingURL=toc-CMwm46RH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toc-CMwm46RH.cjs","names":[],"sources":["../../styles/src/components/documentation/toc/index.module.css","../src/components/documentation/toc/index.tsx"],"sourcesContent":["@import '../../../variables.css';\n\n.default {\n min-width: var(--_sleetch-toc-width);\n height: calc(100vh - var(--_sleetch-header-height));\n position: sticky;\n top: var(--_sleetch-header-height);\n color: var(--_sleetch-color-text);\n padding: 4em 2em;\n border-left: 1px dashed var(--_sleetch-color-muted);\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n@media (max-width: 1024px) {\n .default {\n display: none;\n }\n}\n\n@media (min-width: 1025px) and (max-width: 1280px) {\n .default {\n min-width: 220px;\n padding: 3em 1.5em;\n }\n}\n\n.title {\n margin: 0 0 0.5em;\n font-size: 0.9em;\n font-weight: var(--_sleetch-font-weight-heading);\n color: var(--_sleetch-color-text);\n}\n\n.track {\n position: relative;\n}\n\n.line {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 1px;\n background: var(--_sleetch-color-muted);\n z-index: 0;\n}\n\n.gapDot {\n position: absolute;\n left: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--_sleetch-color-muted-foreground);\n transform: translate(-50%, -50%);\n z-index: 1;\n pointer-events: none;\n transition: top var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.list {\n position: relative; /* nécessaire pour que le z-index prenne le dessus sur .line */\n z-index: 1;\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.item {\n min-width: 0; /* requis pour que l'ellipsis fonctionne dans un flex/grid parent */\n}\n\n.link {\n --depth: 1;\n\n display: block;\n width: 100%;\n margin-left: -1px; /* centre la bordure de 3px sur la ligne de 1px */\n padding-block: 0.4em;\n padding-left: calc(1em + (var(--depth) - 1) * 0.85em);\n padding-right: 0.5em;\n\n border-left: 3px solid transparent;\n\n font-family: var(--_sleetch-font-base);\n font-size: calc(0.85em - (var(--depth) - 1) * 0.03em);\n line-height: 1.3;\n color: var(--_sleetch-color-muted-foreground);\n text-decoration: none;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n transition:\n color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n border-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n background-color var(--_sleetch-transition-duration) var(--_sleetch-transition-timing),\n transform var(--_sleetch-transition-duration) var(--_sleetch-transition-timing);\n}\n\n.link:hover {\n color: var(--_sleetch-color-text);\n}\n\n.active {\n border-left-color: var(--_sleetch-color-text-primary);\n background: color-mix(in srgb, var(--_sleetch-color-text-underline) 35%, transparent);\n color: var(--_sleetch-color-text);\n transform: translateX(4px);\n}\n","/*\nAI Generated :(\nNeeds more testing\n*/\n\nimport { use, useEffect, useRef, useState, type BaseHTMLAttributes, type CSSProperties } from 'react';\nimport styles from '@sleetch/styles/components/documentation/toc/index.module.css';\nimport clsx from 'clsx';\nimport type { markdown_module } from '@sleetch/core/compiler';\n\nexport interface DocumentationTocProps extends BaseHTMLAttributes<HTMLBaseElement> {\n page: Promise<markdown_module>;\n}\n\ninterface TocLinkStyle extends CSSProperties {\n '--depth'?: number;\n}\n\nexport function DocumentationToc({ className, children, page, ...props }: DocumentationTocProps) {\n const value = use(page);\n const toc = value.default.toc;\n if (toc.length == 0) return null;\n\n const [activeIds, setActiveIds] = useState<Set<string>>(new Set());\n const [gapY, setGapY] = useState<number | null>(null);\n\n const trackRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Map<string, HTMLLIElement>>(new Map());\n const lastActiveIndexRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n const elements = toc.map((item) => document.getElementById(item.id)).filter((el): el is HTMLElement => el !== null);\n\n if (elements.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n setActiveIds((prev) => {\n const next = new Set(prev);\n for (const entry of entries) {\n if (entry.isIntersecting) {\n next.add(entry.target.id);\n } else {\n next.delete(entry.target.id);\n }\n }\n return next;\n });\n },\n {\n rootMargin: '0px 0px -70% 0px',\n threshold: 0,\n }\n );\n\n for (const el of elements) observer.observe(el);\n\n return () => observer.disconnect();\n }, [toc]);\n\n useEffect(() => {\n if (activeIds.size > 0) {\n let maxIndex = -1;\n toc.forEach((item, i) => {\n if (activeIds.has(item.id)) maxIndex = i;\n });\n lastActiveIndexRef.current = maxIndex;\n setGapY(null);\n return;\n }\n\n const track = trackRef.current;\n const lastIndex = lastActiveIndexRef.current;\n\n if (!track || lastIndex === null || lastIndex >= toc.length - 1) {\n setGapY(null);\n return;\n }\n\n const currentLi = itemRefs.current.get(toc[lastIndex].id);\n const nextLi = itemRefs.current.get(toc[lastIndex + 1].id);\n\n if (!currentLi || !nextLi) {\n setGapY(null);\n return;\n }\n\n const trackRect = track.getBoundingClientRect();\n const currentRect = currentLi.getBoundingClientRect();\n const nextRect = nextLi.getBoundingClientRect();\n\n const y = (currentRect.bottom - trackRect.top + (nextRect.top - trackRect.top)) / 2;\n\n setGapY(y);\n }, [activeIds, toc]);\n\n return (\n <aside className={clsx(styles['default'], className)} {...props}>\n <h3 className={styles['title']}>On this page</h3>\n <div className={styles['track']} ref={trackRef}>\n <span className={styles['line']} aria-hidden=\"true\" />\n {gapY !== null && <span className={styles['gapDot']} style={{ top: gapY }} aria-hidden=\"true\" />}\n <ul className={styles['list']}>\n {toc.map((item) => {\n const focused = activeIds.has(item.id);\n const linkStyle: TocLinkStyle = { '--depth': item.level };\n\n return (\n <li\n key={item.id}\n className={styles['item']}\n ref={(el) => {\n if (el) itemRefs.current.set(item.id, el);\n else itemRefs.current.delete(item.id);\n }}\n >\n <a\n href={`#${item.id}`}\n title={item.title}\n aria-current={focused ? 'location' : undefined}\n className={clsx(styles['link'], focused && styles['active'])}\n style={linkStyle}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n </aside>\n );\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@sleetch/react",
3
+ "version": "1.0.4",
4
+ "type": "module",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "scripts": {
9
+ "dev": "vite build --watch",
10
+ "build": "vite build"
11
+ },
12
+ "main": "./dist/index.esm.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.esm.js",
17
+ "require": "./dist/index.cjs.js",
18
+ "types": "./dist/index.d.ts"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "sideEffects": [
25
+ "**/*.css"
26
+ ],
27
+ "peerDependencies": {
28
+ "react": "^18.0.0 || ^19.0.0",
29
+ "react-dom": "^18.0.0 || ^19.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@sleetch/core": "1.0.4",
33
+ "@sleetch/styles": "1.0.4",
34
+ "@sleetch/vite": "1.0.4",
35
+ "@types/mdx": "^2.0.14",
36
+ "@types/react": "^19",
37
+ "@types/react-dom": "^19",
38
+ "@vitejs/plugin-react": "^6.0.3",
39
+ "react": "^19.0.0",
40
+ "react-dom": "^19.0.0",
41
+ "vite": "^8.1.3",
42
+ "vite-plugin-lib-inject-css": "^2.2.2"
43
+ },
44
+ "dependencies": {
45
+ "@mdx-js/mdx": "^3.1.1",
46
+ "clsx": "^2.1.1",
47
+ "glob": "^13.0.6",
48
+ "vite-plugin-dts": "^5.0.3"
49
+ }
50
+ }