@g1cloud/bluesea 5.0.0-beta.3 → 5.0.0-beta.30

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 (87) hide show
  1. package/README.md +21 -0
  2. package/bin/install-claude-skill.mjs +74 -0
  3. package/css/bluesea.css +231 -36
  4. package/dist/{BSAlertModal-xBi30_WT.js → BSAlertModal-DulqxsTV.js} +1 -1
  5. package/dist/{BSGridColumnSettingModal-CGOmNxYg.js → BSGridColumnSettingModal-BN6Vj68A.js} +1 -1
  6. package/dist/{BSRichTextMaximizedModal-bwfs_ETq.js → BSRichTextMaximizedModal-CIAHu7mO.js} +1 -1
  7. package/dist/{BSYesNoModal-g_jspSyV.js → BSYesNoModal-Dyn0eiZN.js} +1 -1
  8. package/dist/{BSYoutubeInputModal-gxqSatHw.js → BSYoutubeInputModal-DvZGT4dE.js} +7 -2
  9. package/dist/{ImageInsertModal-BjQMX1aF.js → ImageInsertModal-DxWDiQqF.js} +2 -2
  10. package/dist/{ImageProperties.vue_vue_type_script_setup_true_lang-DngZdEN7.js → ImageProperties.vue_vue_type_script_setup_true_lang-Dw56sBEs.js} +1 -1
  11. package/dist/{ImagePropertiesModal-BVMSRdqN.js → ImagePropertiesModal-C1w8G5aD.js} +2 -2
  12. package/dist/{LinkPropertiesModal-CjQMdxnd.js → LinkPropertiesModal-Iaj5Zq08.js} +1 -1
  13. package/dist/{TableInsertModal-W9oMIgb_.js → TableInsertModal-Bwv292s8.js} +1 -1
  14. package/dist/{TablePropertiesModal-rKhKzzYG.js → TablePropertiesModal-CAj9cBv4.js} +1 -1
  15. package/dist/{VideoInsertModal-DMtZM5vy.js → VideoInsertModal-BBOCUIsN.js} +2 -2
  16. package/dist/{VideoProperties.vue_vue_type_script_setup_true_lang-CbE-PZdm.js → VideoProperties.vue_vue_type_script_setup_true_lang-B5E8cj0N.js} +1 -1
  17. package/dist/{VideoPropertiesModal-CLkvzq3Y.js → VideoPropertiesModal-DynwQU29.js} +2 -2
  18. package/dist/{YoutubeInsertModal-4_qANoY5.js → YoutubeInsertModal-EZ3bANQG.js} +2 -2
  19. package/dist/{YoutubeProperties.vue_vue_type_script_setup_true_lang-B-LT9GYf.js → YoutubeProperties.vue_vue_type_script_setup_true_lang-C_dg08zX.js} +1 -1
  20. package/dist/{YoutubePropertiesModal-BKwZsK6d.js → YoutubePropertiesModal-BCID3YkI.js} +2 -2
  21. package/dist/bluesea.css +194 -33
  22. package/dist/bluesea.js +218 -209
  23. package/dist/bluesea.umd.cjs +2240 -1217
  24. package/dist/component/grid/BSGrid.vue.d.ts +3 -3
  25. package/dist/component/grid/BSGridLookup.vue.d.ts +3 -1
  26. package/dist/component/grid/DateFilterModel.d.ts +15 -0
  27. package/dist/component/grid/GridLib.d.ts +2 -1
  28. package/dist/component/grid/GridModel.d.ts +9 -1
  29. package/dist/component/input/BSCheckboxGroup.vue.d.ts +3 -0
  30. package/dist/component/input/BSColorInput.vue.d.ts +2 -0
  31. package/dist/component/input/BSDateInput.vue.d.ts +2 -0
  32. package/dist/component/input/BSDateRange.vue.d.ts +2 -0
  33. package/dist/component/input/BSDateRangePresets.vue.d.ts +2 -2
  34. package/dist/component/input/BSFileUpload.vue.d.ts +76 -0
  35. package/dist/component/input/BSImageUpload.vue.d.ts +6 -0
  36. package/dist/component/input/BSMediaPreview.vue.d.ts +2 -0
  37. package/dist/component/input/BSMediaPreviewOverlay.vue.d.ts +44 -0
  38. package/dist/component/input/BSMultiImageUpload.vue.d.ts +4 -0
  39. package/dist/component/input/BSMultiSelect.vue.d.ts +10 -1
  40. package/dist/component/input/BSNumberInput.vue.d.ts +7 -0
  41. package/dist/component/input/BSPercentInput.vue.d.ts +166 -0
  42. package/dist/component/input/BSPopupSelect.vue.d.ts +3 -3
  43. package/dist/component/input/BSPositionedImageUpload.vue.d.ts +2 -0
  44. package/dist/component/input/BSPriceInput.vue.d.ts +9 -0
  45. package/dist/component/input/BSRadioButton.vue.d.ts +3 -3
  46. package/dist/component/input/BSRadioButtonGroup.vue.d.ts +3 -0
  47. package/dist/component/input/BSSelect.vue.d.ts +13 -1
  48. package/dist/component/input/BSSelectPopup.vue.d.ts +4 -1
  49. package/dist/component/input/BSTextArea.vue.d.ts +2 -0
  50. package/dist/component/input/BSTextInput.vue.d.ts +2 -0
  51. package/dist/component/input/BSTreeMultiSelect.vue.d.ts +6 -0
  52. package/dist/component/input/BSTreeSelect.vue.d.ts +6 -0
  53. package/dist/component/input/BSYesNoGroup.vue.d.ts +4 -0
  54. package/dist/component/input/BSYesNoSelect.vue.d.ts +4 -0
  55. package/dist/component/input/DateRangePresetModel.d.ts +2 -0
  56. package/dist/component/input/ImageUploadModel.d.ts +2 -0
  57. package/dist/component/layout/BSCardLayout.vue.d.ts +6 -10
  58. package/dist/component/layout/BSListLayout.vue.d.ts +3 -0
  59. package/dist/component/layout/BSListLayoutItem.vue.d.ts +3 -0
  60. package/dist/component/layout/BSTabSheet.vue.d.ts +2 -0
  61. package/dist/component/multilang/BSMultiLangHtmlEditor.vue.d.ts +2 -0
  62. package/dist/component/multilang/BSMultiLangTextArea.vue.d.ts +2 -0
  63. package/dist/component/multilang/BSMultiLangTextInput.vue.d.ts +2 -0
  64. package/dist/component/tree/BSTree.vue.d.ts +6 -0
  65. package/dist/component/tree/BSTreeRow.vue.d.ts +6 -3
  66. package/dist/component/tree/TreeLib.d.ts +20 -0
  67. package/dist/component/tree/TreeModel.d.ts +33 -1
  68. package/dist/config/config.d.ts +14 -6
  69. package/dist/directive/vT.d.ts +6 -1
  70. package/dist/frame/default/DefaultFrameModel.d.ts +2 -0
  71. package/dist/{index-BQZ3zTp7.js → index-DUGkQHsb.js} +2354 -1336
  72. package/dist/index.d.ts +4 -1
  73. package/dist/model/CommonTypes.d.ts +1 -1
  74. package/dist/text/i18n.d.ts +2 -1
  75. package/dist/util/formatUtil.d.ts +4 -4
  76. package/dist/validator/FormValidator.d.ts +5 -0
  77. package/package.json +6 -1
  78. package/skills/bluesea-ui/SKILL.md +312 -0
  79. package/skills/bluesea-ui/references/components.md +189 -0
  80. package/skills/bluesea-ui/references/grid.md +159 -0
  81. package/skills/bluesea-ui/references/i18n.md +126 -0
  82. package/skills/bluesea-ui/references/validation.md +176 -0
  83. package/text/bluesea_text_en.json +248 -956
  84. package/text/bluesea_text_fr.json +248 -956
  85. package/text/bluesea_text_ja.json +248 -956
  86. package/text/bluesea_text_ko.json +248 -956
  87. package/text/bluesea_text_zh.json +248 -956
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
@@ -18681,6 +18681,19 @@ html {
18681
18681
  min-width: 100%;
18682
18682
  }
18683
18683
 
18684
+ .bs-popup-button.icon-only > button {
18685
+ border: 0 !important;
18686
+ padding: 4px 0;
18687
+ }
18688
+
18689
+ .bs-popup-button.icon-only > button > .font-icon {
18690
+ font-size: 1.2rem;
18691
+ }
18692
+
18693
+ .bs-popup-button.icon-only > button > .font-icon.right {
18694
+ display: none;
18695
+ }
18696
+
18684
18697
  .bs-box-component-wrap, .bs-select-wrap, .bs-input-wrap, .bs-text-input {
18685
18698
  display: inline-flex;
18686
18699
  flex-direction: column;
@@ -21505,11 +21518,11 @@ html {
21505
21518
  }
21506
21519
 
21507
21520
  .bs-color-input.error input[type=color] {
21508
- border-color: var(--error);
21521
+ border-color: var(--danger);
21509
21522
  }
21510
21523
 
21511
21524
  .bs-color-input.error .bs-text-input .input-area {
21512
- border-color: var(--error);
21525
+ border-color: var(--danger);
21513
21526
  }
21514
21527
 
21515
21528
  .bs-color-input.modified input[type=color] {
@@ -21520,6 +21533,12 @@ html {
21520
21533
  border-color: var(--purple);
21521
21534
  }
21522
21535
 
21536
+ .bs-color-input.disabled input[type=color] {
21537
+ border-color: var(--border) !important;
21538
+ background-color: var(--gray-100) !important;
21539
+ color: var(--gray-400) !important;
21540
+ }
21541
+
21523
21542
  .bs-color-input .view-mode {
21524
21543
  line-height: 1;
21525
21544
  }
@@ -25378,24 +25397,33 @@ html {
25378
25397
  position: relative;
25379
25398
  align-items: center;
25380
25399
  height: 28px;
25381
- padding: 0 4px;
25400
+ padding: 0 3px;
25382
25401
  border-radius: 4px;
25383
25402
  cursor: pointer;
25403
+ border: 1px solid transparent;
25404
+ }
25405
+
25406
+ .bs-tree-row .row-caption.selected {
25407
+ background-color: var(--blue-bg);
25408
+ }
25409
+
25410
+ .bs-tree-row .row-caption.selected .caption {
25411
+ color: var(--blue);
25412
+ font-weight: bold;
25413
+ }
25414
+
25415
+ .bs-tree-row .row-caption.focused {
25416
+ border: 1px solid var(--blue);
25384
25417
  }
25385
25418
 
25386
25419
  .bs-tree-row .row-caption .caption {
25387
- padding: 4px;
25420
+ padding: 3px;
25388
25421
  cursor: pointer;
25389
25422
  user-select: none;
25390
25423
  flex-grow: 1;
25391
25424
  white-space: nowrap;
25392
25425
  }
25393
25426
 
25394
- .bs-tree-row .row-caption .caption.selected {
25395
- color: var(--blue);
25396
- font-weight: bold;
25397
- }
25398
-
25399
25427
  .bs-tree-row .row-caption > .expand-icon {
25400
25428
  transform: rotate(-90deg);
25401
25429
  transition: transform 300ms ease;
@@ -25462,6 +25490,7 @@ html {
25462
25490
  .bs-tree {
25463
25491
  overflow: auto;
25464
25492
  position: relative;
25493
+ outline: 0;
25465
25494
  }
25466
25495
 
25467
25496
  .bs-tree > .tree-wrap {
@@ -26526,7 +26555,7 @@ html {
26526
26555
  min-width: 200px;
26527
26556
  }
26528
26557
 
26529
- .bs-popup-select[data-v-70cc785c] {
26558
+ .bs-popup-select[data-v-d74fd89c] {
26530
26559
  column-gap: 8px !important;
26531
26560
  }
26532
26561
 
@@ -27084,7 +27113,7 @@ input[data-v-ef5774f0] {
27084
27113
  color: var(--body-text);
27085
27114
  }
27086
27115
 
27087
- input[data-v-8648edf8] {
27116
+ input[data-v-d556d8eb] {
27088
27117
  width: 48px;
27089
27118
  height: 26px;
27090
27119
  padding: 2px 4px;
@@ -27093,11 +27122,11 @@ input[data-v-8648edf8] {
27093
27122
  background-color: var(--body-bg);
27094
27123
  }
27095
27124
 
27096
- span.table-property[data-v-96d890f0] {
27125
+ span.table-property[data-v-537f70be] {
27097
27126
  position: relative;
27098
27127
  }
27099
27128
 
27100
- span.table-property[data-v-96d890f0]:after {
27129
+ span.table-property[data-v-537f70be]:after {
27101
27130
  content: "settings";
27102
27131
  position: absolute;
27103
27132
  font-size: 0.5em;
@@ -27733,6 +27762,60 @@ div[data-v-c1655c12] {
27733
27762
  display: block;
27734
27763
  }
27735
27764
 
27765
+ .bs-media-overlay {
27766
+ position: fixed;
27767
+ inset: 0;
27768
+ z-index: 250;
27769
+ background-color: rgba(0, 0, 0, 0.9);
27770
+ display: flex;
27771
+ align-items: center;
27772
+ justify-content: center;
27773
+ }
27774
+
27775
+ .bs-media-overlay .bs-media-overlay-media {
27776
+ max-width: 95vw;
27777
+ max-height: 95vh;
27778
+ object-fit: contain;
27779
+ }
27780
+
27781
+ .bs-media-overlay .bs-media-overlay-close {
27782
+ position: absolute;
27783
+ top: 12px;
27784
+ right: 12px;
27785
+ color: var(--white);
27786
+ font-size: 1.8em;
27787
+ background-color: rgba(0, 0, 0, 0.5);
27788
+ border-radius: 4px;
27789
+ padding: 4px;
27790
+ line-height: 1;
27791
+ }
27792
+
27793
+ .bs-media-overlay .bs-media-overlay-nav {
27794
+ position: absolute;
27795
+ top: 50%;
27796
+ transform: translateY(-50%);
27797
+ color: var(--white);
27798
+ font-size: 3em;
27799
+ background-color: rgba(0, 0, 0, 0.5);
27800
+ border-radius: 4px;
27801
+ padding: 8px 4px;
27802
+ line-height: 1;
27803
+ user-select: none;
27804
+ }
27805
+
27806
+ .bs-media-overlay .bs-media-overlay-prev {
27807
+ left: 12px;
27808
+ }
27809
+
27810
+ .bs-media-overlay .bs-media-overlay-next {
27811
+ right: 12px;
27812
+ }
27813
+
27814
+ .bs-media-overlay .bs-media-overlay-nav-disabled {
27815
+ opacity: 0.25;
27816
+ cursor: default;
27817
+ }
27818
+
27736
27819
  .bs-image-upload {
27737
27820
  display: inline-block;
27738
27821
  }
@@ -27800,22 +27883,22 @@ div[data-v-c1655c12] {
27800
27883
  border-color: var(--border) !important;
27801
27884
  }
27802
27885
 
27803
- .image-upload-move[data-v-872f4521],
27804
- .image-upload-enter-active[data-v-872f4521],
27805
- .image-upload-leave-active[data-v-872f4521] {
27886
+ .image-upload-move[data-v-e57e268c],
27887
+ .image-upload-enter-active[data-v-e57e268c],
27888
+ .image-upload-leave-active[data-v-e57e268c] {
27806
27889
  transition: all 0.3s ease;
27807
27890
  }
27808
27891
 
27809
- .image-upload-leave-from[data-v-872f4521],
27810
- .image-upload-leave-to[data-v-872f4521] {
27892
+ .image-upload-leave-from[data-v-e57e268c],
27893
+ .image-upload-leave-to[data-v-e57e268c] {
27811
27894
  display: none;
27812
27895
  }
27813
27896
 
27814
- .image-upload-enter-from[data-v-872f4521] {
27897
+ .image-upload-enter-from[data-v-e57e268c] {
27815
27898
  opacity: 0;
27816
27899
  }
27817
27900
 
27818
- .image-upload-leave-active[data-v-872f4521] {
27901
+ .image-upload-leave-active[data-v-e57e268c] {
27819
27902
  position: absolute;
27820
27903
  }
27821
27904
 
@@ -27845,6 +27928,99 @@ div[data-v-c1655c12] {
27845
27928
  color: #999;
27846
27929
  }
27847
27930
 
27931
+ .bs-file-upload {
27932
+ display: inline-block;
27933
+ }
27934
+
27935
+ .bs-file-upload.modified .file-box {
27936
+ border-color: var(--purple) !important;
27937
+ }
27938
+
27939
+ .bs-file-upload.error .file-box {
27940
+ border-color: var(--red) !important;
27941
+ }
27942
+
27943
+ .bs-file-upload .file-box {
27944
+ border: 1px solid var(--border);
27945
+ border-radius: 4px;
27946
+ padding: 8px 12px;
27947
+ display: flex;
27948
+ align-items: center;
27949
+ gap: 8px;
27950
+ min-height: 40px;
27951
+ }
27952
+
27953
+ .bs-file-upload .file-box .file-icon {
27954
+ color: var(--gray-500);
27955
+ font-size: 1.2em;
27956
+ }
27957
+
27958
+ .bs-file-upload .file-box .file-name {
27959
+ flex: 1;
27960
+ overflow: hidden;
27961
+ text-overflow: ellipsis;
27962
+ white-space: nowrap;
27963
+ }
27964
+
27965
+ .bs-file-upload .file-box a.file-name {
27966
+ color: var(--primary);
27967
+ text-decoration: none;
27968
+ }
27969
+
27970
+ .bs-file-upload .file-box a.file-name:hover {
27971
+ text-decoration: underline;
27972
+ }
27973
+
27974
+ .bs-file-upload .file-box .remove-btn {
27975
+ border: none;
27976
+ background: none;
27977
+ padding: 4px;
27978
+ color: var(--gray-500);
27979
+ display: flex;
27980
+ align-items: center;
27981
+ justify-content: center;
27982
+ }
27983
+
27984
+ .bs-file-upload .file-box .remove-btn:hover {
27985
+ color: var(--red);
27986
+ }
27987
+
27988
+ .bs-file-upload .upload-btn-wrapper {
27989
+ width: 100%;
27990
+ display: flex;
27991
+ align-items: center;
27992
+ justify-content: center;
27993
+ }
27994
+
27995
+ .bs-file-upload .upload-btn-wrapper .upload-btn {
27996
+ display: flex;
27997
+ align-items: center;
27998
+ gap: 4px;
27999
+ color: var(--gray-500);
28000
+ padding: 4px 8px;
28001
+ border-radius: 4px;
28002
+ }
28003
+
28004
+ .bs-file-upload .upload-btn-wrapper .upload-btn:hover:not(.disabled) {
28005
+ background-color: var(--gray-100);
28006
+ color: var(--color-text);
28007
+ }
28008
+
28009
+ .bs-file-upload .upload-btn-wrapper .no-file {
28010
+ color: var(--gray-400);
28011
+ }
28012
+
28013
+ .bs-file-upload .upload-btn-wrapper.dropping {
28014
+ background-color: var(--primary-200);
28015
+ border: 2px dashed var(--primary);
28016
+ border-radius: 4px;
28017
+ }
28018
+
28019
+ .bs-file-upload .disabled .file-box {
28020
+ opacity: 0.5;
28021
+ border-color: var(--border) !important;
28022
+ }
28023
+
27848
28024
  .resize-handle[data-v-f4cd842f] {
27849
28025
  position: absolute;
27850
28026
  width: 5px;
@@ -29823,6 +29999,11 @@ div[data-v-c1655c12] {
29823
29999
  width: 100%;
29824
30000
  overflow-x: auto;
29825
30001
  overflow-y: hidden;
30002
+ scrollbar-width: none;
30003
+ }
30004
+
30005
+ .bs-tab-sheet .tab-bar::-webkit-scrollbar {
30006
+ display: none;
29826
30007
  }
29827
30008
 
29828
30009
  .bs-tab-sheet .tab-bar .tabs {
@@ -29839,7 +30020,7 @@ div[data-v-c1655c12] {
29839
30020
  margin-bottom: -1px;
29840
30021
  white-space: nowrap;
29841
30022
  cursor: pointer;
29842
- overflow-x: auto;
30023
+ overflow-x: hidden;
29843
30024
  }
29844
30025
 
29845
30026
  .bs-tab-sheet .tab-bar .tabs .tab + .tab:before {
@@ -29940,16 +30121,9 @@ div[data-v-c1655c12] {
29940
30121
 
29941
30122
  .bs-list-layout-item {
29942
30123
  position: relative;
29943
- border: 1px solid var(--gray-200);
29944
- margin-top: -1px;
29945
- }
29946
-
29947
- .bs-list-layout-item:nth-child(odd) .list-item-title {
29948
30124
  background-color: var(--body-bg);
29949
- }
29950
-
29951
- .bs-list-layout-item:nth-child(even) .list-item-title {
29952
- background-color: var(--gray-100);
30125
+ border: 1px solid var(--gray-300);
30126
+ margin-top: -1px;
29953
30127
  }
29954
30128
 
29955
30129
  .bs-list-layout-item.selected {
@@ -29966,11 +30140,32 @@ div[data-v-c1655c12] {
29966
30140
  }
29967
30141
 
29968
30142
  .bs-list-layout-item > .list-item-title {
29969
- padding: 4px 8px;
30143
+ padding: 8px;
30144
+ background-color: var(--gray-200);
29970
30145
  }
29971
30146
 
29972
- .bs-list-layout-item > .list-item-title > .title-text {
29973
- font-size: 1.2em;
30147
+ .bs-list-layout-item:first-child {
30148
+ border-top-left-radius: 8px;
30149
+ border-top-right-radius: 8px;
30150
+ }
30151
+
30152
+ .bs-list-layout-item:first-child > .list-item-title {
30153
+ border-top-left-radius: 7px;
30154
+ border-top-right-radius: 7px;
30155
+ }
30156
+
30157
+ .bs-list-layout-item:last-child {
30158
+ border-bottom-left-radius: 8px;
30159
+ border-bottom-right-radius: 8px;
30160
+ }
30161
+
30162
+ .bs-list-layout-item:last-child:not(.expanded) > .list-item-title {
30163
+ border-bottom-left-radius: 7px;
30164
+ border-bottom-right-radius: 7px;
30165
+ }
30166
+
30167
+ .bs-list-layout-item.expanded > .list-item-title {
30168
+ border-bottom: 1px solid var(--gray-300);
29974
30169
  }
29975
30170
 
29976
30171
  .bs-list-layout-item .bs-checkbox.checked input::before {
@@ -29978,15 +30173,15 @@ div[data-v-c1655c12] {
29978
30173
  }
29979
30174
 
29980
30175
  .bs-list-layout-item > .list-item-content {
29981
- padding: 8px 8px 8px 42px;
30176
+ padding: 8px;
29982
30177
  }
29983
30178
 
29984
- .bs-button[data-v-0f28f6a6] {
30179
+ .bs-button[data-v-6e4e4dbf] {
29985
30180
  padding: 3px;
29986
30181
  height: auto;
29987
30182
  }
29988
30183
 
29989
- .bs-button[data-v-0f28f6a6] .font-icon {
30184
+ .bs-button[data-v-6e4e4dbf] .font-icon {
29990
30185
  font-size: 12px;
29991
30186
  }
29992
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, j as vFocusOnLoad } from "./index-BQZ3zTp7.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, v as vT, B as BSButton, l as vFocusOnLoad } from "./index-DUGkQHsb.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 { f as createInputGridHandler, u as useModalHandle, _ as _sfc_main$1, B as BSButton, g as _sfc_main$2, h as _sfc_main$3, i as _sfc_main$4, n as notNull } from "./index-BQZ3zTp7.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-DUGkQHsb.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-BQZ3zTp7.js";
2
+ import { u as useModalHandle, d as _sfc_main$1 } from "./index-DUGkQHsb.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-BQZ3zTp7.js";
2
+ import { u as useModalHandle, _ as _sfc_main$1, v as vT, B as BSButton } from "./index-DUGkQHsb.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 } from "./index-BQZ3zTp7.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-DUGkQHsb.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" };
@@ -18,7 +18,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
18
18
  const modalHandle = useModalHandle();
19
19
  const select = () => {
20
20
  const videoId = extractYoutubeVideoId(url.value);
21
- modelValue.value = videoId ? `https://youtu.be/${videoId}` : void 0;
21
+ if (videoId) {
22
+ const nocookie = isYoutubeNocookieUrl(url.value);
23
+ modelValue.value = buildYoutubeUrl(videoId, nocookie);
24
+ } else {
25
+ modelValue.value = void 0;
26
+ }
22
27
  modalHandle.close();
23
28
  };
24
29
  const close = () => {
@@ -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-BQZ3zTp7.js";
3
- import { _ as _sfc_main$5 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-DngZdEN7.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-DUGkQHsb.js";
3
+ import { _ as _sfc_main$5 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-Dw56sBEs.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-BQZ3zTp7.js";
2
+ import { b as _sfc_main$1, c as _sfc_main$2, v as vT } from "./index-DUGkQHsb.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 { o as findImageNode, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, m as formValidator, p as imageInfoNumberToPixel } from "./index-BQZ3zTp7.js";
3
- import { _ as _sfc_main$4 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-DngZdEN7.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-DUGkQHsb.js";
3
+ import { _ as _sfc_main$4 } from "./ImageProperties.vue_vue_type_script_setup_true_lang-Dw56sBEs.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-BQZ3zTp7.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-DUGkQHsb.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, h as _sfc_main$3 } from "./index-BQZ3zTp7.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-DUGkQHsb.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 { k 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, l as _sfc_main$4, m as formValidator } from "./index-BQZ3zTp7.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-DUGkQHsb.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-BQZ3zTp7.js";
3
- import { _ as _sfc_main$5 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-CbE-PZdm.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-DUGkQHsb.js";
3
+ import { _ as _sfc_main$5 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-B5E8cj0N.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 { i as _sfc_main$1, b as _sfc_main$2, c as _sfc_main$3, v as vT } from "./index-BQZ3zTp7.js";
2
+ import { k as _sfc_main$1, b as _sfc_main$2, c as _sfc_main$3, v as vT } from "./index-DUGkQHsb.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 { s as findVideoNode, u as useModalHandle, _ as _sfc_main$1, B as BSButton, b as _sfc_main$2, c as _sfc_main$3, m as formValidator, t as videoInfoNumberToPixel } from "./index-BQZ3zTp7.js";
3
- import { _ as _sfc_main$4 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-CbE-PZdm.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-DUGkQHsb.js";
3
+ import { _ as _sfc_main$4 } from "./VideoProperties.vue_vue_type_script_setup_true_lang-B5E8cj0N.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-BQZ3zTp7.js";
3
- import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-B-LT9GYf.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-DUGkQHsb.js";
3
+ import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-C_dg08zX.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-BQZ3zTp7.js";
2
+ import { b as _sfc_main$1, c as _sfc_main$2, v as vT } from "./index-DUGkQHsb.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 { q as findYoutubeNode, r 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-BQZ3zTp7.js";
3
- import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-B-LT9GYf.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-DUGkQHsb.js";
3
+ import { _ as _sfc_main$4 } from "./YoutubeProperties.vue_vue_type_script_setup_true_lang-C_dg08zX.js";
4
4
  const _hoisted_1 = {
5
5
  key: 0,
6
6
  class: "bs-layout-form"