@emotionalamo/plugin-extratheme 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +153 -0
  2. package/README.zh-CN.md +137 -0
  3. package/client-v2.d.ts +2 -0
  4. package/client-v2.js +1 -0
  5. package/client.d.ts +2 -0
  6. package/client.js +1 -0
  7. package/dist/client/index.d.ts +1 -0
  8. package/dist/client/index.js +10 -0
  9. package/dist/client/plugin.d.ts +5 -0
  10. package/dist/client/selectors.d.ts +1 -0
  11. package/dist/client/settings/LivePreview.d.ts +8 -0
  12. package/dist/client/settings/SettingsPage.d.ts +3 -0
  13. package/dist/client/settings/controls.d.ts +17 -0
  14. package/dist/client/useT.d.ts +2 -0
  15. package/dist/client-v2/index.d.ts +1 -0
  16. package/dist/client-v2/index.js +10 -0
  17. package/dist/client-v2/plugin.d.ts +5 -0
  18. package/dist/client-v2/selectors.d.ts +1 -0
  19. package/dist/externalVersion.js +19 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.js +48 -0
  22. package/dist/locale/en-US.json +80 -0
  23. package/dist/locale/zh-CN.json +80 -0
  24. package/dist/server/collections/extraThemeSettings.d.ts +2 -0
  25. package/dist/server/collections/extraThemeSettings.js +39 -0
  26. package/dist/server/index.d.ts +2 -0
  27. package/dist/server/index.js +48 -0
  28. package/dist/server/plugin.d.ts +6 -0
  29. package/dist/server/plugin.js +64 -0
  30. package/dist/server/resources/extraTheme.d.ts +24 -0
  31. package/dist/server/resources/extraTheme.js +65 -0
  32. package/dist/shared/buildTheme.d.ts +35 -0
  33. package/dist/shared/buildTheme.js +72 -0
  34. package/dist/shared/color.d.ts +44 -0
  35. package/dist/shared/color.js +122 -0
  36. package/dist/shared/defaults.d.ts +22 -0
  37. package/dist/shared/defaults.js +109 -0
  38. package/dist/shared/generateCss.d.ts +5 -0
  39. package/dist/shared/generateCss.js +116 -0
  40. package/dist/shared/injector.d.ts +15 -0
  41. package/dist/shared/injector.js +88 -0
  42. package/dist/shared/selectors.d.ts +17 -0
  43. package/dist/shared/selectors.js +48 -0
  44. package/dist/shared/types.d.ts +97 -0
  45. package/dist/shared/types.js +24 -0
  46. package/package.json +42 -0
  47. package/server.d.ts +2 -0
  48. package/server.js +1 -0
package/README.md ADDED
@@ -0,0 +1,153 @@
1
+ **English** | [简体中文](./README.zh-CN.md)
2
+
3
+ # ExtraTheme · 主题增强
4
+
5
+ > `@amo/plugin-extratheme` — a global theme-enhancement plugin for NocoBase 2.x.
6
+
7
+ Extends theming **beyond the native theme editor** (which only exposes antd tokens):
8
+ custom page **background** (image upload / URL / gradient presets / solid color, with
9
+ cover / contain / stretch / tile fit), surface **transparency**, **frosted-glass**
10
+ (`backdrop-filter`), **top / side navigation** opacity + blur, a **global font** (curated
11
+ system-font preset, custom font-family stack, or an **uploaded font file** that works for
12
+ every viewer with no local install), and a macOS-style **scrollbar** mode (always-show /
13
+ always-hide). Configured globally by an admin in one settings page and applied across
14
+ both clients.
15
+
16
+ **Disabled by default** — enabling the plugin changes nothing until an admin turns a
17
+ section on and saves. Turning every section off cleanly restores the native look.
18
+
19
+ ---
20
+
21
+ ## Scope
22
+
23
+ | Surface | Themed | Notes |
24
+ |---|---|---|
25
+ | `/admin` (legacy client) | ✅ | Primary workspace. Settings UI lives here. |
26
+ | `/v` (modern client) | ✅ | Same theme, bridged via the shared theme record. |
27
+ | Sign-in page | ⏸ Deferred | Plumbing is dormant (default-off); no stable selectors yet. |
28
+
29
+ Settings page: **`/admin/settings/extra-theme`** → three columns —
30
+ **工作区外观** (background + content-card transparency + scrollbar) · **顶部导航栏 / 侧边导航栏**
31
+ (base color + opacity + blur) · **全局字体** — each an **independent** on/off switch, with a
32
+ live preview and a whole-config reset.
33
+
34
+ ---
35
+
36
+ ## How it works (the important part)
37
+
38
+ NocoBase renders each custom "code-block" business page inside an **isolated nested React
39
+ root** wrapped in a `transform`ed container. Raw CSS injected at `<body>` / `.ant-layout`
40
+ **cannot** paint through that boundary — so surface colors are done with **antd design
41
+ tokens**, which NocoBase re-bridges into every nested root, so they penetrate everywhere.
42
+ Outer chrome (nav, background) is done with CSS.
43
+
44
+ | What | Mechanism | Key |
45
+ |---|---|---|
46
+ | Card / surface color | antd token | `colorBgContainer` (rgba, gated on the content-card switch) |
47
+ | Page body | antd token | `colorBgLayout: transparent` (lets the background show) |
48
+ | Overlays stay opaque | antd token | `colorBgElevated: #fff` (Modal/Drawer/Dropdown/…) |
49
+ | Controls stay readable | `components.<C>.colorBgContainer: #fff` | Input/Select/Table/DatePicker/… |
50
+ | Global font | antd token (+ body CSS) | `fontFamily` (uploaded fonts add a document-global `@font-face`) |
51
+ | Top / side nav | **CSS** | base color + opacity + frosted blur on the real header/sider; **menu text color stays theme-owned** |
52
+ | Page background (image / gradient / color) | **CSS** on `<body>` | antd has no bg-image token; supports fit modes + dim |
53
+ | Frosted blur | CSS | `backdrop-filter` (token gives the alpha, CSS gives the blur) |
54
+ | Scrollbar | CSS | always-visible slim bar / fully hidden |
55
+
56
+ Apply path (Provider-free): the settings page upserts **one `themeConfig` record**
57
+ (from the theme-editor plugin, default display name **"Modern"**) marked `default: true`,
58
+ pins the current user to it, and calls `useGlobalTheme().setTheme()` for an immediate
59
+ in-session result. Reloads and other clients pick it up via the theme-editor's
60
+ `InitializeTheme`. Every build deletes the plugin's managed tokens first, so an "off"
61
+ state never inherits a prior "on" state, and a theme-editor rename is preserved.
62
+
63
+ The raw settings are stored server-side in the **`extraThemeSettings`** collection and
64
+ served by the anonymous `extraTheme:getPublic` action, which drives the injected
65
+ `<style>`. `ThemeInjector` caches the config in `localStorage` and paints from cache
66
+ first to avoid a flash.
67
+
68
+ ---
69
+
70
+ ## Security
71
+
72
+ The `extraTheme:getPublic` action is public but exposes **appearance config only**; every
73
+ write requires the **`pm.extra-theme` admin snippet** (`extraTheme:set` and the
74
+ `extraThemeSettings` collection are auth-gated). Because the compiled stylesheet is served
75
+ to every visitor including the anonymous sign-in page, **all config values that reach the
76
+ CSS are sanitized at the generation sink**: a strict color allow-list (`safeCssColor`),
77
+ URL sanitizer (`sanitizeCssUrl`), numeric coercion (`safeNum`), font-family sanitizer, and
78
+ an `@font-face format()` allow-list — so a config value can never break out of the
79
+ injected declaration.
80
+
81
+ ---
82
+
83
+ ## Architecture
84
+
85
+ ```
86
+ src/
87
+ shared/ pure, unit-tested core (framework-agnostic)
88
+ types.ts config shapes
89
+ defaults.ts DEFAULT_APP, gradient/font presets, mergeConfig (deep, non-mutating)
90
+ color.ts color/url/number sanitizers, hexToRgba, buildBackground
91
+ buildTheme.ts AppConfig -> antd ThemeConfig (the token map above)
92
+ generateCss.ts AppConfig -> the injected <style> (bg + nav + blur + scrollbar + font)
93
+ injector.ts ThemeInjector: fetch -> cache -> inject, shared by both clients
94
+ selectors.ts DOM selectors
95
+ server/
96
+ collections/extraThemeSettings.ts
97
+ resources/extraTheme.ts getPublic (public) + set (snippet-gated)
98
+ plugin.ts ACL + install seed (disabled by default)
99
+ client/ legacy /admin — injector + the settings UI (primary)
100
+ client-v2/ modern /v — injector mirror
101
+ locale/ zh-CN + en-US
102
+ ```
103
+
104
+ Shared logic is TDD'd with vitest under `src/shared/__tests__/` (95+ cases, incl. security).
105
+
106
+ ---
107
+
108
+ ## Develop & deploy
109
+
110
+ ```bash
111
+ # build (from the monorepo root)
112
+ yarn build @amo/plugin-extratheme
113
+
114
+ # run the shared tests (point vitest at the shared files explicitly, from the root)
115
+ yarn vitest run packages/plugins/@amo/plugin-extratheme/src/shared/__tests__
116
+ ```
117
+
118
+ First-time registration in the container (the `@amo` scope is not auto-discovered by
119
+ prefix, and the new collection needs a sync):
120
+
121
+ ```bash
122
+ docker exec nb-dev-app sh -lc 'cd /app/nocobase && \
123
+ npx nocobase pm add @amo/plugin-extratheme && \
124
+ npx nocobase pm enable @amo/plugin-extratheme && \
125
+ yarn nocobase db:sync'
126
+ ```
127
+
128
+ The plugin is developed inside a monorepo and mirrored to standalone repos via
129
+ `git subtree` (one-time remote add, then re-push after each release):
130
+
131
+ ```bash
132
+ git subtree push --prefix=packages/plugins/@amo/plugin-extratheme <remote> main
133
+ ```
134
+
135
+ ---
136
+
137
+ ## Known limits
138
+
139
+ - **Author-written inline styles** in a JS-block's HTML (e.g. a hardcoded
140
+ `style="background:#fff"`) can't be overridden by tokens or CSS — that's the block
141
+ author's markup, not chrome.
142
+ - The **sign-in page** is not yet themable (no stable structural selectors). The
143
+ config/injector path exists but is default-off.
144
+ - The **nav bar color** is set in the plugin (NocoBase's theme editor does not expose the
145
+ `colorBgHeader` token); the plugin only layers opacity + blur on top of it.
146
+ - Requires the **theme-editor** plugin for cross-reload persistence (the `themeConfig`
147
+ record). Without it, `setTheme` still gives an immediate in-session result.
148
+
149
+ ---
150
+
151
+ ## License
152
+
153
+ AGPL-3.0
@@ -0,0 +1,137 @@
1
+ [English](./README.md) | **简体中文**
2
+
3
+ # ExtraTheme · 主题增强
4
+
5
+ > `@amo/plugin-extratheme` —— 面向 NocoBase 2.x 的全局主题增强插件。
6
+
7
+ 在**原生主题编辑器(只能改 antd token)之外**扩展主题能力:自定义页面**背景**(图片上传 /
8
+ URL / 渐变预设 / 纯色,支持铺满 / 适应 / 拉伸 / 平铺)、表面**透明度**、**毛玻璃**
9
+ (`backdrop-filter`)、**顶部 / 侧边导航栏**透明度 + 模糊、**全局字体**(内置系统字体预设、
10
+ 自定义 font-family、或**上传字体文件**——对所有访问者生效,无需本机安装)、以及仿 macOS 的
11
+ **滚动条**方式(始终显示 / 始终隐藏)。由管理员在一个设置页里全局配置,对两个客户端同时生效。
12
+
13
+ **默认关闭** —— 启用插件本身不改变任何外观,直到管理员打开某个分区并保存;把所有分区关闭即可干净地恢复原生外观。
14
+
15
+ ---
16
+
17
+ ## 作用范围
18
+
19
+ | 界面 | 是否美化 | 说明 |
20
+ |---|---|---|
21
+ | `/admin`(旧版客户端) | ✅ | 主工作区,设置界面在这里 |
22
+ | `/v`(新版客户端) | ✅ | 同一套主题,通过共享的主题记录桥接 |
23
+ | 登录页 | ⏸ 延后 | 通路已埋好(默认关),但暂无稳定选择器 |
24
+
25
+ 设置页:**`/admin/settings/extra-theme`** → 三列 ——
26
+ **工作区外观**(背景 + 内容卡片透明度 + 滚动条)· **顶部导航栏 / 侧边导航栏**
27
+ (底色 + 透明度 + 模糊)· **全局字体** —— 每项都有**独立开关**,附带实时预览与整组重置。
28
+
29
+ ---
30
+
31
+ ## 原理(关键部分)
32
+
33
+ NocoBase 把每个自定义"代码块"业务页渲染在一个**隔离的嵌套 React 根**里,外层包着一个带
34
+ `transform` 的容器。注入到 `<body>` / `.ant-layout` 的裸 CSS **无法**穿透这个边界 —— 所以
35
+ 表面颜色用 **antd 设计 token** 实现,NocoBase 会把它重新桥接进每个嵌套根,从而处处生效;
36
+ 外层框架(导航、背景)则用 CSS 实现。
37
+
38
+ | 内容 | 机制 | 关键 |
39
+ |---|---|---|
40
+ | 卡片 / 表面色 | antd token | `colorBgContainer`(rgba,受"内容卡片"开关控制) |
41
+ | 页面主体 | antd token | `colorBgLayout: transparent`(让背景透出) |
42
+ | 浮层保持不透明 | antd token | `colorBgElevated: #fff`(Modal/Drawer/Dropdown 等) |
43
+ | 控件保持可读 | `components.<C>.colorBgContainer: #fff` | Input/Select/Table/DatePicker 等 |
44
+ | 全局字体 | antd token(+ body CSS) | `fontFamily`(上传字体额外注入文档级 `@font-face`) |
45
+ | 顶部 / 侧边导航 | **CSS** | 底色 + 透明度 + 毛玻璃,作用在真实的 header/sider 上;**菜单文字颜色仍由主题掌管** |
46
+ | 页面背景(图片 / 渐变 / 纯色) | **CSS**(作用于 `<body>`) | antd 无背景图 token;支持铺法与暗化 |
47
+ | 毛玻璃 | CSS | `backdrop-filter`(token 给透明度,CSS 给模糊) |
48
+ | 滚动条 | CSS | 常驻细滚动条 / 完全隐藏 |
49
+
50
+ 生效方式(无 Provider):设置页 upsert **一条 `themeConfig` 记录**(来自 theme-editor 插件,
51
+ 默认显示名 **"Modern"**),标记 `default: true`,把当前用户 pin 到它,并调用
52
+ `useGlobalTheme().setTheme()` 当场生效;刷新和其它客户端通过 theme-editor 的
53
+ `InitializeTheme` 接手。每次构建都会先**删除**插件所管的 token,所以"关闭"态绝不会继承上一次
54
+ "开启"态,且在主题编辑器里的重命名会被保留。
55
+
56
+ 原始设置存在服务端集合 **`extraThemeSettings`**,由匿名的 `extraTheme:getPublic` 动作提供,
57
+ 驱动注入的 `<style>`。`ThemeInjector` 把配置缓存在 `localStorage`,先从缓存渲染以避免闪烁。
58
+
59
+ ---
60
+
61
+ ## 安全
62
+
63
+ `extraTheme:getPublic` 是公共接口,但**只暴露外观配置**;所有写操作都需要
64
+ **`pm.extra-theme` 管理员 snippet**(`extraTheme:set` 与 `extraThemeSettings` 集合均已鉴权)。
65
+ 由于编译出的样式表会下发给每一个访问者(包括匿名登录页),**所有进入 CSS 的配置值都在生成出口
66
+ 处做了净化**:严格颜色白名单(`safeCssColor`)、URL 净化(`sanitizeCssUrl`)、数字强制转换
67
+ (`safeNum`)、字体族净化、以及 `@font-face format()` 白名单 —— 任何配置值都无法突破注入的声明。
68
+
69
+ ---
70
+
71
+ ## 目录结构
72
+
73
+ ```
74
+ src/
75
+ shared/ 纯逻辑核心(与框架无关,已单测)
76
+ types.ts 配置结构
77
+ defaults.ts DEFAULT_APP、渐变/字体预设、mergeConfig(深合并、不改原对象)
78
+ color.ts 颜色/URL/数字净化器、hexToRgba、buildBackground
79
+ buildTheme.ts AppConfig -> antd ThemeConfig(上面的 token 映射)
80
+ generateCss.ts AppConfig -> 注入的 <style>(背景 + 导航 + 模糊 + 滚动条 + 字体)
81
+ injector.ts ThemeInjector:拉取 -> 缓存 -> 注入,两端共用
82
+ selectors.ts DOM 选择器
83
+ server/
84
+ collections/extraThemeSettings.ts
85
+ resources/extraTheme.ts getPublic(公共)+ set(snippet 鉴权)
86
+ plugin.ts ACL + 安装播种(默认关闭)
87
+ client/ 旧版 /admin —— 注入器 + 设置界面(主)
88
+ client-v2/ 新版 /v —— 注入器镜像
89
+ locale/ zh-CN + en-US
90
+ ```
91
+
92
+ 共享逻辑用 vitest TDD,位于 `src/shared/__tests__/`(95+ 用例,含安全用例)。
93
+
94
+ ---
95
+
96
+ ## 开发与部署
97
+
98
+ ```bash
99
+ # 构建(在 monorepo 根目录)
100
+ yarn build @amo/plugin-extratheme
101
+
102
+ # 跑共享测试(从根目录显式指向 shared 目录)
103
+ yarn vitest run packages/plugins/@amo/plugin-extratheme/src/shared/__tests__
104
+ ```
105
+
106
+ 首次在容器里注册(`@amo` 作用域不会按前缀自动发现,新集合也需要同步):
107
+
108
+ ```bash
109
+ docker exec nb-dev-app sh -lc 'cd /app/nocobase && \
110
+ npx nocobase pm add @amo/plugin-extratheme && \
111
+ npx nocobase pm enable @amo/plugin-extratheme && \
112
+ yarn nocobase db:sync'
113
+ ```
114
+
115
+ 本插件在 monorepo 内开发,通过 `git subtree` 镜像到独立仓库(一次性加 remote,之后每次发布重推):
116
+
117
+ ```bash
118
+ git subtree push --prefix=packages/plugins/@amo/plugin-extratheme <remote> main
119
+ ```
120
+
121
+ ---
122
+
123
+ ## 已知限制
124
+
125
+ - JS 代码块 HTML 里**作者写死的内联样式**(如 `style="background:#fff"`)无法被 token 或
126
+ CSS 覆盖 —— 那是块作者的标记,不属于框架外观。
127
+ - **登录页**暂不可主题化(无稳定结构选择器),配置/注入通路已存在但默认关闭。
128
+ - **导航栏底色由插件设置**(NocoBase 主题编辑器不暴露 `colorBgHeader` token),插件只在其上
129
+ 叠加透明度 + 模糊。
130
+ - 跨刷新持久化依赖 **theme-editor** 插件(即那条 `themeConfig` 记录);没有它时 `setTheme`
131
+ 仍能当场生效。
132
+
133
+ ---
134
+
135
+ ## 许可证
136
+
137
+ AGPL-3.0
package/client-v2.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './dist/client-v2';
2
+ export { default } from './dist/client-v2';
package/client-v2.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/client-v2/index.js');
package/client.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './dist/client';
2
+ export { default } from './dist/client';
package/client.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/client/index.js');
@@ -0,0 +1 @@
1
+ export { default } from './plugin';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react-i18next"),require("react"),require("antd"),require("@nocobase/client")):"function"==typeof define&&define.amd?define("@emotionalamo/plugin-extratheme",["react-i18next","react","antd","@nocobase/client"],t):"object"==typeof exports?exports["@emotionalamo/plugin-extratheme"]=t(require("react-i18next"),require("react"),require("antd"),require("@nocobase/client")):e["@emotionalamo/plugin-extratheme"]=t(e["react-i18next"],e.react,e.antd,e["@nocobase/client"])}(self,function(e,t,r,n){return function(){"use strict";var a={342:function(e){e.exports=n},59:function(e){e.exports=r},155:function(e){e.exports=t},953:function(t){t.exports=e}},o={};function l(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return a[e](r,r.exports,l),r.exports}l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,{a:t}),t},l.d=function(e,t){for(var r in t)l.o(t,r)&&!l.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.r=function(e){"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.g.importScripts&&(i=l.g.location+"");var i,c=l.g.document;if(!i&&c&&(c.currentScript&&"SCRIPT"===c.currentScript.tagName.toUpperCase()&&(i=c.currentScript.src),!i)){var u=c.getElementsByTagName("script");if(u.length)for(var s=u.length-1;s>-1&&(!i||!/^http(s?):/.test(i));)i=u[s--].src}if(!i)throw Error("Automatic publicPath is not supported in this browser");l.p=i.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/");var f={};return!function(){var e="",t="u">typeof document?document.currentScript:null;if(t&&t.src){var r=t.src.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"");r.indexOf("/static/plugins/@emotionalamo/plugin-extratheme/dist/client/")>=0&&(e=r.replace(/\/[^\/]+$/,"/"))}if(!e){var n=window.__webpack_public_path__||"";n&&("/"!==n.charAt(n.length-1)&&(n+="/"),e=n+"static/plugins/@emotionalamo/plugin-extratheme/dist/client/")}if(!e){var a=window.__nocobase_modern_client_prefix__||"v",o="/"+(a=String(a).replace(/^\/+|\/+$/g,"")||"v")+"/";if(!(e=window.__nocobase_public_path__||"")&&window.location&&window.location.pathname){var i=window.location.pathname||"/",c=i.indexOf(o);e=c>=0?i.slice(0,c+1):"/"}e&&(e=e.replace(RegExp("/"+a+"/?$"),"/")),e||(e="/"),"/"!==e.charAt(e.length-1)&&(e+="/"),e+="static/plugins/@emotionalamo/plugin-extratheme/dist/client/"}l.p=e}(),!function(){l.r(f),l.d(f,{default:function(){return eC}});var e=l(342),t=JSON.parse('{"ExtraTheme":"主题增强","主题增强":"主题增强","工作区外观":"工作区外观","登录页外观":"登录页外观","总开关":"总开关","背景":"背景","类型":"类型","纯色":"纯色","渐变":"渐变","图片":"图片","背景颜色":"背景颜色","渐变预设":"渐变预设","自定义":"自定义","角度":"角度","自定义色标":"自定义色标","图片 URL":"图片 URL","需公网可读":"需公网可读","上传":"上传","铺法":"铺法","铺满":"铺满","适应":"适应","拉伸":"拉伸","平铺":"平铺","暗化遮罩":"暗化遮罩","内容区卡片":"内容区卡片","卡片不透明度":"卡片不透明度","背景模糊":"背景模糊","浅色描边":"浅色描边","风格":"风格","实色":"实色","毛玻璃":"毛玻璃","不透明度":"不透明度","文字颜色":"文字颜色","深色":"深色","浅色":"浅色","登录卡片":"登录卡片","圆角":"圆角","投影":"投影","顶部导航栏":"顶部导航栏","侧边导航栏":"侧边导航栏","颜色由主题编辑器管理,这里只叠加透明度与模糊。":"颜色由主题编辑器管理,这里只叠加透明度与模糊。","滚动条":"滚动条","显示方式":"显示方式","始终显示":"始终显示","始终隐藏":"始终隐藏","“始终显示”为常驻细滚动条;“始终隐藏”完全隐藏滚动条(内容仍可滚动)。":"“始终显示”为常驻细滚动条;“始终隐藏”完全隐藏滚动条(内容仍可滚动)。","全局字体":"全局字体","字体":"字体","自定义字体":"自定义字体","字体预览":"预览","字体来源":"字体来源","系统字体":"系统字体","上传字体":"上传字体","上传字体文件":"上传字体文件","选择字体文件":"选择字体文件","字体名称":"字体名称","已上传":"已上传","重新上传":"重新上传","移除":"移除","提示:字体需系统已安装才生效;“无衬线/系统默认”通常与本机默认字体一致,选“楷体/宋体”等可看到明显变化。":"提示:字体需系统已安装才生效;“无衬线/系统默认”通常与本机默认字体一致,选“楷体/宋体”等可看到明显变化。","提示:上传字体对所有访问者生效,无需本机安装;中文字体文件较大,建议使用 woff2 或先做子集化以加快加载。":"提示:上传字体对所有访问者生效,无需本机安装;中文字体文件较大,建议使用 woff2 或先做子集化以加快加载。","上传成功":"上传成功","上传失败":"上传失败","已保存并应用":"已保存并应用","保存失败":"保存失败","保存并应用":"保存并应用","重置本组":"重置本组","实时预览":"实时预览","提示:默认关闭,开启总开关并保存后才生效;关闭插件或关闭开关立即恢复原生外观。":"提示:默认关闭,开启总开关并保存后才生效;关闭插件或关闭开关立即恢复原生外观。","概览":"概览","数据":"数据","设置":"设置","菜单":"菜单","订单":"订单","报表":"报表","内容卡片":"内容卡片","欢迎登录":"欢迎登录","登录":"登录"}'),r=JSON.parse('{"ExtraTheme":"ExtraTheme","主题增强":"ExtraTheme","工作区外观":"Workspace","登录页外观":"Sign-in page","总开关":"Enable","背景":"Background","类型":"Type","纯色":"Solid","渐变":"Gradient","图片":"Image","背景颜色":"Background color","渐变预设":"Preset","自定义":"Custom","角度":"Angle","自定义色标":"Custom stops","图片 URL":"Image URL","需公网可读":"Must be public","上传":"Upload","铺法":"Fit","铺满":"Cover","适应":"Contain","拉伸":"Stretch","平铺":"Repeat","暗化遮罩":"Dim","内容区卡片":"Content cards","卡片不透明度":"Card opacity","背景模糊":"Blur","浅色描边":"Light border","风格":"Style","实色":"Solid","毛玻璃":"Frosted","不透明度":"Opacity","文字颜色":"Text color","深色":"Dark","浅色":"Light","登录卡片":"Login card","圆角":"Radius","投影":"Shadow","顶部导航栏":"Top navigation","侧边导航栏":"Side navigation","颜色由主题编辑器管理,这里只叠加透明度与模糊。":"Color is managed by the theme editor — here you only add opacity and blur.","滚动条":"Scrollbar","显示方式":"Display","始终显示":"Always show","始终隐藏":"Always hide","“始终显示”为常驻细滚动条;“始终隐藏”完全隐藏滚动条(内容仍可滚动)。":"“Always show” is a persistent slim scrollbar; “Always hide” removes the scrollbar (content still scrolls).","全局字体":"Global font","字体":"Font","自定义字体":"Custom font","字体预览":"Preview","字体来源":"Font source","系统字体":"System font","上传字体":"Upload font","上传字体文件":"Upload font file","选择字体文件":"Choose font file","字体名称":"Font name","已上传":"Uploaded","重新上传":"Replace","移除":"Remove","提示:字体需系统已安装才生效;“无衬线/系统默认”通常与本机默认字体一致,选“楷体/宋体”等可看到明显变化。":"The font must be installed on the viewer\'s system. “Sans / System default” usually matches the OS default — pick e.g. Kaiti / Songti to see a clear change.","提示:上传字体对所有访问者生效,无需本机安装;中文字体文件较大,建议使用 woff2 或先做子集化以加快加载。":"An uploaded font works for every viewer without a local install. CJK font files are large — prefer woff2 or subset the font to speed up loading.","上传成功":"Uploaded","上传失败":"Upload failed","已保存并应用":"Saved and applied","保存失败":"Save failed","保存并应用":"Save & apply","重置本组":"Reset","实时预览":"Live preview","提示:默认关闭,开启总开关并保存后才生效;关闭插件或关闭开关立即恢复原生外观。":"Off by default — turn on the switch and save to apply; disabling the plugin or the switch restores the native look instantly.","概览":"Overview","数据":"Data","设置":"Settings","菜单":"Menu","订单":"Orders","报表":"Reports","内容卡片":"Content card","欢迎登录":"Welcome back","登录":"Sign in"}');function n(e){var t=(e||"").replace(/[;{}<>\\/*]/g,"").replace(/[\r\n\t]+/g," ").trim();return(t.match(/"/g)||[]).length%2&&(t=t.replace(/"/g,"")),(t.match(/'/g)||[]).length%2&&(t=t.replace(/'/g,"")),t.slice(0,200)}function a(e){var t;return({woff2:"woff2",woff:"woff",ttf:"truetype",otf:"opentype",ttc:"truetype"})[((null==(t=(e||"").split("?")[0].split("#")[0].match(/\.([a-z0-9]+)$/i))?void 0:t[1])||"").toLowerCase()]||""}function o(e){return(e||"").replace(/["')(;{}<>\\]/g,"").replace(/\s+/g,"").slice(0,2e3)}function i(e,t){var r=(e||"").replace("#","");3===r.length&&(r=r.split("").map(function(e){return e+e}).join(""));var n=parseInt(r.slice(0,2),16),a=parseInt(r.slice(2,4),16),o=parseInt(r.slice(4,6),16);return"rgba(".concat(n,",").concat(a,",").concat(o,",").concat(t,")")}function c(e){var t=(e||"").trim();return/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(t)||/^(rgb|rgba|hsl|hsla)\(\s*[\d.,%\s/]+\)$/i.test(t)||/^[a-z]+$/i.test(t)?t:"transparent"}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=Number(e);return Number.isFinite(r)?r:t}function s(e,t){var r=function(e){var t=(e||"").trim(),r=t.match(/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/i);if(r)return[Math.round(+r[1]),Math.round(+r[2]),Math.round(+r[3])];var n=t.replace("#","");return(3===n.length&&(n=n.split("").map(function(e){return e+e}).join("")),/^[0-9a-f]{6}$/i.test(n))?[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]:null}(e);return r?"rgba(".concat(r[0],",").concat(r[1],",").concat(r[2],",").concat(u(t),")"):"transparent"}function d(e){var t,r={image:"transparent",size:"auto",repeat:"no-repeat",position:"center"};if(!e||"none"===e.type)return r;if("color"===e.type)return{image:c(e.color),size:"auto",repeat:"no-repeat",position:"center"};if("gradient"===e.type){var n=(e.gradient.colors||[]).map(c).join(",");return{image:"linear-gradient(".concat(u(e.gradient.angle),"deg,").concat(n,")"),size:"cover",repeat:"no-repeat",position:"center"}}var a=o((null==(t=e.image)?void 0:t.url)||"");if(!a)return r;var l=e.image.fit;return{image:'url("'.concat(a,'")'),size:"repeat"===l?"auto":"stretch"===l?"100% 100%":"contain"===l?"contain":"cover",repeat:"repeat"===l?"repeat":"no-repeat",position:"center"}}var p=["woff2","woff","truetype","opentype"];function b(e,t){return t.split(",").map(function(t){return"".concat(e," ").concat(t.trim())}).join(",")}function m(e){var t=u(e);return"backdrop-filter:blur(".concat(t,"px);-webkit-backdrop-filter:blur(").concat(t,"px);")}function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var y={晴空:["#e0f2fe","#ede9fe"],暖阳:["#fff7ed","#ffedd5","#fed7aa"],极光:["#c7d2fe","#a7f3d0","#fbcfe8"],海洋:["#cffafe","#bae6fd","#a5b4fc"],薄荷:["#d1fae5","#a7f3d0"],樱粉:["#fce7f3","#fbcfe8","#ddd6fe"],深夜:["#1e293b","#0f172a"]},h=[{label:"系统默认",value:""},{label:"无衬线(苹方/雅黑)",value:'"PingFang SC","Microsoft YaHei","Hiragino Sans GB","Segoe UI",Roboto,system-ui,sans-serif'},{label:"思源黑体",value:'"Source Han Sans SC","Noto Sans CJK SC","PingFang SC","Microsoft YaHei",sans-serif'},{label:"衬线(宋体)",value:'"Songti SC","Noto Serif CJK SC","SimSun",Georgia,"Times New Roman",serif'},{label:"楷体",value:'"Kaiti SC","STKaiti","KaiTi","Noto Serif CJK SC",serif'},{label:"圆体",value:'"Yuanti SC","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif'},{label:"等宽(代码)",value:'"SF Mono","JetBrains Mono","Fira Code",Consolas,"Courier New",monospace'}],v={enabled:!1,background:{type:"gradient",color:"#eef2f7",gradient:{preset:"晴空",angle:135,colors:y["晴空"]},image:{url:"",fit:"cover",position:"center"},dim:0},card:{glass:!0,opacity:72,blur:12,border:!0},header:{enabled:!1,style:"frosted",color:"#ffffff",opacity:90,blur:14,text:"dark"},sider:{enabled:!1,style:"frosted",color:"#ffffff",opacity:86,blur:16,text:"dark"},font:{enabled:!1,source:"system",family:h[1].value,upload:{url:"",name:"",format:""}},scrollbar:{enabled:!1,mode:"always"}},w={enabled:!1,background:{type:"gradient",color:"#1e293b",gradient:{preset:"暖阳",angle:135,colors:y["暖阳"]},image:{url:"",fit:"cover",position:"center"},dim:15},card:{glass:!0,opacity:70,blur:18,radius:18,shadow:!0}};function E(e){return null!=e&&(void 0===e?"undefined":e&&"u">typeof Symbol&&e.constructor===Symbol?"symbol":typeof e)=="object"&&!Array.isArray(e)}function S(e,t){if(!E(e))return void 0===t?e:t;var r=Array.isArray(e)?function(e){if(Array.isArray(e))return g(e)}(e)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e){if(e){if("string"==typeof e)return g(e,void 0);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return g(e,void 0)}}(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}():function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({},e),n=!0,a=!1,o=void 0;try{for(var l,i=Object.keys(e)[Symbol.iterator]();!(n=(l=i.next()).done);n=!0){var c=l.value;E(e[c])?r[c]=S(e[c],null==t?void 0:t[c]):t&&void 0!==t[c]&&(r[c]=t[c])}}catch(e){a=!0,o=e}finally{try{n||null==i.return||i.return()}finally{if(a)throw o}}return r}function x(e){return{app:S(v,null==e?void 0:e.app),login:S(w,null==e?void 0:e.login)}}function O(e,t,r,n,a,o,l){try{var i=e[o](l),c=i.value}catch(e){r(e);return}i.done?t(c):Promise.resolve(c).then(n,a)}function k(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var C="extra-theme-style",j="EXTRA_THEME_CACHE",P=function(){var e;function t(e,r){if(!(this instanceof t))throw TypeError("Cannot call a class as a function");k(this,"request",void 0),k(this,"selectors",void 0),this.request=e,this.selectors=r}return e=[{key:"start",value:function(){var e=this;try{var t=localStorage.getItem(j);t&&this.apply(x(JSON.parse(t)))}catch(e){}this.refresh(),window.addEventListener("extra-theme:changed",function(){return e.refresh()})}},{key:"refresh",value:function(){var e;return(e=function(){var e,t,r,n,a;return function(e,t){var r,n,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(l,"next",{value:c(0)}),i(l,"throw",{value:c(1)}),i(l,"return",{value:c(2)}),"function"==typeof Symbol&&i(l,Symbol.iterator,{value:function(){return this}}),l;function c(i){return function(c){var u=[i,c];if(r)throw TypeError("Generator is already executing.");for(;l&&(l=0,u[0]&&(o=0)),o;)try{if(r=1,n&&(a=2&u[0]?n.return:u[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,u[1])).done)return a;switch(n=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,n=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],n=0}finally{r=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,this.request({url:"extraTheme:getPublic",method:"get"})];case 1:a=x(null!=(e=null!=(t=null==(n=o.sent())||null==(r=n.data)?void 0:r.data)?t:null==n?void 0:n.data)?e:{});try{localStorage.setItem(j,JSON.stringify(a))}catch(e){}return this.apply(a),[3,3];case 2:return o.sent(),[3,3];case 3:return[2]}})},function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function l(e){O(o,n,a,l,i,"next",e)}function i(e){O(o,n,a,l,i,"throw",e)}l(void 0)})}).call(this)}},{key:"apply",value:function(e){var t,r=document.body;if(r){r.classList.toggle("extra-theme-app-on",!!((l=e.app).enabled||l.header.enabled||l.sider.enabled||(null==(c=l.font)?void 0:c.enabled)||(null==(f=l.scrollbar)?void 0:f.enabled))),r.classList.toggle("extra-theme-login-on",!!(null==(t=e.login)?void 0:t.enabled));var l,c,f,g,y=document.getElementById(C);y||((y=document.createElement("style")).id=C,document.head.appendChild(y)),y.textContent=(g=this.selectors,(function(e,t){var r,l,c="body.extra-theme-app-on",f=[];if(e.enabled&&(f.push("".concat(c,"{").concat(function(e){var t=d(e),r=t.image,n=u(e.dim);if(n>0&&"none"!==e.type){var a=i("#000000",n/100);r="linear-gradient(".concat(a,",").concat(a,"),").concat(t.image)}return"background:".concat(r,"!important;")+"background-size:".concat(t.size,"!important;")+"background-repeat:".concat(t.repeat,"!important;")+"background-position:".concat(t.position,"!important;")+"background-attachment:fixed!important;"}(e.background),"}")),f.push("".concat(c," .ant-layout-sider-children{top:auto!important;bottom:0!important;}")),f.push("".concat(b(c,t.content),"{background:transparent!important;}")),f.push("".concat(b(c,t.card+" div:not([class]):not([id])"),"{background-color:transparent!important;}")),e.card.glass&&e.card.blur>0&&f.push("".concat(b(c,t.card),",").concat(c," .code-block{").concat(m(e.card.blur),"}"))),e.header.enabled){var g=s(e.header.color,e.header.opacity/100),y="frosted"===e.header.style&&e.header.blur>0?m(e.header.blur):"";f.push("".concat(c," .ant-layout-header,").concat(c," .ant-pro-layout-header{background:").concat(g,"!important;").concat(y,"}"))}var h=e.font;if(null==h?void 0:h.enabled){if("upload"===h.source&&(null==(l=h.upload)?void 0:l.url)){var v=n(h.upload.name||"").replace(/["']/g,"")||"ExtraTheme Font",w=o(h.upload.url),E=p.includes(h.upload.format)?h.upload.format:a(h.upload.url);w&&(f.push('@font-face{font-family:"'.concat(v,'";src:url("').concat(w,'")').concat(E?' format("'.concat(E,'")'):"",";font-display:swap;}")),f.push("".concat(c,'{font-family:"').concat(v,'"!important;}')))}else if("upload"!==h.source){var S=n(h.family||"");S&&f.push("".concat(c,"{font-family:").concat(S,"!important;}"))}}if(e.sider.enabled){var x=s(e.sider.color,e.sider.opacity/100),O="frosted"===e.sider.style&&e.sider.blur>0?m(e.sider.blur):"";f.push("".concat(c," .ant-layout-sider{background:transparent!important;}")+"".concat(c," .ant-layout-sider-children{background:").concat(x,"!important;border-right:none!important;").concat(O,"}")+"".concat(c," .ant-layout-sider .ant-menu{background:transparent!important;border-inline-end:none!important;}")+"".concat(c," .ant-layout-sider .ant-menu::-webkit-scrollbar{width:6px;height:6px;}")+"".concat(c," .ant-layout-sider .ant-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.18);border-radius:4px;}")+"".concat(c," .ant-layout-sider .ant-menu::-webkit-scrollbar-track{background:transparent;}"))}return(null==(r=e.scrollbar)?void 0:r.enabled)&&("hidden"===e.scrollbar.mode?f.push("".concat(c," ::-webkit-scrollbar,").concat(c,"::-webkit-scrollbar{display:none;width:0;height:0;}")+"".concat(c,",").concat(c," *{scrollbar-width:none;-ms-overflow-style:none;}")):f.push("".concat(c," ::-webkit-scrollbar,").concat(c,"::-webkit-scrollbar{width:10px;height:10px;}")+"".concat(c," ::-webkit-scrollbar-thumb,").concat(c,"::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.22);border-radius:8px;border:2px solid transparent;background-clip:content-box;}")+"".concat(c," ::-webkit-scrollbar-thumb:hover,").concat(c,"::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.4);background-clip:content-box;}")+"".concat(c," ::-webkit-scrollbar-track,").concat(c,"::-webkit-scrollbar-track{background:transparent;}"))),f.join("\n")})(e.app,g.app).trim())}}}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}(t.prototype,e),t}(),T={app:{appRoot:".ant-layout",header:".ant-layout-header",sider:".ant-layout-sider",card:".ant-card",content:'.ant-pro-layout-content,.ant-pro-layout-container,.ant-layout-content,.ant-page-header,[class*="nb-subpages-slot"],[class*="nb-subpages-slot"]>div'},login:{loginRoot:".ant-layout",loginCard:".ant-card"}},_=l(155),I=l.n(_),B=l(59);function A(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}var z={Table:{colorBgContainer:"#ffffff"},Input:{colorBgContainer:"#ffffff"},InputNumber:{colorBgContainer:"#ffffff"},Select:{colorBgContainer:"#ffffff"},TreeSelect:{colorBgContainer:"#ffffff"},Cascader:{colorBgContainer:"#ffffff"},Mentions:{colorBgContainer:"#ffffff"},DatePicker:{colorBgContainer:"#ffffff"}},F=["colorBgContainer","colorBgLayout","fontFamily"],R=l(953),D="@amo/plugin-extratheme";function U(){var e=(0,R.useTranslation)([D,"client"]).t;return function(t,r){return e(t,function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({ns:D},r))}}function M(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function N(e,t,r,n,a,o,l){try{var i=e[o](l),c=i.value}catch(e){r(e);return}i.done?t(c):Promise.resolve(c).then(n,a)}function L(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function l(e){N(o,n,a,l,i,"next",e)}function i(e){N(o,n,a,l,i,"throw",e)}l(void 0)})}}function q(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function W(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function $(e){return function(e){if(Array.isArray(e))return M(e)}(e)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||H(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){if(e){if("string"==typeof e)return M(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return M(e,t)}}function J(e,t){var r,n,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(l,"next",{value:c(0)}),i(l,"throw",{value:c(1)}),i(l,"return",{value:c(2)}),"function"==typeof Symbol&&i(l,Symbol.iterator,{value:function(){return this}}),l;function c(i){return function(c){var u=[i,c];if(r)throw TypeError("Generator is already executing.");for(;l&&(l=0,u[0]&&(o=0)),o;)try{if(r=1,n&&(a=2&u[0]?n.return:u[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,u[1])).done)return a;switch(n=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,n=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],n=0}finally{r=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function G(e){var t;return"string"==typeof e?e:(null==e||null==(t=e.toHexString)?void 0:t.call(e))||"#ffffff"}var K=function(e){var t=e.label,r=e.value,n=e.children;return I().createElement("div",{style:{marginBottom:14}},I().createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:7}},I().createElement("span",{style:{fontSize:12.5,color:"#475569"}},t),null!=r&&I().createElement("span",{style:{fontSize:12,fontWeight:600,color:"#6d5ae6",fontVariantNumeric:"tabular-nums"}},r)),n)},Y=function(e){var t=e.title,r=e.right,n=e.children,a=e.first;return I().createElement("div",{style:{marginTop:18*!a,paddingTop:16*!a,borderTop:a?"none":"1px solid rgba(0,0,0,0.05)"}},t&&I().createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12}},I().createElement("span",{style:{fontSize:12.5,fontWeight:700,color:"#0f172a"}},t),r),n)},V=function(e){var t=e.title,r=e.right,n=e.children,a=e.style;return I().createElement("div",{style:q({flex:"1 1 300px",minWidth:280,background:"#fff",borderRadius:14,border:"1px solid rgba(15,23,42,0.08)",boxShadow:"0 1px 3px rgba(15,23,42,0.04)",padding:"16px 20px 20px",alignSelf:"stretch"},a)},I().createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:16,paddingBottom:13,borderBottom:"1px solid rgba(15,23,42,0.07)"}},I().createElement("b",{style:{fontSize:14,letterSpacing:.2,color:"#0f172a"}},t),r),n)},X=function(e){return e?{}:{opacity:.4,pointerEvents:"none",filter:"grayscale(0.4)"}},Q=function(e){var t=e.bg,r=e.onChange,n=e.uploadImage,a=e.first,o=U(),l=function(e){return r(q({},t,e))},i=Object.keys(y),c=!i.includes(t.gradient.preset);return I().createElement(Y,{title:o("背景"),first:a},I().createElement(K,{label:o("类型")},I().createElement(B.Segmented,{block:!0,size:"small",value:t.type,onChange:function(e){return l({type:e})},options:[{label:o("纯色"),value:"color"},{label:o("渐变"),value:"gradient"},{label:o("图片"),value:"image"}]})),"color"===t.type&&I().createElement(K,{label:o("背景颜色")},I().createElement(B.ColorPicker,{value:t.color,onChangeComplete:function(e){return l({color:G(e)})},showText:!0,disabledAlpha:!0})),"gradient"===t.type&&I().createElement(I().Fragment,null,I().createElement(K,{label:o("渐变预设")},I().createElement(B.Select,{style:{width:"100%"},value:c?"__custom__":t.gradient.preset,onChange:function(e){"__custom__"===e?l({gradient:W(q({},t.gradient),{preset:"自定义"})}):l({gradient:W(q({},t.gradient),{preset:e,colors:y[e]})})},options:$(i.map(function(e){return{label:e,value:e}})).concat([{label:o("自定义"),value:"__custom__"}])})),I().createElement(K,{label:o("角度"),value:"".concat(t.gradient.angle,"\xb0")},I().createElement(B.Slider,{min:0,max:360,value:t.gradient.angle,onChange:function(e){return l({gradient:W(q({},t.gradient),{angle:e})})}})),c&&I().createElement(K,{label:o("自定义色标")},I().createElement("div",{style:{display:"flex",gap:8}},I().createElement(B.ColorPicker,{disabledAlpha:!0,value:t.gradient.colors[0]||"#ffffff",onChangeComplete:function(e){return l({gradient:W(q({},t.gradient),{colors:[G(e),t.gradient.colors[1]||"#ffffff"]})})}}),I().createElement(B.ColorPicker,{disabledAlpha:!0,value:t.gradient.colors[1]||"#ffffff",onChangeComplete:function(e){return l({gradient:W(q({},t.gradient),{colors:[t.gradient.colors[0]||"#ffffff",G(e)]})})}})))),"image"===t.type&&I().createElement(I().Fragment,null,I().createElement(K,{label:o("图片 URL")},I().createElement(B.Input,{value:t.image.url,placeholder:"https://…",onChange:function(e){return l({image:W(q({},t.image),{url:e.target.value})})},addonAfter:n?I().createElement(B.Upload,{showUploadList:!1,beforeUpload:function(e){return L(function(){var r;return J(this,function(a){switch(a.label){case 0:return[4,n(e)];case 1:return(r=a.sent())&&l({image:W(q({},t.image),{url:r})}),[2,!1]}})})()}},I().createElement("span",{style:{cursor:"pointer"}},o("上传"))):null})),I().createElement(K,{label:o("铺法")},I().createElement(B.Segmented,{block:!0,size:"small",value:t.image.fit,onChange:function(e){return l({image:W(q({},t.image),{fit:e})})},options:[{label:o("铺满"),value:"cover"},{label:o("适应"),value:"contain"},{label:o("拉伸"),value:"stretch"},{label:o("平铺"),value:"repeat"}]}))),I().createElement(K,{label:o("暗化遮罩"),value:"".concat(t.dim,"%")},I().createElement(B.Slider,{min:0,max:80,value:t.dim,onChange:function(e){return l({dim:e})}})))},Z=function(e){var t=e.card,r=e.onChange,n=U(),a=function(e){return r(q({},t,e))};return I().createElement(Y,{title:n("内容区卡片"),right:I().createElement(B.Switch,{size:"small",checked:t.glass,onChange:function(e){return a({glass:e})}})},I().createElement("div",{style:X(t.glass)},I().createElement(K,{label:n("卡片不透明度"),value:"".concat(t.opacity,"%")},I().createElement(B.Slider,{min:10,max:100,value:t.opacity,onChange:function(e){return a({opacity:e})}})),I().createElement(K,{label:n("背景模糊"),value:"".concat(t.blur,"px")},I().createElement(B.Slider,{min:0,max:40,value:t.blur,onChange:function(e){return a({blur:e})}})),I().createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"}},I().createElement("span",{style:{fontSize:12.5,color:"#475569"}},n("浅色描边")),I().createElement(B.Switch,{size:"small",checked:t.border,onChange:function(e){return a({border:e})}}))))},ee=function(e){var t=e.scrollbar,r=e.onChange,n=U(),a=function(e){return r(q({},t,e))};return I().createElement(Y,{title:n("滚动条"),right:I().createElement(B.Switch,{size:"small",checked:t.enabled,onChange:function(e){return a({enabled:e})}})},I().createElement("div",{style:X(t.enabled)},I().createElement(K,{label:n("显示方式")},I().createElement(B.Segmented,{block:!0,size:"small",value:t.mode,onChange:function(e){return a({mode:e})},options:[{label:n("始终显示"),value:"always"},{label:n("始终隐藏"),value:"hidden"}]})),I().createElement("div",{style:{fontSize:11,color:"#94a3b8",marginTop:2,lineHeight:1.6}},n("“始终显示”为常驻细滚动条;“始终隐藏”完全隐藏滚动条(内容仍可滚动)。"))))},et=function(e){var t=e.nav,r=e.onChange,n=U(),a=function(e){return r(q({},t,e))};return I().createElement(Y,{first:!0},I().createElement(K,{label:n("背景颜色")},I().createElement(B.ColorPicker,{value:t.color,onChangeComplete:function(e){return a({color:G(e)})},showText:!0,disabledAlpha:!0})),I().createElement(K,{label:n("风格")},I().createElement(B.Segmented,{block:!0,size:"small",value:t.style,onChange:function(e){return a({style:e})},options:[{label:n("实色"),value:"solid"},{label:n("毛玻璃"),value:"frosted"}]})),I().createElement(K,{label:n("不透明度"),value:"".concat(t.opacity,"%")},I().createElement(B.Slider,{min:0,max:100,value:t.opacity,onChange:function(e){return a({opacity:e})}})),I().createElement(K,{label:n("背景模糊"),value:"".concat(t.blur,"px")},I().createElement(B.Slider,{min:0,max:40,value:t.blur,disabled:"frosted"!==t.style,onChange:function(e){return a({blur:e})}})))},er=function(e){var t,r=e.font,n=e.onChange,a=e.uploadFont,o=U(),l=function(e){return n(q({},r,e))},i=h.some(function(e){return e.value===r.family}),c=function(e){if(Array.isArray(e))return e}(t=I().useState(!i))||function(e){var t,r,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a=[],o=!0,l=!1;try{for(n=n.call(e);!(o=(t=n.next()).done)&&(a.push(t.value),2!==a.length);o=!0);}catch(e){l=!0,r=e}finally{try{o||null==n.return||n.return()}finally{if(l)throw r}}return a}}(t)||H(t,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),u=c[0],s=c[1],f=I().useRef(r.family);I().useEffect(function(){r.family!==f.current&&(f.current=r.family,s(!h.some(function(e){return e.value===r.family})))},[r.family]);var d=function(e){f.current=e,l({family:e})},p=u||!i,b=r.upload;I().useEffect(function(){var e=window.FontFace;if("upload"===r.source&&(null==b?void 0:b.url)&&(null==b?void 0:b.name)&&e&&document.fonts)try{new e(b.name,'url("'.concat(b.url,'")')).load().then(function(e){return document.fonts.add(e)}).catch(function(){})}catch(e){}},[r.source,null==b?void 0:b.url,null==b?void 0:b.name]);var m=function(e){return L(function(){var t;return J(this,function(o){switch(o.label){case 0:if(!a)return[3,2];return[4,a(e)];case 1:(t=o.sent()).url&&n(W(q({},r),{upload:t})),o.label=2;case 2:return[2,!1]}})})()},g="upload"===r.source&&(null==b?void 0:b.url)?'"'.concat(b.name,'"'):r.family||void 0;return I().createElement(Y,{first:!0},I().createElement(K,{label:o("字体来源")},I().createElement(B.Segmented,{block:!0,size:"small",value:r.source,onChange:function(e){return l({source:e})},options:[{label:o("系统字体"),value:"system"},{label:o("上传字体"),value:"upload"}]})),"system"===r.source?I().createElement(I().Fragment,null,I().createElement(K,{label:o("字体")},I().createElement(B.Select,{style:{width:"100%"},value:p?"__custom__":r.family,onChange:function(e){"__custom__"===e?s(!0):(s(!1),d(e))},options:$(h.map(function(e){return{label:e.label,value:e.value}})).concat([{label:o("自定义"),value:"__custom__"}])})),p&&I().createElement(K,{label:o("自定义字体")},I().createElement(B.Input,{value:r.family,placeholder:'"Font Name", sans-serif',onChange:function(e){return d(e.target.value)}}))):(null==b?void 0:b.url)?I().createElement(I().Fragment,null,I().createElement(K,{label:o("字体名称")},I().createElement(B.Input,{value:b.name,placeholder:"Custom Font",onChange:function(e){var t;return t={name:e.target.value},n(W(q({},r),{upload:q({},r.upload,t)}))}})),I().createElement("div",{style:{display:"flex",gap:12,alignItems:"center",marginBottom:14}},I().createElement("span",{style:{fontSize:12,color:"#16a34a"}},o("已上传"),b.format?" \xb7 ".concat(b.format):""),I().createElement(B.Upload,{showUploadList:!1,accept:".ttf,.otf,.woff,.woff2",beforeUpload:m},I().createElement(B.Button,{type:"link",size:"small",style:{padding:0}},o("重新上传"))),I().createElement(B.Button,{type:"link",size:"small",danger:!0,style:{padding:0},onClick:function(){return n(W(q({},r),{upload:{url:"",name:"",format:""}}))}},o("移除")))):I().createElement(K,{label:o("上传字体文件")},I().createElement(B.Upload,{showUploadList:!1,accept:".ttf,.otf,.woff,.woff2",beforeUpload:m},I().createElement(B.Button,{size:"small"},o("选择字体文件")))),I().createElement("div",{style:{marginTop:12,padding:"14px 16px",borderRadius:10,background:"#f8fafc",border:"1px solid rgba(15,23,42,0.06)",fontFamily:g}},I().createElement("div",{style:{fontSize:19,fontWeight:700,color:"#0f172a",lineHeight:1.4}},o("字体预览")," Aa 永和"),I().createElement("div",{style:{fontSize:13,color:"#475569",marginTop:5}},"中文示例文本 \xb7 The quick brown fox \xb7 0123456789")),I().createElement("div",{style:{fontSize:11,color:"#94a3b8",marginTop:8,lineHeight:1.6}},o("upload"===r.source?"提示:上传字体对所有访问者生效,无需本机安装;中文字体文件较大,建议使用 woff2 或先做子集化以加快加载。":"提示:字体需系统已安装才生效;“无衬线/系统默认”通常与本机默认字体一致,选“楷体/宋体”等可看到明显变化。")))},en=function(e){var t=e.app,r=e.onChange,n=e.uploadImage,a=e.uploadFont,o=U(),l={flex:"0 0 auto"};return I().createElement("div",{style:{display:"flex",gap:20,flexWrap:"wrap",alignItems:"stretch"}},I().createElement(V,{title:o("工作区外观"),right:I().createElement(B.Switch,{checked:t.enabled,onChange:function(e){return r(W(q({},t),{enabled:e}))}})},I().createElement("div",{style:X(t.enabled)},I().createElement(Q,{first:!0,bg:t.background,onChange:function(e){return r(W(q({},t),{background:e}))},uploadImage:n}),I().createElement(Z,{card:t.card,onChange:function(e){return r(W(q({},t),{card:e}))}})),I().createElement(ee,{scrollbar:t.scrollbar,onChange:function(e){return r(W(q({},t),{scrollbar:e}))}})),I().createElement("div",{style:{flex:"1 1 300px",minWidth:280,display:"flex",flexDirection:"column",gap:20}},I().createElement(V,{style:l,title:o("顶部导航栏"),right:I().createElement(B.Switch,{checked:t.header.enabled,onChange:function(e){return r(W(q({},t),{header:W(q({},t.header),{enabled:e})}))}})},I().createElement("div",{style:X(t.header.enabled)},I().createElement(et,{nav:t.header,onChange:function(e){return r(W(q({},t),{header:e}))}}))),I().createElement(V,{style:l,title:o("侧边导航栏"),right:I().createElement(B.Switch,{checked:t.sider.enabled,onChange:function(e){return r(W(q({},t),{sider:W(q({},t.sider),{enabled:e})}))}})},I().createElement("div",{style:X(t.sider.enabled)},I().createElement(et,{nav:t.sider,onChange:function(e){return r(W(q({},t),{sider:e}))}})))),I().createElement(V,{title:o("全局字体"),right:I().createElement(B.Switch,{checked:t.font.enabled,onChange:function(e){return r(W(q({},t),{font:W(q({},t.font),{enabled:e})}))}})},I().createElement("div",{style:X(t.font.enabled)},I().createElement(er,{font:t.font,onChange:function(e){return r(W(q({},t),{font:e}))},uploadFont:a}))))};function ea(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function eo(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function el(e){var t=d(e),r=t.image;if(e.dim>0&&"none"!==e.type){var n=i("#000000",e.dim/100);r="linear-gradient(".concat(n,",").concat(n,"),").concat(t.image)}return{background:r,backgroundSize:t.size,backgroundRepeat:t.repeat,backgroundPosition:t.position}}function ei(e){var t="frosted"===e.style&&e.blur>0?"blur(".concat(e.blur,"px)"):void 0;return{background:s(e.color,e.opacity/100),backdropFilter:t,WebkitBackdropFilter:t,color:"light"===e.text?"#f8fafc":"#1f2733"}}var ec={position:"relative",height:300,borderRadius:12,overflow:"hidden",border:"1px solid rgba(0,0,0,0.08)",boxShadow:"0 8px 30px rgba(0,0,0,0.12)"},eu=function(e){var t=e.scope,r=e.app,n=e.login,a=U();if("app"===t){var o,l=r.enabled&&r.card.glass?{flex:1,borderRadius:10,padding:12,background:i("#ffffff",r.card.opacity/100),backdropFilter:r.card.blur>0?"blur(".concat(r.card.blur,"px)"):void 0,WebkitBackdropFilter:r.card.blur>0?"blur(".concat(r.card.blur,"px)"):void 0,border:r.card.border?"1px solid rgba(255,255,255,0.5)":"1px solid transparent",color:"#1f2733",fontSize:12}:{flex:1,borderRadius:10,padding:12,background:"#fff",border:"1px solid rgba(0,0,0,0.06)",color:"#1f2733",fontSize:12},c={background:"#fff",border:"1px solid rgba(0,0,0,0.12)",borderRadius:6},u=(null==(o=r.font)?void 0:o.enabled)&&r.font.family?r.font.family:void 0;return I().createElement("div",{style:ea(eo(ea({},ec),{fontFamily:u}),r.enabled?el(r.background):{background:"#f0f2f5"})},I().createElement("div",{style:ea({height:40,display:"flex",alignItems:"center",padding:"0 14px",fontWeight:700,fontSize:13},r.header.enabled?ei(r.header):{background:"#fff",color:"#1f2733"})},"NocoBase",I().createElement("span",{style:{marginLeft:"auto",display:"flex",gap:14,fontWeight:500,opacity:.85}},I().createElement("span",null,a("概览")),I().createElement("span",null,a("数据")),I().createElement("span",null,a("设置")))),I().createElement("div",{style:{display:"flex",height:"calc(100% - 40px)"}},I().createElement("div",{style:ea({width:92,padding:10,display:"flex",flexDirection:"column",gap:8,fontSize:12},r.sider.enabled?ei(r.sider):{background:"#fff",color:"#1f2733"})},I().createElement("div",{style:{fontWeight:700}},a("菜单")),I().createElement("div",{style:{opacity:.8}},a("概览")),I().createElement("div",{style:{opacity:.8}},a("订单")),I().createElement("div",{style:{opacity:.8}},a("报表"))),I().createElement("div",{style:{flex:1,padding:12,display:"flex",flexDirection:"column",gap:10}},I().createElement("div",{style:eo(ea({},l),{display:"flex",flexDirection:"column",gap:6})},I().createElement("span",null,a("内容卡片")," A"),I().createElement("div",{style:eo(ea({},c),{height:22})}),I().createElement("div",{style:eo(ea({},c),{overflow:"hidden"})},I().createElement("div",{style:{height:16,borderBottom:"1px solid rgba(0,0,0,0.07)"}}),I().createElement("div",{style:{height:16}}))),I().createElement("div",{style:{display:"flex",gap:10,flex:1}},I().createElement("div",{style:l},"B"),I().createElement("div",{style:l},"C")))))}var s=n.card,f={width:220,padding:"22px 20px",borderRadius:s.radius,background:i("#ffffff",s.opacity/100),backdropFilter:s.glass&&s.blur>0?"blur(".concat(s.blur,"px)"):void 0,WebkitBackdropFilter:s.glass&&s.blur>0?"blur(".concat(s.blur,"px)"):void 0,boxShadow:s.shadow?"0 24px 70px rgba(15,23,42,0.28)":"none",color:"#1f2733",textAlign:"center"},d={height:30,borderRadius:8,background:"rgba(255,255,255,0.6)",border:"1px solid rgba(0,0,0,0.1)",margin:"8px 0"};return I().createElement("div",{style:ea(eo(ea({},ec),{display:"flex",alignItems:"center",justifyContent:"center"}),n.enabled?el(n.background):{background:"#f0f2f5"})},I().createElement("div",{style:f},I().createElement("div",{style:{fontWeight:800,fontSize:16,marginBottom:4}},"NocoBase"),I().createElement("div",{style:{fontSize:11,opacity:.7,marginBottom:10}},a("欢迎登录")),I().createElement("div",{style:d}),I().createElement("div",{style:d}),I().createElement("div",{style:{height:32,borderRadius:8,background:"#6d5ae6",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontSize:12,marginTop:6}},a("登录"))))};function es(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function ef(e,t,r,n,a,o,l){try{var i=e[o](l),c=i.value}catch(e){r(e);return}i.done?t(c):Promise.resolve(c).then(n,a)}function ed(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function l(e){ef(o,n,a,l,i,"next",e)}function i(e){ef(o,n,a,l,i,"throw",e)}l(void 0)})}}function ep(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function eb(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function em(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var o=[],l=!0,i=!1;try{for(a=a.call(e);!(l=(r=a.next()).done)&&(o.push(r.value),!t||o.length!==t);l=!0);}catch(e){i=!0,n=e}finally{try{l||null==a.return||a.return()}finally{if(i)throw n}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return es(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return es(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eg(e,t){var r,n,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(l,"next",{value:c(0)}),i(l,"throw",{value:c(1)}),i(l,"return",{value:c(2)}),"function"==typeof Symbol&&i(l,Symbol.iterator,{value:function(){return this}}),l;function c(i){return function(c){var u=[i,c];if(r)throw TypeError("Generator is already executing.");for(;l&&(l=0,u[0]&&(o=0)),o;)try{if(r=1,n&&(a=2&u[0]?n.return:u[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,u[1])).done)return a;switch(n=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,n=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],n=0}finally{r=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var ey="amo-extratheme",eh=function(){var t=U(),r=(0,e.useAPIClient)(),o=(0,e.useGlobalTheme)(),l=o.setTheme,c=o.theme,u=em((0,_.useState)(function(){return x({})}),2),s=u[0],f=u[1],d=em((0,_.useState)(!0),2),p=d[0],b=d[1],m=em((0,_.useState)(!1),2),g=m[0],y=m[1];return((0,_.useEffect)(function(){var e=!0;return ed(function(){var t,n,a,o;return eg(this,function(l){switch(l.label){case 0:return l.trys.push([0,2,3,4]),[4,r.request({url:"extraTheme:getPublic",method:"get"})];case 1:return o=null!=(t=null==(a=l.sent())||null==(n=a.data)?void 0:n.data)?t:{},e&&f(x(o)),[3,4];case 2:return l.sent(),[3,4];case 3:return e&&b(!1),[7];case 4:return[2]}})})(),function(){e=!1}},[r]),p)?I().createElement("div",{style:{padding:60,textAlign:"center"}},I().createElement(B.Spin,null)):I().createElement("div",{style:{padding:4,width:"100%"}},I().createElement(en,{app:s.app,onChange:function(e){return f(eb(ep({},s),{app:e}))},uploadImage:function(e){return ed(function(){var n,a,o,l,i;return eg(this,function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),(o=new FormData).append("file",e),[4,r.request({url:"attachments:create",method:"post",data:o})];case 1:if(!(i=(null==(l=c.sent())||null==(a=l.data)||null==(n=a.data)?void 0:n.url)||""))throw Error("no url");return B.message.success(t("上传成功")),[2,i.startsWith("http")?i:window.location.origin+i];case 2:return c.sent(),B.message.error(t("上传失败")),[2,""];case 3:return[2]}})})()},uploadFont:function(e){return ed(function(){var n,o,l,i,c,u,s,f;return eg(this,function(d){switch(d.label){case 0:n={url:"",name:"",format:""},d.label=1;case 1:return d.trys.push([1,3,,4]),(i=new FormData).append("file",e),[4,r.request({url:"attachments:create",method:"post",data:i})];case 2:if(!(u=(null==(c=d.sent())||null==(l=c.data)||null==(o=l.data)?void 0:o.url)||""))throw Error("no url");return u.startsWith("http")||(u=window.location.origin+u),s=(e.name||"Custom Font").replace(/\.[^.]+$/,"")||"Custom Font",f=a(e.name||u),B.message.success(t("上传成功")),[2,{url:u,name:s,format:f}];case 3:return d.sent(),B.message.error(t("上传失败")),[2,n];case 4:return[2]}})})()}}),I().createElement(B.Space,{style:{marginTop:20}},I().createElement(B.Button,{type:"primary",loading:g,onClick:function(){return ed(function(){return eg(this,function(a){switch(a.label){case 0:y(!0),a.label=1;case 1:return a.trys.push([1,4,5,6]),[4,r.request({url:"extraTheme:set",method:"post",data:{scope:"app",config:s.app}})];case 2:var o;return a.sent(),[4,(o=s.app,ed(function(){var t,a,u,s,f,d,p,b,m,g,y;return eg(this,function(h){switch(h.label){case 0:a=t=function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};arguments.length>2&&void 0!==arguments[2]&&arguments[2];var a=A({},r),o=!0,l=!1,c=void 0;try{for(var u,s=F[Symbol.iterator]();!(o=(u=s.next()).done);o=!0){var f=u.value;delete a[f]}}catch(e){l=!0,c=e}finally{try{o||null==s.return||s.return()}finally{if(l)throw c}}a.colorBgElevated="#ffffff",e.enabled&&(a.colorBgLayout="transparent",e.card.glass&&(a.colorBgContainer=i("#ffffff",e.card.opacity/100)));var d=e.font;if(null==d?void 0:d.enabled){if("upload"===d.source&&(null==(t=d.upload)?void 0:t.url)){var p=n(d.upload.name||"").replace(/["']/g,"");p&&(a.fontFamily='"'.concat(p,'"'))}else if("upload"!==d.source){var b=n(d.family||"");b&&(a.fontFamily=b)}}return{name:"Modern",token:a,components:A({},z),cssVar:!0}}(o,(null==c?void 0:c.token)||(null===e.defaultTheme||void 0===e.defaultTheme?void 0:e.defaultTheme.token)||{},(null===e.defaultTheme||void 0===e.defaultTheme?void 0:e.defaultTheme.token)||{}),h.label=1;case 1:return h.trys.push([1,9,,10]),[4,r.resource("themeConfig").list({filter:{uid:ey},pageSize:1})];case 2:if(b=null==(p=null==(d=h.sent())||null==(s=d.data)||null==(u=s.data)?void 0:u[0])?void 0:p.id,(null==p||null==(f=p.config)?void 0:f.name)&&(a=eb(ep({},t),{name:p.config.name})),!p)return[3,4];return[4,r.resource("themeConfig").update({filterByTk:b,values:{config:a,default:!0,optional:!0}})];case 3:return h.sent(),[3,6];case 4:return[4,r.resource("themeConfig").create({values:{config:a,optional:!0,isBuiltIn:!1,uid:ey,default:!0}})];case 5:b=null==(y=h.sent())||null==(g=y.data)||null==(m=g.data)?void 0:m.id,h.label=6;case 6:if(null==b)return[3,8];return[4,r.resource("users").updateTheme({values:{themeId:b}})];case 7:h.sent(),h.label=8;case 8:return[3,10];case 9:return h.sent(),[3,10];case 10:try{null==l||l(a)}catch(e){}return[2]}})})())];case 3:return a.sent(),window.dispatchEvent(new Event("extra-theme:changed")),B.message.success(t("已保存并应用")),[3,6];case 4:return a.sent(),B.message.error(t("保存失败")),[3,6];case 5:return y(!1),[7];case 6:return[2]}})})()}},t("保存并应用")),I().createElement(B.Button,{onClick:function(){return f(eb(ep({},s),{app:JSON.parse(JSON.stringify(v))}))}},t("重置本组"))),I().createElement("div",{style:{marginTop:24}},I().createElement("div",{style:{fontSize:12,color:"#94a3b8",marginBottom:8}},t("实时预览")),I().createElement(eu,{scope:"app",app:s.app,login:s.login}),I().createElement("div",{style:{fontSize:11,color:"#94a3b8",marginTop:10,lineHeight:1.6}},t("提示:默认关闭,开启总开关并保存后才生效;关闭插件或关闭开关立即恢复原生外观。"))))};function ev(e,t,r,n,a,o,l){try{var i=e[o](l),c=i.value}catch(e){r(e);return}i.done?t(c):Promise.resolve(c).then(n,a)}function ew(e,t,r){return(ew=eO()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var a=new(Function.bind.apply(e,n));return r&&eS(a,r.prototype),a}).apply(null,arguments)}function eE(e){return(eE=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function eS(e,t){return(eS=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function ex(e){var t="function"==typeof Map?new Map:void 0;return(ex=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return ew(e,arguments,eE(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),eS(r,e)})(e)}function eO(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(eO=function(){return!!e})()}var ek="@amo/plugin-extratheme",eC=function(e){var n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function a(){var e,t;if(!(this instanceof a))throw TypeError("Cannot call a class as a function");return e=a,t=arguments,e=eE(e),function(e,t){var r;if(t&&("object"==((r=t)&&"u">typeof Symbol&&r.constructor===Symbol?"symbol":typeof r)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,eO()?Reflect.construct(e,t||[],eE(this).constructor):e.apply(this,t))}return a.prototype=Object.create(e&&e.prototype,{constructor:{value:a,writable:!0,configurable:!0}}),e&&eS(a,e),n=[{key:"load",value:function(){var e;return(e=function(){var e;return function(e,t){var r,n,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},l=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(l,"next",{value:c(0)}),i(l,"throw",{value:c(1)}),i(l,"return",{value:c(2)}),"function"==typeof Symbol&&i(l,Symbol.iterator,{value:function(){return this}}),l;function c(i){return function(c){var u=[i,c];if(r)throw TypeError("Generator is already executing.");for(;l&&(l=0,u[0]&&(o=0)),o;)try{if(r=1,n&&(a=2&u[0]?n.return:u[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,u[1])).done)return a;switch(n=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,n=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],n=0}finally{r=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(n){return e=this,this.app.i18n.addResources("zh-CN",ek,t),this.app.i18n.addResources("en-US",ek,r),new P(function(t){return e.app.apiClient.request(t)},T).start(),this.app.addComponents({ExtraThemeSettings:eh}),this.app.pluginSettingsManager.add("extra-theme",{title:this.app.i18n.t("主题增强",{ns:ek}),icon:"BgColorsOutlined",Component:"ExtraThemeSettings",aclSnippet:"pm.extra-theme",sort:500}),[2]})},function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function l(e){ev(o,n,a,l,i,"next",e)}function i(e){ev(o,n,a,l,i,"throw",e)}l(void 0)})}).call(this)}}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}(a.prototype,n),a}(ex(e.Plugin))}(),f}()});
@@ -0,0 +1,5 @@
1
+ import { Plugin } from '@nocobase/client';
2
+ export declare class PluginExtraThemeClient extends Plugin {
3
+ load(): Promise<void>;
4
+ }
5
+ export default PluginExtraThemeClient;
@@ -0,0 +1 @@
1
+ export { DEFAULT_SELECTORS as LEGACY_SELECTORS } from '../shared/selectors';
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { AppConfig, LoginConfig } from '../../shared/types';
3
+ export declare const LivePreview: React.FC<{
4
+ scope: 'app' | 'login';
5
+ app: AppConfig;
6
+ login: LoginConfig;
7
+ }>;
8
+ export default LivePreview;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const SettingsPage: React.FC;
3
+ export default SettingsPage;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import type { AppConfig, LoginConfig } from '../../shared/types';
3
+ export declare const AppForm: React.FC<{
4
+ app: AppConfig;
5
+ onChange: (a: AppConfig) => void;
6
+ uploadImage?: (f: File) => Promise<string>;
7
+ uploadFont?: (f: File) => Promise<{
8
+ url: string;
9
+ name: string;
10
+ format: string;
11
+ }>;
12
+ }>;
13
+ export declare const LoginForm: React.FC<{
14
+ login: LoginConfig;
15
+ onChange: (l: LoginConfig) => void;
16
+ uploadImage?: (f: File) => Promise<string>;
17
+ }>;
@@ -0,0 +1,2 @@
1
+ export declare function useT(): (key: string, options?: Record<string, any>) => string;
2
+ export default useT;
@@ -0,0 +1 @@
1
+ export { default } from './plugin';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("@nocobase/client-v2")):"function"==typeof define&&define.amd?define("@emotionalamo/plugin-extratheme/client-v2",["@nocobase/client-v2"],e):"object"==typeof exports?exports["@emotionalamo/plugin-extratheme/client-v2"]=e(require("@nocobase/client-v2")):t["@emotionalamo/plugin-extratheme/client-v2"]=e(t["@nocobase/client-v2"])}(self,function(t){return function(){"use strict";var e={485:function(e){e.exports=t}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.r=function(t){"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.g.importScripts&&(o=n.g.location+"");var o,a=n.g.document;if(!o&&a&&(a.currentScript&&"SCRIPT"===a.currentScript.tagName.toUpperCase()&&(o=a.currentScript.src),!o)){var c=a.getElementsByTagName("script");if(c.length)for(var i=c.length-1;i>-1&&(!o||!/^http(s?):/.test(o));)o=c[i--].src}if(!o)throw Error("Automatic publicPath is not supported in this browser");n.p=o.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/");var l={};return!function(){var t="",e="u">typeof document?document.currentScript:null;if(e&&e.src){var r=e.src.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"");r.indexOf("/static/plugins/@emotionalamo/plugin-extratheme/dist/client-v2/")>=0&&(t=r.replace(/\/[^\/]+$/,"/"))}if(!t){var o=window.__webpack_public_path__||"";o&&("/"!==o.charAt(o.length-1)&&(o+="/"),t=o+"static/plugins/@emotionalamo/plugin-extratheme/dist/client-v2/")}if(!t){var a=window.__nocobase_modern_client_prefix__||"v",c="/"+(a=String(a).replace(/^\/+|\/+$/g,"")||"v")+"/";if(!(t=window.__nocobase_public_path__||"")&&window.location&&window.location.pathname){var i=window.location.pathname||"/",l=i.indexOf(c);t=l>=0?i.slice(0,l+1):"/"}t&&(t=t.replace(RegExp("/"+a+"/?$"),"/")),t||(t="/"),"/"!==t.charAt(t.length-1)&&(t+="/"),t+="static/plugins/@emotionalamo/plugin-extratheme/dist/client-v2/"}n.p=t}(),!function(){n.r(l),n.d(l,{default:function(){return $}});var t=n(485);function e(t){var e=(t||"").replace(/[;{}<>\\/*]/g,"").replace(/[\r\n\t]+/g," ").trim();return(e.match(/"/g)||[]).length%2&&(e=e.replace(/"/g,"")),(e.match(/'/g)||[]).length%2&&(e=e.replace(/'/g,"")),e.slice(0,200)}function r(t){return(t||"").replace(/["')(;{}<>\\]/g,"").replace(/\s+/g,"").slice(0,2e3)}function o(t){var e=(t||"").trim();return/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(e)||/^(rgb|rgba|hsl|hsla)\(\s*[\d.,%\s/]+\)$/i.test(e)||/^[a-z]+$/i.test(e)?e:"transparent"}function a(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=Number(t);return Number.isFinite(r)?r:e}function c(t,e){var r=function(t){var e=(t||"").trim(),r=e.match(/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/i);if(r)return[Math.round(+r[1]),Math.round(+r[2]),Math.round(+r[3])];var n=e.replace("#","");return(3===n.length&&(n=n.split("").map(function(t){return t+t}).join("")),/^[0-9a-f]{6}$/i.test(n))?[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]:null}(t);return r?"rgba(".concat(r[0],",").concat(r[1],",").concat(r[2],",").concat(a(e),")"):"transparent"}var i=["woff2","woff","truetype","opentype"];function u(t,e){return e.split(",").map(function(e){return"".concat(t," ").concat(e.trim())}).join(",")}function s(t){var e=a(t);return"backdrop-filter:blur(".concat(e,"px);-webkit-backdrop-filter:blur(").concat(e,"px);")}function p(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var f={enabled:!1,background:{type:"gradient",color:"#eef2f7",gradient:{preset:"晴空",angle:135,colors:["#e0f2fe","#ede9fe"]},image:{url:"",fit:"cover",position:"center"},dim:0},card:{glass:!0,opacity:72,blur:12,border:!0},header:{enabled:!1,style:"frosted",color:"#ffffff",opacity:90,blur:14,text:"dark"},sider:{enabled:!1,style:"frosted",color:"#ffffff",opacity:86,blur:16,text:"dark"},font:{enabled:!1,source:"system",family:'"PingFang SC","Microsoft YaHei","Hiragino Sans GB","Segoe UI",Roboto,system-ui,sans-serif',upload:{url:"",name:"",format:""}},scrollbar:{enabled:!1,mode:"always"}},d={enabled:!1,background:{type:"gradient",color:"#1e293b",gradient:{preset:"暖阳",angle:135,colors:["#fff7ed","#ffedd5","#fed7aa"]},image:{url:"",fit:"cover",position:"center"},dim:15},card:{glass:!0,opacity:70,blur:18,radius:18,shadow:!0}};function b(t){return null!=t&&(void 0===t?"undefined":t&&"u">typeof Symbol&&t.constructor===Symbol?"symbol":typeof t)=="object"&&!Array.isArray(t)}function y(t,e){if(!b(t))return void 0===e?t:e;var r=Array.isArray(t)?function(t){if(Array.isArray(t))return p(t)}(t)||function(t){if("u">typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t){if(t){if("string"==typeof t)return p(t,void 0);var e=Object.prototype.toString.call(t).slice(8,-1);if("Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e)return Array.from(e);if("Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return p(t,void 0)}}(t)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}():function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),n.forEach(function(e){var n;n=r[e],e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n})}return t}({},t),n=!0,o=!1,a=void 0;try{for(var c,i=Object.keys(t)[Symbol.iterator]();!(n=(c=i.next()).done);n=!0){var l=c.value;b(t[l])?r[l]=y(t[l],null==e?void 0:e[l]):e&&void 0!==e[l]&&(r[l]=e[l])}}catch(t){o=!0,a=t}finally{try{n||null==i.return||i.return()}finally{if(o)throw a}}return r}function h(t){return{app:y(f,null==t?void 0:t.app),login:y(d,null==t?void 0:t.login)}}function m(t,e,r,n,o,a,c){try{var i=t[a](c),l=i.value}catch(t){r(t);return}i.done?e(l):Promise.resolve(l).then(n,o)}function v(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var g="extra-theme-style",w="EXTRA_THEME_CACHE",k=function(){var t;function n(t,e){if(!(this instanceof n))throw TypeError("Cannot call a class as a function");v(this,"request",void 0),v(this,"selectors",void 0),this.request=t,this.selectors=e}return t=[{key:"start",value:function(){var t=this;try{var e=localStorage.getItem(w);e&&this.apply(h(JSON.parse(e)))}catch(t){}this.refresh(),window.addEventListener("extra-theme:changed",function(){return t.refresh()})}},{key:"refresh",value:function(){var t;return(t=function(){var t,e,r,n,o;return function(t,e){var r,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(c,"next",{value:l(0)}),i(c,"throw",{value:l(1)}),i(c,"return",{value:l(2)}),"function"==typeof Symbol&&i(c,Symbol.iterator,{value:function(){return this}}),c;function l(i){return function(l){var u=[i,l];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,u[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&u[0]?n.return:u[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,u[1])).done)return o;switch(n=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return a.label++,{value:u[1],done:!1};case 5:a.label++,n=u[1],u=[0];continue;case 7:u=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){a=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){a.label=u[1];break}if(6===u[0]&&a.label<o[1]){a.label=o[1],o=u;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(u);break}o[2]&&a.ops.pop(),a.trys.pop();continue}u=e.call(t,a)}catch(t){u=[6,t],n=0}finally{r=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,this.request({url:"extraTheme:getPublic",method:"get"})];case 1:o=h(null!=(t=null!=(e=null==(n=a.sent())||null==(r=n.data)?void 0:r.data)?e:null==n?void 0:n.data)?t:{});try{localStorage.setItem(w,JSON.stringify(o))}catch(t){}return this.apply(o),[3,3];case 2:return a.sent(),[3,3];case 3:return[2]}})},function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function c(t){m(a,n,o,c,i,"next",t)}function i(t){m(a,n,o,c,i,"throw",t)}c(void 0)})}).call(this)}},{key:"apply",value:function(t){var n,l=document.body;if(l){l.classList.toggle("extra-theme-app-on",!!((p=t.app).enabled||p.header.enabled||p.sider.enabled||(null==(f=p.font)?void 0:f.enabled)||(null==(d=p.scrollbar)?void 0:d.enabled))),l.classList.toggle("extra-theme-login-on",!!(null==(n=t.login)?void 0:n.enabled));var p,f,d,b,y=document.getElementById(g);y||((y=document.createElement("style")).id=g,document.head.appendChild(y)),y.textContent=(b=this.selectors,(function(t,n){var l,p,f="body.extra-theme-app-on",d=[];if(t.enabled&&(d.push("".concat(f,"{").concat(function(t){var e=function(t){var e,n={image:"transparent",size:"auto",repeat:"no-repeat",position:"center"};if(!t||"none"===t.type)return n;if("color"===t.type)return{image:o(t.color),size:"auto",repeat:"no-repeat",position:"center"};if("gradient"===t.type){var c=(t.gradient.colors||[]).map(o).join(",");return{image:"linear-gradient(".concat(a(t.gradient.angle),"deg,").concat(c,")"),size:"cover",repeat:"no-repeat",position:"center"}}var i=r((null==(e=t.image)?void 0:e.url)||"");if(!i)return n;var l=t.image.fit;return{image:'url("'.concat(i,'")'),size:"repeat"===l?"auto":"stretch"===l?"100% 100%":"contain"===l?"contain":"cover",repeat:"repeat"===l?"repeat":"no-repeat",position:"center"}}(t),n=e.image,c=a(t.dim);if(c>0&&"none"!==t.type){var i,l,u,s,p,f=(i=c/100,3===(l="#000000".replace("#","")).length&&(l=l.split("").map(function(t){return t+t}).join("")),u=parseInt(l.slice(0,2),16),s=parseInt(l.slice(2,4),16),p=parseInt(l.slice(4,6),16),"rgba(".concat(u,",").concat(s,",").concat(p,",").concat(i,")"));n="linear-gradient(".concat(f,",").concat(f,"),").concat(e.image)}return"background:".concat(n,"!important;")+"background-size:".concat(e.size,"!important;")+"background-repeat:".concat(e.repeat,"!important;")+"background-position:".concat(e.position,"!important;")+"background-attachment:fixed!important;"}(t.background),"}")),d.push("".concat(f," .ant-layout-sider-children{top:auto!important;bottom:0!important;}")),d.push("".concat(u(f,n.content),"{background:transparent!important;}")),d.push("".concat(u(f,n.card+" div:not([class]):not([id])"),"{background-color:transparent!important;}")),t.card.glass&&t.card.blur>0&&d.push("".concat(u(f,n.card),",").concat(f," .code-block{").concat(s(t.card.blur),"}"))),t.header.enabled){var b=c(t.header.color,t.header.opacity/100),y="frosted"===t.header.style&&t.header.blur>0?s(t.header.blur):"";d.push("".concat(f," .ant-layout-header,").concat(f," .ant-pro-layout-header{background:").concat(b,"!important;").concat(y,"}"))}var h=t.font;if(null==h?void 0:h.enabled){if("upload"===h.source&&(null==(p=h.upload)?void 0:p.url)){var m,v=e(h.upload.name||"").replace(/["']/g,"")||"ExtraTheme Font",g=r(h.upload.url),w=i.includes(h.upload.format)?h.upload.format:({woff2:"woff2",woff:"woff",ttf:"truetype",otf:"opentype",ttc:"truetype"})[((null==(m=(h.upload.url||"").split("?")[0].split("#")[0].match(/\.([a-z0-9]+)$/i))?void 0:m[1])||"").toLowerCase()]||"";g&&(d.push('@font-face{font-family:"'.concat(v,'";src:url("').concat(g,'")').concat(w?' format("'.concat(w,'")'):"",";font-display:swap;}")),d.push("".concat(f,'{font-family:"').concat(v,'"!important;}')))}else if("upload"!==h.source){var k=e(h.family||"");k&&d.push("".concat(f,"{font-family:").concat(k,"!important;}"))}}if(t.sider.enabled){var x=c(t.sider.color,t.sider.opacity/100),j="frosted"===t.sider.style&&t.sider.blur>0?s(t.sider.blur):"";d.push("".concat(f," .ant-layout-sider{background:transparent!important;}")+"".concat(f," .ant-layout-sider-children{background:").concat(x,"!important;border-right:none!important;").concat(j,"}")+"".concat(f," .ant-layout-sider .ant-menu{background:transparent!important;border-inline-end:none!important;}")+"".concat(f," .ant-layout-sider .ant-menu::-webkit-scrollbar{width:6px;height:6px;}")+"".concat(f," .ant-layout-sider .ant-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.18);border-radius:4px;}")+"".concat(f," .ant-layout-sider .ant-menu::-webkit-scrollbar-track{background:transparent;}"))}return(null==(l=t.scrollbar)?void 0:l.enabled)&&("hidden"===t.scrollbar.mode?d.push("".concat(f," ::-webkit-scrollbar,").concat(f,"::-webkit-scrollbar{display:none;width:0;height:0;}")+"".concat(f,",").concat(f," *{scrollbar-width:none;-ms-overflow-style:none;}")):d.push("".concat(f," ::-webkit-scrollbar,").concat(f,"::-webkit-scrollbar{width:10px;height:10px;}")+"".concat(f," ::-webkit-scrollbar-thumb,").concat(f,"::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.22);border-radius:8px;border:2px solid transparent;background-clip:content-box;}")+"".concat(f," ::-webkit-scrollbar-thumb:hover,").concat(f,"::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,0.4);background-clip:content-box;}")+"".concat(f," ::-webkit-scrollbar-track,").concat(f,"::-webkit-scrollbar-track{background:transparent;}"))),d.join("\n")})(t.app,b.app).trim())}}}],function(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}(n.prototype,t),n}(),x={app:{appRoot:".ant-layout",header:".ant-layout-header",sider:".ant-layout-sider",card:".ant-card",content:'.ant-pro-layout-content,.ant-pro-layout-container,.ant-layout-content,.ant-page-header,[class*="nb-subpages-slot"],[class*="nb-subpages-slot"]>div'},login:{loginRoot:".ant-layout",loginCard:".ant-card"}};function j(t,e,r,n,o,a,c){try{var i=t[a](c),l=i.value}catch(t){r(t);return}i.done?e(l):Promise.resolve(l).then(n,o)}function O(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function c(t){j(a,n,o,c,i,"next",t)}function i(t){j(a,n,o,c,i,"throw",t)}c(void 0)})}}function S(t,e,r){return(S=I()?Reflect.construct:function(t,e,r){var n=[null];n.push.apply(n,e);var o=new(Function.bind.apply(t,n));return r&&P(o,r.prototype),o}).apply(null,arguments)}function _(t){return(_=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function P(t,e){return(P=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function E(t){var e="function"==typeof Map?new Map:void 0;return(E=function(t){if(null===t||-1===Function.toString.call(t).indexOf("[native code]"))return t;if("function"!=typeof t)throw TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,r)}function r(){return S(t,arguments,_(this).constructor)}return r.prototype=Object.create(t.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),P(r,t)})(t)}function I(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(I=function(){return!!t})()}function T(t,e){var r,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(c,"next",{value:l(0)}),i(c,"throw",{value:l(1)}),i(c,"return",{value:l(2)}),"function"==typeof Symbol&&i(c,Symbol.iterator,{value:function(){return this}}),c;function l(i){return function(l){var u=[i,l];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,u[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&u[0]?n.return:u[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,u[1])).done)return o;switch(n=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return a.label++,{value:u[1],done:!1};case 5:a.label++,n=u[1],u=[0];continue;case 7:u=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){a=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){a.label=u[1];break}if(6===u[0]&&a.label<o[1]){a.label=o[1],o=u;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(u);break}o[2]&&a.ops.pop(),a.trys.pop();continue}u=e.call(t,a)}catch(t){u=[6,t],n=0}finally{r=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function A(){return O(function(){var t,e;return T(this,function(r){switch(r.label){case 0:return[4,fetch("/api/extraTheme:getPublic",{headers:{Accept:"application/json"}})];case 1:return t=r.sent(),e={},[4,t.json()];case 2:return[2,(e.data=r.sent(),e)]}})})()}var $=function(t){var e;if("function"!=typeof t&&null!==t)throw TypeError("Super expression must either be null or a function");function r(){var t,e;if(!(this instanceof r))throw TypeError("Cannot call a class as a function");return t=r,e=arguments,t=_(t),function(t,e){var r;if(e&&("object"==((r=e)&&"u">typeof Symbol&&r.constructor===Symbol?"symbol":typeof r)||"function"==typeof e))return e;if(void 0===t)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(this,I()?Reflect.construct(t,e||[],_(this).constructor):t.apply(this,e))}return r.prototype=Object.create(t&&t.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),t&&P(r,t),e=[{key:"load",value:function(){return O(function(){return T(this,function(t){return new k(A,x).start(),[2]})})()}}],function(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}(r.prototype,e),r}(E(t.Plugin))}(),l}()});
@@ -0,0 +1,5 @@
1
+ import { Plugin } from '@nocobase/client-v2';
2
+ export declare class PluginExtraThemeClientV2 extends Plugin {
3
+ load(): Promise<void>;
4
+ }
5
+ export default PluginExtraThemeClientV2;
@@ -0,0 +1 @@
1
+ export { DEFAULT_SELECTORS as MODERN_SELECTORS } from '../shared/selectors';
@@ -0,0 +1,19 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ module.exports = {
11
+ "@nocobase/client": "2.1.19",
12
+ "react-i18next": "11.18.6",
13
+ "@nocobase/client-v2": "2.1.19",
14
+ "@nocobase/server": "2.1.19",
15
+ "react": "18.3.1",
16
+ "antd": "5.24.2",
17
+ "@nocobase/database": "2.1.19",
18
+ "@nocobase/actions": "2.1.19"
19
+ };
@@ -0,0 +1,2 @@
1
+ export * from './server';
2
+ export { default } from './server';