diff --git a/features/assets/plugin_project_sandbox/css/51-modern-default.css b/features/assets/plugin_project_sandbox/css/51-modern-default.css new file mode 100644 index 00000000000..57f0a89382e --- /dev/null +++ b/features/assets/plugin_project_sandbox/css/51-modern-default.css @@ -0,0 +1,665 @@ +@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; +} + +/* Title for settings*/ +/* Labels */ +/* +
Title
+*/ +.kintoneplugin-label { + margin-bottom: 8px; + font-weight: bold; +} + +/* 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/features/assets/plugin_project_sandbox/css/config.css b/features/assets/plugin_project_sandbox/css/config.css new file mode 100644 index 00000000000..36bb4c5b542 --- /dev/null +++ b/features/assets/plugin_project_sandbox/css/config.css @@ -0,0 +1,7 @@ +.settings-heading { + padding: 1em 0; +} + +.kintoneplugin-input-text { + width: 20em; +} \ No newline at end of file diff --git a/features/assets/plugin_project_sandbox/css/desktop.css b/features/assets/plugin_project_sandbox/css/desktop.css new file mode 100644 index 00000000000..661fa70c85d --- /dev/null +++ b/features/assets/plugin_project_sandbox/css/desktop.css @@ -0,0 +1,10 @@ +.plugin-space-heading { + font-size: 1.5rem; + margin: 0.8rem; +} +.plugin-space-message { + display: inline-block; + font-size: 1.2em; + margin: 0.8rem; + margin-top: 0; +} diff --git a/features/assets/plugin_project_sandbox/css/mobile.css b/features/assets/plugin_project_sandbox/css/mobile.css new file mode 100644 index 00000000000..661fa70c85d --- /dev/null +++ b/features/assets/plugin_project_sandbox/css/mobile.css @@ -0,0 +1,10 @@ +.plugin-space-heading { + font-size: 1.5rem; + margin: 0.8rem; +} +.plugin-space-message { + display: inline-block; + font-size: 1.2em; + margin: 0.8rem; + margin-top: 0; +} diff --git a/features/assets/plugin_project_sandbox/html/config.html b/features/assets/plugin_project_sandbox/html/config.html new file mode 100644 index 00000000000..dd9a0e3c09a --- /dev/null +++ b/features/assets/plugin_project_sandbox/html/config.html @@ -0,0 +1,16 @@ +
+

Settings for hello-kintone

+

This message is displayed on the app page after the app has been updated.

+
+

+ +

+

+ + +

+
+
\ No newline at end of file diff --git a/features/assets/plugin_project_sandbox/image/icon.png b/features/assets/plugin_project_sandbox/image/icon.png new file mode 100644 index 00000000000..aed0c9ff2f3 Binary files /dev/null and b/features/assets/plugin_project_sandbox/image/icon.png differ diff --git a/features/assets/plugin_project_sandbox/js/config.js b/features/assets/plugin_project_sandbox/js/config.js new file mode 100644 index 00000000000..a1e3993c67d --- /dev/null +++ b/features/assets/plugin_project_sandbox/js/config.js @@ -0,0 +1,25 @@ +(function (PLUGIN_ID) { + const formEl = document.querySelector(".js-submit-settings"); + const cancelButtonEl = document.querySelector(".js-cancel-button"); + const messageEl = document.querySelector(".js-text-message"); + if (!(formEl && cancelButtonEl && messageEl)) { + throw new Error("Required elements do not exist."); + } + + const config = kintone.plugin.app.getConfig(PLUGIN_ID); + if (config.message) { + messageEl.value = config.message; + } + + formEl.addEventListener("submit", (e) => { + e.preventDefault(); + kintone.plugin.app.setConfig({ message: messageEl.value }, () => { + alert("The plug-in settings have been saved. Please update the app!"); + window.location.href = "../../flow?app=" + kintone.app.getId(); + }); + }); + + cancelButtonEl.addEventListener("click", () => { + window.location.href = "../../" + kintone.app.getId() + "/plugin/"; + }); +})(kintone.$PLUGIN_ID); diff --git a/features/assets/plugin_project_sandbox/js/desktop.js b/features/assets/plugin_project_sandbox/js/desktop.js new file mode 100644 index 00000000000..aa010767a2a --- /dev/null +++ b/features/assets/plugin_project_sandbox/js/desktop.js @@ -0,0 +1,22 @@ +(function (PLUGIN_ID) { + kintone.events.on("app.record.index.show", () => { + const spaceEl = kintone.app.getHeaderSpaceElement(); + if (spaceEl === null) { + throw new Error("The header element is unavailable on this page."); + } + + const fragment = document.createDocumentFragment(); + const headingEl = document.createElement("h3"); + const messageEl = document.createElement("p"); + + const config = kintone.plugin.app.getConfig(PLUGIN_ID); + messageEl.textContent = config.message; + messageEl.classList.add("plugin-space-message"); + headingEl.textContent = "Hello kintone plugin!"; + headingEl.classList.add("plugin-space-heading"); + + fragment.appendChild(headingEl); + fragment.appendChild(messageEl); + spaceEl.appendChild(fragment); + }); +})(kintone.$PLUGIN_ID); diff --git a/features/assets/plugin_project_sandbox/js/mobile.js b/features/assets/plugin_project_sandbox/js/mobile.js new file mode 100644 index 00000000000..63e9f89e7b2 --- /dev/null +++ b/features/assets/plugin_project_sandbox/js/mobile.js @@ -0,0 +1,22 @@ +(function (PLUGIN_ID) { + kintone.events.on("mobile.app.record.index.show", () => { + const spaceEl = kintone.mobile.app.getHeaderSpaceElement(); + if (spaceEl === null) { + throw new Error("The header element is unavailable on this page."); + } + + const fragment = document.createDocumentFragment(); + const headingEl = document.createElement("h3"); + const messageEl = document.createElement("p"); + + const config = kintone.plugin.app.getConfig(PLUGIN_ID); + messageEl.textContent = config.message; + messageEl.classList.add("plugin-space-message"); + headingEl.textContent = "Hello kintone plugin!"; + headingEl.classList.add("plugin-space-heading"); + + fragment.appendChild(headingEl); + fragment.appendChild(messageEl); + spaceEl.appendChild(fragment); + }); +})(kintone.$PLUGIN_ID); diff --git a/features/assets/plugin_project_sandbox/manifest.json b/features/assets/plugin_project_sandbox/manifest.json new file mode 100644 index 00000000000..cd2638dfe75 --- /dev/null +++ b/features/assets/plugin_project_sandbox/manifest.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://raw.githubusercontent.com/kintone/js-sdk/%40kintone/plugin-manifest-validator%4011.2.0/packages/plugin-manifest-validator/manifest-schema.json", + "manifest_version": 1, + "version": 1, + "type": "APP", + "sandbox": true, + "allowed_hosts": ["https://example.com", "wss://example.com/ws/*"], + "permissions": { + "js_api": ["app:read", "network:connect"], + "rest_api": ["app_record:read"] + }, + "desktop": { + "js": ["js/desktop.js"], + "css": ["css/51-modern-default.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": ["message"] + }, + "name": { + "en": "hello-kintone-sandbox" + }, + "description": { + "en": "Sandbox-enabled plugin sample." + }, + "homepage_url": { + "en": "https://example.com/en/" + }, + "mobile": { + "js": ["js/mobile.js"], + "css": ["css/mobile.css"] + } +} diff --git a/features/assets/plugin_project_sandbox/private.ppk b/features/assets/plugin_project_sandbox/private.ppk new file mode 100644 index 00000000000..fbafd3d3ef4 --- /dev/null +++ b/features/assets/plugin_project_sandbox/private.ppk @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQDdjV2LPB6D8OQBnJDRcRl4u5FpwVmAesqRPCrDt6UyjGl8V0Mb +c4TAo4IEmuiftgCeyPkSIzPicEW4fxySqr7U8YZPkSdvB6WaOpbuiRIqryS9scHO +wDOtSzifo9+UpZhofx155te+88VTBDIU2zCIdhmShvwr5y0L3MlcF4BTxwIDAQAB +AoGASURbwBTknouGS4YkWi8F1mhpIUkguR1iaf80wT61Me8/XzBYb/aW20H3WGCG +N3Lv55Lc04Oyv9qTI/1dTJ+Mta+ZfkAOkEp+XwF3jW1qDc25TZsP8wXOW5wSRdCs +N4MIpZXLq0OaEC5xw7C8Dt8f+BAhPkUAzD8gehbfts4UybkCQQDuV4uXdBfVcDLW +srEn1oNyIJ3uhFzvZMfEkmvxSQNpdbcL1kfpnFoSwImYN5r6AwMOYgDDjI+qL91j +NXZ/zs1dAkEA7fdhk1Qn7JHHcl3ML7w/SL59JLqpcOEF4rZ66ZKDfqKDu5+JN5Q+ +9+86es4sl4tLN+kamgvR9bUOKkZU6R4vcwJBANjTsf1tswUMlmN1mu74Gwrnm2XS +6s0qrQYqgqK2XrFBUu4k2bUv9U2b9VESPR33QX+DLti3djdIZiqMB6rME00CQQDZ +gWnAfgVX6A9C65T8dLXrSaGc9rh1Ilh81ooWAAMMtoJt9e43zNqZSCJNqTF8+qav +3fKgpvkr+meOIGbwBNUdAkEA2sPlzdNLYrA6R0Bsxgwk5XixTlzYZ+BIHrrRGSUM +UsbQmXsHSbhA6rNWeBEO4fdbmPZOUbP0mDbPQpZA9TQJ2A== +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/features/plugin/pack.feature b/features/plugin/pack.feature index b8360046158..1eccaf3065e 100644 --- a/features/plugin/pack.feature +++ b/features/plugin/pack.feature @@ -19,3 +19,37 @@ Feature: plugin pack When I run the command with args "plugin pack --input ./src/manifest.json --private-key ./src/private.ppk --output ./dist/plugin.zip" Then I should get the exit code is zero And I have a file at "./dist/plugin.zip" + + Scenario: Pack a plugin with sandbox, allowed_hosts and permissions + Given An asset with key "plugin_project_sandbox" is available as "src" + When I run the command with args "plugin pack --input ./src/manifest.json --private-key ./src/private.ppk" + Then I should get the exit code is zero + And I have a file at "plugin.zip" + + Scenario: Plugin info surfaces sandbox, allowed_hosts and permissions + Given An asset with key "plugin_project_sandbox" is available as "src" + When I run the command with args "plugin pack --input ./src/manifest.json --private-key ./src/private.ppk" + Then I should get the exit code is zero + And I have a file at "plugin.zip" + When I run the command with args "plugin info --input ./plugin.zip" + Then I should get the exit code is zero + And The output message should match with the pattern: + """ + sandbox: true + allowed_hosts: https://example\.com, wss://example\.com/ws/\* + permissions\.js_api: app:read, network:connect + permissions\.rest_api: app_record:read + """ + + Scenario: Plugin info --format json surfaces sandbox-related keys with snake_case names + Given An asset with key "plugin_project_sandbox" is available as "src" + When I run the command with args "plugin pack --input ./src/manifest.json --private-key ./src/private.ppk" + Then I should get the exit code is zero + And I have a file at "plugin.zip" + When I run the command with args "plugin info --input ./plugin.zip --format json" + Then I should get the exit code is zero + And The output message should match with the pattern: "\"sandbox\": true" + And The output message should match with the pattern: "\"allowed_hosts\": \[" + And The output message should match with the pattern: "\"permissions\":" + And The output message should match with the pattern: "\"js_api\":" + And The output message should match with the pattern: "\"rest_api\":" diff --git a/package.json b/package.json index aa46de075be..4f66b531968 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ }, "dependencies": { "@inquirer/prompts": "7.10.1", - "@kintone/plugin-manifest-validator": "11.1.1", + "@kintone/plugin-manifest-validator": "11.2.0", "@kintone/rest-api-client": "6.1.6", "chalk": "4.1.2", "chokidar": "4.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 91b3b55f365..0256310ce93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,8 +17,8 @@ importers: specifier: 7.10.1 version: 7.10.1(@types/node@18.19.130) '@kintone/plugin-manifest-validator': - specifier: 11.1.1 - version: 11.1.1 + specifier: 11.2.0 + version: 11.2.0 '@kintone/rest-api-client': specifier: 6.1.6 version: 6.1.6 @@ -876,7 +876,7 @@ packages: engines: {node: '>=6.9.0'} '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, tarball: https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz} engines: {node: '>=0.1.90'} '@cspotcode/source-map-support@0.8.1': @@ -1423,7 +1423,7 @@ packages: react-dom: ^18.0.0 || ^19.0.0 '@docusaurus/react-loadable@6.0.0': - resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==} + resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==, tarball: https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz} peerDependencies: react: '*' @@ -1475,169 +1475,169 @@ packages: engines: {node: '>=20.0'} '@emnapi/core@1.5.0': - resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==, tarball: https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz} '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==, tarball: https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz} '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==, tarball: https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==, tarball: https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==, tarball: https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==, tarball: https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==, tarball: https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==, tarball: https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==, tarball: https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==, tarball: https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==, tarball: https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==, tarball: https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==, tarball: https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==, tarball: https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==, tarball: https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==, tarball: https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==, tarball: https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==, tarball: https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==, tarball: https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==, tarball: https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==, tarball: https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==, tarball: https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==, tarball: https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==, tarball: https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==, tarball: https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==, tarball: https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==, tarball: https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==, tarball: https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==, tarball: https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1918,8 +1918,8 @@ packages: peerDependencies: tslib: '2' - '@kintone/plugin-manifest-validator@11.1.1': - resolution: {integrity: sha512-ucGgZtgNSFg3cRSpd4ddM5D9AJYMVCa+GWxTzoSbmP+wDxW8n7l8w6kDW5FW9rWMPNeiMx9Idm7nXf0AE6f+qw==} + '@kintone/plugin-manifest-validator@11.2.0': + resolution: {integrity: sha512-eQYVM+RzZwpObmUmWz5xVOuAwu9acn6DINk9ij6C7ES0NeRuPtqOACutwFeL8rn2WbNn9N3WYHVzrYeFNdC0Lg==, tarball: https://registry.npmjs.org/@kintone/plugin-manifest-validator/-/plugin-manifest-validator-11.2.0.tgz} engines: {node: '>=20'} '@kintone/rest-api-client@6.1.6': @@ -1939,7 +1939,7 @@ packages: react: '>=16' '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, tarball: https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2006,95 +2006,95 @@ packages: resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==, tarball: https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==, tarball: https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==, tarball: https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==, tarball: https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==, tarball: https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==, tarball: https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==, tarball: https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==, tarball: https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==, tarball: https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==, tarball: https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [musl] '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==, tarball: https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==, tarball: https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==, tarball: https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==, tarball: https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz} engines: {node: '>= 10.0.0'} '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} engines: {node: '>=14'} '@pkgr/core@0.2.9': @@ -2121,123 +2121,123 @@ packages: engines: {node: '>= 22'} '@rollup/rollup-android-arm-eabi@4.52.2': - resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.52.2': - resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.52.2': - resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.52.2': - resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==, tarball: https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.52.2': - resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==, tarball: https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.52.2': - resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==, tarball: https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.52.2': - resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz} cpu: [arm] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.52.2': - resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz} cpu: [arm] os: [linux] libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.52.2': - resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz} cpu: [arm64] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.52.2': - resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz} cpu: [arm64] os: [linux] libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.52.2': - resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz} cpu: [loong64] os: [linux] libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.52.2': - resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz} cpu: [ppc64] os: [linux] libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.52.2': - resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz} cpu: [riscv64] os: [linux] libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.52.2': - resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz} cpu: [riscv64] os: [linux] libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.52.2': - resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz} cpu: [s390x] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.52.2': - resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz} cpu: [x64] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-musl@4.52.2': - resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==, tarball: https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz} cpu: [x64] os: [linux] libc: [musl] '@rollup/rollup-openharmony-arm64@4.52.2': - resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==, tarball: https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz} cpu: [arm64] os: [openharmony] '@rollup/rollup-win32-arm64-msvc@4.52.2': - resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.52.2': - resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-gnu@4.52.2': - resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz} cpu: [x64] os: [win32] '@rollup/rollup-win32-x64-msvc@4.52.2': - resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==, tarball: https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz} cpu: [x64] os: [win32] @@ -2262,7 +2262,7 @@ packages: engines: {node: '>=14.16'} '@slorber/react-helmet-async@1.3.0': - resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==} + resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==, tarball: https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz} peerDependencies: react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2383,7 +2383,7 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, tarball: https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz} '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} @@ -2652,105 +2652,105 @@ packages: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz} cpu: [arm] os: [android] '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz} cpu: [arm64] os: [android] '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz} cpu: [arm64] os: [darwin] '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz} cpu: [x64] os: [darwin] '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz} cpu: [x64] os: [freebsd] '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz} cpu: [arm64] os: [linux] libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz} cpu: [arm64] os: [linux] libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz} cpu: [ppc64] os: [linux] libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz} cpu: [riscv64] os: [linux] libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz} cpu: [riscv64] os: [linux] libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz} cpu: [s390x] os: [linux] libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz} cpu: [x64] os: [linux] libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz} cpu: [x64] os: [linux] libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz} engines: {node: '>=14.0.0'} cpu: [wasm32] '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz} cpu: [arm64] os: [win32] '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz} cpu: [ia32] os: [win32] '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz} cpu: [x64] os: [win32] @@ -2896,7 +2896,7 @@ packages: optional: true ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==, tarball: https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -2917,7 +2917,7 @@ packages: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==, tarball: https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz} ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -3148,7 +3148,7 @@ packages: optional: true bare-fs@4.4.10: - resolution: {integrity: sha512-arqVF+xX/rJHwrONZaSPhlzleT2gXwVs9rsAe1p1mIVwWZI2A76/raio+KwwxfWMO8oV9Wo90EaUkS2QwVmy4w==} + resolution: {integrity: sha512-arqVF+xX/rJHwrONZaSPhlzleT2gXwVs9rsAe1p1mIVwWZI2A76/raio+KwwxfWMO8oV9Wo90EaUkS2QwVmy4w==, tarball: https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.10.tgz} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -3161,7 +3161,7 @@ packages: engines: {bare: '>=1.14.0'} bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==, tarball: https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz} bare-stream@2.7.0: resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} @@ -3262,7 +3262,7 @@ packages: engines: {node: '>= 0.8'} bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, tarball: https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz} engines: {node: '>= 0.8'} cac@6.7.14: @@ -4408,7 +4408,7 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -4813,7 +4813,7 @@ packages: engines: {node: '>=20'} invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==, tarball: https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -6545,7 +6545,7 @@ packages: react: ^18.3.1 react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==, tarball: https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz} react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -6864,7 +6864,7 @@ packages: engines: {node: '>= 10.13.0'} search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==, tarball: https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz} section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} @@ -6953,7 +6953,7 @@ packages: engines: {node: '>=8'} shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==, tarball: https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz} shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -10586,7 +10586,7 @@ snapshots: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@kintone/plugin-manifest-validator@11.1.1': + '@kintone/plugin-manifest-validator@11.2.0': dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) diff --git a/src/plugin/core/__tests__/summary.test.ts b/src/plugin/core/__tests__/summary.test.ts new file mode 100644 index 00000000000..2770880728b --- /dev/null +++ b/src/plugin/core/__tests__/summary.test.ts @@ -0,0 +1,150 @@ +import { describe, expect, it } from "vitest"; +import type { ManifestInterface } from "../manifest/interface"; +import { buildPluginSummary } from "../summary"; + +const baseManifest: ManifestInterface = { + validate: async () => ({ valid: true, warnings: [] }), + sourceList: () => [], + generateContentsZip: async () => ({}) as never, + manifestVersion: 1, + name: "Sample Plugin", + version: 1, + description: "A plugin for unit test", + homepageUrl: "https://example.com", + sandbox: undefined, + allowedHosts: undefined, + permissions: undefined, + json: {}, +}; + +const withSandboxFields = ( + fields: Partial< + Pick + >, +): ManifestInterface => ({ + ...baseManifest, + ...fields, +}); + +describe("buildPluginSummary", () => { + it("returns identity / description / homepage from manifest", () => { + const summary = buildPluginSummary("plugin-id", baseManifest); + expect(summary.id).toBe("plugin-id"); + expect(summary.name).toBe("Sample Plugin"); + expect(summary.version).toBe("1"); + expect(summary.description).toBe("A plugin for unit test"); + expect(summary.homepage).toBe("https://example.com"); + }); + + it("uses (not set) for missing description / homepage", () => { + const empty = buildPluginSummary("plugin-id", { + ...baseManifest, + description: undefined, + homepageUrl: undefined, + }); + expect(empty.description).toBe("(not set)"); + expect(empty.homepage).toBe("(not set)"); + }); + + describe("sandbox block", () => { + it("returns null when no sandbox fields are defined", () => { + const summary = buildPluginSummary("plugin-id", baseManifest); + expect(summary.sandbox).toBeNull(); + }); + + it("formats every field when all are defined", () => { + const summary = buildPluginSummary( + "plugin-id", + withSandboxFields({ + sandbox: true, + allowedHosts: ["https://example.com", "wss://example.com/ws/*"], + permissions: { + js_api: ["app:read", "network:connect"], + rest_api: ["app_record:read"], + }, + }), + ); + expect(summary.sandbox).toEqual({ + sandbox: "true", + allowedHosts: "https://example.com, wss://example.com/ws/*", + permissionsJsApi: "app:read, network:connect", + permissionsRestApi: "app_record:read", + }); + }); + + it("uses (not set) for fields that are undefined when at least one sibling is defined", () => { + const summary = buildPluginSummary( + "plugin-id", + withSandboxFields({ + sandbox: true, + allowedHosts: undefined, + permissions: undefined, + }), + ); + expect(summary.sandbox).toEqual({ + sandbox: "true", + allowedHosts: "(not set)", + permissionsJsApi: "(not set)", + permissionsRestApi: "(not set)", + }); + }); + + it("uses (none) for explicitly empty arrays and (not set) for omitted children", () => { + const summary = buildPluginSummary( + "plugin-id", + withSandboxFields({ + sandbox: true, + allowedHosts: [], + permissions: { js_api: [] }, + }), + ); + expect(summary.sandbox).toEqual({ + sandbox: "true", + allowedHosts: "(none)", + permissionsJsApi: "(none)", + permissionsRestApi: "(not set)", + }); + }); + + it("uses (not set) for both permission children when permissions is declared empty", () => { + const summary = buildPluginSummary( + "plugin-id", + withSandboxFields({ + sandbox: true, + permissions: {}, + }), + ); + expect(summary.sandbox?.permissionsJsApi).toBe("(not set)"); + expect(summary.sandbox?.permissionsRestApi).toBe("(not set)"); + }); + + it("returns sandbox: (not set) when only siblings are defined", () => { + const summary = buildPluginSummary( + "plugin-id", + withSandboxFields({ + sandbox: undefined, + allowedHosts: ["https://example.com"], + permissions: undefined, + }), + ); + expect(summary.sandbox).toEqual({ + sandbox: "(not set)", + allowedHosts: "https://example.com", + permissionsJsApi: "(not set)", + permissionsRestApi: "(not set)", + }); + }); + + it("formats sandbox: false correctly (not as not set)", () => { + const summary = buildPluginSummary( + "plugin-id", + withSandboxFields({ + sandbox: false, + allowedHosts: undefined, + permissions: undefined, + }), + ); + expect(summary.sandbox?.sandbox).toBe("false"); + }); + }); +}); diff --git a/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-invalid-missing-allowed-hosts/image/icon.png b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-invalid-missing-allowed-hosts/image/icon.png new file mode 100644 index 00000000000..fe24d3aee82 Binary files /dev/null and b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-invalid-missing-allowed-hosts/image/icon.png differ diff --git a/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-invalid-missing-allowed-hosts/manifest.json b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-invalid-missing-allowed-hosts/manifest.json new file mode 100644 index 00000000000..697058a5468 --- /dev/null +++ b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-invalid-missing-allowed-hosts/manifest.json @@ -0,0 +1,14 @@ +{ + "manifest_version": 1, + "version": 1, + "type": "APP", + "name": { + "en": "sandbox invalid sample" + }, + "icon": "image/icon.png", + "sandbox": true, + "permissions": { + "js_api": ["app:read"], + "rest_api": ["app_record:read"] + } +} diff --git a/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-valid/image/icon.png b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-valid/image/icon.png new file mode 100644 index 00000000000..fe24d3aee82 Binary files /dev/null and b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-valid/image/icon.png differ diff --git a/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-valid/manifest.json b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-valid/manifest.json new file mode 100644 index 00000000000..0fadfb68cf3 --- /dev/null +++ b/src/plugin/core/manifest/__tests__/fixtures/plugin-sandbox-valid/manifest.json @@ -0,0 +1,20 @@ +{ + "manifest_version": 1, + "version": 1, + "type": "APP", + "name": { + "en": "sandbox sample" + }, + "icon": "image/icon.png", + "sandbox": true, + "allowed_hosts": [ + "https://example.com", + "wss://example.com", + "https://example.com/api/*", + "*" + ], + "permissions": { + "js_api": ["app:read", "network:connect"], + "rest_api": ["app_record:read", "file:write"] + } +} diff --git a/src/plugin/core/manifest/__tests__/validate.test.ts b/src/plugin/core/manifest/__tests__/validate.test.ts index 5dd652491d3..22e7cddfafe 100644 --- a/src/plugin/core/manifest/__tests__/validate.test.ts +++ b/src/plugin/core/manifest/__tests__/validate.test.ts @@ -41,6 +41,16 @@ describe("validate", () => { dir: "plugin-locales/v1/invalid-locales", expected: false, }, + { + name: "`sandbox-valid`", + dir: "plugin-sandbox-valid", + expected: true, + }, + { + name: "`sandbox-invalid-missing-allowed-hosts`", + dir: "plugin-sandbox-invalid-missing-allowed-hosts", + expected: false, + }, // TODO : Validation for v2 is not yet implemented. see src/plugin/core/manifest/v2/index.ts // { // name: "`valid-locales-v2`", diff --git a/src/plugin/core/manifest/interface.ts b/src/plugin/core/manifest/interface.ts index f6d5441d475..0aeeee11831 100644 --- a/src/plugin/core/manifest/interface.ts +++ b/src/plugin/core/manifest/interface.ts @@ -2,6 +2,11 @@ import type { DriverInterface } from "../driver"; import type { ContentsZip } from "../contents"; import type { ValidationResult } from "./validate"; +export type ManifestPermissions = { + js_api?: string[]; + rest_api?: string[]; +}; + export interface ManifestStaticInterface { /** * Parse JSON object to Manifest @@ -43,6 +48,11 @@ export interface ManifestInterface { get version(): number | string; get description(): string | undefined; get homepageUrl(): string | undefined; + // Sandbox-related accessors return raw manifest values. Normalization + // (dedup, canonicalization, etc.) belongs to the validator layer. + get sandbox(): boolean | undefined; + get allowedHosts(): string[] | undefined; + get permissions(): ManifestPermissions | undefined; /** * Returns JSON object represents Manifest raw object. diff --git a/src/plugin/core/manifest/v1/index.ts b/src/plugin/core/manifest/v1/index.ts index ebd699be295..0a08f1be172 100644 --- a/src/plugin/core/manifest/v1/index.ts +++ b/src/plugin/core/manifest/v1/index.ts @@ -1,5 +1,9 @@ import { sourceList } from "./sourcelist"; -import type { ManifestInterface, ManifestStaticInterface } from "../interface"; +import type { + ManifestInterface, + ManifestPermissions, + ManifestStaticInterface, +} from "../interface"; import type { DriverInterface } from "../../driver"; import { LocalFSDriver } from "../../driver"; import { validateManifest } from "../validate"; @@ -46,6 +50,18 @@ export class ManifestV1 implements ManifestInterface { return this.manifest.homepage_url?.en; } + get sandbox(): boolean | undefined { + return this.manifest.sandbox; + } + + get allowedHosts(): string[] | undefined { + return this.manifest.allowed_hosts; + } + + get permissions(): ManifestPermissions | undefined { + return this.manifest.permissions; + } + get json(): ManifestV1JsonObject { return this.manifest; } @@ -117,4 +133,7 @@ export type ManifestV1JsonObject = { css?: string[]; required_params?: string[]; }; + sandbox?: boolean; + allowed_hosts?: string[]; + permissions?: ManifestPermissions; }; diff --git a/src/plugin/core/manifest/v2/index.ts b/src/plugin/core/manifest/v2/index.ts index a6c46fa0168..6f0d2c8c418 100644 --- a/src/plugin/core/manifest/v2/index.ts +++ b/src/plugin/core/manifest/v2/index.ts @@ -1,4 +1,8 @@ -import type { ManifestInterface, ManifestStaticInterface } from "../interface"; +import type { + ManifestInterface, + ManifestPermissions, + ManifestStaticInterface, +} from "../interface"; import { sourceListV2 } from "./sourcelist"; import type { DriverInterface } from "../../driver"; import { LocalFSDriver } from "../../driver"; @@ -44,6 +48,19 @@ export class ManifestV2 implements ManifestInterface { return this.manifest.homepage_url?.en; } + // Manifest v2 does not define a sandbox field; always absent by design. + get sandbox(): boolean | undefined { + return undefined; + } + + get allowedHosts(): string[] | undefined { + return this.manifest.allowed_hosts; + } + + get permissions(): ManifestPermissions | undefined { + return this.manifest.permissions; + } + get json(): ManifestV2JsonObject { return this.manifest; } @@ -118,8 +135,5 @@ export type ManifestV2JsonObject = { required_params?: string[]; }; allowed_hosts?: string[]; - permissions?: { - js_api?: string[]; - rest_api?: string[]; - }; + permissions?: ManifestPermissions; }; diff --git a/src/plugin/core/summary.ts b/src/plugin/core/summary.ts new file mode 100644 index 00000000000..5a3f11d0a76 --- /dev/null +++ b/src/plugin/core/summary.ts @@ -0,0 +1,68 @@ +import type { ManifestInterface } from "./manifest/interface"; + +export type SandboxSummary = { + sandbox: string; + allowedHosts: string; + permissionsJsApi: string; + permissionsRestApi: string; +}; + +export type PluginSummary = { + id: string; + name: string; + version: string; + description: string; + homepage: string; + sandbox: SandboxSummary | null; +}; + +const NOT_SET = "(not set)"; +const NONE = "(none)"; + +// `(not set)` for absent fields (including children whose parent declares them +// optionally and they are omitted); `(none)` only for an explicitly declared +// empty array. This mirrors the schema in @kintone/plugin-manifest-validator, +// where `permissions.js_api` / `permissions.rest_api` are optional arrays. +const formatList = (list: string[] | undefined): string => { + if (list === undefined) { + return NOT_SET; + } + if (list.length === 0) { + return NONE; + } + return list.join(", "); +}; + +const buildSandboxSummary = ( + manifest: Pick, +): SandboxSummary | null => { + const hasFields = + manifest.sandbox !== undefined || + manifest.allowedHosts !== undefined || + manifest.permissions !== undefined; + if (!hasFields) { + return null; + } + + return { + sandbox: + manifest.sandbox === undefined ? NOT_SET : String(manifest.sandbox), + allowedHosts: formatList(manifest.allowedHosts), + permissionsJsApi: formatList(manifest.permissions?.js_api), + permissionsRestApi: formatList(manifest.permissions?.rest_api), + }; +}; + +export const buildPluginSummary = ( + id: string, + manifest: ManifestInterface, +): PluginSummary => { + return { + id, + name: manifest.name, + version: String(manifest.version), + description: manifest.description ?? NOT_SET, + homepage: manifest.homepageUrl ?? NOT_SET, + sandbox: buildSandboxSummary(manifest), + }; +}; diff --git a/src/plugin/info/__tests__/index.test.ts b/src/plugin/info/__tests__/index.test.ts new file mode 100644 index 00000000000..9a18b0d9cd6 --- /dev/null +++ b/src/plugin/info/__tests__/index.test.ts @@ -0,0 +1,74 @@ +import { describe, expect, it } from "vitest"; +import type { ManifestInterface } from "../../core/manifest/interface"; +import { buildJsonInfo } from "../index"; + +const baseManifest: ManifestInterface = { + validate: async () => ({ valid: true, warnings: [] }), + sourceList: () => [], + generateContentsZip: async () => ({}) as never, + manifestVersion: 1, + name: "Sample Plugin", + version: 1, + description: "A plugin for unit test", + homepageUrl: "https://example.com", + sandbox: undefined, + allowedHosts: undefined, + permissions: undefined, + json: {}, +}; + +describe("buildJsonInfo", () => { + it("returns identity / description / homepage from the manifest", () => { + const info = buildJsonInfo("plugin-id", baseManifest); + expect(info).toEqual({ + id: "plugin-id", + name: "Sample Plugin", + version: 1, + description: "A plugin for unit test", + homepage: "https://example.com", + sandbox: undefined, + allowed_hosts: undefined, + permissions: undefined, + }); + }); + + it("emits sandbox-related keys with snake_case names", () => { + const info = buildJsonInfo("plugin-id", { + ...baseManifest, + sandbox: true, + allowedHosts: ["https://example.com"], + permissions: { + js_api: ["app:read"], + rest_api: ["app_record:read"], + }, + }); + expect(info.sandbox).toBe(true); + expect(info.allowed_hosts).toEqual(["https://example.com"]); + expect(info.permissions).toEqual({ + js_api: ["app:read"], + rest_api: ["app_record:read"], + }); + }); + + it("drops absent sandbox keys when serialized as JSON (undefined → omitted)", () => { + const info = buildJsonInfo("plugin-id", baseManifest); + const serialized = JSON.parse(JSON.stringify(info)); + expect(serialized).not.toHaveProperty("sandbox"); + expect(serialized).not.toHaveProperty("allowed_hosts"); + expect(serialized).not.toHaveProperty("permissions"); + expect(serialized).toMatchObject({ + id: "plugin-id", + name: "Sample Plugin", + version: 1, + }); + }); + + it("preserves sandbox: false (not stripped) when serialized", () => { + const info = buildJsonInfo("plugin-id", { + ...baseManifest, + sandbox: false, + }); + const serialized = JSON.parse(JSON.stringify(info)); + expect(serialized.sandbox).toBe(false); + }); +}); diff --git a/src/plugin/info/index.ts b/src/plugin/info/index.ts index 24385dfb964..56cbf2bf257 100644 --- a/src/plugin/info/index.ts +++ b/src/plugin/info/index.ts @@ -1,31 +1,64 @@ import fs from "fs/promises"; import { PluginZip } from "../core"; +import type { + ManifestInterface, + ManifestPermissions, +} from "../core/manifest/interface"; +import { buildPluginSummary } from "../core/summary"; export type OutputFormat = "plain" | "json"; +export type PluginInfoJson = { + id: string; + name: string; + version: number | string; + description: string | undefined; + homepage: string | undefined; + sandbox: boolean | undefined; + allowed_hosts: string[] | undefined; + permissions: ManifestPermissions | undefined; +}; + +export const buildJsonInfo = ( + id: string, + manifest: ManifestInterface, +): PluginInfoJson => ({ + id, + name: manifest.name, + version: manifest.version, + description: manifest.description, + homepage: manifest.homepageUrl, + sandbox: manifest.sandbox, + allowed_hosts: manifest.allowedHosts, + permissions: manifest.permissions, +}); + export const run = async (pluginFilePath: string, format: OutputFormat) => { const buffer = await fs.readFile(pluginFilePath); const pluginZip = await PluginZip.fromBuffer(buffer); const id = await pluginZip.getPluginID(); const manifest = await pluginZip.manifest(); - const info = { - id: id, - name: manifest.name, - version: manifest.version, - description: manifest.description, - homepage: manifest.homepageUrl, - }; - switch (format) { - case "plain": - console.log("id:", info.id); - console.log("name:", info.name); - console.log("version:", info.version); - console.log("description:", info.description ?? "(not set)"); - console.log("homepage:", info.homepage ?? "(not set)"); + case "plain": { + const summary = buildPluginSummary(id, manifest); + console.log("id:", summary.id); + console.log("name:", summary.name); + console.log("version:", summary.version); + console.log("description:", summary.description); + console.log("homepage:", summary.homepage); + if (summary.sandbox !== null) { + const s = summary.sandbox; + console.log("sandbox:", s.sandbox); + console.log("allowed_hosts:", s.allowedHosts); + console.log("permissions.js_api:", s.permissionsJsApi); + console.log("permissions.rest_api:", s.permissionsRestApi); + } + break; + } + case "json": { + console.log(JSON.stringify(buildJsonInfo(id, manifest), null, 2)); break; - case "json": - console.log(JSON.stringify(info, null, 2)); + } } }; diff --git a/src/plugin/upload/index.ts b/src/plugin/upload/index.ts index d1b858c487d..36f8bb46312 100644 --- a/src/plugin/upload/index.ts +++ b/src/plugin/upload/index.ts @@ -1,6 +1,7 @@ import fs from "fs/promises"; import { confirm } from "@inquirer/prompts"; import { PluginZip } from "../core"; +import { buildPluginSummary } from "../core/summary"; import { buildRestAPIClient, type RestAPIClientOptions, @@ -48,14 +49,24 @@ export const upload = async ( const isSameVersion = installedPlugin?.version === pluginManifest.version; // Show installation summary - const installationSummary = ` - Installation Summary: - Destination: ${restApiClientOptions.baseUrl} - File Path: ${pluginFilePath} - Plugin ID: ${pluginId} - Plugin Name: ${pluginManifest.name} - Current version: ${installedPlugin?.version ?? "(not installed)"} - Target version: ${pluginManifest.version}${isSameVersion ? " (reinstall)" : ""}`; + const summary = buildPluginSummary(pluginId, pluginManifest); + const lines = [ + ` Destination: ${restApiClientOptions.baseUrl}`, + ` File Path: ${pluginFilePath}`, + ` Plugin ID: ${summary.id}`, + ` Plugin Name: ${summary.name}`, + ` Current version: ${installedPlugin?.version ?? "(not installed)"}`, + ` Target version: ${summary.version}${isSameVersion ? " (reinstall)" : ""}`, + ...(summary.sandbox !== null + ? [ + ` Sandbox: ${summary.sandbox.sandbox}`, + ` Allowed hosts: ${summary.sandbox.allowedHosts}`, + ` Permissions (js_api): ${summary.sandbox.permissionsJsApi}`, + ` Permissions (rest_api): ${summary.sandbox.permissionsRestApi}`, + ] + : []), + ]; + const installationSummary = `\n Installation Summary:\n${lines.join("\n")}`; logger.info(installationSummary); // Get confirmation from user if required diff --git a/website/docs/guide/experimental/sandbox.md b/website/docs/guide/experimental/sandbox.md new file mode 100644 index 00000000000..de89a4f87b7 --- /dev/null +++ b/website/docs/guide/experimental/sandbox.md @@ -0,0 +1,82 @@ +--- +title: Plugin sandbox +unlisted: true +--- + +# Plugin sandbox + +:::experimental[Plugin sandbox support] + +This feature is still under active development and is not part of the public interface yet. +Field names, validation rules, and command output may change without notice. + +::: + +cli-kintone recognizes three optional fields in `manifest.json` (Manifest v1) that declare a plugin's sandbox policy: `sandbox`, `allowed_hosts`, and `permissions`. When these fields are present, `plugin pack` validates them, `plugin info` surfaces them in its output, and `plugin upload` includes them in the installation summary. + +## Fields + +| Field | Type | Description | +| --------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sandbox` | `boolean` | Whether the plugin is sandbox-aware. | +| `allowed_hosts` | `string[]` | List of allowed network endpoints. Each entry is either a URI with a scheme (e.g. `https://example.com`, `wss://example.com/ws/*`) or the bare wildcard `"*"`. cli-kintone only checks the structural form; domain-specific rules (IP literal rejection, trailing-slash-only rejection, cybozu domain exclusion, etc.) are enforced by kintone itself at runtime. | +| `permissions` | `{ js_api?: string[]; rest_api?: string[] }` | API permissions the plugin requests. `js_api` is for JS API / JS API Event; `rest_api` is for REST API. | + +When `sandbox` is set to `true`, both `allowed_hosts` and `permissions` are required. When `sandbox` is absent or set to `false`, `allowed_hosts` and `permissions` remain optional. + +## Example manifest + +```json +{ + "manifest_version": 1, + "version": 1, + "type": "APP", + "name": { "en": "sandbox-sample" }, + "icon": "image/icon.png", + "sandbox": true, + "allowed_hosts": ["https://example.com", "wss://example.com/ws/*"], + "permissions": { + "js_api": ["app:read", "network:connect"], + "rest_api": ["app_record:read"] + } +} +``` + +## Command behavior + +### `plugin pack` + +Validates the three fields against the manifest schema before packaging. Validation errors abort packaging with a non-zero exit code; otherwise the plugin zip is produced as usual. + +### `plugin info` + +When any of `sandbox` / `allowed_hosts` / `permissions` is defined in the manifest, `plugin info` prints all four sandbox-related lines (`sandbox`, `allowed_hosts`, `permissions.js_api`, `permissions.rest_api`). Sandbox-unaware plugins (none of the three fields defined) omit the block entirely. + +- `(not set)` — the field is absent from the manifest. For `permissions.js_api` / `permissions.rest_api`, this also applies when `permissions` is declared but the child key is omitted. +- `(none)` — the field is declared as an explicitly empty array. + +Example plain output: + +```text +sandbox: true +allowed_hosts: https://example.com, wss://example.com/ws/* +permissions.js_api: app:read, network:connect +permissions.rest_api: app_record:read +``` + +In JSON format, keys that are absent from the manifest are omitted from the output. Sandbox-related keys mirror the manifest naming (`sandbox`, `allowed_hosts`, `permissions`) rather than the camelCase accessor names used by the library internals. + +### `plugin upload` + +When any of `sandbox` / `allowed_hosts` / `permissions` is defined in the manifest, the installation summary prints all four sandbox-related lines together (`Sandbox`, `Allowed hosts`, `Permissions (js_api)`, `Permissions (rest_api)`). Sandbox-unaware plugins show no additional lines. The same `(not set)` / `(none)` placeholders as `plugin info` are used. Example: + +```text + Installation Summary: + Destination: https://example.cybozu.com + ... + Target version: 1 + Sandbox: true + Allowed hosts: https://example.com, wss://example.com/ws/* + Permissions (js_api): app:read, network:connect + Permissions (rest_api): app_record:read +``` diff --git a/website/i18n/ja/docusaurus-plugin-content-docs/current/guide/experimental/sandbox.md b/website/i18n/ja/docusaurus-plugin-content-docs/current/guide/experimental/sandbox.md new file mode 100644 index 00000000000..ddd3ee478f2 --- /dev/null +++ b/website/i18n/ja/docusaurus-plugin-content-docs/current/guide/experimental/sandbox.md @@ -0,0 +1,98 @@ +--- +title: プラグインサンドボックス +unlisted: true +--- + +# プラグインサンドボックス + +:::experimental[プラグインサンドボックス対応] + +この機能は開発中であり、まだ公開インターフェースの一部ではありません。 +フィールド名・バリデーション規則・コマンド出力は予告なく変更される可能性があります。 + +::: + +cli-kintone は `manifest.json` (Manifest v1) のオプショナルフィールドとして +`sandbox` / `allowed_hosts` / `permissions` の 3 つを認識します。これらが +指定されていると、`plugin pack` がバリデーションを行い、`plugin info` が出力に +反映し、`plugin upload` が Installation Summary に含めます。 + +## フィールド + +| フィールド | 型 | 説明 | +| --------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sandbox` | `boolean` | このプラグインがサンドボックスに対応しているかを示すフラグ。 | +| `allowed_hosts` | `string[]` | プラグインがアクセスできる通信先の一覧。各エントリはスキーム付きの URI(例: `https://example.com`, `wss://example.com/ws/*`)またはワイルドカード `"*"`。cli-kintone は構造的な形式のみを検証し、IP アドレスの拒否・末尾スラッシュのみの拒否・サイボウズドメインの除外などのドメイン固有ルールは実行時に kintone 本体が判定します。 | +| `permissions` | `{ js_api?: string[]; rest_api?: string[] }` | プラグインが要求する API 権限。`js_api` は JS API / JS API Event 用、`rest_api` は REST API 用。 | + +`sandbox` が `true` の場合、`allowed_hosts` と `permissions` は必須です。 +`sandbox` が未指定または `false` の場合、`allowed_hosts` と `permissions` は +任意のままです。 + +## マニフェスト例 + +```json +{ + "manifest_version": 1, + "version": 1, + "type": "APP", + "name": { "en": "sandbox-sample" }, + "icon": "image/icon.png", + "sandbox": true, + "allowed_hosts": ["https://example.com", "wss://example.com/ws/*"], + "permissions": { + "js_api": ["app:read", "network:connect"], + "rest_api": ["app_record:read"] + } +} +``` + +## コマンドごとの挙動 + +### `plugin pack` + +パッケージング前に 3 フィールドをマニフェストスキーマで検証します。バリデーション +エラーがあるとパッケージングを中断し、非ゼロ終了コードを返します。エラーが +無ければ通常どおりプラグイン zip を生成します。 + +### `plugin info` + +`sandbox` / `allowed_hosts` / `permissions` のいずれかがマニフェストに +定義されている場合、`plugin info` はサンドボックス関連 4 行 +(`sandbox`、`allowed_hosts`、`permissions.js_api`、`permissions.rest_api`) +をまとめて出力します。どれも未定義のサンドボックス非対応プラグインでは +ブロックごと省略されます。 + +- `(not set)` — 当該フィールドがマニフェストに存在しない。`permissions.js_api` / `permissions.rest_api` については、`permissions` 自体は宣言されているが子キーが省略されている場合も含む。 +- `(none)` — 当該フィールドが空配列として明示されている。 + +plain 出力例: + +```text +sandbox: true +allowed_hosts: https://example.com, wss://example.com/ws/* +permissions.js_api: app:read, network:connect +permissions.rest_api: app_record:read +``` + +JSON 形式では、マニフェストに存在しないキーは出力から省略されます。サンドボックス関連のキーは、ライブラリ内部で用いる camelCase のアクセサ名ではなくマニフェストのキー名(`sandbox`、`allowed_hosts`、`permissions`)をそのまま使います。 + +### `plugin upload` + +`sandbox` / `allowed_hosts` / `permissions` のいずれかがマニフェストに +定義されている場合、Installation Summary にはサンドボックス関連 4 行 +(`Sandbox`、`Allowed hosts`、`Permissions (js_api)`、`Permissions (rest_api)`) +がまとめて出力されます。どれも未定義のサンドボックス非対応プラグインでは +追加行は出ません。`(not set)` / `(none)` のプレースホルダは `plugin info` と +同じ意味で使われます。出力例: + +```text + Installation Summary: + Destination: https://example.cybozu.com + ... + Target version: 1 + Sandbox: true + Allowed hosts: https://example.com, wss://example.com/ws/* + Permissions (js_api): app:read, network:connect + Permissions (rest_api): app_record:read +```