honkit-plugin-theme-learnj 1.0.0 → 1.0.1

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/README.md CHANGED
@@ -8,6 +8,27 @@ LearnJ HonKit theme built with **Tailwind CSS** and **shadcn/ui** design tokens.
8
8
  npm install honkit-plugin-theme-learnj --save-dev
9
9
  ```
10
10
 
11
+ ## Live demo
12
+
13
+ The [example book](example/) is published on every push to `main`:
14
+
15
+ **https://learnj-ai.github.io/honkit-plugin-theme-learnj/**
16
+
17
+ Run it locally:
18
+
19
+ ```bash
20
+ npm run example:install
21
+ npm run example:serve
22
+ ```
23
+
24
+ See [example/getting-started/using-the-theme.md](example/getting-started/using-the-theme.md) for full setup instructions (also rendered in the demo site).
25
+
26
+ ### GitHub Pages
27
+
28
+ 1. In the repository, open **Settings → Pages**.
29
+ 2. Under **Build and deployment**, set **Source** to **GitHub Actions**.
30
+ 3. Push to `main`; the [pages workflow](.github/workflows/pages.yml) builds `example/` and deploys `example/_book`.
31
+
11
32
  ## Usage
12
33
 
13
34
  In your book's `book.json`:
@@ -16,10 +37,14 @@ In your book's `book.json`:
16
37
  {
17
38
  "plugins": [
18
39
  "-theme-default",
40
+ "-search",
41
+ "lunr",
42
+ "highlight",
19
43
  "theme-learnj"
20
44
  ],
21
45
  "pluginsConfig": {
22
46
  "theme-learnj": {
47
+ "logo": "https://raw.githubusercontent.com/learnj-ai/learnj/main/image.png",
23
48
  "logoText": "LearnJ Workshop",
24
49
  "githubUrl": "https://github.com/learnj-ai/workshops",
25
50
  "showLevel": false
@@ -39,6 +64,10 @@ Load `theme-learnj` **last** in the plugins array. Disable the default theme wit
39
64
  | `githubUrl` | string | GitHub link in sidebar footer |
40
65
  | `showLevel` | boolean | Show chapter level numbers in TOC |
41
66
 
67
+ ### Search
68
+
69
+ Disable the default `search` plugin (`-search`) and enable `lunr`. The theme ships search UI and scripts (from [gitbook-plugin-search](https://github.com/GitbookIO/plugin-search), Apache-2.0) so custom themes avoid template inheritance conflicts.
70
+
42
71
  ## Development
43
72
 
44
73
  ```bash
@@ -57,6 +86,12 @@ cd /path/to/your/book
57
86
  npm link honkit-plugin-theme-learnj
58
87
  ```
59
88
 
89
+ Or run the included example from this repository:
90
+
91
+ ```bash
92
+ cd example && npm install && npm run serve
93
+ ```
94
+
60
95
  ## shadcn / Tailwind
61
96
 
62
97
  HonKit renders static HTML, so this theme uses shadcn's **design tokens and utility patterns** (`learnj-btn`, `learnj-nav-link`, etc.) rather than React components.
@@ -1 +1,16 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:0 0% 100%;--foreground:240 10% 3.9%;--card:0 0% 100%;--card-foreground:240 10% 3.9%;--popover:0 0% 100%;--popover-foreground:240 10% 3.9%;--primary:240 5.9% 10%;--primary-foreground:0 0% 98%;--secondary:240 4.8% 95.9%;--secondary-foreground:240 5.9% 10%;--muted:240 4.8% 95.9%;--muted-foreground:240 3.8% 46.1%;--accent:240 4.8% 95.9%;--accent-foreground:240 5.9% 10%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 5.9% 90%;--input:240 5.9% 90%;--ring:240 5.9% 10%;--radius:0.5rem;--sidebar-background:0 0% 98%;--sidebar-foreground:240 5.3% 26.1%;--sidebar-primary:240 5.9% 10%;--sidebar-primary-foreground:0 0% 98%;--sidebar-accent:240 4.8% 95.9%;--sidebar-accent-foreground:240 5.9% 10%;--sidebar-border:220 13% 91%;--sidebar-ring:217.2 91.2% 59.8%}.dark{--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 10% 3.9%;--card-foreground:0 0% 98%;--popover:240 10% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:240 5.9% 10%;--secondary:240 3.7% 15.9%;--secondary-foreground:0 0% 98%;--muted:240 3.7% 15.9%;--muted-foreground:240 5% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 15.9%;--ring:240 4.9% 83.9%;--sidebar-background:240 5.9% 10%;--sidebar-foreground:240 4.8% 95.9%;--sidebar-primary:224.3 76.3% 48%;--sidebar-primary-foreground:0 0% 100%;--sidebar-accent:240 3.7% 15.9%;--sidebar-accent-foreground:240 4.8% 95.9%;--sidebar-border:240 3.7% 15.9%;--sidebar-ring:217.2 91.2% 59.8%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.prose{color:var(--tw-prose-body);max-width:none}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;border-left-color:hsl(var(--primary));background-color:hsl(var(--muted));border-radius:calc(var(--radius) - 2px);padding:.5em 1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:500;font-size:.875em;background-color:hsl(var(--muted));padding:.2em .4em;border-radius:calc(var(--radius) - 4px)}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:""}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:""}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:hsl(var(--muted));overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:var(--radius);padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em;border:1px solid hsl(var(--border))}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;background-color:hsl(var(--muted))}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:hsl(var(--foreground));--tw-prose-headings:hsl(var(--foreground));--tw-prose-lead:#4b5563;--tw-prose-links:hsl(var(--primary));--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:hsl(var(--foreground));--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-slate{--tw-prose-body:#334155;--tw-prose-headings:#0f172a;--tw-prose-lead:#475569;--tw-prose-links:#0f172a;--tw-prose-bold:#0f172a;--tw-prose-counters:#64748b;--tw-prose-bullets:#cbd5e1;--tw-prose-hr:#e2e8f0;--tw-prose-quotes:#0f172a;--tw-prose-quote-borders:#e2e8f0;--tw-prose-captions:#64748b;--tw-prose-kbd:#0f172a;--tw-prose-kbd-shadows:rgba(15,23,42,.1);--tw-prose-code:#0f172a;--tw-prose-pre-code:#e2e8f0;--tw-prose-pre-bg:#1e293b;--tw-prose-th-borders:#cbd5e1;--tw-prose-td-borders:#e2e8f0;--tw-prose-invert-body:#cbd5e1;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#94a3b8;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#94a3b8;--tw-prose-invert-bullets:#475569;--tw-prose-invert-hr:#334155;--tw-prose-invert-quotes:#f1f5f9;--tw-prose-invert-quote-borders:#334155;--tw-prose-invert-captions:#94a3b8;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#cbd5e1;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#475569;--tw-prose-invert-td-borders:#334155}.learnj-nav-link{display:flex;width:100%;align-items:center;gap:.5rem;border-radius:calc(var(--radius) - 2px);padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:hsl(var(--sidebar-foreground));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-nav-link.active,.learnj-nav-link:hover{background-color:hsl(var(--sidebar-accent));color:hsl(var(--sidebar-accent-foreground))}.learnj-nav-link.active{font-weight:600}.learnj-nav-section{padding:.5rem .75rem;font-size:.75rem;line-height:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:hsl(var(--muted-foreground))}.learnj-btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;white-space:nowrap;border-radius:calc(var(--radius) - 2px);font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-ring-offset-color:hsl(var(--background));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-btn-ghost:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:hsl(var(--ring));--tw-ring-offset-width:2px}.learnj-btn-ghost:disabled{pointer-events:none;opacity:.5}.learnj-btn-ghost{height:2.25rem;width:2.25rem}.learnj-btn-ghost:hover{background-color:hsl(var(--accent));color:hsl(var(--accent-foreground))}.learnj-btn-outline{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;white-space:nowrap;border-radius:calc(var(--radius) - 2px);font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-ring-offset-color:hsl(var(--background));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-btn-outline:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:hsl(var(--ring));--tw-ring-offset-width:2px}.learnj-btn-outline:disabled{pointer-events:none;opacity:.5}.learnj-btn-outline{height:2.25rem;border-width:1px;border-color:hsl(var(--input));background-color:hsl(var(--background));padding:.5rem 1rem}.learnj-btn-outline:hover{background-color:hsl(var(--accent));color:hsl(var(--accent-foreground))}.learnj-badge-secondary{display:inline-flex;align-items:center;border-radius:.25rem;border-width:1px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:600;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;border-color:transparent;background-color:hsl(var(--secondary));color:hsl(var(--secondary-foreground))}.fixed{position:fixed}.sticky{position:sticky}.inset-y-0{top:0;bottom:0}.left-0{left:0}.top-0{top:0}.z-30{z-index:30}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.ml-3{margin-left:.75rem}.mr-1{margin-right:.25rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.contents{display:contents}.hidden{display:none}.h-14{height:3.5rem}.h-8{height:2rem}.h-full{height:100%}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-8{width:2rem}.w-\[280px\]{width:280px}.min-w-0{min-width:0}.max-w-4xl{max-width:56rem}.max-w-\[85vw\]{max-width:85vw}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.cursor-default{cursor:default}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-sidebar-border{border-color:hsl(var(--sidebar-border))}.bg-background\/95{background-color:hsl(var(--background)/.95)}.bg-primary{background-color:hsl(var(--primary))}.bg-sidebar{background-color:hsl(var(--sidebar-background))}.object-contain{-o-object-fit:contain;object-fit:contain}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pl-2{padding-left:.5rem}.pt-4{padding-top:1rem}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.tracking-tight{letter-spacing:-.025em}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-sidebar-foreground{color:hsl(var(--sidebar-foreground))}.opacity-80{opacity:.8}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.duration-200{animation-duration:.2s}.learnj-cloak{visibility:hidden}.learnj-cloak.learnj-ready{visibility:visible}#book-search-input{margin-left:.5rem;margin-right:.5rem;margin-bottom:.75rem}#book-search-input input{display:flex;height:2.25rem;width:100%;border-radius:calc(var(--radius) - 2px);border-width:1px;border-color:hsl(var(--input));background-color:hsl(var(--background));padding:.25rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}#book-search-input input::-moz-placeholder{color:hsl(var(--muted-foreground))}#book-search-input input::placeholder{color:hsl(var(--muted-foreground))}#book-search-input input:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:hsl(var(--ring))}.book-search-results{position:absolute;z-index:50;margin-top:.25rem;max-height:20rem;width:100%;overflow:auto;border-radius:calc(var(--radius) - 2px);border-width:1px;background-color:hsl(var(--popover));padding:.25rem;color:hsl(var(--popover-foreground));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mermaid{margin-top:1.5rem;margin-bottom:1.5rem;border-radius:var(--radius);border-width:1px;background-color:hsl(var(--muted)/.5);padding:1rem;text-align:center}.mermaid svg{margin-left:auto;margin-right:auto;max-width:100%}.markdown-section style[data-mermaid],.markdown-section>style{display:none!important}.markdown-section pre{overflow-x:auto}.markdown-section .hljs{background-color:transparent}.font-settings{border-radius:calc(var(--radius) - 2px);border-width:1px;background-color:hsl(var(--popover));padding:.5rem;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.learnj-sidebar-backdrop{position:fixed;inset:0;z-index:40;background-color:hsl(var(--background)/.8);--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}@media (min-width:1024px){.learnj-sidebar-backdrop{display:none}}.learnj-sidebar-backdrop.hidden{display:none}.learnj-page-nav{position:fixed;bottom:1.5rem;z-index:30;display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;background-color:hsl(var(--background));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-page-nav:hover{background-color:hsl(var(--accent))}.learnj-page-nav-prev{left:1.5rem;position:fixed;bottom:1.5rem;z-index:30;display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;background-color:hsl(var(--background));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-page-nav-prev:hover{background-color:hsl(var(--accent))}@media print{.learnj-page-nav-prev{display:none}}.learnj-page-nav-next{right:1.5rem;position:fixed;bottom:1.5rem;z-index:30;display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;background-color:hsl(var(--background));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-page-nav-next:hover{background-color:hsl(var(--accent))}@media print{.learnj-page-nav-next{display:none}#book-search-input,.learnj-header,.learnj-page-nav,.learnj-sidebar{display:none!important}.learnj-main{margin-left:0!important}}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:opacity-80:hover{opacity:.8}@supports (backdrop-filter:var(--tw )){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background)/.6)}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}@media (min-width:640px){.sm\:inline-flex{display:inline-flex}.sm\:text-base{font-size:1rem;line-height:1.5rem}}@media (min-width:1024px){.lg\:static{position:static}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}
1
+ .markdown-section code,.markdown-section pre{
2
+ /*!
3
+ Theme: Tomorrow
4
+ Author: Chris Kempson (http://chriskempson.com)
5
+ License: ~ MIT (or more permissive) [via base16-schemes-source]
6
+ Maintainer: @highlightjs/core-team
7
+ Version: 2021.09.0
8
+ */}.markdown-section code pre code.hljs,.markdown-section pre pre code.hljs{display:block;overflow-x:auto;padding:1em}.markdown-section code code.hljs,.markdown-section pre code.hljs{padding:3px 5px}.markdown-section code .hljs,.markdown-section pre .hljs{color:#4d4d4c;background:#fff}.markdown-section code .hljs ::-moz-selection,.markdown-section code .hljs::-moz-selection,.markdown-section pre .hljs ::-moz-selection,.markdown-section pre .hljs::-moz-selection{background-color:#d6d6d6;color:#4d4d4c}.markdown-section code .hljs ::selection,.markdown-section code .hljs::selection,.markdown-section pre .hljs ::selection,.markdown-section pre .hljs::selection{background-color:#d6d6d6;color:#4d4d4c}.markdown-section code .hljs-comment,.markdown-section pre .hljs-comment{color:#8e908c}.markdown-section code .hljs-tag,.markdown-section pre .hljs-tag{color:#969896}.markdown-section code .hljs-operator,.markdown-section code .hljs-punctuation,.markdown-section code .hljs-subst,.markdown-section pre .hljs-operator,.markdown-section pre .hljs-punctuation,.markdown-section pre .hljs-subst{color:#4d4d4c}.markdown-section code .hljs-operator,.markdown-section pre .hljs-operator{opacity:.7}.markdown-section code .hljs-bullet,.markdown-section code .hljs-deletion,.markdown-section code .hljs-name,.markdown-section code .hljs-selector-tag,.markdown-section code .hljs-template-variable,.markdown-section code .hljs-variable,.markdown-section pre .hljs-bullet,.markdown-section pre .hljs-deletion,.markdown-section pre .hljs-name,.markdown-section pre .hljs-selector-tag,.markdown-section pre .hljs-template-variable,.markdown-section pre .hljs-variable{color:#c82829}.markdown-section code .hljs-attr,.markdown-section code .hljs-link,.markdown-section code .hljs-literal,.markdown-section code .hljs-number,.markdown-section code .hljs-symbol,.markdown-section code .hljs-variable.constant_,.markdown-section pre .hljs-attr,.markdown-section pre .hljs-link,.markdown-section pre .hljs-literal,.markdown-section pre .hljs-number,.markdown-section pre .hljs-symbol,.markdown-section pre .hljs-variable.constant_{color:#f5871f}.markdown-section code .hljs-class .hljs-title,.markdown-section code .hljs-title,.markdown-section code .hljs-title.class_,.markdown-section pre .hljs-class .hljs-title,.markdown-section pre .hljs-title,.markdown-section pre .hljs-title.class_{color:#eab700}.markdown-section code .hljs-strong,.markdown-section pre .hljs-strong{font-weight:700;color:#eab700}.markdown-section code .hljs-addition,.markdown-section code .hljs-code,.markdown-section code .hljs-string,.markdown-section code .hljs-title.class_.inherited__,.markdown-section pre .hljs-addition,.markdown-section pre .hljs-code,.markdown-section pre .hljs-string,.markdown-section pre .hljs-title.class_.inherited__{color:#718c00}.markdown-section code .hljs-built_in,.markdown-section code .hljs-doctag,.markdown-section code .hljs-keyword.hljs-atrule,.markdown-section code .hljs-quote,.markdown-section code .hljs-regexp,.markdown-section pre .hljs-built_in,.markdown-section pre .hljs-doctag,.markdown-section pre .hljs-keyword.hljs-atrule,.markdown-section pre .hljs-quote,.markdown-section pre .hljs-regexp{color:#3e999f}.markdown-section code .hljs-attribute,.markdown-section code .hljs-function .hljs-title,.markdown-section code .hljs-section,.markdown-section code .hljs-title.function_,.markdown-section code .ruby .hljs-property,.markdown-section pre .hljs-attribute,.markdown-section pre .hljs-function .hljs-title,.markdown-section pre .hljs-section,.markdown-section pre .hljs-title.function_,.markdown-section pre .ruby .hljs-property{color:#4271ae}.markdown-section code .diff .hljs-meta,.markdown-section code .hljs-keyword,.markdown-section code .hljs-template-tag,.markdown-section code .hljs-type,.markdown-section pre .diff .hljs-meta,.markdown-section pre .hljs-keyword,.markdown-section pre .hljs-template-tag,.markdown-section pre .hljs-type{color:#8959a8}.markdown-section code .hljs-emphasis,.markdown-section pre .hljs-emphasis{color:#8959a8;font-style:italic}.markdown-section code .hljs-meta,.markdown-section code .hljs-meta .hljs-keyword,.markdown-section code .hljs-meta .hljs-string,.markdown-section pre .hljs-meta,.markdown-section pre .hljs-meta .hljs-keyword,.markdown-section pre .hljs-meta .hljs-string{color:#a3685a}.markdown-section code .hljs-meta .hljs-keyword,.markdown-section code .hljs-meta-keyword,.markdown-section pre .hljs-meta .hljs-keyword,.markdown-section pre .hljs-meta-keyword{font-weight:700}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre{
9
+ /*!
10
+ Theme: Solarized Light
11
+ Author: Ethan Schoonover (modified by aramisgithub)
12
+ License: ~ MIT (or more permissive) [via base16-schemes-source]
13
+ Maintainer: @highlightjs/core-team
14
+ Version: 2021.09.0
15
+ */}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code pre code.hljs,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre pre code.hljs{display:block;overflow-x:auto;padding:1em}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code code.hljs,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre code.hljs{padding:3px 5px}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs{color:#586e75;background:#fdf6e3}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs ::-moz-selection,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs::-moz-selection,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs ::-moz-selection,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs::-moz-selection{background-color:#93a1a1;color:#586e75}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs ::selection,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs::selection,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs ::selection,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs::selection{background-color:#93a1a1;color:#586e75}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment{color:#839496}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-tag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag{color:#657b83}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-operator,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-punctuation,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-subst,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-operator,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-punctuation,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-subst{color:#586e75}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-operator,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-operator{opacity:.7}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-bullet,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-name,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-name,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable{color:#dc322f}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attr,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-link,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-literal,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-number,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-variable.constant_,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attr,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-link,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable.constant_{color:#cb4b16}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-class .hljs-title,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title.class_,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-class .hljs-title,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title.class_{color:#b58900}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-strong,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-strong{font-weight:700;color:#b58900}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-code,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-string,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title.class_.inherited__,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-code,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title.class_.inherited__{color:#859900}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-doctag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword.hljs-atrule,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-quote,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-doctag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword.hljs-atrule,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-quote,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp{color:#2aa198}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-function .hljs-title,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-section,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-title.function_,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .ruby .hljs-property,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-function .hljs-title,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-section,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-title.function_,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .ruby .hljs-property{color:#268bd2}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .diff .hljs-meta,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-template-tag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-type,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .diff .hljs-meta,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-tag,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-type{color:#6c71c4}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis{color:#6c71c4;font-style:italic}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-string,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-string{color:#d33682}.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta .hljs-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal code .hljs-meta-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta .hljs-keyword,.book.color-theme-1 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta-keyword{font-weight:700}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code pre code.hljs,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre pre code.hljs{display:block;overflow-x:auto;padding:1em}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code code.hljs,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre code.hljs{padding:3px 5px}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-comment,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-quote,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-comment,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-quote{color:#969896}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-deletion,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-name,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-regexp,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-class,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-id,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-tag,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-template-variable,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-variable,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-deletion,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-name,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-regexp,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-class,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-id,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-tag,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-template-variable,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-variable{color:#d54e53}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-built_in,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-link,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-literal,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-meta,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-number,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-params,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-type,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-built_in,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-link,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-literal,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-meta,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-number,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-params,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-type{color:#e78c45}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-attribute,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-attribute{color:#e7c547}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-addition,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-bullet,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-string,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-symbol,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-addition,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-bullet,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-string,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-symbol{color:#b9ca4a}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-section,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-title,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-section,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-title{color:#7aa6da}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-keyword,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-selector-tag,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-keyword,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-selector-tag{color:#c397d8}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs{background:#000;color:#eaeaea}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-emphasis,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-emphasis{font-style:italic}.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal code .hljs-strong,.book.color-theme-2 .book-body .page-wrapper .page-inner section.normal pre .hljs-strong{font-weight:700}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
16
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:0 0% 100%;--foreground:240 10% 3.9%;--card:0 0% 100%;--card-foreground:240 10% 3.9%;--popover:0 0% 100%;--popover-foreground:240 10% 3.9%;--primary:240 5.9% 10%;--primary-foreground:0 0% 98%;--secondary:240 4.8% 95.9%;--secondary-foreground:240 5.9% 10%;--muted:240 4.8% 95.9%;--muted-foreground:240 3.8% 46.1%;--accent:240 4.8% 95.9%;--accent-foreground:240 5.9% 10%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:240 5.9% 90%;--input:240 5.9% 90%;--ring:240 5.9% 10%;--radius:0.5rem;--sidebar-background:0 0% 98%;--sidebar-foreground:240 5.3% 26.1%;--sidebar-primary:240 5.9% 10%;--sidebar-primary-foreground:0 0% 98%;--sidebar-accent:240 4.8% 95.9%;--sidebar-accent-foreground:240 5.9% 10%;--sidebar-border:220 13% 91%;--sidebar-ring:217.2 91.2% 59.8%}.dark{--background:240 10% 3.9%;--foreground:0 0% 98%;--card:240 10% 3.9%;--card-foreground:0 0% 98%;--popover:240 10% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:240 5.9% 10%;--secondary:240 3.7% 15.9%;--secondary-foreground:0 0% 98%;--muted:240 3.7% 15.9%;--muted-foreground:240 5% 64.9%;--accent:240 3.7% 15.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:240 3.7% 15.9%;--input:240 3.7% 15.9%;--ring:240 4.9% 83.9%;--sidebar-background:240 5.9% 10%;--sidebar-foreground:240 4.8% 95.9%;--sidebar-primary:224.3 76.3% 48%;--sidebar-primary-foreground:0 0% 100%;--sidebar-accent:240 3.7% 15.9%;--sidebar-accent-foreground:240 4.8% 95.9%;--sidebar-border:240 3.7% 15.9%;--sidebar-ring:217.2 91.2% 59.8%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.prose{color:var(--tw-prose-body);max-width:none}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;border-left-color:hsl(var(--primary));background-color:hsl(var(--muted));border-radius:calc(var(--radius) - 2px);padding:.5em 1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:hsl(var(--foreground));font-weight:500;font-size:.875em;background-color:hsl(var(--muted));padding:.2em .4em;border-radius:calc(var(--radius) - 4px)}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:""}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:""}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:hsl(var(--foreground));background-color:hsl(var(--muted));overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:var(--radius);padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em;border:1px solid hsl(var(--border))}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em;background-color:hsl(var(--muted))}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:hsl(var(--foreground));--tw-prose-headings:hsl(var(--foreground));--tw-prose-lead:#4b5563;--tw-prose-links:hsl(var(--primary));--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:hsl(var(--foreground));--tw-prose-pre-code:hsl(var(--foreground));--tw-prose-pre-bg:hsl(var(--muted));--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.learnj-nav-link{display:flex;width:100%;align-items:center;gap:.5rem;border-radius:calc(var(--radius) - 2px);padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:hsl(var(--sidebar-foreground));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-nav-link.active,.learnj-nav-link:hover{background-color:hsl(var(--sidebar-accent));color:hsl(var(--sidebar-accent-foreground))}.learnj-nav-link.active{font-weight:600}.learnj-nav-section{padding:.5rem .75rem;font-size:.75rem;line-height:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:hsl(var(--muted-foreground))}.learnj-btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;white-space:nowrap;border-radius:calc(var(--radius) - 2px);font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-ring-offset-color:hsl(var(--background));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-btn-ghost:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:hsl(var(--ring));--tw-ring-offset-width:2px}.learnj-btn-ghost:disabled{pointer-events:none;opacity:.5}.learnj-btn-ghost{height:2.25rem;width:2.25rem}.learnj-btn-ghost:hover{background-color:hsl(var(--accent));color:hsl(var(--accent-foreground))}.learnj-btn-outline{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;white-space:nowrap;border-radius:calc(var(--radius) - 2px);font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-ring-offset-color:hsl(var(--background));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-btn-outline:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:hsl(var(--ring));--tw-ring-offset-width:2px}.learnj-btn-outline:disabled{pointer-events:none;opacity:.5}.learnj-btn-outline{height:2.25rem;border-width:1px;border-color:hsl(var(--input));background-color:hsl(var(--background));padding:.5rem 1rem}.learnj-btn-outline:hover{background-color:hsl(var(--accent));color:hsl(var(--accent-foreground))}.learnj-badge-secondary{display:inline-flex;align-items:center;border-radius:.25rem;border-width:1px;padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:600;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;border-color:transparent;background-color:hsl(var(--secondary));color:hsl(var(--secondary-foreground))}.fixed{position:fixed}.sticky{position:sticky}.inset-y-0{top:0;bottom:0}.left-0{left:0}.top-0{top:0}.z-30{z-index:30}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.ml-3{margin-left:.75rem}.mr-1{margin-right:.25rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.contents{display:contents}.hidden{display:none}.h-14{height:3.5rem}.h-4{height:1rem}.h-8{height:2rem}.h-full{height:100%}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-8{width:2rem}.w-\[280px\]{width:280px}.w-px{width:1px}.min-w-0{min-width:0}.max-w-4xl{max-width:56rem}.max-w-\[85vw\]{max-width:85vw}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.cursor-default{cursor:default}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-2{row-gap:.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-sidebar-border{border-color:hsl(var(--sidebar-border))}.bg-background{background-color:hsl(var(--background))}.bg-background\/95{background-color:hsl(var(--background)/.95)}.bg-border{background-color:hsl(var(--border))}.bg-primary{background-color:hsl(var(--primary))}.bg-sidebar{background-color:hsl(var(--sidebar-background))}.object-contain{-o-object-fit:contain;object-fit:contain}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-20{padding-bottom:5rem}.pl-2{padding-left:.5rem}.pt-4{padding-top:1rem}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.text-sm{font-size:.875rem;line-height:1.25rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.tracking-tight{letter-spacing:-.025em}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-sidebar-foreground{color:hsl(var(--sidebar-foreground))}.opacity-80{opacity:.8}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-filter{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.duration-200{animation-duration:.2s}.learnj-cloak{visibility:hidden}.learnj-cloak.learnj-ready{visibility:visible}#book-search-input{margin-left:.5rem;margin-right:.5rem;margin-bottom:.75rem}#book-search-input input{display:flex;height:2.25rem;width:100%;border-radius:calc(var(--radius) - 2px);border-width:1px;border-color:hsl(var(--input));background-color:hsl(var(--background));padding:.25rem .75rem;font-size:.875rem;line-height:1.25rem;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}#book-search-input input::-moz-placeholder{color:hsl(var(--muted-foreground))}#book-search-input input::placeholder{color:hsl(var(--muted-foreground))}#book-search-input input:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:hsl(var(--ring))}.book-search-results{position:absolute;z-index:50;margin-top:.25rem;max-height:20rem;width:100%;overflow:auto;border-radius:calc(var(--radius) - 2px);border-width:1px;background-color:hsl(var(--popover));padding:.25rem;color:hsl(var(--popover-foreground));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mermaid{margin-top:1.5rem;margin-bottom:1.5rem;border-radius:var(--radius);border-width:1px;background-color:hsl(var(--muted)/.5);padding:1rem;text-align:center}.mermaid svg{margin-left:auto;margin-right:auto;max-width:100%}.markdown-section style[data-mermaid],.markdown-section>style{display:none!important}.markdown-section pre{overflow-x:auto;line-height:1.25rem;line-height:1.625}.markdown-section :not(pre)>code,.markdown-section pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem}.markdown-section :not(pre)>code{border-radius:.25rem;background-color:hsl(var(--muted));padding:.125rem .375rem;line-height:1.25rem;font-weight:500;color:hsl(var(--foreground))}.markdown-section pre code{background-color:transparent;padding:0;font-weight:400;color:inherit}.markdown-section pre .hljs,.markdown-section pre code.hljs{background:transparent!important}.dark .markdown-section pre{background-color:hsl(var(--secondary))}.dark .markdown-section pre .hljs,.dark .markdown-section pre code.hljs{color:#abb2bf;background:transparent!important}.dark .markdown-section pre .hljs-comment,.dark .markdown-section pre code.hljs .hljs-comment{color:#5c6370}.dark .markdown-section pre .hljs-keyword,.dark .markdown-section pre code.hljs .hljs-keyword{color:#c678dd}.dark .markdown-section pre .hljs-string,.dark .markdown-section pre code.hljs .hljs-string{color:#98c379}.dark .markdown-section pre .hljs-number,.dark .markdown-section pre code.hljs .hljs-number{color:#d19a66}.dark .markdown-section pre .hljs-built_in,.dark .markdown-section pre code.hljs .hljs-built_in{color:#e6c07b}.dark .markdown-section pre .hljs-title,.dark .markdown-section pre code.hljs .hljs-title{color:#61afef}.dark .markdown-section pre .hljs-attr,.dark .markdown-section pre code.hljs .hljs-attr{color:#d19a66}.dark .markdown-section pre .hljs-literal,.dark .markdown-section pre code.hljs .hljs-literal{color:#56b6c2}.font-settings{border-radius:calc(var(--radius) - 2px);border-width:1px;background-color:hsl(var(--popover));padding:.5rem;--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.learnj-sidebar-backdrop{position:fixed;inset:0;z-index:40;background-color:hsl(var(--background)/.8);--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}@media (min-width:1024px){.learnj-sidebar-backdrop{display:none}}.learnj-sidebar-backdrop.hidden{display:none}.learnj-page-nav{position:fixed;bottom:1.5rem;z-index:30;display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;background-color:hsl(var(--background));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-page-nav:hover{background-color:hsl(var(--accent))}.learnj-page-nav-prev{left:1.5rem;position:fixed;bottom:1.5rem;z-index:30;display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;background-color:hsl(var(--background));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-page-nav-prev:hover{background-color:hsl(var(--accent))}@media print{.learnj-page-nav-prev{display:none}}.learnj-page-nav-next{right:1.5rem;position:fixed;bottom:1.5rem;z-index:30;display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:9999px;border-width:1px;background-color:hsl(var(--background));--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.learnj-page-nav-next:hover{background-color:hsl(var(--accent))}@media print{.learnj-page-nav-next{display:none}}.learnj-footer a{text-decoration-line:none}@media print{#book-search-input,.learnj-footer,.learnj-header,.learnj-page-nav,.learnj-sidebar{display:none!important}.learnj-main{margin-left:0!important}}.dark\:prose-invert:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:hsl(var(--foreground));--tw-prose-pre-bg:hsl(var(--secondary));--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.dark\:prose-invert:is(.dark *) :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:hsl(var(--foreground));background-color:hsl(var(--secondary))}.dark\:prose-invert:is(.dark *) :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;background-color:transparent}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:opacity-80:hover{opacity:.8}@supports (backdrop-filter:var(--tw )){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background)/.6)}}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}@media (min-width:640px){.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:text-base{font-size:1rem;line-height:1.5rem}}@media (min-width:1024px){.lg\:static{position:static}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.12
3
+ * Copyright (C) 2015 Oliver Nightingale
4
+ * MIT Licensed
5
+ * @license
6
+ */
7
+ !function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.5.12",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(t){return arguments.length&&null!=t&&void 0!=t?Array.isArray(t)?t.map(function(t){return t.toLowerCase()}):t.toString().trim().toLowerCase().split(/[\s\-]+/):[]},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,o=0;n>o;o++){for(var r=t[o],s=0;i>s&&(r=this._stack[s](r,o,t),void 0!==r);s++);void 0!==r&&e.push(r)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(e<i.idx)return this.list=new t.Vector.Node(e,n,i),this.length++;for(var o=i,r=i.next;void 0!=r;){if(e<r.idx)return o.next=new t.Vector.Node(e,n,r),this.length++;o=r,r=r.next}return o.next=new t.Vector.Node(e,n,r),this.length++},t.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var t,e=this.list,n=0;e;)t=e.val,n+=t*t,e=e.next;return this._magnitude=Math.sqrt(n)},t.Vector.prototype.dot=function(t){for(var e=this.list,n=t.list,i=0;e&&n;)e.idx<n.idx?e=e.next:e.idx>n.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t<arguments.length;t++)e=arguments[t],~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e);this.length=this.elements.length},t.SortedSet.prototype.toArray=function(){return this.elements.slice()},t.SortedSet.prototype.map=function(t,e){return this.elements.map(t,e)},t.SortedSet.prototype.forEach=function(t,e){return this.elements.forEach(t,e)},t.SortedSet.prototype.indexOf=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;){if(r===t)return o;t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o]}return r===t?o:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,o=e+Math.floor(i/2),r=this.elements[o];i>1;)t>r&&(e=o),r>t&&(n=o),i=n-e,o=e+Math.floor(i/2),r=this.elements[o];return r>t?o:t>r?o+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,o=0,r=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>r-1||o>s-1)break;a[i]!==h[o]?a[i]<h[o]?i++:a[i]>h[o]&&o++:(n.add(a[i]),i++,o++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},o=new t.SortedSet,r=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=r,t.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),t.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s<o.length;s++){var a=o.elements[s],h=this._fields.reduce(function(t,e){var n=i[e.name].length;if(!n)return t;var o=i[e.name].filter(function(t){return t===a}).length;return t+o/n*e.boost},0);this.tokenStore.add(a,{ref:r,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,o=[],r=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*r,h=this,l=this.tokenStore.expand(e).reduce(function(n,o){var r=h.corpusTokens.indexOf(o),s=h.idf(o),l=1,u=new t.SortedSet;if(o!==e){var c=Math.max(3,o.length-e.length);l=1/Math.log(c)}return r>-1&&i.insert(r,a*s*l),Object.keys(h.tokenStore.get(o)).forEach(function(t){u.add(t)}),n.union(u)},new t.SortedSet);o.push(l)},this);var a=o.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,o=new t.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*h)}return o},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",h="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,u=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(l),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+o+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,r,s,a,h,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var T=s.exec(n);s=u,s.test(T[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,l=x,a.test(n)?n+="e":h.test(n)?(s=g,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+t[o])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],o=T[2],s=u,s.test(i)&&(n=i+e[o])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==e?e:void 0},t.stopWordFilter.stopWords={a:"a",able:"able",about:"about",across:"across",after:"after",all:"all",almost:"almost",also:"also",am:"am",among:"among",an:"an",and:"and",any:"any",are:"are",as:"as",at:"at",be:"be",because:"because",been:"been",but:"but",by:"by",can:"can",cannot:"cannot",could:"could",dear:"dear",did:"did","do":"do",does:"does",either:"either","else":"else",ever:"ever",every:"every","for":"for",from:"from",get:"get",got:"got",had:"had",has:"has",have:"have",he:"he",her:"her",hers:"hers",him:"him",his:"his",how:"how",however:"however",i:"i","if":"if","in":"in",into:"into",is:"is",it:"it",its:"its",just:"just",least:"least",let:"let",like:"like",likely:"likely",may:"may",me:"me",might:"might",most:"most",must:"must",my:"my",neither:"neither",no:"no",nor:"nor",not:"not",of:"of",off:"off",often:"often",on:"on",only:"only",or:"or",other:"other",our:"our",own:"own",rather:"rather",said:"said",say:"say",says:"says",she:"she",should:"should",since:"since",so:"so",some:"some",than:"than",that:"that",the:"the",their:"their",them:"them",then:"then",there:"there",these:"these",they:"they","this":"this",tis:"tis",to:"to",too:"too",twas:"twas",us:"us",wants:"wants",was:"was",we:"we",were:"were",what:"what",when:"when",where:"where",which:"which","while":"while",who:"who",whom:"whom",why:"why",will:"will","with":"with",would:"would",yet:"yet",you:"you",your:"your"},t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){var e=t.replace(/^\W+/,"").replace(/\W+$/,"");return""===e?void 0:e},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t[0],o=t.slice(1);return i in n||(n[i]={docs:{}}),0===o.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(o,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n<t.length;n++){if(!e[t[n]])return!1;e=e[t[n]]}return!0},t.TokenStore.prototype.getNode=function(t){if(!t)return{};for(var e=this.root,n=0;n<t.length;n++){if(!e[t[n]])return{};e=e[t[n]]}return e},t.TokenStore.prototype.get=function(t,e){return this.getNode(t,e).docs||{}},t.TokenStore.prototype.count=function(t,e){return Object.keys(this.get(t,e)).length},t.TokenStore.prototype.remove=function(t,e){if(t){for(var n=this.root,i=0;i<t.length;i++){if(!(t[i]in n))return;n=n[t[i]]}delete n.docs[e]}},t.TokenStore.prototype.expand=function(t,e){var n=this.getNode(t),i=n.docs||{},e=e||[];return Object.keys(i).length&&e.push(t),Object.keys(n).forEach(function(n){"docs"!==n&&e.concat(this.expand(t+n,e))},this),e},t.TokenStore.prototype.toJSON=function(){return{root:this.root,length:this.length}},function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.lunr=e()}(this,function(){return t})}();
@@ -0,0 +1,50 @@
1
+ require([
2
+ 'gitbook',
3
+ 'jquery'
4
+ ], function(gitbook, $) {
5
+ // Global search objects
6
+ var engine = null;
7
+ var initialized = false;
8
+
9
+ // Set a new search engine
10
+ function setEngine(Engine, config) {
11
+ initialized = false;
12
+ engine = new Engine(config);
13
+
14
+ init(config);
15
+ }
16
+
17
+ // Initialize search engine with config
18
+ function init(config) {
19
+ if (!engine) throw new Error('No engine set for research. Set an engine using gitbook.research.setEngine(Engine).');
20
+
21
+ return engine.init(config)
22
+ .then(function() {
23
+ initialized = true;
24
+ gitbook.events.trigger('search.ready');
25
+ });
26
+ }
27
+
28
+ // Launch search for query q
29
+ function query(q, offset, length) {
30
+ if (!initialized) throw new Error('Search has not been initialized');
31
+ return engine.search(q, offset, length);
32
+ }
33
+
34
+ // Get stats about search
35
+ function getEngine() {
36
+ return engine? engine.name : null;
37
+ }
38
+
39
+ function isInitialized() {
40
+ return initialized;
41
+ }
42
+
43
+ // Initialize gitbook.search
44
+ gitbook.search = {
45
+ setEngine: setEngine,
46
+ getEngine: getEngine,
47
+ query: query,
48
+ isInitialized: isInitialized
49
+ };
50
+ });
@@ -0,0 +1,35 @@
1
+ /*
2
+ This CSS only styled the search results section, not the search input
3
+ It defines the basic interraction to hide content when displaying results, etc
4
+ */
5
+ #book-search-results .search-results {
6
+ display: none;
7
+ }
8
+ #book-search-results .search-results ul.search-results-list {
9
+ list-style-type: none;
10
+ padding-left: 0;
11
+ }
12
+ #book-search-results .search-results ul.search-results-list li {
13
+ margin-bottom: 1.5rem;
14
+ padding-bottom: 0.5rem;
15
+ /* Highlight results */
16
+ }
17
+ #book-search-results .search-results ul.search-results-list li p em {
18
+ background-color: rgba(255, 220, 0, 0.4);
19
+ font-style: normal;
20
+ }
21
+ #book-search-results .search-results .no-results {
22
+ display: none;
23
+ }
24
+ #book-search-results.open .search-results {
25
+ display: block;
26
+ }
27
+ #book-search-results.open .search-noresults {
28
+ display: none;
29
+ }
30
+ #book-search-results.no-results .search-results .has-results {
31
+ display: none;
32
+ }
33
+ #book-search-results.no-results .search-results .no-results {
34
+ display: block;
35
+ }
@@ -0,0 +1,213 @@
1
+ require([
2
+ 'gitbook',
3
+ 'jquery'
4
+ ], function(gitbook, $) {
5
+ var MAX_RESULTS = 15;
6
+ var MAX_DESCRIPTION_SIZE = 500;
7
+
8
+ var usePushState = (typeof history.pushState !== 'undefined');
9
+
10
+ // DOM Elements
11
+ var $body = $('body');
12
+ var $bookSearchResults;
13
+ var $searchInput;
14
+ var $searchList;
15
+ var $searchTitle;
16
+ var $searchResultsCount;
17
+ var $searchQuery;
18
+
19
+ // Throttle search
20
+ function throttle(fn, wait) {
21
+ var timeout;
22
+
23
+ return function() {
24
+ var ctx = this, args = arguments;
25
+ if (!timeout) {
26
+ timeout = setTimeout(function() {
27
+ timeout = null;
28
+ fn.apply(ctx, args);
29
+ }, wait);
30
+ }
31
+ };
32
+ }
33
+
34
+ function displayResults(res) {
35
+ $bookSearchResults.addClass('open');
36
+
37
+ var noResults = res.count == 0;
38
+ $bookSearchResults.toggleClass('no-results', noResults);
39
+
40
+ // Clear old results
41
+ $searchList.empty();
42
+
43
+ // Display title for research
44
+ $searchResultsCount.text(res.count);
45
+ $searchQuery.text(res.query);
46
+
47
+ // Create an <li> element for each result
48
+ res.results.forEach(function(res) {
49
+ var $li = $('<li>', {
50
+ 'class': 'search-results-item'
51
+ });
52
+
53
+ var $title = $('<h3>');
54
+
55
+ var $link = $('<a>', {
56
+ 'href': gitbook.state.basePath + '/' + res.url,
57
+ 'text': res.title
58
+ });
59
+
60
+ var content = res.body.trim();
61
+ if (content.length > MAX_DESCRIPTION_SIZE) {
62
+ content = content.slice(0, MAX_DESCRIPTION_SIZE).trim()+'...';
63
+ }
64
+ var $content = $('<p>').html(content);
65
+
66
+ $link.appendTo($title);
67
+ $title.appendTo($li);
68
+ $content.appendTo($li);
69
+ $li.appendTo($searchList);
70
+ });
71
+ }
72
+
73
+ function launchSearch(q) {
74
+ // Add class for loading
75
+ $body.addClass('with-search');
76
+ $body.addClass('search-loading');
77
+
78
+ // Launch search query
79
+ throttle(gitbook.search.query(q, 0, MAX_RESULTS)
80
+ .then(function(results) {
81
+ displayResults(results);
82
+ })
83
+ .always(function() {
84
+ $body.removeClass('search-loading');
85
+ }), 1000);
86
+ }
87
+
88
+ function closeSearch() {
89
+ $body.removeClass('with-search');
90
+ $bookSearchResults.removeClass('open');
91
+ }
92
+
93
+ function launchSearchFromQueryString() {
94
+ var q = getParameterByName('q');
95
+ if (q && q.length > 0) {
96
+ // Update search input
97
+ $searchInput.val(q);
98
+
99
+ // Launch search
100
+ launchSearch(q);
101
+ }
102
+ }
103
+
104
+ function bindSearch() {
105
+ // Bind DOM
106
+ $searchInput = $('#book-search-input input');
107
+ $bookSearchResults = $('#book-search-results');
108
+ $searchList = $bookSearchResults.find('.search-results-list');
109
+ $searchTitle = $bookSearchResults.find('.search-results-title');
110
+ $searchResultsCount = $searchTitle.find('.search-results-count');
111
+ $searchQuery = $searchTitle.find('.search-query');
112
+
113
+ // Launch query based on input content
114
+ function handleUpdate() {
115
+ var q = $searchInput.val();
116
+
117
+ if (q.length == 0) {
118
+ closeSearch();
119
+ }
120
+ else {
121
+ launchSearch(q);
122
+ }
123
+ }
124
+
125
+ // Detect true content change in search input
126
+ // Workaround for IE < 9
127
+ var propertyChangeUnbound = false;
128
+ $searchInput.on('propertychange', function(e) {
129
+ if (e.originalEvent.propertyName == 'value') {
130
+ handleUpdate();
131
+ }
132
+ });
133
+
134
+ // HTML5 (IE9 & others)
135
+ $searchInput.on('input', function(e) {
136
+ // Unbind propertychange event for IE9+
137
+ if (!propertyChangeUnbound) {
138
+ $(this).unbind('propertychange');
139
+ propertyChangeUnbound = true;
140
+ }
141
+
142
+ handleUpdate();
143
+ });
144
+
145
+ // Push to history on blur
146
+ $searchInput.on('blur', function(e) {
147
+ // Update history state
148
+ if (usePushState) {
149
+ var uri = updateQueryString('q', $(this).val());
150
+ history.pushState({ path: uri }, null, uri);
151
+ }
152
+ });
153
+ }
154
+
155
+ gitbook.events.on('page.change', function() {
156
+ bindSearch();
157
+ closeSearch();
158
+
159
+ // Launch search based on query parameter
160
+ if (gitbook.search.isInitialized()) {
161
+ launchSearchFromQueryString();
162
+ }
163
+ });
164
+
165
+ gitbook.events.on('search.ready', function() {
166
+ bindSearch();
167
+
168
+ // Launch search from query param at start
169
+ launchSearchFromQueryString();
170
+ });
171
+
172
+ function getParameterByName(name) {
173
+ var url = window.location.href;
174
+ name = name.replace(/[\[\]]/g, '\\$&');
175
+ var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)', 'i'),
176
+ results = regex.exec(url);
177
+ if (!results) return null;
178
+ if (!results[2]) return '';
179
+ return decodeURIComponent(results[2].replace(/\+/g, ' '));
180
+ }
181
+
182
+ function updateQueryString(key, value) {
183
+ value = encodeURIComponent(value);
184
+
185
+ var url = window.location.href;
186
+ var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'),
187
+ hash;
188
+
189
+ if (re.test(url)) {
190
+ if (typeof value !== 'undefined' && value !== null)
191
+ return url.replace(re, '$1' + key + '=' + value + '$2$3');
192
+ else {
193
+ hash = url.split('#');
194
+ url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
195
+ if (typeof hash[1] !== 'undefined' && hash[1] !== null)
196
+ url += '#' + hash[1];
197
+ return url;
198
+ }
199
+ }
200
+ else {
201
+ if (typeof value !== 'undefined' && value !== null) {
202
+ var separator = url.indexOf('?') !== -1 ? '&' : '?';
203
+ hash = url.split('#');
204
+ url = hash[0] + separator + key + '=' + value;
205
+ if (typeof hash[1] !== 'undefined' && hash[1] !== null)
206
+ url += '#' + hash[1];
207
+ return url;
208
+ }
209
+ else
210
+ return url;
211
+ }
212
+ }
213
+ });
@@ -0,0 +1,26 @@
1
+ {% set themeConfig = config.pluginsConfig['theme-learnj'] or {} %}
2
+
3
+ <footer class="learnj-footer border-t border-border bg-background" role="contentinfo">
4
+ <div class="mx-auto flex max-w-4xl flex-col gap-4 px-4 py-8 sm:flex-row sm:items-center sm:justify-between lg:px-8">
5
+ <div class="min-w-0 space-y-1">
6
+ <p class="text-sm font-semibold text-foreground">
7
+ {{ themeConfig.logoText or config.title }}
8
+ </p>
9
+ {% if config.description %}
10
+ <p class="text-sm text-muted-foreground">{{ config.description }}</p>
11
+ {% endif %}
12
+ </div>
13
+
14
+ <div class="flex flex-wrap items-center gap-x-4 gap-y-2 text-sm text-muted-foreground">
15
+ {% if themeConfig.githubUrl %}
16
+ <a href="{{ themeConfig.githubUrl }}" target="_blank" rel="noopener noreferrer"
17
+ class="inline-flex items-center gap-2 font-medium text-foreground transition-colors hover:text-primary">
18
+ {% include "website/github-icon.html" %}
19
+ <span>GitHub</span>
20
+ </a>
21
+ {% endif %}
22
+ <span class="hidden h-4 w-px bg-border sm:inline-block" aria-hidden="true"></span>
23
+ <span>{{ "GITBOOK_LINK"|t }}</span>
24
+ </div>
25
+ </div>
26
+ </footer>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" class="shrink-0">
2
+ <path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
3
+ </svg>
@@ -17,9 +17,19 @@
17
17
  </h1>
18
18
  </div>
19
19
 
20
- <button type="button" id="learnj-theme-toggle" class="learnj-btn-ghost" aria-label="Toggle dark mode">
21
- <svg class="hidden dark:block" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>
22
- <svg class="block dark:hidden" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>
23
- </button>
20
+ <div class="flex shrink-0 items-center gap-1">
21
+ {% if themeConfig.githubUrl %}
22
+ <a href="{{ themeConfig.githubUrl }}" target="_blank" rel="noopener noreferrer"
23
+ class="learnj-btn-ghost"
24
+ aria-label="View on GitHub"
25
+ title="View on GitHub">
26
+ {% include "website/github-icon.html" %}
27
+ </a>
28
+ {% endif %}
29
+ <button type="button" id="learnj-theme-toggle" class="learnj-btn-ghost" aria-label="Toggle dark mode">
30
+ <svg class="hidden dark:block" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>
31
+ <svg class="block dark:hidden" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>
32
+ </button>
33
+ </div>
24
34
  </header>
25
35
  {% endblock %}
@@ -44,7 +44,11 @@
44
44
 
45
45
  <div class="flex-1 overflow-y-auto py-3">
46
46
  {% block book_sidebar %}
47
- {% block search_input %}{% endblock %}
47
+ {% block search_input %}
48
+ <div id="book-search-input" role="search">
49
+ <input type="text" placeholder="{{ 'SEARCH_PLACEHOLDER'|t }}" />
50
+ </div>
51
+ {% endblock %}
48
52
  {% block book_summary %}
49
53
  {% include "website/summary.html" %}
50
54
  {% endblock %}
@@ -57,17 +61,36 @@
57
61
  {% block book_inner %}
58
62
  {% include "website/header.html" %}
59
63
 
60
- <div class="flex-1 px-4 py-6 lg:px-8" tabindex="-1" role="main">
64
+ <div class="flex-1 px-4 py-6 pb-20 lg:px-8" tabindex="-1" role="main">
61
65
  <div class="mx-auto max-w-4xl">
62
66
  {% block search_results %}
63
- <article class="markdown-section prose prose-slate dark:prose-invert max-w-none">
64
- {% block page %}
65
- {{ page.content|safe }}
66
- {% endblock %}
67
- </article>
67
+ <div id="book-search-results">
68
+ <div class="search-noresults">
69
+ <article class="markdown-section prose dark:prose-invert max-w-none">
70
+ {% block page %}
71
+ {{ page.content|safe }}
72
+ {% endblock %}
73
+ </article>
74
+ </div>
75
+ <div class="search-results">
76
+ <div class="has-results">
77
+ {% block search_has_results %}
78
+ <h1 class="search-results-title">{{ 'SEARCH_RESULTS_TITLE'|t|safe }}</h1>
79
+ <ul class="search-results-list"></ul>
80
+ {% endblock %}
81
+ </div>
82
+ <div class="no-results">
83
+ {% block search_no_results %}
84
+ <h1 class="search-results-title">{{ 'SEARCH_NO_RESULTS_TITLE'|t|safe }}</h1>
85
+ {% endblock %}
86
+ </div>
87
+ </div>
88
+ </div>
68
89
  {% endblock %}
69
90
  </div>
70
91
  </div>
92
+
93
+ {% include "website/footer.html" %}
71
94
  {% endblock %}
72
95
 
73
96
  {% block book_navigation %}
package/index.js CHANGED
@@ -1,4 +1,15 @@
1
1
  module.exports = {
2
+ book: {
3
+ assets: "./_assets",
4
+ js: [
5
+ "website/lunr.min.js",
6
+ "website/search-engine.js",
7
+ "website/search.js",
8
+ ],
9
+ css: [
10
+ "website/search.css",
11
+ ],
12
+ },
2
13
  hooks: {
3
14
  config(config) {
4
15
  const themeConfig = config.pluginsConfig["theme-learnj"] || {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "honkit-plugin-theme-learnj",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "LearnJ HonKit theme — Tailwind CSS + shadcn/ui design system",
5
5
  "main": "./index.js",
6
6
  "files": [
@@ -12,6 +12,9 @@
12
12
  "scripts": {
13
13
  "build:css": "tailwindcss -i ./src/learnj.css -o ./_assets/website/learnj.css --minify",
14
14
  "build": "npm run build:css",
15
+ "example:install": "npm install --prefix example",
16
+ "example:serve": "npm run serve --prefix example",
17
+ "example:build": "npm run build --prefix example",
15
18
  "watch": "tailwindcss -i ./src/learnj.css -o ./_assets/website/learnj.css --watch",
16
19
  "prepublishOnly": "npm run build",
17
20
  "prepack": "npm run build"