waibu-bootstrap 1.1.5 → 1.1.7

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "waibu-bootstrap",
3
- "version": "1.1.5",
3
+ "version": "1.1.7",
4
4
  "description": "Bootstrap suport for Waibu Framework",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,21 @@
1
+ async function factory (pkgName) {
2
+ const me = this
3
+
4
+ return class WaibuBootstrap extends this.lib.BajoPlugin {
5
+ constructor () {
6
+ super(pkgName, me.app)
7
+ this.alias = 'wbs'
8
+ this.dependencies = ['waibu-mpa', 'waibu-extra']
9
+ this.config = {
10
+ waibu: {
11
+ prefix: 'bootstrap'
12
+ },
13
+ siteSetting: {
14
+ toastAutohideDelayDur: '5s'
15
+ }
16
+ }
17
+ }
18
+ }
19
+ }
20
+
21
+ export default factory
@@ -11,21 +11,22 @@ async function accordionItem () {
11
11
 
12
12
  build = async () => {
13
13
  const { omit, without } = this.plugin.lib._
14
- const { groupAttrs } = this.plugin.app.waibuMpa
15
- const group = groupAttrs(this.params.attr, ['body'])
14
+ const { groupAttrs, attribsStringify } = this.plugin.app.waibuMpa
15
+ const group = groupAttrs(this.params.attr, ['body', 'header'])
16
16
  if (!group.body.noPadding) group.body.class.push('accordion-body')
17
17
  const clsList = without(this.params.attr.class, cls)
18
- const header = ['<h2 class="accordion-header">',
18
+ group.header.class.push('accordion-header')
19
+ const header = [`<c:h2 ${attribsStringify(group.header)}>`,
19
20
  `<button class="${this.params.attr.narrowHeader ? 'px-3 py-2 ' : ''}accordion-button${this.params.attr.showOnStart ? '' : ' collapsed'}"`,
20
21
  `type="button" data-bs-toggle="collapse" data-bs-target="#${this.params.attr.id}"`,
21
22
  `aria-expanded="${this.params.attr.showOnStart}"`,
22
23
  'x-data',
23
24
  `@click="$dispatch('accordion-item', { id: $el.closest('.accordion').id, cls: '${clsList.join(' ')}' })"`,
24
- `aria-controls="${this.params.attr.id}">${this.params.attr.header}</button></h2>`]
25
+ `aria-controls="${this.params.attr.id}">${this.params.attr.header}</button></c:h2>`]
25
26
  const body = await this.component.buildTag({ tag: 'div', attr: group.body, html: this.params.html })
26
27
  const details = [`<div id="${this.params.attr.id}" class="accordion-collapse collapse${this.params.attr.showOnStart ? ' show' : ''}">`,
27
28
  body, '</div']
28
- this.params.html = `${header.join(' ')}\n${details.join(' ')}`
29
+ this.params.html = await this.component.buildSentence(`${header.join(' ')}\n${details.join(' ')}`)
29
30
  this.params.attr = omit(this.params.attr, ['id', 'noPadding', 'narrowHeader', 'bodyClass'])
30
31
  }
31
32
  }
@@ -21,19 +21,24 @@ async function appLauncherTrigger () {
21
21
 
22
22
  build = async () => {
23
23
  const { fastGlob } = this.plugin.lib
24
- const { omit } = this.plugin.lib._
25
- let logo = 'waibu'
26
- const files = await fastGlob(`${this.plugin.app.main.dir.pkg}/plugin/logo.*`)
27
- if (files.length > 0) logo = 'main'
24
+ const { groupAttrs, attribsStringify } = this.plugin.app.waibuMpa
25
+ const group = groupAttrs(this.params.attr, ['img'])
26
+ this.params.attr = group._
27
+ let src = group.img.src
28
+ if (!src) {
29
+ let logo = 'waibu'
30
+ const files = await fastGlob(`${this.plugin.app.main.dir.pkg}/plugin/logo.*`)
31
+ if (files.length > 0) logo = 'main'
32
+ src = `waibuMpa:/logo/${logo}`
33
+ }
28
34
  this.params.tag = 'a'
29
35
  const sentence = [
30
- `<c:img src="waibuMpa:/logo/${logo}"`,
31
- `width="${this.params.attr.imgDimWidth}" height="${this.params.attr.imgDimHeight}"`
36
+ `<c:img src="${src}"`,
37
+ `width="${group.img.dimWidth}" height="${group.img.dimHeight}"`
32
38
  ]
33
- if (this.params.attr.imgStyle) sentence.push(`style="${this.params.attr.imgStyle}"`)
39
+ if (group.img.style) sentence.push(`style="${attribsStringify(group.img.style)}"`)
34
40
  sentence.push('/>')
35
41
  this.params.html = await this.component.buildSentence(sentence)
36
- this.params.attr = omit(this.params.attr, ['imgDimHeight', 'imgDimWidth', 'imgStyle'])
37
42
  }
38
43
  }
39
44
  }
@@ -10,34 +10,60 @@ async function appLauncher () {
10
10
 
11
11
  build = async () => {
12
12
  const { groupAttrs, attrToArray } = this.plugin.app.waibuMpa
13
+ const menu = this.params.attr.menu ?? 'pages'
13
14
  const group = groupAttrs(this.params.attr, ['trigger'])
14
- let launcher = `<c:drawer id="${this.params.attr.id}" t:title="Modules" no-padding>\n`
15
- launcher += '<c:div padding="start-3 bottom-3 end-3">'
15
+ let launcher = `<c:drawer id="${this.params.attr.id}" t:title="Modules" no-padding style="${menu === 'pages' ? 'width:350px' : ''}">\n`
16
16
  if (this.params.attr.type === 'modal') launcher = `<c:modal id="${this.params.attr.id}" t:title="Modules" centered>\n`
17
17
  const toolbar = attrToArray(this.params.attr.toolbar)
18
18
  if (toolbar.length > 0) {
19
- launcher += '<c:navbar>\n<c:nav tag="ul" dim="width:100" flex="justify-content:end">\n'
19
+ if (menu === 'pages') toolbar.unshift('home')
20
+ launcher += `<c:div padding="x-3 ${menu === 'home' ? 'bottom-3' : ''}">`
21
+ launcher += '<c:navbar padding="y-0">\n<c:nav tag="ul" dim="width:100" flex="justify-content:end">\n'
20
22
  for (const t of toolbar) {
21
- if (t === 'user') launcher += '<c:nav-dropdown-user />\n'
23
+ if (t === 'home') launcher += '<c:nav-item href="/" icon="house" padding="end-2" />\n'
24
+ if (t === 'user') launcher += '<c:nav-dropdown-user padding="end-2" />\n'
22
25
  if (t === '-') launcher += '<c:nav-divider />\n'
23
- if (t === 'fullscreen') launcher += '<c:nav-toggle-fullscreen />\n'
24
- if (t === 'darkmode') launcher += '<c:nav-dropdown-darkmode dropdown-menu="end" />\n'
25
- if (t === 'language') launcher += '<c:nav-dropdown-language dropdown-menu="end" />\n'
26
+ if (t === 'fullscreen') launcher += '<c:nav-toggle-fullscreen padding="end-2" />\n'
27
+ if (t === 'darkmode') launcher += '<c:nav-dropdown-darkmode padding="end-2" dropdown-menudir="end" />\n'
28
+ if (t === 'language') launcher += '<c:nav-dropdown-language padding="end-2" dropdown-menudir="end" />\n'
26
29
  }
27
- launcher += '</c:nav></c:navbar>\n'
30
+ launcher += '</c:nav></c:navbar></c:div>\n'
28
31
  }
29
- launcher += '<c:grid-row gutter="1">\n'
30
- for (const m of (this.component.locals.menu.homes ?? [])) {
31
- launcher += `
32
- <c:grid-col col="4" text="align:center">
33
- <c:a href="${m.href}" display="type:block" border rounded padding="all-2" text="decoration:none">
34
- <c:img src="waibuMpa:/logo/${m.ns}" height="60" fluid/>
35
- <c:div margin="top-2">${m.title}</c:div>
36
- </c:a>
37
- </c:grid-col>
38
- `
32
+ const items = this.component.locals.menu[menu] ?? []
33
+ if (menu === 'pages') {
34
+ launcher += '<c:hr margin="all-0" /><c:accordion no-border>\n'
35
+ for (const m of items) {
36
+ const sm = []
37
+ if (!m.children) continue
38
+ for (const s of m.children) {
39
+ if (s.visible === 'anon' && this.component.locals._meta.user) continue
40
+ if (s.visible === 'auth' && !this.component.locals._meta.user) continue
41
+ if (s.title === '-') continue
42
+ sm.push(`<c:list-item href="${s.href}" t:content="${s.title}" style="padding-left:1.2rem"/>`)
43
+ }
44
+ launcher += `
45
+ <c:accordion-item t:header="${m.title}" body-no-padding header-font="weight:bold">\n
46
+ <c:list type="group" hover no-border>\n
47
+ ${sm.join('\n')}\n
48
+ </c:list>\n
49
+ </c:accordion-item>\n
50
+ `
51
+ }
52
+ } else {
53
+ launcher += '<c:div padding="start-3 bottom-3 end-3">'
54
+ launcher += '<c:grid-row gutter="1">\n'
55
+ for (const m of items) {
56
+ launcher += `
57
+ <c:grid-col col="4" text="align:center">
58
+ <c:a href="${m.href}" display="type:block" border rounded padding="all-2" text="decoration:none">
59
+ <c:img src="waibuMpa:/logo/${m.ns}" class="app-launcher-img" height="60" fluid/>
60
+ <c:div margin="top-2">${m.title}</c:div>
61
+ </c:a>
62
+ </c:grid-col>
63
+ `
64
+ }
65
+ launcher += '</c:grid-row></c:div>\n'
39
66
  }
40
- launcher += '</c:grid-row>\n'
41
67
  if (this.params.attr.type === 'modal') launcher += '</c:modal>'
42
68
  else launcher += '</c:div></c:drawer>'
43
69
  let trigger = ''
@@ -6,6 +6,7 @@ async function card () {
6
6
  super(options)
7
7
  this.selector = '.' + cls
8
8
  this.component.normalizeAttr(this.params, { tag: 'div', cls })
9
+ if (this.params.attr.noBorder) this.params.attr.border = 'none'
9
10
  }
10
11
 
11
12
  build = async () => {
@@ -2,12 +2,9 @@ import { css, scripts, inlineScript, handler } from './form-datetime.js'
2
2
 
3
3
  async function formDate () {
4
4
  return class FormDate extends this.baseFactory {
5
- constructor (options) {
6
- super(options)
7
- this.css = css
8
- this.scripts = scripts
9
- this.inlineScript = inlineScript
10
- }
5
+ static css = [...super.css, ...css]
6
+ static scripts = [...super.scripts, ...scripts(this.component.req)]
7
+ static inlineScript = inlineScript(this.component.req)
11
8
 
12
9
  build = async () => {
13
10
  const { set } = this.plugin.lib._
@@ -60,12 +60,9 @@ export async function handler (opts, params = {}) {
60
60
 
61
61
  async function formDatetime () {
62
62
  return class FormDatetime extends this.baseFactory {
63
- constructor (options) {
64
- super(options)
65
- this.css = css
66
- this.scripts = scripts
67
- this.inlineScript = inlineScript
68
- }
63
+ static css = [...super.css, ...css]
64
+ static scripts = [...super.scripts, ...scripts(this.component.req)]
65
+ static inlineScript = inlineScript(this.component.req)
69
66
 
70
67
  build = async () => {
71
68
  const { set } = this.plugin.lib._
@@ -21,18 +21,9 @@ export const scripts = 'waibuExtra.virtual:/tom-select/js/tom-select.complete.mi
21
21
  async function formSelectExt () {
22
22
  return class FormSelectExt extends this.baseFactory {
23
23
  static css = [...super.css, css]
24
-
25
24
  static scripts = [...super.scripts, scripts]
26
-
27
25
  static inlineCss = inlineCss
28
26
 
29
- constructor (options) {
30
- super(options)
31
- this.css = css
32
- this.inlineCss = inlineCss
33
- this.scripts = scripts
34
- }
35
-
36
27
  build = async () => {
37
28
  const { omit } = this.plugin.lib._
38
29
  const { jsonStringify, base64JsonDecode } = this.plugin.app.waibuMpa
@@ -2,12 +2,9 @@ import { css, scripts, inlineScript, handler } from './form-datetime.js'
2
2
 
3
3
  async function formTime () {
4
4
  return class FormTime extends this.baseFactory {
5
- constructor (options) {
6
- super(options)
7
- this.css = css
8
- this.inlineScript = inlineScript
9
- this.scripts = scripts
10
- }
5
+ static css = [...super.css, ...css]
6
+ static scripts = [...super.scripts, ...scripts(this.component.req)]
7
+ static inlineScript = inlineScript(this.component.req)
11
8
 
12
9
  build = async () => {
13
10
  const { set } = this.plugin.lib._
@@ -20,7 +20,7 @@ async function listItem () {
20
20
  }
21
21
  if (isString(this.params.attr.target) && !this.params.attr.href) this.params.attr.href = '#'
22
22
  if (this.params.attr.href) {
23
- const attr = { href: this.params.attr.href, class: [] }
23
+ const attr = this.params.attr
24
24
  const html = this.params.html
25
25
  if (isString(this.params.attr.target)) {
26
26
  const [id, toggle = 'modal'] = this.params.attr.target.split(':')
@@ -2,7 +2,7 @@ async function navDropdownDarkmode () {
2
2
  return class NavDropdownDarkmode extends this.baseFactory {
3
3
  build = async () => {
4
4
  const { titleize, isSet } = this.plugin.app.bajo
5
- const { set } = this.plugin.lib._
5
+ const { set, omit } = this.plugin.lib._
6
6
  const cfgWmpa = this.plugin.app.waibuMpa.config
7
7
  this.params.noTag = true
8
8
  if (isSet(this.plugin.app.waibuMpa.config.darkMode.set)) {
@@ -11,12 +11,9 @@ async function navDropdownDarkmode () {
11
11
  }
12
12
  const name = this.component.req.darkMode ? 'dark' : 'bright'
13
13
  const content = this.component.req.iconset ? await this.component.buildTag({ tag: 'icon', attr: { name } }) : this.component.req.t(titleize(name))
14
- const attr = {
15
- dropdown: true,
16
- dropdownDir: this.params.attr.dropdownDir,
17
- dropdownMenudir: this.params.attr.dropdownMenudir,
18
- content
19
- }
14
+ const attr = omit(this.params.attr, ['text'])
15
+ attr.dropdown = true
16
+ attr.content = content
20
17
  if (this.params.attr.text) attr.text = this.params.attr.text
21
18
  const html = [
22
19
  await this.component.buildTag({ tag: 'dropdownItem', attr: { href: this.component.buildUrl({ params: set({}, cfgWmpa.darkMode.qsKey, 'false') }), active: !this.component.req.darkMode }, html: this.component.req.t('brightMode') }),
@@ -1,16 +1,13 @@
1
1
  async function navDropdownLanguage () {
2
2
  return class NavDropdownLanguage extends this.baseFactory {
3
3
  build = async () => {
4
- const { camelCase } = this.plugin.lib._
4
+ const { camelCase, cloneDeep, omit } = this.plugin.lib._
5
5
  const { supported } = this.plugin.app.bajo.config.intl
6
6
  const lang = this.component.req.lang
7
- const attr = {
8
- dropdown: true,
9
- dropdownDir: this.params.attr.dropdownDir,
10
- dropdownMenudir: this.params.attr.dropdownMenudir,
11
- content: lang.toUpperCase()
12
- }
13
- if (this.params.attr.text) attr.text = this.params.attr.text
7
+ const attr = cloneDeep(this.params.attr)
8
+ this.params.attr = omit(this.params.attr, ['text'])
9
+ attr.dropdown = true
10
+ attr.content = lang.toUpperCase()
14
11
  const html = []
15
12
  for (const s of supported) {
16
13
  html.push(await this.component.buildTag({
@@ -16,13 +16,13 @@ async function navDropdownSetting () {
16
16
  this.params.attr.dropdown = true
17
17
  this.params.attr.content = icon
18
18
  let profile = `
19
- <c:dropdown-item href="sumba:/my-stuff/profile" t:content="yourProfile" />
20
- <c:dropdown-item href="sumba:/my-stuff/change-password" t:content="changePassword" />
19
+ <c:dropdown-item href="sumba:/your-stuff/profile" t:content="yourProfile" />
20
+ <c:dropdown-item href="sumba:/your-stuff/change-password" t:content="changePassword" />
21
21
  `
22
22
  if (this.params.attr.fancyProfile) {
23
23
  profile = await this.component.buildSentence(`
24
24
  <div>
25
- <c:dropdown-item href="sumba:/my-stuff/profile">
25
+ <c:dropdown-item href="sumba:/your-stuff/profile">
26
26
  <c:img src="dobo:/attachment/SumbaUser/${req.user.id}/profile/main.png" responsive rounded />
27
27
  <c:div margin="top-1">${req.user.firstName} ${req.user.lastName}</c:div>
28
28
  </c:dropdown-item>
@@ -6,7 +6,7 @@ async function navDropdownUser () {
6
6
  this.params.html = ''
7
7
  return
8
8
  }
9
- const { has } = this.plugin.lib._
9
+ const { has, omit } = this.plugin.lib._
10
10
  const { routePath } = this.plugin.app.waibu
11
11
  const { req } = this.component
12
12
  const icon = this.component.req.iconset ? await this.component.buildTag({ tag: 'icon', attr: { name: 'person' } }) : ''
@@ -19,24 +19,20 @@ async function navDropdownUser () {
19
19
  } else text = req.t('guest')
20
20
  }
21
21
  const html = []
22
- const attr = {
23
- dropdown: true,
24
- dropdownDir: this.params.attr.dropdownDir,
25
- dropdownMenudir: this.params.attr.dropdownMenudir,
26
- content: `${icon} ${text}`
27
- }
28
- if (this.params.attr.text) attr.text = this.params.attr.text
22
+ const attr = omit(this.params.attr, ['text'])
23
+ attr.dropdown = true
24
+ attr.content = `${icon} ${text}`
29
25
  if (this.params.attr.noMenu) {
30
26
  delete attr.dropdown
31
27
  delete attr.dropdownMenu
32
- attr.href = routePath(this.component.req.user ? 'sumba:/my-stuff/profile' : 'sumba:/signin')
28
+ attr.href = routePath(this.component.req.user ? 'sumba:/your-stuff/profile' : 'sumba:/signin')
33
29
  } else {
34
30
  if (req.user) {
35
31
  if (this.params.attr.fancyProfile) {
36
32
  const replacer = 'sumba.asset:/user-profile.png'
37
33
  const profile = await this.component.buildSentence(`
38
34
  <div>
39
- <c:dropdown-item href="sumba:/my-stuff/profile">
35
+ <c:dropdown-item href="sumba:/your-stuff/profile">
40
36
  <c:img src="dobo:/attachment/SumbaUser/${req.user.id}/profile/main.png?notfound=${replacer}" responsive rounded />
41
37
  <c:div margin="top-1" text="align:center">${req.user.firstName} ${req.user.lastName}</c:div>
42
38
  </c:dropdown-item>
@@ -44,11 +40,11 @@ async function navDropdownUser () {
44
40
  `)
45
41
  html.push(profile)
46
42
  html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { divider: true } }))
47
- html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/my-stuff/change-password') }, html: this.component.req.t('changePassword') }))
43
+ html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/your-stuff/change-password') }, html: this.component.req.t('changePassword') }))
48
44
  html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/signout') }, html: this.component.req.t('signout') }))
49
45
  } else {
50
- html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/my-stuff/profile') }, html: this.component.req.t('yourProfile') }))
51
- html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/my-stuff/change-password') }, html: this.component.req.t('changePassword') }))
46
+ html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/your-stuff/profile') }, html: this.component.req.t('yourProfile') }))
47
+ html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/your-stuff/change-password') }, html: this.component.req.t('changePassword') }))
52
48
  html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { divider: true } }))
53
49
  html.push(await this.component.buildTag({ tag: 'dropdownItem', attr: { href: routePath('sumba:/signout') }, html: this.component.req.t('signout') }))
54
50
  }
@@ -14,8 +14,8 @@ async function navItem () {
14
14
  const { groupAttrs } = this.plugin.app.waibuMpa
15
15
  const { $ } = this.component
16
16
  const group = groupAttrs(this.params.attr, ['dropdown', 'badge'])
17
+ this.params.attr = group._
17
18
  if (group.dropdown) {
18
- this.params.attr = group._
19
19
  this.params.attr.class.push('dropdown-toggle')
20
20
  this.params.attr.role = 'button'
21
21
  this.params.attr.dataBsToggle = 'dropdown'
@@ -5,14 +5,10 @@ async function navToggleFullscreen () {
5
5
  if (!req.iconset) return
6
6
  const inIcon = iconset.resolve('fullscreen')
7
7
  const outIcon = iconset.resolve('fullscreenExit')
8
- const content = await this.component.buildTag({ tag: 'icon', attr: { oname: inIcon } })
9
- const attr = {
10
- 'x-ref': 'fullscreen',
11
- '@click': 'toggle()',
12
- content
13
- }
14
- if (this.params.attr.text) attr.text = this.params.attr.text
15
- attr['@fullscreenchange.document'] = `
8
+ this.params.attr['x-ref'] = 'fullscreen'
9
+ this.params.attr['@click'] = 'toggle()'
10
+ this.params.attr.content = await this.component.buildTag({ tag: 'icon', attr: { oname: inIcon } })
11
+ this.params.attr['@fullscreenchange.document'] = `
16
12
  const el = $refs.fullscreen.querySelector('i')
17
13
  if (document.fullscreenElement) {
18
14
  el.classList.remove(inIcon)
@@ -22,7 +18,7 @@ async function navToggleFullscreen () {
22
18
  el.classList.add(inIcon)
23
19
  }
24
20
  `
25
- attr['x-data'] = `{
21
+ this.params.attr['x-data'] = `{
26
22
  inIcon: '${inIcon}',
27
23
  outIcon: '${outIcon}',
28
24
  async toggle () {
@@ -40,7 +36,7 @@ async function navToggleFullscreen () {
40
36
  }
41
37
  }`
42
38
  this.params.noTag = true
43
- this.params.html = await this.component.buildTag({ tag: 'navItem', attr })
39
+ this.params.html = await this.component.buildTag({ tag: 'navItem', attr: this.params.attr })
44
40
  }
45
41
  }
46
42
  }
@@ -5,7 +5,7 @@ export const fstyles = ['italic', 'normal']
5
5
  export const heights = ['1', 'sm', 'base', 'lg']
6
6
  export const cvariants = ['emphasis', 'secondary', 'tertiary']
7
7
  export const cbgvariants = ['subtle']
8
- export const opacities = ['25', '50', '75', '100']
8
+ export const opacities = ['0', '25', '50', '75', '100']
9
9
  export const aligns = ['top', 'bottom', 'start', 'end', 'middle']
10
10
  export const dirs = ['up', 'down', 'start', 'end']
11
11
  export const widths = ['0', '1', '2', '3', '4', '5']
@@ -92,11 +92,12 @@ class Wbs {
92
92
  return await this.alert(msg, opts.title ?? 'Prompt', opts)
93
93
  }
94
94
 
95
- async appLauncher (params) {
95
+ async appLauncher (params, menu) {
96
96
  document.body.click()
97
97
  const id = wmpa.randomId()
98
98
  const toolbar = params ? `toolbar="${params}"` : ''
99
- const body = [`<c:app-launcher id="${id}" ${toolbar} />`]
99
+ const menuId = menu ? `menu="${menu}"` : ''
100
+ const body = [`<c:app-launcher id="${id}" ${toolbar} ${menuId} />`]
100
101
  await wmpa.addComponent(body.join('\n'), 'body')
101
102
  const item = new bootstrap.Offcanvas(`#${id}`)
102
103
  const itemEl = document.getElementById(id)
package/plugin/.alias DELETED
@@ -1 +0,0 @@
1
- wbs
@@ -1,2 +0,0 @@
1
- waibu-mpa
2
- waibu-extra
@@ -1,8 +0,0 @@
1
- {
2
- "waibu": {
3
- "prefix": "bootstrap"
4
- },
5
- "siteSetting": {
6
- "toastAutohideDelayDur": "5s"
7
- }
8
- }