diff --git a/theme/.editorconfig b/theme/.editorconfig new file mode 100644 index 00000000..2a1417f5 --- /dev/null +++ b/theme/.editorconfig @@ -0,0 +1,11 @@ +# https://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/theme/.gitignore b/theme/.gitignore new file mode 100644 index 00000000..fb6e78f7 --- /dev/null +++ b/theme/.gitignore @@ -0,0 +1,22 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Compiled output +dist + +# Dependency directories +node_modules/ + +# Output of 'npm pack' +*.tgz + +# Output of running `yarn typedoc src` on this repo +docs diff --git a/theme/README.md b/theme/README.md new file mode 100644 index 00000000..e69de29b diff --git a/theme/assets/style.css b/theme/assets/style.css new file mode 100644 index 00000000..8fca1abc --- /dev/null +++ b/theme/assets/style.css @@ -0,0 +1,159 @@ +@media (prefers-color-scheme: light) { + :root { + --menu-item-active-bg: #dfe0e2; + } + } + @media (prefers-color-scheme: dark) { + :root { + --menu-item-active-bg: #1e2024; + } + } + :root[data-theme='light'] { + --menu-item-active-bg: #dfe0e2; + } + :root[data-theme='dark'] { + --menu-item-active-bg: #1e2024; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background-color: var(--menu-item-active-bg); + } + .container { + padding: 0; + } + .tsd-page-toolbar, + .tsd-generator { + border: 0; + } + .tsd-generator { + padding: 0; + line-height: 40px; + height: 40px; + background: var(--color-background-secondary); + } + .tsd-generator > p { + max-width: 1700px; + margin: auto; + } + .container-main { + margin: 0 auto; + min-height: calc(100vh - 80px); + } + .menu-sticky-wrap { + } + .tsd-navigation.settings .tsd-accordion-details { + padding: 1rem; + background: var(--color-background-secondary); + } + .tsd-navigation.settings { + display: inline-block; + vertical-align: top; + margin: 0; + } + .tsd-navigation.settings h3{ + display: flex; + align-items: center; + font-size: 14px; + } + .tsd-navigation.settings .tsd-index-accordion { + position: relative; + } + .tsd-navigation.settings .tsd-accordion-summary { + display: inline-flex; + vertical-align: top; + align-items: center; + margin-left: 1rem; + height: 40px; + } + .tsd-navigation .tsd-accordion-summary { + display: flex; + align-items: center; + } + .tsd-navigation a { + display: flex; + } + .col-menu, + .col-content { + position: static; + margin: 0; + height: 100%; + box-sizing: border-box; + } + .col-menu { + flex: 0 0 20rem; + border-left: 0; + padding-left: 1rem; + padding-right: 0.1rem; + } + .col-content { + padding-top: 1rem; + padding-left: 1rem; + padding-right: 1rem; + flex: 1; + } + .menu-item-desc { + color: #5d5d5d; + font-size: 12px; + line-height: 1.26; + font-weight: normal; + } + + :root[data-theme='dark'] .menu-item-desc { + color: #989898; + } + @media (prefers-color-scheme: dark) { + .menu-item-desc { + color: #989898; + } + } + + a.tsd-index-link { + align-items: flex-start; + } + pre { + border: 0; + } + .tsd-signature { + background: var(--code-background); + border: 0; + } + code.tsd-tag { + border: 0; + } + + #tsd-search.has-focus .tsd-navigation.settings { + visibility: hidden; + } + + .tsd-page-toolbar .tsd-toolbar-icon { + text-align: center; + } + @media (max-width: 1024px) { + #tsd-search .title { + max-width: calc(100vw - 22rem); + overflow: hidden; + display: inline-block; + text-overflow: ellipsis; + } + } + @media (min-width: 1200px) { + .page-menu, + .site-menu { + max-height: calc(100vh - 60px); + padding: 10px 0 10px 10px; + top: 40px; + } + .container-main.empty-page-menu { + grid-template-columns: minmax(0, 1fr) minmax(0, 3.5fr) minmax(0, 0); + grid-template-areas: 'sidebar content'; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 60px); + top: 40px; + } + } + #tsd-search .title { + padding-left: 10px; + } \ No newline at end of file diff --git a/theme/package-lock.json b/theme/package-lock.json new file mode 100644 index 00000000..2fbc3f5d --- /dev/null +++ b/theme/package-lock.json @@ -0,0 +1,141 @@ +{ + "name": "marlowe-typedoc-theme", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "marlowe-typedoc-theme", + "version": "0.0.1", + "license": "MIT", + "devDependencies": { + "typedoc": "^0.24.8", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">= 14.20.1" + }, + "peerDependencies": { + "typedoc": "^0.24.8" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shiki": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + } + } +} diff --git a/theme/package.json b/theme/package.json new file mode 100644 index 00000000..2ee04fec --- /dev/null +++ b/theme/package.json @@ -0,0 +1,24 @@ +{ + "name": "marlowe-typedoc-theme", + "version": "0.0.1", + "main": "dist/index.js", + "license": "Apache-2.0", + "keywords": [ + "typedoc-theme" + ], + "engines": { + "node": ">= 14.20.1" + }, + "devDependencies": { + "typedoc": "^0.24.8", + "typescript": "^4.9.5" + }, + "peerDependencies": { + "typedoc": "^0.24.8" + }, + "scripts": { + "build": "tsc", + "predocs": "tsc", + "docs": "typedoc src --plugin dist/index.js" + } +} diff --git a/theme/src/MarloweTheme.tsx b/theme/src/MarloweTheme.tsx new file mode 100644 index 00000000..cf753fca --- /dev/null +++ b/theme/src/MarloweTheme.tsx @@ -0,0 +1,8 @@ +import { DefaultTheme, JSX, PageEvent, Reflection } from 'typedoc'; +import { ThemeContext } from './ThemeContext'; + +export class MarloweTheme extends DefaultTheme { + override getRenderContext(pageEvent: PageEvent): ThemeContext { + return new ThemeContext(this, pageEvent, this.application.options); + } +} \ No newline at end of file diff --git a/theme/src/ThemeContext.tsx b/theme/src/ThemeContext.tsx new file mode 100644 index 00000000..1bdcacb6 --- /dev/null +++ b/theme/src/ThemeContext.tsx @@ -0,0 +1,25 @@ +import { + DefaultTheme, + DefaultThemeRenderContext, + JSX, + Options, + PageEvent, + Reflection, + } from 'typedoc'; + // import * as templates from './templates'; + + function bind(fn: (f: F, ...a: L) => R, first: F) { + return (...r: L) => fn(first, ...r); + } + + export class ThemeContext extends DefaultThemeRenderContext { + constructor(theme: DefaultTheme, page: PageEvent, options: Options) { + super(theme, page, options); + this.init(); + } + init(){ + // for (const [key, tpl] of Object.entries(templates)) { + // this[key as keyof ThemeContext] = bind(tpl as any, this) as any; + // } + } + } \ No newline at end of file diff --git a/theme/src/index.tsx b/theme/src/index.tsx new file mode 100644 index 00000000..ef5d82eb --- /dev/null +++ b/theme/src/index.tsx @@ -0,0 +1,58 @@ +import { cpSync } from "node:fs"; +import { resolve } from "node:path"; +import { MarloweTheme } from "./MarloweTheme"; + +import { Application, JSX, RendererEvent } from "typedoc"; + + +/** + * Called by TypeDoc when loaded as a plugin. + */ +export function load(app: Application) { + app.renderer.hooks.on('body.begin', (_) => ( + + )); + + app.renderer.hooks.on("head.end", (event) => ( + <> + + + )); + + app.listenTo(app.renderer, RendererEvent.END, () => { + const from = resolve(__dirname, '../assets/style.css'); + const to = resolve(app.options.getValue('out'), 'assets/marlowe-theme.css'); + cpSync(from, to); + }); + app.renderer.defineTheme('marlowe-theme', MarloweTheme); + + app.renderer.hooks.on("body.end", (event) => ( + + )); +} \ No newline at end of file diff --git a/theme/tsconfig.json b/theme/tsconfig.json new file mode 100644 index 00000000..cbac28e9 --- /dev/null +++ b/theme/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "strict": true, + "outDir": "dist", + "esModuleInterop": true, + + "jsx": "react", + "jsxFactory": "JSX.createElement", + "jsxFragmentFactory": "JSX.Fragment" + }, + "include": ["src"] +} diff --git a/typedoc.json b/typedoc.json index 3fd6da77..33770329 100644 --- a/typedoc.json +++ b/typedoc.json @@ -9,6 +9,7 @@ "out": "./docs", "readme": "./packages/api.md", "includeVersion": true, + "plugin": ["./theme/dist/index.js"], "sidebarLinks": { "How to develop": "https://github.com/input-output-hk/marlowe-ts-sdk/blob/main/doc/howToDevelop.md", "Module system": "https://github.com/input-output-hk/marlowe-ts-sdk/blob/main/doc/modules-system.md",