commit 0d9423e6e4a54a55fd12ef43f7c3340ea4b689fb Author: xuejiahao Date: Fri Oct 17 14:33:33 2025 +0800 upload code diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..636efe9 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,13 @@ +module.exports = { + extends: [ + '@cybozu/eslint-config/globals/kintone.js', + '@cybozu/eslint-config/lib/base.js', + '@cybozu/eslint-config/lib/kintone.js', + '@cybozu/eslint-config/lib/prettier.js', + ], + rules: { + 'prettier/prettier': ['error', { singleQuote: true }], + 'space-before-function-paren': 0, + 'object-curly-spacing': 0, + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7202a8e --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +data + +private.ppk +package-lock.json +yarn.lock \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..a13dd61 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "singleQuote": true, + "semi": true, + "trailingComma": "all", + "printWidth": 120, + "bracketSpacing": true +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..a48ad49 --- /dev/null +++ b/README.md @@ -0,0 +1,189 @@ + +# kintone-vue-ts-template + +使用 Vue 、ts 和 Vite 创建 kintone plugin 的初始化模板,先由 [create-plugin](https://cybozu.dev/ja/kintone/sdk/development-environment/create-plugin/) 生成之后再手动引入 Vue。 + +> プラグイン開発手順:https://cybozu.dev/ja/kintone/tips/development/plugins/development-plugin/ + +包括了以下 kintone 库: + +- [kintone-ui-component (v1.22.0)](https://cybozu.dev/ja/kintone/sdk/library/kintone-ui-component-v1/)([文档](https://ui-component.kintone.dev/ja/)) +- [@cybozu/eslint-config](https://cybozu.dev/ja/kintone/sdk/development-environment/eslint-config/) +- [@kintone/rest-api-client](https://cybozu.dev/ja/kintone/sdk/rest-api-client/kintone-javascript-client/)([文档](https://github.com/kintone/js-sdk/tree/main/packages/rest-api-client)) +- [kintone/plugin-packer](https://cybozu.dev/ja/kintone/sdk/development-environment/plugin-packer/) +- [@kintone/plugin-uploader](https://cybozu.dev/ja/kintone/sdk/development-environment/plugin-uploader/) +- [@kintone/dts-gen](https://cybozu.dev/ja/kintone/sdk/library/dts-gen/) + +# 使用步骤 + +首先进行安装 + +```bash +npm install # 或 yarn +``` + +随后需要修改项目信息: + +1. `package.json` +```diff +{ ++ "name": "项目名", +- "name": "kintone-vue-template", + "private": true, ++ "version": "版本号", +- "version": "0.0.0", + "type": "module", + "scripts": { + "vite:build": "vite build", + "build": "vite build && npm run pkg", + "build-upload": "npm run build && npm run upload", + "pkg": "kintone-plugin-packer --ppk private.ppk --out dist/plugin.zip dist/src", ++ "upload": "修改 kintone 域名、用户名和密码" +- "upload": "kintone-plugin-uploader --base-url https://alicorn.cybozu.com --username maxz --password 7ld7i8vd dist/plugin.zip " + }, + ... +``` + +2. `src/manifest.json` + +```diff +{ + ... ++ "icon": "icon 路径", +- "icon": "image/icon.png", + "config": { + ... ++ "required_params": [ "/config 页面必填的参数" ] +- "required_params": [ "buttonName" ] + }, ++ "name": "项目名", +- "name": { +- "en": "kintone Vue template", +- "ja": "kintone Vue テンプレート" +- }, ++ "description": "项目描述", +- "description": { +- "en": "kintone Vue template for creating plugin", +- "ja": "kintoneプラグイン作成用 Vue テンプレート" +- }, ++ "description": "项目网站", +- "homepage_url": { +- "en": "https://www.alicorns.co.jp/", +- "ja": "https://www.alicorns.co.jp/" +- }, + ... +} +``` + +# 编译流程 + +- `build` 会生成 `dist` 文件夹,以及 `plugin.zip` 文件 + +> 如果只需要 `dist` 文件夹,可以执行 `vite:build` + +```bash +npm run build # 或 yarn build + +# 仅生成 `dist` 文件夹 +npm run vite:build # 或 yarn vite:build +``` + +- `upload` 会将 `plugin.zip` 上传到 Kintone plugin + +```bash +npm run upload # 或 yarn upload +``` + +- `build-upload` 会顺序执行上面两步 + +```bash +npm run build-upload # 或 yarn build-upload +``` + +# 开发说明 + +## 项目结构 + +``` +├── src +│ ├── components +│ │ ├── basic +│ │ │ ├── PluginInput.vue +│ │ │ └── PluginLabel.vue +│ │ └── Config.vue +│ ├── css +│ │ ├── 51-modern-default.css +│ │ └── config.css +│ ├── i18n +│ │ ├── lang +│ │ │ ├── en.ts +│ │ │ └── ja.ts +│ │ └── index.ts +│ ├── js +│ │ ├── desktop.ts +│ │ └── mobile.ts +│ ├── types +│ │ ├── index.d.ts +│ │ ├── model.d.ts +│ │ └── my-kintone.d.ts +│ ├── main.ts +│ └── manifest.json +├── README.md +├── components.d.ts +├── env.d.ts +├── index.html +├── package.json +├── tsconfig.json +└── vite.config.ts +``` + +当前模板中已经有一个案例,可以参考并且修改。 + +1. 对于 Config 页面,请修改 `components/Config.vue` +2. 对于 PC 的 App 页面,请修改 `js/desktop.ts` +3. 对于 Mobile 的 App 页面,请修改 `js/mobile.ts` + +这三个文件是强制指定的,请不要修改。 + +### 关于 Config 页面 + +只有 **Config 页面** 的开发可以使用 Vue Template,其他页面请使用 `js` 文件。 + +基本上和 Vue 开发没有区别,但是有以下一些限制: +1. CSS 样式只能使用 `css` 文件 +2. `kintone-ui-component` 库有一些限制 + + +### 关于 CSS + +1. 暂时不支持在 Vue Template 中创建,**只能在 `css` 文件夹下新建 css 文件** +2. 目前在 `config` 页面引入了 `51-modern-default.css`,里面存放了 kintone 的一些样式 + - 如果不需要使用就在 `manifest.json` 中删除 + ```diff + "config": { + "html": "html/config.html", + "js": [ + "js/config.js" + ], + "css": [ + - "css/51-modern-default.css", + "css/config.css" + ], + "required_params": [ + "buttonName" + ] + }, + ``` + + + +### + + +**支持 Vue 页面**, +不支持 Vue 页面, + + +## 对于 `kintone-ui-component` 库的限制 + +v-model 语法糖无法使用 \ No newline at end of file diff --git a/components.d.ts b/components.d.ts new file mode 100644 index 0000000..f0e951b --- /dev/null +++ b/components.d.ts @@ -0,0 +1,14 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + Config: typeof import('./src/components/Config.vue')['default'] + PluginInput: typeof import('./src/components/basic/PluginInput.vue')['default'] + PluginLabel: typeof import('./src/components/basic/PluginLabel.vue')['default'] + } +} diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..528bb9b --- /dev/null +++ b/env.d.ts @@ -0,0 +1,8 @@ +/// +/// + +declare module '*.vue' { + import { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..81b9372 --- /dev/null +++ b/index.html @@ -0,0 +1,4 @@ +
+
+
+ \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..8981220 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "kintone-vue-template", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "vite:build": "vite build", + "build": "vite build && npm run pkg", + "build-upload": "npm run build && npm run upload", + "pkg": "kintone-plugin-packer --ppk private.ppk --out dist/plugin.zip dist/src", + "upload": "kintone-plugin-uploader --base-url https://alicorn.cybozu.com --username maxz --password 7ld7i8vd dist/plugin.zip " + }, + "dependencies": { + "@kintone/rest-api-client": "^5.7.5", + "kintone-ui-component": "1.22.0", + "rollup-plugin-css-only": "^4.5.2", + "vue": "^3.5.13", + "vue-i18n": "^11.0.1" + }, + "devDependencies": { + "@cybozu/eslint-config": "^23.0.0", + "@kintone/dts-gen": "^8.1.1", + "@kintone/plugin-packer": "^8.1.3", + "@kintone/plugin-uploader": "^9.1.2", + "@types/node-rsa": "^1.1.4", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/tsconfig": "^0.7.0", + "eslint": "^8.57.0", + "node-rsa": "^1.1.1", + "rollup-plugin-copy": "^3.5.0", + "typescript": "^5.7.3", + "unplugin-vue-components": "^28.0.0", + "vite": "^6.0.1", + "vue-tsc": "^2.1.10" + } +} diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000..aed0c9f Binary files /dev/null and b/src/assets/icon.png differ diff --git a/src/components/Config.vue b/src/components/Config.vue new file mode 100644 index 0000000..e00154e --- /dev/null +++ b/src/components/Config.vue @@ -0,0 +1,81 @@ + + diff --git a/src/components/basic/PluginInput.vue b/src/components/basic/PluginInput.vue new file mode 100644 index 0000000..651c9e8 --- /dev/null +++ b/src/components/basic/PluginInput.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/basic/PluginLabel.vue b/src/components/basic/PluginLabel.vue new file mode 100644 index 0000000..32691ed --- /dev/null +++ b/src/components/basic/PluginLabel.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/src/css/51-modern-default.css b/src/css/51-modern-default.css new file mode 100644 index 0000000..0b338ee --- /dev/null +++ b/src/css/51-modern-default.css @@ -0,0 +1,655 @@ +@charset "UTF-8"; +/* + * Copyright (c) 2014 Cybozu + * + * Licensed under the MIT License +*/ + +*[class|="kintoneplugin"] { + color: #333; + word-wrap: break-word; + font-size: 16px; + line-height: 1.5; +} + +:lang(us) *[class|="kintoneplugin"] { + font-family: 'HelveticaNeueW02-45Ligh', Arial, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif; +} + +:lang(ja) *[class|="kintoneplugin"] { + font-family: 'メイリオ', 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif; +} + +:lang(zh) *[class|="kintoneplugin"] { + font-family: '微软雅黑', 'Microsoft YaHei', '新宋体', NSimSun, STHeiti, Hei, 'Heiti SC', sans-serif; +} + +/*Alert message*/ +/* +
+

Alert message、
Alert message

+

Alert message

+
+*/ +.kintoneplugin-alert { + position: relative; + display: block; + margin: 8px 0; + padding: 4px 18px; + background: #e74c3c; + color: #f6f6f6; +} + +/* Row for the settings */ +/* +
Settings 1
+
Settings 2
+*/ +.kintoneplugin-row { + margin-bottom: 24px; +} + +/* Heading for each settings*/ +/* Heading */ +/* +
Heading for the setting
+*/ +.kintoneplugin-label { + margin-bottom: 8px; + font-weight: bold; +} + +/* Title for each settings */ +/* Title */ +/* +
Title of the setting
+*/ +.kintoneplugin-title { + margin-bottom: 8px; +} + +/* Description for each settings */ +/* Description */ +/* +
Description of the setting
+*/ +.kintoneplugin-desc { + margin-bottom: 8px; + font-size: 14px; + color: #888; +} + +/* Required settings*/ +/* +
Title*
+*/ +.kintoneplugin-require { + color: #c09853; +} + +/* Input (text box) */ +/* +
+ +
+*/ +.kintoneplugin-input-outer { + position: relative; + display: inline-block; + vertical-align: top; +} + +.kintoneplugin-input-text { + display: inline-block; + box-sizing: border-box; + margin: 0; + padding: 0 8px; + height: 48px; + outline: none; + border: 1px solid #e3e7e8; + background-color: #fff; + box-shadow: 4px 4px 12px #f5f5f5 inset, -4px -4px 12px #f5f5f5 inset; + color: #a7a7a7; + font-size: 14px; +} + +.kintoneplugin-input-text:focus { + background-color: #e2f2fe; + box-shadow: none; + color: #000; +} + +/* Check box */ +/* For IE8, specify .lt-ie9 for the parent. */ +/* +
+
+
+
+*/ +.kintoneplugin-input-checkbox-item { + display: block; + margin-right: 16px; + margin-bottom: 8px; + padding-left: 1px; + max-width: 98%; +} + +.kintoneplugin-input-checkbox-item-block { + display: block; +} +.kintoneplugin-input-checkbox-item-inline { + display: inline-block; +} + +.kintoneplugin-input-checkbox-item:hover + label { + color: #666; +} + +.kintoneplugin-input-checkbox-item input[type="checkbox"] { + display: none; + cursor: pointer; +} + +.kintoneplugin-input-checkbox-item input[type="checkbox"] + label { + position: relative; + display: inline-block; + margin-left: 32px; + vertical-align: middle; + font-size: 14px; + cursor: pointer; +} + +.kintoneplugin-input-checkbox-item input[type="checkbox"][disabled] + label { + color: #bababa; + cursor: not-allowed; +} + +.kintoneplugin-input-checkbox-item input[type="checkbox"] + label:before { + position: absolute; + top: 50%; + left: -30px; + display: inline-block; + box-sizing: border-box; + margin-top: -11px; + width: 21px; + height: 21px; + background: #fff; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAACXBIWXMAAAsTAAALEwEAmpwYAAA5mGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTExLTA1VDE1OjE2OjQ0KzA5OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMTEtMDdUMTc6Mjc6MDkrMDk6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTExLTA3VDE3OjI3OjA5KzA5OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmM0ZThhODkwLTIzMTYtNGE0Yy04YTYxLTM3Y2E1OWUzYjkzOTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDozMUQ4RkVFRkZGRTAxMUUzQUJBOENCMDVGMTBEODkwODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDozMUQ4RkVFQ0ZGRTAxMUUzQUJBOENCMDVGMTBEODkwODwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDozMUQ4RkVFREZGRTAxMUUzQUJBOENCMDVGMTBEODkwODwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjMxRDhGRUVGRkZFMDExRTNBQkE4Q0IwNUYxMEQ4OTA4PC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpjNGU4YTg5MC0yMzE2LTRhNGMtOGE2MS0zN2NhNTllM2I5Mzk8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMTEtMDdUMTc6Mjc6MDkrMDk6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjE8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PlzrgSQAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAATBJREFUeNrslMtOAzEMRY9fldj2/39x2FVFzcRmMZNOKZQWBCu4m2QRnVzHuZbD4VCtNdo8kz2pKoaKbf+R5LwRVJVdBBE7/NQaL8cjPZPMJKu245VwF1uIKqbKPHeeAG+t0TPZ7/eEO1XFMHvp+kPkereokr0zTc+cTg2vWtxFBG7Gd9VF6JlYJV4FmUX2BDMyE1kt3HM6zpgZvXcyl+fy616IyBk61s80QNsloKPPP6FB0aKg6lzqIyXfeobBUX5B/9A/DV2zwwPhuTFU5F0Sffvw2+e/jt5nwKp6E2cR8EIwU0yXCWVfnFQDqKqoLm7dTMlutN6p1emjkT2Xvg5oM0NV8V0E89yZpmkZgRelPwKtdXU3TITwwCOCJ4F2amQl5DZt7kIv2u1qeDjhwesANeG11rjZfScAAAAASUVORK5CYII=) no-repeat center center #fff; + content: ""; +} + +.kintoneplugin-input-checkbox-item input[type="checkbox"]:checked + label:after { + position: absolute; + top: 50%; + left: -30px; + box-sizing: border-box; + margin-top: -11px; + width: 21px; + height: 21px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwMkNFQUUzRkZCMzExRTNBQkE4Q0IwNUYxMEQ4OTA4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjUwMkNFQUU0RkZCMzExRTNBQkE4Q0IwNUYxMEQ4OTA4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTAyQ0VBRTFGRkIzMTFFM0FCQThDQjA1RjEwRDg5MDgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyQ0VBRTJGRkIzMTFFM0FCQThDQjA1RjEwRDg5MDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5TrKxVAAABt0lEQVR42rzVSy8DURQH8P+0HaopoV7TkLAoCRYshNjYaTxiZcmexEZsxBeQiEWrC9/AzkpFCCsSQhALEY8uEH3QqXjUtNPpTN07EQumpvpwlneSX/5n5pw7zJFfCLr3w9bTkAgDg6xLSQEdXDGmeqqjzNjKreB7kkqqLEbkWrwgw2FjYyaSUG4sZ+EdbcwZHV6+AfUMubSsVdQzoACVNXr3IiEhp/KHnj/GMeH1w3PA402Ufzw3/RW8joiY3gzhPBzHcUBAS5UZQ82l+knfJQVnJM33uiLg5FoAl7wIOoC9DVbUl7H67UeEJOZ2whhf9WPvTvg6v+A/QQLLZNI76yxwD9jRzpn10d1bAUuHEdy/SpjZCuEkEFPBqfWgmpRuThcBXQSs00ip+U7baswYaS3Dli+Kh2gSs9shWFgDfE8JFeymCQftmm2nTdpUWYQFpx1ORyliSUVNTJMmZEVNuKgDpv36FSVGzDs5gGzHxvWbekZBz2D6ljMaKRuF+zi8JxQ8x+WMQd05pbCr3w6RbE6mYEbDX2s1/d/u/4oqqfyC1DORX4CR3PzqBZuPm596TCH+UR8CDAC9yr4WxILwPAAAAABJRU5ErkJggg==) no-repeat center center #fff; + content: ""; +} + +.kintoneplugin-input-checkbox-item input[type="checkbox"][disabled]:checked + label:after { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkQ5N0VENzg3MEJBQzExRTQ5MUVFOTIwNzZCRTVEQkEwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkQ5N0VENzg4MEJBQzExRTQ5MUVFOTIwNzZCRTVEQkEwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RDk3RUQ3ODUwQkFDMTFFNDkxRUU5MjA3NkJFNURCQTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RDk3RUQ3ODYwQkFDMTFFNDkxRUU5MjA3NkJFNURCQTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4bu7OxAAABBUlEQVR42mK8fPXacwYGBh4G6oEvLECCH4gvAvEbKhgoAsT6IEP/Qg30pYKhm0HmMTHQAAw6Q+WAmI2ahmoB8XQgzsOWcsgxVAWIe4HYC4i7gdiOWEO5gFgHi7gaEE8FYg8ofw0QPyHGUCEgrgbimUBshSSuATXQDcnAfCC+hG4ACxZDQd6pgrI7oRq/AXE/ELsgGVgIxM+weROboVeAeA4QpwCxDRCfRZOHGfgEV6BjM/QOEJdC2SlocuugLn9GTjr9AMTlUBcjG5hLyEBcLoWBd1CDQSlBgFgDCRkKMxgUfhzEGkiMoSDwasgXKHi9zwwtsTdTqeRnBhn6EUc+Jxd8BAgwAIGUL+JG+jF3AAAAAElFTkSuQmCC); +} + +.lt-ie9 .kintoneplugin-input-checkbox-item input[type="checkbox"] { + display: inline-block; + vertical-align: middle; +} + +.lt-ie9 .kintoneplugin-input-checkbox-item input[type="checkbox"] + label { + margin-left: 4px; +} + +.lt-ie9 .kintoneplugin-input-checkbox-item input[type="checkbox"] + label:before { + display: none; +} + +.lt-ie9 .kintoneplugin-input-checkbox-item input[type="checkbox"]:checked + label:after { + display: none; +} + +/* Dropdown */ +/* +
+
+
Dropdown
+
+
+
+
Option A
+
Option B
+
Option C
+
+*/ +.kintoneplugin-dropdown-outer { + display: inline-block; +} + +.kintoneplugin-dropdown { + position: relative; + display: inline-block; + overflow: hidden; + box-sizing: border-box; + margin-right: 8px; + margin-bottom: 0; + padding: 0 16px; + min-width: 80px; + max-width: 280px; + height: 48px; + border: 1px solid #e3e7e8; + background-color: #f7f9fa; + box-shadow: 1px 1px 1px #fff inset; + color: #3498db; + text-overflow: ellipsis; +} + +.kintoneplugin-dropdown:hover { + background-color: #f4f7f8; + cursor: pointer; +} + +.kintoneplugin-dropdown-selected { + padding-right: 48px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwM0JEQzc5RUZENzExRTNBRjRFQ0I1NjlCRDUzOTA5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjUwM0JEQzdBRUZENzExRTNBRjRFQ0I1NjlCRDUzOTA5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTAzQkRDNzdFRkQ3MTFFM0FGNEVDQjU2OUJENTM5MDkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NTAzQkRDNzhFRkQ3MTFFM0FGNEVDQjU2OUJENTM5MDkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7KovlSAAAAhElEQVR42mI0mX7LjoGB4RADccCWCUjsB2ILIhSD1BwAadAB4qNAbIxHsTFUjQ5Iw3UgNgTiU1AaHRggyV1nggpegppyBoj1kBTrAvFZIDaBqmFgQZK8AMRmQHwe6kyYmAVUjAFdAwPUNGsgvgLl2wDxaWQFLFjcfAKIHaHs4+iSAAEGABHGF74RDCRaAAAAAElFTkSuQmCC) no-repeat right center; +} + +.kintoneplugin-dropdown-selected-name { + color: #3498db; + font-size: 14px; + line-height: 48px; +} + +.kintoneplugin-dropdown-list { + padding: 12px 0 0 0; + min-width: 280px; + border: 1px solid #e3e7e8; + background-color: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); + line-height: 1; +} + +.kintoneplugin-dropdown-list-item { + padding: 1px 16px 8px 25px; + line-height: 1; + cursor: pointer; +} + +.kintoneplugin-dropdown-list-item-name { + font: normal 13px Arial, sans-serif; + line-height: 1; +} + +.kintoneplugin-dropdown-list-item-selected { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAALCAYAAACksgdhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkVFNDNBMDI0MEIxNjExRTQ5MUVFOTIwNzZCRTVEQkEwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkVFNDNBMDI1MEIxNjExRTQ5MUVFOTIwNzZCRTVEQkEwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RUU0M0EwMjIwQjE2MTFFNDkxRUU5MjA3NkJFNURCQTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RUU0M0EwMjMwQjE2MTFFNDkxRUU5MjA3NkJFNURCQTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4n981NAAABVElEQVR42mL4//8/AzH44Ydf7D///AOzidJw9eV3Ps/F9392H32V8enHH0ZGsE484Pbbn1y5255/vfb6BwPIpnkBstpMIImvv/8xXnn1gx9dw623P7mztzz7evPNTwZmIN9Onue+DB/rM6a33/4wtR163Zq+6emHY4++ScE03Hjzkweo4cvNtz8Z/v77z2AizXV/gqekur4ExwfG9dc+GiZueHKOj52JQY6fjWGip6QIFxvTz4Jtzz9ff/ODAaiewRykwUtSA2jLL5CBjLfe/OTqPPJq7e47XzzYWZgYFAVZGbhYmRguv/zJ8PPvPwwNYE2ggHj//S9T2a4XW3fc+ewBshFk+tdf/xhMpbmeTvKSVJTmY/2N7Fd46L0DaizfDdR4+7MHiG+GQwMYIMcHKFAiVz86D4qTJx9/seKKN4x4evnlD8vPv/+Z5fhZf+KKO4AAAwB1mv8yxhgabQAAAABJRU5ErkJggg==) no-repeat 7px 4px; +} + +.kintoneplugin-dropdown-list-item-selected .kintoneplugin-dropdown-list-item-name { + color: #3498db; +} + +/* Dropdown (Simple) */ +/* +
+
+ +
+
+*/ +.kintoneplugin-select-outer { + display: inline-block; +} + +.kintoneplugin-select { + position: relative; + display: inline-block; + overflow: hidden; + box-sizing: border-box; + margin-right: 8px; + padding: 0 32px 0 8px; + min-width: 80px; + max-width: 280px; + height: 48px; + border: 1px solid #e3e7e8; + background-color: #f7f9fa; + box-shadow: 1px 1px 1px #fff inset; + text-overflow: ellipsis; +} + +.kintoneplugin-select:after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + display: block; + width: 32px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUwM0JEQzc5RUZENzExRTNBRjRFQ0I1NjlCRDUzOTA5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjUwM0JEQzdBRUZENzExRTNBRjRFQ0I1NjlCRDUzOTA5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTAzQkRDNzdFRkQ3MTFFM0FGNEVDQjU2OUJENTM5MDkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NTAzQkRDNzhFRkQ3MTFFM0FGNEVDQjU2OUJENTM5MDkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7KovlSAAAAhElEQVR42mI0mX7LjoGB4RADccCWCUjsB2ILIhSD1BwAadAB4qNAbIxHsTFUjQ5Iw3UgNgTiU1AaHRggyV1nggpegppyBoj1kBTrAvFZIDaBqmFgQZK8AMRmQHwe6kyYmAVUjAFdAwPUNGsgvgLl2wDxaWQFLFjcfAKIHaHs4+iSAAEGABHGF74RDCRaAAAAAElFTkSuQmCC) no-repeat center center transparent; + content: ""; + pointer-events: none; +} + +.kintoneplugin-select:hover { + background-color: #f4f7f8; + cursor: pointer; +} + +.lt-ie9 .kintoneplugin-select:hover { + background-color: transparent; +} + +.kintoneplugin-select select { + margin: 0; + min-width: 140px; + width: 144%; + height: 48px; + outline: none; + border: 0 none; + background-color: transparent; + color: #3498db; + font-size: 13px; + cursor: pointer; + -moz-appearance: none; + -webkit-appearance: none; + -ms-appearance: none; + appearance: none; +} + +.kintoneplugin-select option { + background-color: #fff; + color: #333; +} + +/* Radio Button */ +/* For IE8, specify .lt-ie9 for the parent. */ +/* +
+*/ +.kintoneplugin-input-radio-item { + display: inline-block; + margin-right: 16px; + margin-bottom: 8px; + padding-left: 1px; + max-width: 98%; + font-size: 14px; +} + +.kintoneplugin-input-radio-item:hover + label { + color: #666; +} + +.kintoneplugin-input-radio-item input[type="radio"] { + display: none; + cursor: pointer; +} + +.kintoneplugin-input-radio-item input[type="radio"] + label { + position: relative; + display: inline-block; + margin-left: 32px; + vertical-align: middle; + cursor: pointer; +} + +.kintoneplugin-input-radio-item input[type="checkbox"][disabled] + label { + color: #bababa; + cursor: not-allowed; +} + +.kintoneplugin-input-radio-item input[type="radio"] + label:before { + position: absolute; + top: 50%; + left: -30px; + box-sizing: border-box; + margin-top: -11px; + width: 21px; + height: 21px; + border: 1px solid #e3e7e8; + border-radius: 50%; + background: #fff; + box-shadow: 1px 1px 3px #f5f5f5 inset, -1px -1px 3px #f5f5f5 inset; + content: ""; + font-size: 14px; +} + +.kintoneplugin-input-radio-item input[type="radio"]:checked + label:after { + position: absolute; + top: 50%; + left: -26px; + margin-top: -7px; + width: 13px; + height: 13px; + border-radius: 50%; + background-color: #3498db; + content: ""; +} + +.lt-ie9 .kintoneplugin-input-radio-item input[type="radio"] { + display: inline-block; + vertical-align: middle; +} + +.lt-ie9 .kintoneplugin-input-radio-item input[type="radio"] + label { + margin-left: 4px; +} + +.lt-ie9 .kintoneplugin-input-radio-item input[type="radio"] + label:before { + display: none; +} + +.lt-ie9 .kintoneplugin-input-radio-item input[type="radio"]:checked + label:after { + display: none; +} + +/* Button */ +/* + +*/ +.kintoneplugin-button-normal { + display: inline-block; + box-sizing: border-box; + padding: 0 16px; + min-width: 163px; + height: 48px; + outline: none; + border: 1px solid #e3e7e8; + background-color: #f7f9fa; + box-shadow: 1px 1px 1px #fff inset; + color: #3498db; + text-align: center; + line-height: 48px; +} + +.kintoneplugin-button-normal:hover { + background-color: #c8d6dd; + box-shadow: none; + cursor: pointer; +} + +/* Disabled button */ +/* + +*/ +.kintoneplugin-button-disabled { + display: inline-block; + box-sizing: border-box; + padding: 0 16px; + min-width: 163px; + height: 48px; + outline: none; + border: 1px solid #e3e7e8; + background-color: #dbdcdd; + box-shadow: none; + color: #bababa; + text-align: center; + line-height: 48px; +} + +/* Dialog OK button */ +/* + +*/ +.kintoneplugin-button-dialog-ok { + display: inline-block; + box-sizing: border-box; + padding: 0 16px; + min-width: 163px; + height: 48px; + outline: none; + border: 1px solid #e3e7e8; + background-color: #3498db; + box-shadow: 1px 1px 1px #8ccbee inset; + color: #fff; + text-align: center; + line-height: 48px; +} + +.kintoneplugin-button-dialog-ok:hover { + background-color: #1d6fa5; + cursor: pointer; +} + +/* Dialog Cancel button */ +/* + +*/ +.kintoneplugin-button-dialog-cancel { + display: inline-block; + box-sizing: border-box; + padding: 0 16px; + min-width: 163px; + height: 48px; + outline: none; + border: 1px solid #e3e7e8; + background-color: #f7f9fa; + box-shadow: 1px 1px 1px #fff inset; + color: #3498db; + text-align: center; + line-height: 48px; +} + +.kintoneplugin-button-dialog-cancel:hover { + background-color: #c8d6dd; + box-shadow: none; + cursor: pointer; +} + + +/* Table */ +/* + + + + + + + + + + + + + +
Title1
+
+
+
+ +
+
+
+
+ + +
+*/ +.kintoneplugin-table { + border-collapse: collapse; + border-spacing: 0; + margin-left: 18px; + margin-bottom: 16px; +} + +.kintoneplugin-table-th { + border-color: #3498db; + height: 40px; + color: #fff; + box-sizing: border-box; + text-align: left; + font-weight: 400; + font-size: 12px; + white-space: nowrap; + border-width: 2px; + background-color: #3498db; +} + +.kintoneplugin-table-th .title { + display: inline-block; + padding: 4px 8px; + box-sizing: border-box; + min-width: 204px; +} + +.kintoneplugin-table-th-blankspace { + background-color: transparent; +} + +.kintoneplugin-table td { + border-color: #e3e7e8; + border-style: solid; + border-width: 0 1px 1px 0; + vertical-align: top; + padding: 4px 0; +} + +.kintoneplugin-table td:first-child { + border-left-width: 1px; +} + +.kintoneplugin-table td.kintoneplugin-table-td-operation { + border-right: 0; + border-bottom: 0; +} + +.kintoneplugin-table-td-control { + padding: 0 8px; +} + +.kintoneplugin-table-td-control-value { + overflow: hidden; + padding: 4px 0; + min-height: 21px; + color: #333; + background-color: transparent; +} + +.kintoneplugin-table-td-operation .kintoneplugin-button-add-row-image, .kintoneplugin-table-td-operation .kintoneplugin-button-remove-row-image { + display: inline-block; + width: 24px; + height: 24px; +} + +.kintoneplugin-table-td-operation .kintoneplugin-button-add-row-image { + margin-left: 12px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAABG0lEQVQ4ja2UMWrDUAyG31TIAUIO0cVbCMToHa0nyF4HqbtPkBPkAqEe/KQ4bclkCB06FDqoQ7Cb5j2/l1L/oMFY/pB+SzImoZzc1BZ1lpObpnKDsihLICkBubIohy4AuQKS0qIsk5DFajsBdAQo+0vIdQBJA+hosdpOgqD7h+c7S7yJQbwg3gSBgPz4J1DfuqNrkyHR2vswTPY5Ofip6mzqQDIfVVUTHpaXLVb/giFXxhhj5uvdLJGYhFmUw3y9mxlb1Jn/kj81Ikvy4X1T1FmwMkB+A+QWkFsgOamq9s/ILRC/Bisb1bPR/2ZszoDkBZC/bp6zc6uORtmAbslH281fV4OkSXjUAPLTIMjb1cg98zy6Vd2l7ecoom+t8LKwzLF7UgAAAABJRU5ErkJggg==) center center no-repeat; + border: 1px solid transparent; +} +.kintoneplugin-table-td-operation .kintoneplugin-button-add-row-image:hover { + cursor: pointer; +} +.kintoneplugin-table-td-operation .kintoneplugin-button-remove-row-image { + margin-left: 4px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAABPUlEQVQ4ja2UvW6DMBDHUTMkK0vyQJXoxoaUB2nWxEorMcNgD/gOWbIii7GSJx6Bmdegq1lKF6CUAqYSJ/2HE8dP5/tyHIvFcbynlLpxHO9tsZPGGDsCgI+IrwBAOrW+zxg7WiFBEOwAwEPE6xAyVpqmNwDwgiDYTYIIIU+c8/MSZCzO+XkSyDl//g9oIO8XKEmSk+1pc0LEa5Ikpx4GAP5csFIqVEqFFqjfw8ZdGyrLsjDLMhvs0hX+sBS4EkYIIQeHUuqOP5Rl+WGMqYwxVV3Xn03TfHW+MaYqiuIx/odS6k5mJqV811pHWusoz3OW5znrfK11JKV8m8xs05rZurkS9tPNpTkTQtyFEPfVc9Zm522yAd2Sb7abw6vRXoVZSJqmN0R8mQWNdxUm7hkAXADA/1OjtdZd2n6OFuwblG9sdxWO0ggAAAAASUVORK5CYII=) center center no-repeat; + border: 1px solid transparent; +} + +.kintoneplugin-table-td-operation .kintoneplugin-button-remove-row-image:hover { + cursor: pointer; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAACi0lEQVQ4jZ2UT0hUQRzHp0uHDtFVk0QqTGtdddXVN/Pe7ubuuu3Me7sY2s1jRZcOQX+kQC+dkrr15xAIElhIEBSZloKHPHTMIlHS9r2ZNdvUNK1Evh3S1WVdNX/wuf1+H+bHzHcIyVET4ZoiJViLjLKrjmBtUtBrdpSetwVzE0L25JrLKBlkh6RgHZJTWwmGLDidk5x2qYhWvaXIidKQ5Gx0U8kGkoJBCfpTcXZpU5HNNS45+7WdaKNwJmZgJORtz1wtqhVKQSd3Klpj2tSRMg28NtzhdZlgHf8rUoJBCoZZy8B4Q+27+578fWQiXFMkOfu6W5kSFL8bA3hQUWwRJVhLdqMOZW7Daq/NKVaa6tFdV9ZJJKetGRLLgBOogENL4bAc0FI4QQ+UZUByipSpIylYP3EEa0vLIrWQfjcWeh5hOTGBP2OfshkfxfLkZ8zduw1HOwZlGZgSOuZjvgGiOL2Rlp2qg6yvxNzdDiwNvsJi3/Ns+l9gaaAX329eh2OcgDR1TJs6Zi3jDVFcuyA3rhnzwa4tRsKVj4S7IJuyAiRcB+Hox6HifticYrHRj7eBqh6SiHjLFGcLGRdgGVAxP1TMlwP/vx7BYEcpcCaEO+6j59Zi1L2bp5HgFPNxH2Ysw24tKcwjhBDyJaJVJ9OZ2xkOp1CCAc1BdFaXXMyI1CTXrkybOr6ZOuQOTpRcFY2E6540EbI3K+zvQ972pGBIWQaSpg6bU0i+/todTmFzioW4D2iux8eG2p6n5eUHcn5Dw4Gq6FhEG0qZOlZOBzAb8yG5GuqlRj/QHMSU0Me7akoub/mfpYXeI/uHfJXmM8318EPY2/sj7h+ctfS+4ZOex7dch8++9JTkbTb3FyHXv8RgEtykAAAAAElFTkSuQmCC) center center no-repeat; +} diff --git a/src/css/config.css b/src/css/config.css new file mode 100644 index 0000000..449d29d --- /dev/null +++ b/src/css/config.css @@ -0,0 +1,73 @@ +/* 辅助类 */ +.flex-row { + display: flex; +} +.hidden { + visibility: hidden; +} + +/* config 页面 */ +#app { + width: 60vw; + min-width: 1030px; +} + +/* 最上面的说明 */ +.settings-heading { + padding: 1em 0; + margin-bottom: 8px; +} + +/* label 样式 */ +.kintoneplugin-label { + padding-left: 20px; + line-height: 40px; +} + +.kintoneplugin-label-required-icon { + font-size: 20px; + vertical-align: -3px; + color: #e74c3c; + margin-left: 4px; + line-height: 1; +} + +/* label input 单行的情况 */ +.flex-row .kintoneplugin-label { + margin: 0; + width: 8.5em; +} + +/* 底部按钮空间 */ +.action-area { + padding: 24px 0; + margin-bottom: 32px; + text-align: right; + border-top: none; +} +.save-btn { + margin-left: 16px; + margin-right: 24px; +} + +/* loading 遮罩 */ +#main-area { + position: relative; +} +#main-area [class^="kuc-spinner"][class$="__mask"] { + position: absolute; + background-color: white; +} +#main-area [class^="kuc-spinner"][class$="__spinner"] { + position: absolute; +} +#main-area [class^="kuc-spinner"][class$="__spinner__loader"] { + fill: #3498db; +} + +/* 输入框宽度 */ +.kuc-text-input { + --kuc-text-input-width: max(16vw, 200px); + --kuc-dropdown-toggle-width: max(16vw, 200px); + --kuc-combobox-toggle-width: max(16vw, 200px); +} \ No newline at end of file diff --git a/src/css/desktop.css b/src/css/desktop.css new file mode 100644 index 0000000..e69de29 diff --git a/src/css/mobile.css b/src/css/mobile.css new file mode 100644 index 0000000..e69de29 diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..834fcea --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,13 @@ +import { createI18n } from 'vue-i18n'; +import ja from './lang/ja'; +import en from './lang/en'; + +const i18n = createI18n({ + legacy: false, + locale: kintone.getLoginUser().language || 'ja', + messages: { + ja, + en, + }, +}); +export default i18n; diff --git a/src/i18n/lang/en.ts b/src/i18n/lang/en.ts new file mode 100644 index 0000000..e54a4d3 --- /dev/null +++ b/src/i18n/lang/en.ts @@ -0,0 +1,14 @@ +export default { + config: { + title: 'kintone Vue template', + desc: 'kintone Vue template for creating plugin', + button: { + label: 'button name', + default: 'button' + }, + message: { + label: 'message', + default: '' + }, + }, +}; diff --git a/src/i18n/lang/ja.ts b/src/i18n/lang/ja.ts new file mode 100644 index 0000000..3cae0bf --- /dev/null +++ b/src/i18n/lang/ja.ts @@ -0,0 +1,14 @@ +export default { + config: { + title: 'kintone Vue テンプレート', + desc: 'kintoneプラグイン作成用 Vue テンプレート', + button: { + label: 'ボタン名', + default: 'ボタン' + }, + message: { + label: 'メッセージ', + default: '' + }, + }, +}; diff --git a/src/js/desktop.ts b/src/js/desktop.ts new file mode 100644 index 0000000..52a7fb1 --- /dev/null +++ b/src/js/desktop.ts @@ -0,0 +1,36 @@ +import type { Setting } from '@/types/model'; +import { KintoneRestAPIClient } from '@kintone/rest-api-client'; + +(function (PLUGIN_ID) { + kintone.events.on('app.record.index.show', () => { + // App id + const appId = kintone.app.getId()?.toString(); + if (!appId) return; + + // get setting + const setting: Setting = kintone.plugin.app.getConfig(PLUGIN_ID); + + // header space + const headerSpace = kintone.app.getHeaderMenuSpaceElement(); + if (!headerSpace) { + throw new Error('このページではヘッダー要素が利用できません。'); + } + + const btnId = 'template-btn-id'; + // ボタン追加 + if (document.getElementById(btnId)) return; + const button = new Kucs[KUC_VERSION].Button({ + text: setting.buttonName, + type: 'submit', + id: btnId, + }); + const client = new KintoneRestAPIClient(); + button.addEventListener('click', async () => { + const { plugins } = await client.app.getPlugins({ + app: appId + }) + alert(setting.message + "\n--------\n【Plugins】 " + plugins.map(p => p.name).join('、')); + }); + headerSpace.appendChild(button); + }); +})(kintone.$PLUGIN_ID); diff --git a/src/js/mobile.ts b/src/js/mobile.ts new file mode 100644 index 0000000..8bba15a --- /dev/null +++ b/src/js/mobile.ts @@ -0,0 +1,36 @@ +import type { Setting } from '@/types/model'; +import { KintoneRestAPIClient } from '@kintone/rest-api-client'; + +(function (PLUGIN_ID) { + kintone.events.on('mobile.app.record.index.show', () => { + // App id + const appId = kintone.app.getId()?.toString(); + if (!appId) return; + + // get setting + const setting: Setting = kintone.plugin.app.getConfig(PLUGIN_ID); + + // header space + const headerSpace = kintone.mobile.app.getHeaderSpaceElement(); + if (!headerSpace) { + throw new Error('このページではヘッダー要素が利用できません。'); + } + + const btnId = 'template-btn-id'; + // ボタン追加 + if (document.getElementById(btnId)) return; + const button = new Kucs[KUC_VERSION].MobileButton({ + text: setting.buttonName, + type: 'submit', + id: btnId, + }); + const client = new KintoneRestAPIClient(); + button.addEventListener('click', async () => { + const { plugins } = await client.app.getPlugins({ + app: appId + }) + alert(setting.message + "\n--------\n【Plugins】 " + plugins.map(p => p.name).join('、')); + }); + headerSpace.appendChild(button); + }); +})(kintone.$PLUGIN_ID); diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..30e3c7c --- /dev/null +++ b/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import Config from './components/Config.vue'; +import i18n from './i18n'; + +createApp(Config, { pluginId: kintone.$PLUGIN_ID }).use(i18n).mount('#app'); diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..1bd389a --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://raw.githubusercontent.com/kintone/js-sdk/%40kintone/plugin-manifest-validator%4010.2.0/packages/plugin-manifest-validator/manifest-schema.json", + "manifest_version": 1, + "version": 1, + "type": "APP", + "desktop": { + "js": [ + "js/kuc.min.js", + "js/desktop.js" + ], + "css": [ + "css/desktop.css" + ] + }, + "icon": "image/icon.png", + "config": { + "html": "html/config.html", + "js": [ + "js/config.js" + ], + "css": [ + "css/51-modern-default.css", + "css/config.css" + ], + "required_params": [ + "buttonName" + ] + }, + "name": { + "en": "kintone Vue template", + "ja": "kintone Vue テンプレート" + }, + "description": { + "en": "kintone Vue template for creating plugin", + "ja": "kintoneプラグイン作成用 Vue テンプレート" + }, + "homepage_url": { + "en": "https://www.alicorns.co.jp/", + "ja": "https://www.alicorns.co.jp/" + }, + "mobile": { + "js": [ + "js/kuc.min.js", + "js/mobile.js" + ], + "css": [ + "css/mobile.css" + ] + } +} \ No newline at end of file diff --git a/src/types/index.d.ts b/src/types/index.d.ts new file mode 100644 index 0000000..8a48749 --- /dev/null +++ b/src/types/index.d.ts @@ -0,0 +1,8 @@ +declare global { + const Kucs: { + [version: string]: any; + }; + const KUC_VERSION: string; + const KUC_VERSION_DASHED: string; +} +export {}; diff --git a/src/types/model.d.ts b/src/types/model.d.ts new file mode 100644 index 0000000..795a732 --- /dev/null +++ b/src/types/model.d.ts @@ -0,0 +1,4 @@ +export interface Setting { + buttonName: string; + message: string; +} \ No newline at end of file diff --git a/src/types/my-kintone.d.ts b/src/types/my-kintone.d.ts new file mode 100644 index 0000000..a91cc9c --- /dev/null +++ b/src/types/my-kintone.d.ts @@ -0,0 +1,11 @@ +import { KintoneFormFieldProperty } from '@kintone/rest-api-client'; + +export interface KucEvent { + detail: T; +} + +export type SelectType = + | KintoneFormFieldProperty.CheckBox + | KintoneFormFieldProperty.RadioButton + | KintoneFormFieldProperty.Dropdown + | KintoneFormFieldProperty.MultiSelect; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..87293ab --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "components.d.ts"], + "exclude": ["src/**/__tests__/*"], + "files" : [ + "./node_modules/@kintone/dts-gen/kintone.d.ts", + ], + "compilerOptions": { + "esModuleInterop": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "paths": { + "@/*": ["./src/*"] + } + } +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..725599e --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,150 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import copy from "rollup-plugin-copy"; +import * as path from 'path'; +import * as fs from 'fs'; +import Components from 'unplugin-vue-components/vite'; +import RSA from 'node-rsa'; + +// Read kintone-ui-component version from package.json +const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'package.json'), 'utf-8')); +const kucVersion = packageJson.dependencies['kintone-ui-component']; +const formattedVersion = kucVersion.replace(/\./g, '-'); // e.g., 1.22.0 -> 1-22-0 +const dottedVersion = kucVersion; // e.g., 1.22.0 -> 1.22.0 + +/** + * Create a private key for a kintone plugin + */ +export const generatePrivateKey = () => { + const key = new RSA({ b: 1024 }); + return key.exportKey("pkcs1-private"); +}; + +// Check if private.ppk exists, if not, generate it +const privateKeyPath = path.resolve(__dirname, 'private.ppk'); +if (!fs.existsSync(privateKeyPath)) { + const privateKey = generatePrivateKey(); + fs.writeFileSync(privateKeyPath, privateKey); +} + +function replaceKucTagsPlugin() { + return { + name: 'vite-plugin-replace-tags', + async load(id) { + if (id.endsWith('.vue')) { + const content = await fs.promises.readFile(id, 'utf-8'); + + const usedComponent = {} + + let res = content + .replace(new RegExp(``, 'g'), (match, p1) => ``) + .replace(new RegExp(`]*)>`, 'g'), (match, p1, p2) => { + usedComponent[p1] = true; + return `` + }); + if (Object.keys(usedComponent).length) { + let importScript = ''; + res = importScript + res; + } + + return res; + } + } + }; +} + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue({ + template: { + compilerOptions: { + isCustomElement: (tag) => tag.startsWith("kuc-"), + } + } + }), + Components(), + copy({ + targets: [ + { src: 'dist/index.html', dest: 'dist/src/html', rename: 'config.html' }, + { src: 'src/assets/*.js', dest: 'dist/src/js' }, + { src: 'src/assets/*.png', dest: 'dist/src/image' }, + { src: 'src/css/*', dest: 'dist/src/css' }, + { src: 'node_modules/kintone-ui-component/umd/kuc.min.js', dest: 'dist/src/js' }, + ], + hook: 'writeBundle' // 指定在何时复制文件 + }), + { + name: 'manifest-updater', + writeBundle() { + try { + const manifestPath = path.resolve(__dirname, 'dist/src/manifest.json'); + const destDir = path.dirname(manifestPath); + fs.mkdirSync(destDir, { recursive: true }); + fs.copyFileSync(path.resolve(__dirname, 'src/manifest.json'), manifestPath); + const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')); + const viteManifestPath = path.resolve(__dirname, 'dist/.vite/manifest.json'); + if (!fs.existsSync(viteManifestPath)) return; + + const viteManifest = JSON.parse(fs.readFileSync(viteManifestPath, 'utf-8')); + + // 收集所有生成的 chunk 文件 + const chunkFiles: string[] = []; + Object.values(viteManifest).forEach((value: any) => { + if (value.file && value.file.endsWith('.chunk.js')) { + chunkFiles.push('js/' + path.basename(value.file)); + } + }); + + // 更新 desktop 和 mobile 的 js 数组,包含 chunk 文件 + if (chunkFiles.length > 0) { + manifest.desktop.js = ['js/kuc.min.js', 'js/desktop.js', ...chunkFiles]; + manifest.mobile.js = ['js/kuc.min.js', 'js/mobile.js', ...chunkFiles]; + } + + fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)); + } catch (error) { + console.error('Error updating manifest:', error); + } + } + }, + replaceKucTagsPlugin() + ], + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + }, + }, + build: { + rollupOptions: { + input: { + config: path.resolve(__dirname, 'index.html'), + desktop: path.resolve(__dirname, 'src/js/desktop.ts'), + mobile: path.resolve(__dirname, 'src/js/mobile.ts'), + }, + output: { + entryFileNames: (chunkInfo) => { + return 'src/js/[name].js'; // 默认处理为 JS 文件 + }, + chunkFileNames: 'src/js/[name]-[hash].chunk.js', + assetFileNames: 'src/[ext]/[name].[ext]', + }, + }, + sourcemap: 'inline', + manifest: true, + }, + define: { + KUC_VERSION: JSON.stringify(dottedVersion), + KUC_VERSION_DASHED: JSON.stringify(formattedVersion) + } +})