@g1cloud/bluesea 5.0.0-beta.27 → 5.0.0-beta.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +21 -0
  2. package/bin/install-claude-skill.mjs +74 -0
  3. package/css/bluesea.css +2 -2
  4. package/dist/{BSAlertModal-DT2Wai4R.js → BSAlertModal-DBRQ0cCa.js} +1 -1
  5. package/dist/{BSGridColumnSettingModal-CUMe_yWj.js → BSGridColumnSettingModal-C7xgLov6.js} +1 -1
  6. package/dist/{BSRichTextMaximizedModal-CaaSAgmI.js → BSRichTextMaximizedModal-D4w5hGdQ.js} +1 -1
  7. package/dist/{BSYesNoModal-C91E2MSF.js → BSYesNoModal-Dj2nMArb.js} +1 -1
  8. package/dist/{BSYoutubeInputModal-DSI-NoGb.js → BSYoutubeInputModal-Mro_98AC.js} +1 -1
  9. package/dist/{ImageInsertModal-7u7YeHsI.js → ImageInsertModal-DeL97iRr.js} +2 -2
  10. package/dist/{ImageProperties.vue_vue_type_script_setup_true_lang-CSHlFWfd.js → ImageProperties.vue_vue_type_script_setup_true_lang-DCv-pBh_.js} +1 -1
  11. package/dist/{ImagePropertiesModal-HRPdVJRK.js → ImagePropertiesModal-DD6cl6c0.js} +2 -2
  12. package/dist/{LinkPropertiesModal-x73isyqI.js → LinkPropertiesModal-CkgkjB7g.js} +1 -1
  13. package/dist/{TableInsertModal-BfWLdDCa.js → TableInsertModal-CNnGZuaP.js} +1 -1
  14. package/dist/{TablePropertiesModal-D1wSXQ3C.js → TablePropertiesModal-BYjN7jg3.js} +1 -1
  15. package/dist/{VideoInsertModal-DQ-wO6_P.js → VideoInsertModal-DIIzKI53.js} +2 -2
  16. package/dist/{VideoProperties.vue_vue_type_script_setup_true_lang-D73f1tdh.js → VideoProperties.vue_vue_type_script_setup_true_lang-BR8B1ON_.js} +1 -1
  17. package/dist/{VideoPropertiesModal-BYADjPfV.js → VideoPropertiesModal-DyMdwd1w.js} +2 -2
  18. package/dist/{YoutubeInsertModal-DNq4v5Ll.js → YoutubeInsertModal-BSIDbYkd.js} +2 -2
  19. package/dist/{YoutubeProperties.vue_vue_type_script_setup_true_lang-CWIVZP3H.js → YoutubeProperties.vue_vue_type_script_setup_true_lang-BlmuRJva.js} +1 -1
  20. package/dist/{YoutubePropertiesModal-D2-7I2sg.js → YoutubePropertiesModal-VDPQiwEJ.js} +2 -2
  21. package/dist/bluesea.css +2 -2
  22. package/dist/bluesea.js +1 -1
  23. package/dist/bluesea.umd.cjs +21 -7
  24. package/dist/{index-BIvcVEog.js → index-0VUHPqA4.js} +37 -23
  25. package/dist/text/i18n.d.ts +2 -1
  26. package/package.json +6 -1
  27. package/skills/bluesea-ui/SKILL.md +312 -0
  28. package/skills/bluesea-ui/references/components.md +189 -0
  29. package/skills/bluesea-ui/references/grid.md +159 -0
  30. package/skills/bluesea-ui/references/i18n.md +126 -0
  31. package/skills/bluesea-ui/references/validation.md +176 -0
  32. package/text/bluesea_text_en.json +248 -964
  33. package/text/bluesea_text_fr.json +248 -964
  34. package/text/bluesea_text_ja.json +248 -964
  35. package/text/bluesea_text_ko.json +248 -964
  36. package/text/bluesea_text_zh.json +248 -964
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @g1cloud/bluesea
2
+
3
+ Vue 3 UI library for g1cloud BackOffice applications. See the root
4
+ [README](../../README.md) and the demo app at `packages/bluesea-demo/` for a
5
+ guided tour of the components.
6
+
7
+ ## Claude Code skill (optional)
8
+
9
+ This package ships a `bluesea-ui` skill that teaches Claude Code how to use
10
+ its components, validation system, and i18n conventions. Install it into
11
+ your project with:
12
+
13
+ npx -p @g1cloud/bluesea bluesea-install-skill
14
+
15
+ This writes `.claude/skills/bluesea-ui/` in the current working directory.
16
+ Re-run after upgrading `@g1cloud/bluesea` to pick up skill updates.
17
+
18
+ Supported flags:
19
+
20
+ - `--path <dir>` — install into `<dir>/.claude/skills/` instead of `cwd`.
21
+ - `--help` — usage.
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import { cp, readFile, rm, stat, writeFile, mkdir } from 'node:fs/promises'
3
+ import { dirname, resolve } from 'node:path'
4
+ import { fileURLToPath } from 'node:url'
5
+
6
+ const SKILL_NAME = 'bluesea-ui'
7
+
8
+ const here = dirname(fileURLToPath(import.meta.url))
9
+ const packageRoot = resolve(here, '..')
10
+ const skillSource = resolve(packageRoot, 'skills', SKILL_NAME)
11
+ const packageJsonPath = resolve(packageRoot, 'package.json')
12
+
13
+ function parseArgs(argv) {
14
+ const out = { path: null }
15
+ for (let i = 0; i < argv.length; i++) {
16
+ const a = argv[i]
17
+ if (a === '--path' || a === '-p') {
18
+ out.path = argv[++i]
19
+ } else if (a === '--help' || a === '-h') {
20
+ out.help = true
21
+ } else {
22
+ console.error(`Unknown argument: ${a}`)
23
+ process.exit(2)
24
+ }
25
+ }
26
+ return out
27
+ }
28
+
29
+ function printHelp() {
30
+ console.log(`Usage: bluesea-install-skill [--path <dir>]
31
+
32
+ Installs the @g1cloud/bluesea Claude Code skill into <dir>/.claude/skills/${SKILL_NAME}/.
33
+ Defaults to the current working directory. Re-running overwrites the existing copy.`)
34
+ }
35
+
36
+ async function exists(p) {
37
+ try { await stat(p); return true } catch { return false }
38
+ }
39
+
40
+ async function main() {
41
+ const args = parseArgs(process.argv.slice(2))
42
+ if (args.help) { printHelp(); return }
43
+
44
+ if (!(await exists(skillSource))) {
45
+ console.error(`Skill source not found at ${skillSource}. This package appears to be incomplete.`)
46
+ process.exit(1)
47
+ }
48
+
49
+ const targetRoot = resolve(args.path ?? process.cwd())
50
+ if (!(await exists(resolve(targetRoot, 'package.json')))) {
51
+ console.warn(`Note: no package.json at ${targetRoot} — installing anyway.`)
52
+ }
53
+
54
+ const targetSkillDir = resolve(targetRoot, '.claude', 'skills', SKILL_NAME)
55
+
56
+ if (await exists(targetSkillDir)) {
57
+ await rm(targetSkillDir, { recursive: true, force: true })
58
+ }
59
+ await mkdir(dirname(targetSkillDir), { recursive: true })
60
+ await cp(skillSource, targetSkillDir, { recursive: true })
61
+
62
+ let version = 'unknown'
63
+ try {
64
+ version = JSON.parse(await readFile(packageJsonPath, 'utf8')).version ?? 'unknown'
65
+ } catch { /* fall through with 'unknown' */ }
66
+ await writeFile(resolve(targetSkillDir, '.installed-version'), `${version}\n`, 'utf8')
67
+
68
+ console.log(`Installed @g1cloud/bluesea skill v${version} → ${targetSkillDir.replace(targetRoot + '/', '')}/`)
69
+ }
70
+
71
+ main().catch((err) => {
72
+ console.error(err.message ?? err)
73
+ process.exit(1)
74
+ })
package/css/bluesea.css CHANGED
@@ -30176,12 +30176,12 @@ div[data-v-c1655c12] {
30176
30176
  padding: 8px;
30177
30177
  }
30178
30178
 
30179
- .bs-button[data-v-487255f8] {
30179
+ .bs-button[data-v-6e4e4dbf] {
30180
30180
  padding: 3px;
30181
30181
  height: auto;
30182
30182
  }
30183
30183
 
30184
- .bs-button[data-v-487255f8] .font-icon {
30184
+ .bs-button[data-v-6e4e4dbf] .font-icon {
30185
30185
  font-size: 12px;
30186
30186
  }
30187
30187
 
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, createBlock, openBlock, withCtx, withDirectives, createElementVNode, unref, createVNode } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, v as vT, B as BSButton, l as vFocusOnLoad } from "./index-BIvcVEog.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, v as vT, B as BSButton, l as vFocusOnLoad } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "text-right" };
4
4
  const _sfc_main = /* @__PURE__ */ defineComponent({
5
5
  __name: "BSAlertModal",
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, onMounted, createBlock, openBlock, withCtx, createElementVNode, createVNode, mergeProps, unref, toHandlers, nextTick } from "vue";
2
- import { g as createInputGridHandler, u as useModalHandle, _ as _sfc_main$1, B as BSButton, h as _sfc_main$2, j as _sfc_main$3, k as _sfc_main$4, n as notNull } from "./index-BIvcVEog.js";
2
+ import { g as createInputGridHandler, u as useModalHandle, _ as _sfc_main$1, B as BSButton, h as _sfc_main$2, j as _sfc_main$3, k as _sfc_main$4, n as notNull } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "text-center" };
4
4
  const _hoisted_2 = { class: "text-center" };
5
5
  const _hoisted_3 = { class: "bs-layout-horizontal" };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, mergeModels, useModel, useTemplateRef, createBlock, openBlock } from "vue";
2
- import { u as useModalHandle, d as _sfc_main$1 } from "./index-BIvcVEog.js";
2
+ import { u as useModalHandle, d as _sfc_main$1 } from "./index-0VUHPqA4.js";
3
3
  const _sfc_main = /* @__PURE__ */ defineComponent({
4
4
  __name: "BSRichTextMaximizedModal",
5
5
  props: /* @__PURE__ */ mergeModels({
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, createBlock, openBlock, withCtx, withDirectives, createElementVNode, unref, createVNode } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, v as vT, B as BSButton } from "./index-BIvcVEog.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, v as vT, B as BSButton } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "text-right" };
4
4
  const _sfc_main = /* @__PURE__ */ defineComponent({
5
5
  __name: "BSYesNoModal",
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, useModel, ref, createBlock, openBlock, withCtx, createElementVNode, createVNode, createCommentVNode, unref } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, e as extractYoutubeVideoId, i as isYoutubeNocookieUrl, f as buildYoutubeUrl } from "./index-BIvcVEog.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, e as extractYoutubeVideoId, i as isYoutubeNocookieUrl, f as buildYoutubeUrl } from "./index-0VUHPqA4.js";
3
3
  import YouTube from "vue3-youtube";
4
4
  const _hoisted_1 = { class: "bs-layout-vertical gap-16" };
5
5
  const _hoisted_2 = { class: "bs-layout-horizontal align-items-center" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, ref, createBlock, openBlock, withCtx, createElementVNode, createVNode, withDirectives, vShow } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, a as _sfc_main$2, b as _sfc_main$3, c as _sfc_main$4 } from "./index-BIvcVEog.js";
3
- import { _ as _sfc_main$5 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-CSHlFWfd.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, a as _sfc_main$2, b as _sfc_main$3, c as _sfc_main$4 } from "./index-0VUHPqA4.js";
3
+ import { _ as _sfc_main$5 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-DCv-pBh_.js";
4
4
  const _hoisted_1 = { class: "bs-layout-form title-w-8" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = { class: "bs-layout-horizontal justify-content-end gap-8" };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, createElementBlock, openBlock, Fragment, createElementVNode, createVNode, withDirectives, createTextVNode, unref } from "vue";
2
- import { b as _sfc_main$1, c as _sfc_main$2, v as vT } from "./index-BIvcVEog.js";
2
+ import { b as _sfc_main$1, c as _sfc_main$2, v as vT } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "title" };
4
4
  const _hoisted_2 = { class: "title" };
5
5
  const _hoisted_3 = { class: "title" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, ref, onMounted, useTemplateRef, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode } from "vue";
2
- import { q as findImageNode, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, p as formValidator, r as imageInfoNumberToPixel } from "./index-BIvcVEog.js";
3
- import { _ as _sfc_main$4 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-CSHlFWfd.js";
2
+ import { q as findImageNode, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, p as formValidator, r as imageInfoNumberToPixel } from "./index-0VUHPqA4.js";
3
+ import { _ as _sfc_main$4 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-DCv-pBh_.js";
4
4
  const _hoisted_1 = { class: "title" };
5
5
  const _hoisted_2 = { class: "bs-layout-horizontal justify-content-end gap-8" };
6
6
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, onMounted, createBlock, openBlock, withCtx, createElementVNode, createVNode, createTextVNode, withModifiers } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3 } from "./index-BIvcVEog.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3 } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "bs-layout-form title-w-8" };
4
4
  const _hoisted_2 = { class: "title" };
5
5
  const _hoisted_3 = { class: "title" };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, createBlock, openBlock, withCtx, createElementVNode, createVNode } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, j as _sfc_main$3 } from "./index-BIvcVEog.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, j as _sfc_main$3 } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "bs-layout-form" };
4
4
  const _hoisted_2 = { class: "bs-form-label" };
5
5
  const _hoisted_3 = { class: "bs-form-label" };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, ref, onMounted, useTemplateRef, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, withDirectives, createTextVNode, unref, Fragment, renderList, toDisplayString } from "vue";
2
- import { m as componentUtil, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, v as vT, o as _sfc_main$4, p as formValidator } from "./index-BIvcVEog.js";
2
+ import { m as componentUtil, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, v as vT, o as _sfc_main$4, p as formValidator } from "./index-0VUHPqA4.js";
3
3
  const findTableNode = (selection, type) => {
4
4
  const head = selection.$head;
5
5
  let depth = head.depth;
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, ref, createBlock, openBlock, withCtx, createElementVNode, createVNode, withDirectives, vShow } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, a as _sfc_main$2, b as _sfc_main$3, c as _sfc_main$4 } from "./index-BIvcVEog.js";
3
- import { _ as _sfc_main$5 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-D73f1tdh.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, a as _sfc_main$2, b as _sfc_main$3, c as _sfc_main$4 } from "./index-0VUHPqA4.js";
3
+ import { _ as _sfc_main$5 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-BR8B1ON_.js";
4
4
  const _hoisted_1 = { class: "bs-layout-form title-w-8" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = { class: "bs-layout-horizontal justify-content-end gap-8" };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, createElementBlock, openBlock, Fragment, createElementVNode, createVNode, withDirectives, createTextVNode, unref } from "vue";
2
- import { k as _sfc_main$1, b as _sfc_main$2, c as _sfc_main$3, v as vT } from "./index-BIvcVEog.js";
2
+ import { k as _sfc_main$1, b as _sfc_main$2, c as _sfc_main$3, v as vT } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "bs-layout-horizontal gap-8" };
4
4
  const _hoisted_2 = { class: "title" };
5
5
  const _hoisted_3 = { class: "title" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, ref, onMounted, useTemplateRef, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode } from "vue";
2
- import { w as findVideoNode, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, p as formValidator, x as videoInfoNumberToPixel } from "./index-BIvcVEog.js";
3
- import { _ as _sfc_main$4 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-D73f1tdh.js";
2
+ import { w as findVideoNode, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, p as formValidator, x as videoInfoNumberToPixel } from "./index-0VUHPqA4.js";
3
+ import { _ as _sfc_main$4 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-BR8B1ON_.js";
4
4
  const _hoisted_1 = { class: "title" };
5
5
  const _hoisted_2 = { class: "bs-layout-horizontal justify-content-end gap-8" };
6
6
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, ref, createBlock, openBlock, withCtx, createElementVNode, createVNode } from "vue";
2
- import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, y as youtubeInfoNumberToPixel } from "./index-BIvcVEog.js";
3
- import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-CWIVZP3H.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, y as youtubeInfoNumberToPixel } from "./index-0VUHPqA4.js";
3
+ import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-BlmuRJva.js";
4
4
  const _hoisted_1 = { class: "bs-layout-form" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = { class: "bs-layout-horizontal justify-content-end gap-8" };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, createElementBlock, openBlock, Fragment, createElementVNode, createVNode, withDirectives, createTextVNode, unref } from "vue";
2
- import { b as _sfc_main$1, c as _sfc_main$2, v as vT } from "./index-BIvcVEog.js";
2
+ import { b as _sfc_main$1, c as _sfc_main$2, v as vT } from "./index-0VUHPqA4.js";
3
3
  const _hoisted_1 = { class: "title" };
4
4
  const _hoisted_2 = { class: "title" };
5
5
  const _hoisted_3 = { class: "title" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, ref, onMounted, createBlock, openBlock, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode } from "vue";
2
- import { s as findYoutubeNode, t as normalizeYoutubeInfoData, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, y as youtubeInfoNumberToPixel } from "./index-BIvcVEog.js";
3
- import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-CWIVZP3H.js";
2
+ import { s as findYoutubeNode, t as normalizeYoutubeInfoData, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, y as youtubeInfoNumberToPixel } from "./index-0VUHPqA4.js";
3
+ import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-BlmuRJva.js";
4
4
  const _hoisted_1 = {
5
5
  key: 0,
6
6
  class: "bs-layout-form"
package/dist/bluesea.css CHANGED
@@ -11042,11 +11042,11 @@ span.table-property[data-v-537f70be]:after {
11042
11042
  }
11043
11043
  .bs-list-layout-item > .list-item-content {
11044
11044
  padding: 8px;
11045
- }.bs-button[data-v-487255f8] {
11045
+ }.bs-button[data-v-6e4e4dbf] {
11046
11046
  padding: 3px;
11047
11047
  height: auto;
11048
11048
  }
11049
- .bs-button[data-v-487255f8] .font-icon {
11049
+ .bs-button[data-v-6e4e4dbf] .font-icon {
11050
11050
  font-size: 12px;
11051
11051
  }.bs-horizontal-layout-resizer {
11052
11052
  cursor: ew-resize;
package/dist/bluesea.js CHANGED
@@ -1,4 +1,4 @@
1
- import { aN, aO, bL, bM, z, ap, az, B, J, K, a9, k, R, ar, N, F, aA, ct, H, O, av, P, a7, a8, aw, Q, a3, b, h, a5, a4, ac, as, aq, a0, D, ab, aa, G, am, cb, ax, _, a1, aj, al, ak, ai, ah, ag, V, an, ay, j, I, M, at, C, Y, a2, L, E, S, o, d, U, au, a, ao, Z, a6, c, ae, af, X, W, ad, T, A, bT, bb, bS, aX, aC, cy, aB, b2, b0, aZ, $, bR, b4, b3, cD, bJ, bP, b1, bV, bU, bQ, cx, b5, aW, aK, aL, aJ, aM, bO, bN, a$, bK, bA, c5, cC, bf, bm, c4, cM, ch, bW, c1, c0, aT, f, bD, cj, aU, cs, ba, cw, cz, g, ce, a_, bi, cQ, aP, b7, bj, aQ, aS, aR, b9, b$, bx, by, bz, bu, bw, bv, e, bt, bq, p, cF, aV, b8, cq, cm, cE, bZ, aF, cN, cK, cO, bE, cL, bF, c3, c2, cn, bn, i, b_, bp, bl, cP, b6, ca, c9, aY, bY, n, cf, bX, cJ, cA, c6, cd, bB, bc, bg, bI, c8, bG, bH, ci, cp, co, cg, cl, bo, aE, bk, ck, cI, cu, cv, cB, c7, cc, u, bC, bd, be, bh, aD, aH, aI, l, v, aG, br, bs, cH, cG, cr } from "./index-BIvcVEog.js";
1
+ import { aN, aO, bL, bM, z, ap, az, B, J, K, a9, k, R, ar, N, F, aA, ct, H, O, av, P, a7, a8, aw, Q, a3, b, h, a5, a4, ac, as, aq, a0, D, ab, aa, G, am, cb, ax, _, a1, aj, al, ak, ai, ah, ag, V, an, ay, j, I, M, at, C, Y, a2, L, E, S, o, d, U, au, a, ao, Z, a6, c, ae, af, X, W, ad, T, A, bT, bb, bS, aX, aC, cy, aB, b2, b0, aZ, $, bR, b4, b3, cD, bJ, bP, b1, bV, bU, bQ, cx, b5, aW, aK, aL, aJ, aM, bO, bN, a$, bK, bA, c5, cC, bf, bm, c4, cM, ch, bW, c1, c0, aT, f, bD, cj, aU, cs, ba, cw, cz, g, ce, a_, bi, cQ, aP, b7, bj, aQ, aS, aR, b9, b$, bx, by, bz, bu, bw, bv, e, bt, bq, p, cF, aV, b8, cq, cm, cE, bZ, aF, cN, cK, cO, bE, cL, bF, c3, c2, cn, bn, i, b_, bp, bl, cP, b6, ca, c9, aY, bY, n, cf, bX, cJ, cA, c6, cd, bB, bc, bg, bI, c8, bG, bH, ci, cp, co, cg, cl, bo, aE, bk, ck, cI, cu, cv, cB, c7, cc, u, bC, bd, be, bh, aD, aH, aI, l, v, aG, br, bs, cH, cG, cr } from "./index-0VUHPqA4.js";
2
2
  export {
3
3
  aN as ADDRESS_COUNTRY_CONFIGS,
4
4
  aO as ADDRESS_COUNTRY_CONFIG_DEFAULT,
@@ -528,9 +528,16 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
528
528
  constructor() {
529
529
  __publicField(this, "localeTexts", {});
530
530
  }
531
- addTexts(locale, textList) {
531
+ addTexts(locale, input) {
532
532
  const text = this.ensureAddLocale(locale);
533
- textList.forEach((t2) => text[t2.key] = t2);
533
+ if (Array.isArray(input)) {
534
+ input.forEach((t2) => text[t2.key] = t2);
535
+ } else {
536
+ for (const key in input) {
537
+ const v = input[key];
538
+ text[key] = Array.isArray(v) ? { key, text: String(v[0]), html: !!v[1] } : { key, text: v };
539
+ }
540
+ }
534
541
  }
535
542
  /**
536
543
  * 현재 언어코드에서 `key` 에 해당하는 `TextRecord` 를 리턴한다.
@@ -38425,7 +38432,8 @@ img.ProseMirror-separator {
38425
38432
  const likeFilterItems = vue.computed(() => likeTextFilterItems.value.filter((item) => !item.filterCreator && item.filterType !== "NUMBER"));
38426
38433
  const equalFilterItemPropertyIds = vue.computed(() => likeTextFilterItems.value.filter((item) => !item.filterCreator && item.filterType === "NUMBER").map((item) => item.propertyId));
38427
38434
  const customFilterItems = vue.computed(() => likeTextFilterItems.value.filter((item) => item.filterCreator));
38428
- const inFilterItemPropertyIds = vue.computed(() => inTextFilterItems.value.map((filter) => filter.propertyId));
38435
+ const stringInFilterItemPropertyIds = vue.computed(() => inTextFilterItems.value.filter((item) => item.filterType !== "NUMBER").map((item) => item.propertyId));
38436
+ const numberInFilterItemPropertyIds = vue.computed(() => inTextFilterItems.value.filter((item) => item.filterType === "NUMBER").map((item) => item.propertyId));
38429
38437
  const getFilterKeyword = (filter) => {
38430
38438
  const actualFilter = filter instanceof OrFilter ? filter.filters[0] : filter;
38431
38439
  if (actualFilter && "getFilterValueString" in actualFilter) {
@@ -38486,9 +38494,15 @@ img.ProseMirror-separator {
38486
38494
  if (allFilters.length >= 2) return orFilter(allFilters);
38487
38495
  else return allFilters[0];
38488
38496
  } else if (filterMode.value === "TEXTAREA") {
38489
- const names = inFilterItemPropertyIds.value;
38490
38497
  const keywords2 = keyword2.split("\n");
38491
- return inFilter(names, keywords2, true);
38498
+ const stringNames = stringInFilterItemPropertyIds.value;
38499
+ const stringIn = stringNames.length > 0 ? inFilter(stringNames, keywords2, true) : void 0;
38500
+ const numberNames = numberInFilterItemPropertyIds.value;
38501
+ const numberKeywords = keywords2.map((k) => k.trim()).filter((k) => k !== "" && !Number.isNaN(Number(k))).map(Number);
38502
+ const numberIn = numberNames.length > 0 && numberKeywords.length > 0 ? inFilter(numberNames, numberKeywords, true) : void 0;
38503
+ const allFilters = [stringIn, numberIn].filter(notNull);
38504
+ if (allFilters.length >= 2) return orFilter(allFilters);
38505
+ else return allFilters[0];
38492
38506
  }
38493
38507
  };
38494
38508
  vue.watch(
@@ -39673,7 +39687,7 @@ img.ProseMirror-separator {
39673
39687
  }, null, 8, _hoisted_3$o)
39674
39688
  ]),
39675
39689
  vue.createVNode(BSButton, {
39676
- caption: allExpanded.value ? "전체닫기" : "전체열기",
39690
+ caption: allExpanded.value ? { key: "bs.collapseAll" } : { key: "bs.expandAll" },
39677
39691
  "left-icon": allExpanded.value ? "expand_less" : "expand_more",
39678
39692
  class: "border-0",
39679
39693
  onClick: expandAll
@@ -39683,7 +39697,7 @@ img.ProseMirror-separator {
39683
39697
  };
39684
39698
  }
39685
39699
  });
39686
- const BSListControl = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["__scopeId", "data-v-487255f8"]]);
39700
+ const BSListControl = /* @__PURE__ */ _export_sfc(_sfc_main$O, [["__scopeId", "data-v-6e4e4dbf"]]);
39687
39701
  const _sfc_main$N = /* @__PURE__ */ vue.defineComponent({
39688
39702
  __name: "BSHorizontalLayoutResizer",
39689
39703
  emits: ["resized"],
@@ -368,8 +368,8 @@ const defaultAddressInputComponentConfig = {
368
368
  countryConfigs: ADDRESS_COUNTRY_CONFIGS
369
369
  };
370
370
  const defaultRichTextComponentConfig = {
371
- imageInsertModal: defineAsyncComponent(() => import("./ImageInsertModal-7u7YeHsI.js")),
372
- videoInsertModal: defineAsyncComponent(() => import("./VideoInsertModal-DQ-wO6_P.js")),
371
+ imageInsertModal: defineAsyncComponent(() => import("./ImageInsertModal-DeL97iRr.js")),
372
+ videoInsertModal: defineAsyncComponent(() => import("./VideoInsertModal-DIIzKI53.js")),
373
373
  toolButtons: [
374
374
  "Heading",
375
375
  "FontSize",
@@ -528,9 +528,16 @@ class I18NTexts {
528
528
  constructor() {
529
529
  __publicField(this, "localeTexts", {});
530
530
  }
531
- addTexts(locale, textList) {
531
+ addTexts(locale, input) {
532
532
  const text = this.ensureAddLocale(locale);
533
- textList.forEach((t2) => text[t2.key] = t2);
533
+ if (Array.isArray(input)) {
534
+ input.forEach((t2) => text[t2.key] = t2);
535
+ } else {
536
+ for (const key in input) {
537
+ const v = input[key];
538
+ text[key] = Array.isArray(v) ? { key, text: String(v[0]), html: !!v[1] } : { key, text: v };
539
+ }
540
+ }
534
541
  }
535
542
  /**
536
543
  * 현재 언어코드에서 `key` 에 해당하는 `TextRecord` 를 리턴한다.
@@ -6336,7 +6343,7 @@ class BSModal {
6336
6343
  }
6337
6344
  openAlert(title, message, clickHandler2) {
6338
6345
  const option = {
6339
- component: defineAsyncComponent(() => import("./BSAlertModal-DT2Wai4R.js")),
6346
+ component: defineAsyncComponent(() => import("./BSAlertModal-DBRQ0cCa.js")),
6340
6347
  bind: {
6341
6348
  title,
6342
6349
  message
@@ -6349,7 +6356,7 @@ class BSModal {
6349
6356
  }
6350
6357
  openYesNo(title, message, yesHandler, noHandler) {
6351
6358
  const option = {
6352
- component: defineAsyncComponent(() => import("./BSYesNoModal-C91E2MSF.js")),
6359
+ component: defineAsyncComponent(() => import("./BSYesNoModal-Dj2nMArb.js")),
6353
6360
  bind: {
6354
6361
  title,
6355
6362
  message
@@ -31483,13 +31490,13 @@ const tableContextMenus = (modal, editor) => {
31483
31490
  };
31484
31491
  const showTableProperties = (modal, editor) => {
31485
31492
  modal.openModal({
31486
- component: defineAsyncComponent(() => import("./TablePropertiesModal-D1wSXQ3C.js")),
31493
+ component: defineAsyncComponent(() => import("./TablePropertiesModal-BYjN7jg3.js")),
31487
31494
  bind: { editor }
31488
31495
  });
31489
31496
  };
31490
31497
  const insertTable = (modal, editor) => {
31491
31498
  modal.openModal({
31492
- component: defineAsyncComponent(() => import("./TableInsertModal-BfWLdDCa.js")),
31499
+ component: defineAsyncComponent(() => import("./TableInsertModal-CNnGZuaP.js")),
31493
31500
  bind: { editor }
31494
31501
  });
31495
31502
  };
@@ -31654,7 +31661,7 @@ const insertImage = (modal, editor) => {
31654
31661
  const component = (_a2 = blueseaConfig.componentConfig.richText) == null ? void 0 : _a2.imageInsertModal;
31655
31662
  if (component) {
31656
31663
  modal.openModal({
31657
- component: defineAsyncComponent(() => import("./ImageInsertModal-7u7YeHsI.js")),
31664
+ component: defineAsyncComponent(() => import("./ImageInsertModal-DeL97iRr.js")),
31658
31665
  bind: { editor },
31659
31666
  on: {
31660
31667
  insertImage: (image) => {
@@ -31672,7 +31679,7 @@ const insertImage = (modal, editor) => {
31672
31679
  };
31673
31680
  const showImageProperties = (modal, editor) => {
31674
31681
  modal.openModal({
31675
- component: defineAsyncComponent(() => import("./ImagePropertiesModal-HRPdVJRK.js")),
31682
+ component: defineAsyncComponent(() => import("./ImagePropertiesModal-DD6cl6c0.js")),
31676
31683
  bind: { editor }
31677
31684
  });
31678
31685
  };
@@ -32033,13 +32040,13 @@ const youtubeContextMenu = (modal, editor) => {
32033
32040
  };
32034
32041
  const insertYoutube = (modal, editor) => {
32035
32042
  modal.openModal({
32036
- component: defineAsyncComponent(() => import("./YoutubeInsertModal-DNq4v5Ll.js")),
32043
+ component: defineAsyncComponent(() => import("./YoutubeInsertModal-BSIDbYkd.js")),
32037
32044
  bind: { editor }
32038
32045
  });
32039
32046
  };
32040
32047
  const showYoutubeProperties = (modal, editor) => {
32041
32048
  modal.openModal({
32042
- component: defineAsyncComponent(() => import("./YoutubePropertiesModal-D2-7I2sg.js")),
32049
+ component: defineAsyncComponent(() => import("./YoutubePropertiesModal-VDPQiwEJ.js")),
32043
32050
  bind: { editor }
32044
32051
  });
32045
32052
  };
@@ -32083,7 +32090,7 @@ const _sfc_main$15 = /* @__PURE__ */ defineComponent({
32083
32090
  const showLinkProperties = () => {
32084
32091
  if (!props.disabled) {
32085
32092
  modal.openModal({
32086
- component: defineAsyncComponent(() => import("./LinkPropertiesModal-x73isyqI.js")),
32093
+ component: defineAsyncComponent(() => import("./LinkPropertiesModal-CkgkjB7g.js")),
32087
32094
  bind: {
32088
32095
  editor: props.editor
32089
32096
  }
@@ -32448,7 +32455,7 @@ const insertVideo = (modal, editor) => {
32448
32455
  const component = (_a2 = blueseaConfig.componentConfig.richText) == null ? void 0 : _a2.videoInsertModal;
32449
32456
  if (component) {
32450
32457
  modal.openModal({
32451
- component: defineAsyncComponent(() => import("./VideoInsertModal-DQ-wO6_P.js")),
32458
+ component: defineAsyncComponent(() => import("./VideoInsertModal-DIIzKI53.js")),
32452
32459
  bind: { editor },
32453
32460
  on: {
32454
32461
  insertVideo: (video) => {
@@ -32466,7 +32473,7 @@ const insertVideo = (modal, editor) => {
32466
32473
  };
32467
32474
  const showVideoProperties = (modal, editor) => {
32468
32475
  modal.openModal({
32469
- component: defineAsyncComponent(() => import("./VideoPropertiesModal-BYADjPfV.js")),
32476
+ component: defineAsyncComponent(() => import("./VideoPropertiesModal-DyMdwd1w.js")),
32470
32477
  bind: { editor }
32471
32478
  });
32472
32479
  };
@@ -34644,7 +34651,7 @@ const _sfc_main$Z = /* @__PURE__ */ defineComponent({
34644
34651
  emit("maximized");
34645
34652
  if (!props.internalMaximized) {
34646
34653
  modal.openModal({
34647
- component: defineAsyncComponent(() => import("./BSRichTextMaximizedModal-CaaSAgmI.js")),
34654
+ component: defineAsyncComponent(() => import("./BSRichTextMaximizedModal-D4w5hGdQ.js")),
34648
34655
  bind: {
34649
34656
  modelValue: getEditorValue(),
34650
34657
  contentMaxWidth: props.contentMaxWidth,
@@ -35301,7 +35308,7 @@ const _sfc_main$W = /* @__PURE__ */ defineComponent({
35301
35308
  const modal = useModal();
35302
35309
  const enterYoutubeUrl = () => {
35303
35310
  modal.openModal({
35304
- component: defineAsyncComponent(() => import("./BSYoutubeInputModal-DSI-NoGb.js")),
35311
+ component: defineAsyncComponent(() => import("./BSYoutubeInputModal-Mro_98AC.js")),
35305
35312
  on: {
35306
35313
  "update:modelValue": (url) => {
35307
35314
  emit("update:modelValue", {
@@ -38425,7 +38432,8 @@ const _sfc_main$H = /* @__PURE__ */ defineComponent({
38425
38432
  const likeFilterItems = computed(() => likeTextFilterItems.value.filter((item) => !item.filterCreator && item.filterType !== "NUMBER"));
38426
38433
  const equalFilterItemPropertyIds = computed(() => likeTextFilterItems.value.filter((item) => !item.filterCreator && item.filterType === "NUMBER").map((item) => item.propertyId));
38427
38434
  const customFilterItems = computed(() => likeTextFilterItems.value.filter((item) => item.filterCreator));
38428
- const inFilterItemPropertyIds = computed(() => inTextFilterItems.value.map((filter) => filter.propertyId));
38435
+ const stringInFilterItemPropertyIds = computed(() => inTextFilterItems.value.filter((item) => item.filterType !== "NUMBER").map((item) => item.propertyId));
38436
+ const numberInFilterItemPropertyIds = computed(() => inTextFilterItems.value.filter((item) => item.filterType === "NUMBER").map((item) => item.propertyId));
38429
38437
  const getFilterKeyword = (filter) => {
38430
38438
  const actualFilter = filter instanceof OrFilter ? filter.filters[0] : filter;
38431
38439
  if (actualFilter && "getFilterValueString" in actualFilter) {
@@ -38486,9 +38494,15 @@ const _sfc_main$H = /* @__PURE__ */ defineComponent({
38486
38494
  if (allFilters.length >= 2) return orFilter(allFilters);
38487
38495
  else return allFilters[0];
38488
38496
  } else if (filterMode.value === "TEXTAREA") {
38489
- const names = inFilterItemPropertyIds.value;
38490
38497
  const keywords2 = keyword2.split("\n");
38491
- return inFilter(names, keywords2, true);
38498
+ const stringNames = stringInFilterItemPropertyIds.value;
38499
+ const stringIn = stringNames.length > 0 ? inFilter(stringNames, keywords2, true) : void 0;
38500
+ const numberNames = numberInFilterItemPropertyIds.value;
38501
+ const numberKeywords = keywords2.map((k) => k.trim()).filter((k) => k !== "" && !Number.isNaN(Number(k))).map(Number);
38502
+ const numberIn = numberNames.length > 0 && numberKeywords.length > 0 ? inFilter(numberNames, numberKeywords, true) : void 0;
38503
+ const allFilters = [stringIn, numberIn].filter(notNull);
38504
+ if (allFilters.length >= 2) return orFilter(allFilters);
38505
+ else return allFilters[0];
38492
38506
  }
38493
38507
  };
38494
38508
  watch(
@@ -39007,7 +39021,7 @@ const _sfc_main$D = /* @__PURE__ */ defineComponent({
39007
39021
  const modal = useModal();
39008
39022
  const openSettingModal = () => {
39009
39023
  modal.openModal({
39010
- component: defineAsyncComponent(() => import("./BSGridColumnSettingModal-CUMe_yWj.js")),
39024
+ component: defineAsyncComponent(() => import("./BSGridColumnSettingModal-C7xgLov6.js")),
39011
39025
  bind: {
39012
39026
  columns: props.columns,
39013
39027
  columnSettings: props.columnSettings,
@@ -39673,7 +39687,7 @@ const _sfc_main$x = /* @__PURE__ */ defineComponent({
39673
39687
  }, null, 8, _hoisted_3$c)
39674
39688
  ]),
39675
39689
  createVNode(BSButton, {
39676
- caption: allExpanded.value ? "전체닫기" : "전체열기",
39690
+ caption: allExpanded.value ? { key: "bs.collapseAll" } : { key: "bs.expandAll" },
39677
39691
  "left-icon": allExpanded.value ? "expand_less" : "expand_more",
39678
39692
  class: "border-0",
39679
39693
  onClick: expandAll
@@ -39683,7 +39697,7 @@ const _sfc_main$x = /* @__PURE__ */ defineComponent({
39683
39697
  };
39684
39698
  }
39685
39699
  });
39686
- const BSListControl = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["__scopeId", "data-v-487255f8"]]);
39700
+ const BSListControl = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["__scopeId", "data-v-6e4e4dbf"]]);
39687
39701
  const _sfc_main$w = /* @__PURE__ */ defineComponent({
39688
39702
  __name: "BSHorizontalLayoutResizer",
39689
39703
  emits: ["resized"],
@@ -6,9 +6,10 @@ export type TextRecord = {
6
6
  export type ResolvedTextRecord = TextRecord & {
7
7
  resolved: boolean;
8
8
  };
9
+ export type CompactTexts = Record<string, string | (string | number)[]>;
9
10
  export declare class I18NTexts {
10
11
  private localeTexts;
11
- addTexts(locale: string, textList: TextRecord[]): void;
12
+ addTexts(locale: string, input: TextRecord[] | CompactTexts): void;
12
13
  /**
13
14
  * 현재 언어코드에서 `key` 에 해당하는 `TextRecord` 를 리턴한다.
14
15
  * @param key
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@g1cloud/bluesea",
3
3
  "private": false,
4
- "version": "5.0.0-beta.27",
4
+ "version": "5.0.0-beta.29",
5
5
  "description": "Ui Library for g1cloud BackOffice.",
6
6
  "type": "module",
7
7
  "engines": {
@@ -14,11 +14,16 @@
14
14
  "css",
15
15
  "scss",
16
16
  "text",
17
+ "skills",
18
+ "bin",
17
19
  "!dist/tests"
18
20
  ],
19
21
  "module": "dist/bluesea.js",
20
22
  "main": "dist/bluesea.js",
21
23
  "types": "dist/index.d.ts",
24
+ "bin": {
25
+ "bluesea-install-skill": "./bin/install-claude-skill.mjs"
26
+ },
22
27
  "dependencies": {
23
28
  "@codemirror/lang-css": "^6.2.1",
24
29
  "@codemirror/lang-html": "^6.4.9",