core, web: Vendored client follow-ups (#21174)

* core, web: Vendored client follow-ups

- Updated packages for use with TypeScript 6
- Fix search results including symlinks.

* Bump docker package.

* web: bump vite from 8.0.2 to 8.0.3 in /web

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.2 to 8.0.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.0.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix import declaration order.

* Fix live reload imports, package declarations.

* Tidy admin entrypoint.

* Rename.

* Fix import.

* Fix import.

* Update paths. Update Knip.

* Bump knip.

* Update esbuild.d.ts

Signed-off-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>

* Bump.

* Re-enable deprecation warning.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
Teffen Ellis
2026-03-26 18:33:24 +01:00
committed by GitHub
parent 12a546e18a
commit 1b1be27f6a
35 changed files with 351 additions and 328 deletions

View File

@@ -1,6 +1,7 @@
# Prettier Ignorefile
## Static Files
CODEOWNERS
**/LICENSE
authentik/stages/**/*

View File

@@ -17,6 +17,6 @@
"ms-python.vscode-pylance",
"redhat.vscode-yaml",
"Tobermory.es6-string-html",
"unifiedjs.vscode-mdx",
"unifiedjs.vscode-mdx"
]
}

16
.vscode/settings.json vendored
View File

@@ -38,10 +38,10 @@
"!AtIndex scalar",
"!ParseJSON scalar"
],
"typescript.preferences.importModuleSpecifier": "non-relative",
"typescript.preferences.importModuleSpecifierEnding": "index",
"typescript.tsdk": "./node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"js/ts.preferences.importModuleSpecifier": "non-relative",
"js/ts.preferences.importModuleSpecifierEnding": "index",
"js/ts.tsdk.path": "./node_modules/typescript/lib",
"js/ts.tsdk.promptToUseWorkspaceVersion": true,
"yaml.schemas": {
"./blueprints/schema.json": "blueprints/**/*.yaml"
},
@@ -59,9 +59,11 @@
},
"github-actions.workflows.pinned.workflows": [".github/workflows/ci-main.yml"],
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.code-search": true,
"packages/client-*": true,
"**/bower_components": true,
"**/node_modules": true,
"**/playwright-report/**": true,
"**/website/**/build": true,
"**/client-*": true
}
}

View File

@@ -32,6 +32,7 @@ packages/django-channels-postgres @goauthentik/backend
packages/django-postgres-cache @goauthentik/backend
packages/django-dramatiq-postgres @goauthentik/backend
# Web packages
tsconfig.json @goauthentik/frontend
package.json @goauthentik/frontend
package-lock.json @goauthentik/frontend
packages/package.json @goauthentik/frontend

4
package-lock.json generated
View File

@@ -6813,7 +6813,7 @@
},
"packages/logger-js": {
"name": "@goauthentik/logger-js",
"version": "1.1.0",
"version": "1.1.1",
"license": "MIT",
"devDependencies": {
"@eslint/js": "^9.39.3",
@@ -6874,7 +6874,7 @@
},
"packages/tsconfig": {
"name": "@goauthentik/tsconfig",
"version": "1.0.8",
"version": "1.0.9",
"license": "MIT",
"engines": {
"node": ">=24",

View File

@@ -1,7 +1,7 @@
---
services:
gen:
image: docker.io/openapitools/openapi-generator-cli:v7.20.0
image: docker.io/openapitools/openapi-generator-cli:v7.21.0
restart: never
network_mode: none
volumes:

View File

@@ -261,6 +261,12 @@ export class ResponseError extends Error {
override name: "ResponseError" = "ResponseError";
constructor(public response: Response, msg?: string) {
super(msg);
// restore prototype chain
const actualProto = new.target.prototype;
if (Object.setPrototypeOf) {
Object.setPrototypeOf(this, actualProto);
}
}
}
@@ -268,6 +274,12 @@ export class FetchError extends Error {
override name: "FetchError" = "FetchError";
constructor(public cause: Error, msg?: string) {
super(msg);
// restore prototype chain
const actualProto = new.target.prototype;
if (Object.setPrototypeOf) {
Object.setPrototypeOf(this, actualProto);
}
}
}
@@ -275,6 +287,12 @@ export class RequiredError extends Error {
override name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) {
super(msg);
// restore prototype chain
const actualProto = new.target.prototype;
if (Object.setPrototypeOf) {
Object.setPrototypeOf(this, actualProto);
}
}
}

View File

@@ -4,7 +4,6 @@
"composite": true,
"isolatedModules": true,
"incremental": true,
"baseUrl": ".",
"rootDir": "src",
"strict": true,
"newLine": "lf",

View File

@@ -4,7 +4,6 @@
"composite": true,
"isolatedModules": true,
"incremental": true,
"baseUrl": ".",
"rootDir": "src",
"strict": true,
"newLine": "lf",

View File

@@ -43,7 +43,7 @@ Add the following import near the beginning of your application's entry point.
```js
if (process.env.NODE_ENV === "development") {
await import("@goauthentik/esbuild-plugin-live-reload/client");
await import("@goauthentik/esbuild-plugin-live-reload");
}
```

View File

@@ -33,7 +33,7 @@ const disposeSymbol = Symbol.dispose || Symbol.for("dispose");
*
* ```ts
* if (process.env.NODE_ENV === "development") {
* await import("@goauthentik/esbuild-plugin-live-reload/client")
* await import("@goauthentik/esbuild-plugin-live-reload")
* .catch(() => console.warn("Failed to import watcher"))
* }
* ```

View File

@@ -1,12 +1,12 @@
{
"name": "@goauthentik/esbuild-plugin-live-reload",
"version": "2.0.0",
"version": "2.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@goauthentik/esbuild-plugin-live-reload",
"version": "2.0.0",
"version": "2.0.1",
"license": "MIT",
"dependencies": {
"find-free-ports": "^3.1.1"
@@ -59,7 +59,7 @@
"@goauthentik/prettier-config": "../prettier-config",
"@goauthentik/tsconfig": "../tsconfig",
"@types/eslint": "^9.6.1",
"@types/node": "^25.3.0",
"@types/node": "^25.5.0",
"typescript": "^6.0.2",
"typescript-eslint": "^8.57.2"
},
@@ -84,19 +84,19 @@
},
"../logger-js": {
"name": "@goauthentik/logger-js",
"version": "1.1.0",
"version": "1.1.1",
"dev": true,
"license": "MIT",
"devDependencies": {
"@eslint/js": "^9.39.3",
"@goauthentik/prettier-config": "../prettier-config",
"@goauthentik/tsconfig": "../tsconfig",
"@types/node": "^25.3.0",
"@types/node": "^25.5.0",
"eslint": "^9.39.3",
"pino": "^10.3.1",
"pino-pretty": "^13.1.2",
"prettier": "^3.8.1",
"prettier-plugin-packagejson": "^3.0.0",
"prettier-plugin-packagejson": "^3.0.2",
"typescript": "^6.0.2",
"typescript-eslint": "^8.57.2"
},
@@ -132,7 +132,7 @@
"@types/node": "^25.0.0",
"eslint": "^9.39.3",
"prettier": "^3.8.1",
"prettier-plugin-packagejson": "^3.0.0",
"prettier-plugin-packagejson": "^3.0.2",
"typescript": "^6.0.2",
"typescript-eslint": "^8.57.2"
},
@@ -142,7 +142,7 @@
},
"peerDependencies": {
"prettier": "^3.8.1",
"prettier-plugin-packagejson": "^3.0.0"
"prettier-plugin-packagejson": "^3.0.2"
}
},
"../tsconfig": {

View File

@@ -1,6 +1,6 @@
{
"name": "@goauthentik/esbuild-plugin-live-reload",
"version": "2.0.0",
"version": "2.0.1",
"description": "ESBuild + browser refresh. Build completes, page reloads.",
"license": "MIT",
"repository": {
@@ -34,6 +34,7 @@
"types": "./out/client/index.d.ts",
"import": "./client/index.js"
},
"./client/types": "./client/types.d.ts",
"./plugin": {
"types": "./out/plugin/index.d.ts",
"import": "./plugin/index.js"

View File

@@ -1,12 +1,12 @@
{
"name": "@goauthentik/logger-js",
"version": "1.1.0",
"version": "1.1.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@goauthentik/logger-js",
"version": "1.1.0",
"version": "1.1.1",
"license": "MIT",
"devDependencies": {
"@eslint/js": "^9.39.3",

View File

@@ -1,6 +1,6 @@
{
"name": "@goauthentik/logger-js",
"version": "1.1.0",
"version": "1.1.1",
"description": "Pino-based logger for authentik",
"license": "MIT",
"repository": {
@@ -23,8 +23,8 @@
".": {
"types": "./out/index.d.ts",
"node": "./lib/node.js",
"import": "./lib/index.js",
"browser": "./lib/index.js"
"browser": "./index.js",
"import": "./index.js"
}
},
"devDependencies": {

View File

@@ -1,12 +1,12 @@
{
"name": "@goauthentik/tsconfig",
"version": "1.0.8",
"version": "1.0.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@goauthentik/tsconfig",
"version": "1.0.8",
"version": "1.0.9",
"license": "MIT",
"engines": {
"node": ">=24",

View File

@@ -1,6 +1,6 @@
{
"name": "@goauthentik/tsconfig",
"version": "1.0.8",
"version": "1.0.9",
"description": "authentik's base TypeScript configuration.",
"license": "MIT",
"repository": {

View File

@@ -2,7 +2,7 @@
{
"extends": "@goauthentik/tsconfig",
"compilerOptions": {
"baseUrl": "."
"ignoreDeprecations": "6.0"
},
"watchOptions": {
"excludeDirectories": [

154
web/package-lock.json generated
View File

@@ -78,7 +78,7 @@
"globals": "^17.4.0",
"guacamole-common-js": "^1.5.0",
"hastscript": "^9.0.1",
"knip": "^6.0.5",
"knip": "^6.0.6",
"lex": "^2025.11.0",
"lit": "^3.3.2",
"lit-analyzer": "^2.0.3",
@@ -114,7 +114,7 @@
"typescript": "^6.0.2",
"typescript-eslint": "^8.57.2",
"unist-util-visit": "^5.1.0",
"vite": "^8.0.2",
"vite": "^8.0.3",
"vitest": "^4.1.1",
"webcomponent-qr-code": "^1.3.0",
"wireit": "^0.14.12",
@@ -2905,9 +2905,9 @@
"license": "MIT"
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz",
"integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz",
"integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==",
"cpu": [
"arm64"
],
@@ -2921,9 +2921,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz",
"integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz",
"integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==",
"cpu": [
"arm64"
],
@@ -2937,9 +2937,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz",
"integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz",
"integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==",
"cpu": [
"x64"
],
@@ -2953,9 +2953,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz",
"integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz",
"integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==",
"cpu": [
"x64"
],
@@ -2969,9 +2969,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz",
"integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz",
"integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==",
"cpu": [
"arm"
],
@@ -2985,9 +2985,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz",
"integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz",
"integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==",
"cpu": [
"arm64"
],
@@ -3001,9 +3001,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz",
"integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz",
"integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==",
"cpu": [
"arm64"
],
@@ -3017,9 +3017,9 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz",
"integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz",
"integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==",
"cpu": [
"ppc64"
],
@@ -3033,9 +3033,9 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz",
"integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz",
"integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==",
"cpu": [
"s390x"
],
@@ -3049,9 +3049,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz",
"integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz",
"integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==",
"cpu": [
"x64"
],
@@ -3065,9 +3065,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz",
"integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz",
"integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==",
"cpu": [
"x64"
],
@@ -3081,9 +3081,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz",
"integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz",
"integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==",
"cpu": [
"arm64"
],
@@ -3097,9 +3097,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz",
"integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz",
"integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==",
"cpu": [
"wasm32"
],
@@ -3113,9 +3113,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz",
"integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz",
"integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==",
"cpu": [
"arm64"
],
@@ -3129,9 +3129,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz",
"integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz",
"integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==",
"cpu": [
"x64"
],
@@ -3145,9 +3145,9 @@
}
},
"node_modules/@rolldown/pluginutils": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz",
"integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz",
"integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==",
"license": "MIT"
},
"node_modules/@rollup/plugin-commonjs": {
@@ -11449,9 +11449,9 @@
}
},
"node_modules/knip": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/knip/-/knip-6.0.5.tgz",
"integrity": "sha512-+i9e/ZKuYlECB5iIK82NQwnYso4oNLBhzsTbXhSqCG1qfGi6D84GNtRENafmS3C0lABX8Wf3BKM434nPXi2AbQ==",
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/knip/-/knip-6.0.6.tgz",
"integrity": "sha512-PA+r1mTDLHH3eShlffn2ZDyH1hHvmgDj7JsTP3JKuhV/jZTyHbRkGcOd+uaSxfJZmcZyOE5zw3naP33WllTIlA==",
"funding": [
{
"type": "github",
@@ -15559,13 +15559,13 @@
"license": "Unlicense"
},
"node_modules/rolldown": {
"version": "1.0.0-rc.11",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz",
"integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==",
"version": "1.0.0-rc.12",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz",
"integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==",
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.122.0",
"@rolldown/pluginutils": "1.0.0-rc.11"
"@rolldown/pluginutils": "1.0.0-rc.12"
},
"bin": {
"rolldown": "bin/cli.mjs"
@@ -15574,21 +15574,21 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.0-rc.11",
"@rolldown/binding-darwin-arm64": "1.0.0-rc.11",
"@rolldown/binding-darwin-x64": "1.0.0-rc.11",
"@rolldown/binding-freebsd-x64": "1.0.0-rc.11",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11",
"@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11",
"@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11",
"@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11",
"@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11",
"@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11",
"@rolldown/binding-linux-x64-musl": "1.0.0-rc.11",
"@rolldown/binding-openharmony-arm64": "1.0.0-rc.11",
"@rolldown/binding-wasm32-wasi": "1.0.0-rc.11",
"@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11",
"@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11"
"@rolldown/binding-android-arm64": "1.0.0-rc.12",
"@rolldown/binding-darwin-arm64": "1.0.0-rc.12",
"@rolldown/binding-darwin-x64": "1.0.0-rc.12",
"@rolldown/binding-freebsd-x64": "1.0.0-rc.12",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12",
"@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12",
"@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12",
"@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12",
"@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12",
"@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12",
"@rolldown/binding-linux-x64-musl": "1.0.0-rc.12",
"@rolldown/binding-openharmony-arm64": "1.0.0-rc.12",
"@rolldown/binding-wasm32-wasi": "1.0.0-rc.12",
"@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12",
"@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12"
}
},
"node_modules/rolldown/node_modules/@oxc-project/types": {
@@ -17685,15 +17685,15 @@
}
},
"node_modules/vite": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz",
"integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==",
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz",
"integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==",
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.3",
"picomatch": "^4.0.4",
"postcss": "^8.5.8",
"rolldown": "1.0.0-rc.11",
"rolldown": "1.0.0-rc.12",
"tinyglobby": "^0.2.15"
},
"bin": {

View File

@@ -153,7 +153,7 @@
"globals": "^17.4.0",
"guacamole-common-js": "^1.5.0",
"hastscript": "^9.0.1",
"knip": "^6.0.5",
"knip": "^6.0.6",
"lex": "^2025.11.0",
"lit": "^3.3.2",
"lit-analyzer": "^2.0.3",
@@ -189,7 +189,7 @@
"typescript": "^6.0.2",
"typescript-eslint": "^8.57.2",
"unist-util-visit": "^5.1.0",
"vite": "^8.0.2",
"vite": "^8.0.3",
"vitest": "^4.1.1",
"webcomponent-qr-code": "^1.3.0",
"wireit": "^0.14.12",

View File

@@ -55,7 +55,7 @@ export const DistDirectory = /** @type {`${WebPackageIdentifier}/${DistDirectory
*/
export const EntryPoint = /** @type {const} */ ({
Admin: {
in: resolve(PackageRoot, "src", "admin", "AdminInterface", "index.entrypoint.ts"),
in: resolve(PackageRoot, "src", "admin", "index.entrypoint.ts"),
out: resolve(DistDirectory, "admin", "AdminInterface"),
},
User: {

View File

@@ -2,14 +2,16 @@ import { type KnipConfig } from "knip";
const config: KnipConfig = {
entry: [
"./src/admin/AdminInterface/AdminInterface.ts",
"./src/user/UserInterface.ts",
"./src/flow/FlowInterface.ts",
"./src/standalone/api-browser/index.ts",
"./src/rac/index.ts",
"./src/standalone/loading/index.ts",
"./src/polyfill/poly.ts",
"./src/admin/index.entrypoint.ts",
"./src/user/index.entrypoint.ts",
"./src/flow/index.entrypoint.ts",
"./src/standalone/api-browser/index.entrypoint.ts",
"./src/rac/index.entrypoint.ts",
"./src/standalone/loading/index.entrypoint.ts",
"./src/polyfill/index.entrypoint.ts",
],
ignore: ["packages/client-ts/**", "out/**/*"],
project: ["src/**/*.ts", "src/**/*.js", "./scripts/*.mjs", ".storybook/*.ts"],
// "ignore": ["src/**/*.test.ts", "src/**/*.stories.ts"],
// Prevent Knip from complaining about web components, which export their classes but also

View File

@@ -188,7 +188,7 @@ export const ROUTES: Route[] = [
return html`<ak-blueprint-list></ak-blueprint-list>`;
}),
new Route(new RegExp("^/debug$"), async () => {
await import("#admin/DebugPage");
await import("#admin/ak-admin-debug-page");
return html`<ak-admin-debug-page></ak-admin-debug-page>`;
}),
new Route(new RegExp("^/enterprise/licenses$"), async () => {

View File

@@ -1,17 +1,16 @@
import "#elements/banner/EnterpriseStatusBanner";
import "#elements/banner/VersionBanner";
import "#elements/messages/MessageContainer";
import "#elements/router/RouterOutlet";
import "#elements/sidebar/Sidebar";
import "#elements/sidebar/SidebarItem";
import "#elements/commands/ak-command-palette-user-modal";
import "#elements/router/RouterOutlet";
import "#elements/commands/ak-command-palette";
import {
createAdminSidebarEnterpriseEntries,
createAdminSidebarEntries,
renderSidebarItems,
SidebarEntry,
} from "./AdminSidebar.js";
} from "./navigation/sidebar.js";
import { isAPIResultReady } from "#common/api/responses";
import { configureSentry } from "#common/sentry/index";
@@ -38,7 +37,7 @@ import {
} from "#elements/notifications/utils";
import { navigate } from "#elements/router/RouterOutlet";
import Styles from "#admin/AdminInterface/index.entrypoint.css";
import Styles from "#admin/ak-interface-admin.css";
import { ROUTES } from "#admin/Routes";
import { CapabilitiesEnum } from "@goauthentik/api";
@@ -54,10 +53,6 @@ import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css";
import PFNav from "@patternfly/patternfly/components/Nav/nav.css";
import PFPage from "@patternfly/patternfly/components/Page/page.css";
if (process.env.NODE_ENV === "development") {
await import("@goauthentik/esbuild-plugin-live-reload/client");
}
@customElement("ak-interface-admin")
export class AdminInterface extends WithCapabilitiesConfig(
WithNotifications(WithSession(AuthenticatedInterface)),

View File

@@ -0,0 +1,6 @@
import "#elements/messages/MessageContainer";
import "#admin/ak-interface-admin";
if (process.env.NODE_ENV === "development") {
await import("@goauthentik/esbuild-plugin-live-reload");
}

View File

@@ -2,7 +2,7 @@ import { AKCommandChangeEvent } from "#elements/commands/events";
import { AKModal } from "#elements/modals/ak-modal";
import { SlottedTemplateResult } from "#elements/types";
import { AboutModal } from "#admin/AdminInterface/AboutModal";
import { AboutModal } from "#admin/ak-about-modal";
import { msg, str } from "@lit/localize";

View File

@@ -5,7 +5,7 @@ import { AKElement } from "#elements/Base";
import { WithLicenseSummary } from "#elements/mixins/license";
import { WithVersion } from "#elements/mixins/version";
import { AboutModal } from "#admin/AdminInterface/AboutModal";
import { AboutModal } from "#admin/ak-about-modal";
import { LicenseSummaryStatusEnum } from "@goauthentik/api";

View File

@@ -15,5 +15,5 @@ import "#flow/stages/password/PasswordStage";
// end of stage import
if (process.env.NODE_ENV === "development") {
await import("@goauthentik/esbuild-plugin-live-reload/client");
await import("@goauthentik/esbuild-plugin-live-reload");
}

View File

@@ -0,0 +1,192 @@
import "#components/ak-nav-buttons";
import "#elements/banner/EnterpriseStatusBanner";
import "#elements/notifications/APIDrawer";
import "#elements/notifications/NotificationDrawer";
import "#elements/router/RouterOutlet";
import { globalAK } from "#common/global";
import { configureSentry } from "#common/sentry/index";
import { isGuest } from "#common/users";
import { WebsocketClient } from "#common/ws/WebSocketClient";
import { AuthenticatedInterface } from "#elements/AuthenticatedInterface";
import { listen } from "#elements/decorators/listen";
import { WithBrandConfig } from "#elements/mixins/branding";
import { canAccessAdmin, WithSession } from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import {
DrawerState,
persistDrawerParams,
readDrawerParams,
renderNotificationDrawerPanel,
} from "#elements/notifications/utils";
import { ifPresent } from "#elements/utils/attributes";
import { ThemedImage } from "#elements/utils/images";
import Styles from "#user/ak-interface-user.css";
import { ROUTES } from "#user/Routes";
import { ConsoleLogger } from "#logger/browser";
import { msg } from "@lit/localize";
import { html, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { guard } from "lit/directives/guard.js";
import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css";
import PFBrand from "@patternfly/patternfly/components/Brand/brand.css";
import PFButton from "@patternfly/patternfly/components/Button/button.css";
import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css";
import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css";
import PFNotificationBadge from "@patternfly/patternfly/components/NotificationBadge/notification-badge.css";
import PFPage from "@patternfly/patternfly/components/Page/page.css";
import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css";
@customElement("ak-interface-user")
class UserInterface extends WithBrandConfig(WithSession(AuthenticatedInterface)) {
public static readonly styles = [
PFDisplay,
PFBrand,
PFPage,
PFAvatar,
PFButton,
PFDrawer,
PFDropdown,
PFNotificationBadge,
Styles,
];
#logger = ConsoleLogger.prefix("user-interface");
@property({ attribute: false, useDefault: true })
public drawer: DrawerState = readDrawerParams();
@listen(AKDrawerChangeEvent)
protected drawerListener = (event: AKDrawerChangeEvent) => {
this.drawer = event.drawer;
persistDrawerParams(event.drawer);
};
//#region Lifecycle
constructor() {
configureSentry();
super();
WebsocketClient.connect();
}
public override disconnectedCallback() {
super.disconnectedCallback();
WebsocketClient.close();
}
//#endregion
//#region Rendering
protected renderAdminInterfaceLink() {
return guard([this.currentUser], () => {
if (!canAccessAdmin(this.currentUser)) {
return nothing;
}
const { base } = globalAK().api;
return html`<a
class="pf-c-button pf-m-secondary pf-m-small pf-u-display-none pf-u-display-block-on-md"
href="${base}if/admin/"
slot="extra"
>
${msg("Admin interface")}
</a>
<a
class="pf-c-button pf-m-secondary pf-m-small pf-u-display-none-on-md pf-u-display-block"
href="${base}if/admin/"
slot="extra"
>
${msg("Admin")}
</a>`;
});
}
protected render() {
const { currentUser } = this;
const guest = isGuest(currentUser);
if (!currentUser || guest) {
this.#logger.debug("Waiting for user session", {
currentUser,
guest,
});
// TODO: There might be a hidden feature here.
// Allowing guest users to see some parts of the interface?
// Maybe redirect to a flow?
return html`<slot name="placeholder"></slot>`;
}
const backgroundStyles = this.uiConfig.theme.background;
return html`<ak-enterprise-status interface="user"></ak-enterprise-status>
<div part="page" class="pf-c-page">
<div part="background-wrapper" style=${ifPresent(backgroundStyles)}>
${!backgroundStyles
? html`<div part="background-default-slant"></div>`
: nothing}
</div>
<header
role="banner"
aria-label="Main"
part="page__header"
class="pf-c-page__header"
>
<div part="brand" class="pf-c-page__header-brand">
<a href="#/" class="pf-c-page__header-brand-link">
${ThemedImage({
src: this.brandingLogo,
alt: this.brandingTitle,
className: "pf-c-brand",
theme: this.activeTheme,
themedUrls: this.brandingLogoThemedUrls,
})}
</a>
</div>
<ak-nav-buttons>${this.renderAdminInterfaceLink()}</ak-nav-buttons>
</header>
<div class="pf-c-page__drawer">
<div
class="pf-c-drawer ${this.drawer.notifications || this.drawer.api
? "pf-m-expanded"
: "pf-m-collapsed"}"
>
<div class="pf-c-drawer__main">
<div class="pf-c-drawer__content">
<div class="pf-c-drawer__body">
<ak-router-outlet
class="pf-l-bullseye__item pf-c-page__main"
tabindex="-1"
id="main-content"
default-url="/library"
.routes=${ROUTES}
>
</ak-router-outlet>
</div>
</div>
${renderNotificationDrawerPanel(this.drawer)}
</div>
</div>
</div>
</div>
${this.commandPalette}`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ak-interface-user": UserInterface;
}
}

View File

@@ -1,199 +1,6 @@
import "#components/ak-nav-buttons";
import "#elements/banner/EnterpriseStatusBanner";
import "#elements/buttons/ActionButton/ak-action-button";
import "#elements/messages/MessageContainer";
import "#elements/notifications/APIDrawer";
import "#elements/notifications/NotificationDrawer";
import "#elements/router/RouterOutlet";
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
import { globalAK } from "#common/global";
import { configureSentry } from "#common/sentry/index";
import { isGuest } from "#common/users";
import { WebsocketClient } from "#common/ws/WebSocketClient";
import { AuthenticatedInterface } from "#elements/AuthenticatedInterface";
import { listen } from "#elements/decorators/listen";
import { WithBrandConfig } from "#elements/mixins/branding";
import { canAccessAdmin, WithSession } from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import {
DrawerState,
persistDrawerParams,
readDrawerParams,
renderNotificationDrawerPanel,
} from "#elements/notifications/utils";
import { ifPresent } from "#elements/utils/attributes";
import { ThemedImage } from "#elements/utils/images";
import Styles from "#user/index.entrypoint.css";
import { ROUTES } from "#user/Routes";
import { ConsoleLogger } from "#logger/browser";
import { msg } from "@lit/localize";
import { html, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { guard } from "lit/directives/guard.js";
import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css";
import PFBrand from "@patternfly/patternfly/components/Brand/brand.css";
import PFButton from "@patternfly/patternfly/components/Button/button.css";
import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css";
import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css";
import PFNotificationBadge from "@patternfly/patternfly/components/NotificationBadge/notification-badge.css";
import PFPage from "@patternfly/patternfly/components/Page/page.css";
import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css";
import "#user/ak-interface-user";
if (process.env.NODE_ENV === "development") {
await import("@goauthentik/esbuild-plugin-live-reload/client");
}
@customElement("ak-interface-user")
class UserInterface extends WithBrandConfig(WithSession(AuthenticatedInterface)) {
public static readonly styles = [
PFDisplay,
PFBrand,
PFPage,
PFAvatar,
PFButton,
PFDrawer,
PFDropdown,
PFNotificationBadge,
Styles,
];
#logger = ConsoleLogger.prefix("user-interface");
@property({ attribute: false, useDefault: true })
public drawer: DrawerState = readDrawerParams();
@listen(AKDrawerChangeEvent)
protected drawerListener = (event: AKDrawerChangeEvent) => {
this.drawer = event.drawer;
persistDrawerParams(event.drawer);
};
//#region Lifecycle
constructor() {
configureSentry();
super();
WebsocketClient.connect();
}
public override disconnectedCallback() {
super.disconnectedCallback();
WebsocketClient.close();
}
//#endregion
//#region Rendering
protected renderAdminInterfaceLink() {
return guard([this.currentUser], () => {
if (!canAccessAdmin(this.currentUser)) {
return nothing;
}
const { base } = globalAK().api;
return html`<a
class="pf-c-button pf-m-secondary pf-m-small pf-u-display-none pf-u-display-block-on-md"
href="${base}if/admin/"
slot="extra"
>
${msg("Admin interface")}
</a>
<a
class="pf-c-button pf-m-secondary pf-m-small pf-u-display-none-on-md pf-u-display-block"
href="${base}if/admin/"
slot="extra"
>
${msg("Admin")}
</a>`;
});
}
protected render() {
const { currentUser } = this;
const guest = isGuest(currentUser);
if (!currentUser || guest) {
this.#logger.debug("Waiting for user session", {
currentUser,
guest,
});
// TODO: There might be a hidden feature here.
// Allowing guest users to see some parts of the interface?
// Maybe redirect to a flow?
return html`<slot name="placeholder"></slot>`;
}
const backgroundStyles = this.uiConfig.theme.background;
return html`<ak-enterprise-status interface="user"></ak-enterprise-status>
<div part="page" class="pf-c-page">
<div part="background-wrapper" style=${ifPresent(backgroundStyles)}>
${!backgroundStyles
? html`<div part="background-default-slant"></div>`
: nothing}
</div>
<header
role="banner"
aria-label="Main"
part="page__header"
class="pf-c-page__header"
>
<div part="brand" class="pf-c-page__header-brand">
<a href="#/" class="pf-c-page__header-brand-link">
${ThemedImage({
src: this.brandingLogo,
alt: this.brandingTitle,
className: "pf-c-brand",
theme: this.activeTheme,
themedUrls: this.brandingLogoThemedUrls,
})}
</a>
</div>
<ak-nav-buttons>${this.renderAdminInterfaceLink()}</ak-nav-buttons>
</header>
<div class="pf-c-page__drawer">
<div
class="pf-c-drawer ${this.drawer.notifications || this.drawer.api
? "pf-m-expanded"
: "pf-m-collapsed"}"
>
<div class="pf-c-drawer__main">
<div class="pf-c-drawer__content">
<div class="pf-c-drawer__body">
<ak-router-outlet
class="pf-l-bullseye__item pf-c-page__main"
tabindex="-1"
id="main-content"
default-url="/library"
.routes=${ROUTES}
>
</ak-router-outlet>
</div>
</div>
${renderNotificationDrawerPanel(this.drawer)}
</div>
</div>
</div>
</div>
${this.commandPalette}`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ak-interface-user": UserInterface;
}
await import("@goauthentik/esbuild-plugin-live-reload");
}