@7pmlabs/design-system 2.0.9 → 2.1.0
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/README.md +4 -4
- package/dist/design-system.css +1 -1
- package/dist/design-system.js +65 -59
- package/dist/design-system100.js +1 -1
- package/dist/design-system100.js.map +1 -1
- package/dist/design-system101.js +87 -53
- package/dist/design-system101.js.map +1 -1
- package/dist/design-system103.js +5 -13
- package/dist/design-system103.js.map +1 -1
- package/dist/design-system104.js +53 -108
- package/dist/design-system104.js.map +1 -1
- package/dist/{design-system102.js → design-system105.js} +1 -1
- package/dist/{design-system102.js.map → design-system105.js.map} +1 -1
- package/dist/design-system106.js +13 -6
- package/dist/design-system106.js.map +1 -1
- package/dist/design-system107.js +93 -190
- package/dist/design-system107.js.map +1 -1
- package/dist/design-system109.js +2 -2
- package/dist/design-system109.js.map +1 -1
- package/dist/design-system110.js +183 -484
- package/dist/design-system110.js.map +1 -1
- package/dist/design-system112.js +5 -4
- package/dist/design-system112.js.map +1 -1
- package/dist/design-system113.js +507 -7
- package/dist/design-system113.js.map +1 -1
- package/dist/design-system115.js +8 -0
- package/dist/design-system115.js.map +1 -0
- package/dist/design-system116.js +7 -6
- package/dist/design-system116.js.map +1 -1
- package/dist/design-system117.js +154 -169
- package/dist/design-system117.js.map +1 -1
- package/dist/design-system119.js +2 -2
- package/dist/design-system119.js.map +1 -1
- package/dist/design-system120.js +210 -149
- package/dist/design-system120.js.map +1 -1
- package/dist/design-system122.js +5 -4
- package/dist/design-system122.js.map +1 -1
- package/dist/design-system123.js +160 -9
- package/dist/design-system123.js.map +1 -1
- package/dist/design-system125.js +8 -0
- package/dist/design-system125.js.map +1 -0
- package/dist/design-system126.js +176 -6
- package/dist/design-system126.js.map +1 -1
- package/dist/design-system128.js +8 -0
- package/dist/design-system128.js.map +1 -0
- package/dist/design-system129.js +213 -5
- package/dist/design-system129.js.map +1 -1
- package/dist/design-system131.js +5 -90
- package/dist/design-system131.js.map +1 -1
- package/dist/design-system132.js +166 -0
- package/dist/design-system132.js.map +1 -0
- package/dist/design-system134.js +5 -42
- package/dist/design-system134.js.map +1 -1
- package/dist/design-system135.js +12 -0
- package/dist/design-system135.js.map +1 -0
- package/dist/design-system136.js +274 -5
- package/dist/design-system136.js.map +1 -1
- package/dist/design-system138.js +9 -0
- package/dist/{design-system124.js.map → design-system138.js.map} +1 -1
- package/dist/design-system139.js +16 -5
- package/dist/design-system139.js.map +1 -1
- package/dist/design-system141.js +8 -0
- package/dist/{design-system127.js.map → design-system141.js.map} +1 -1
- package/dist/design-system142.js +12 -5
- package/dist/design-system142.js.map +1 -1
- package/dist/design-system143.js +78 -83
- package/dist/design-system143.js.map +1 -1
- package/dist/design-system145.js +1 -1
- package/dist/design-system145.js.map +1 -1
- package/dist/design-system146.js +42 -9
- package/dist/design-system146.js.map +1 -1
- package/dist/design-system148.js +3 -2
- package/dist/design-system148.js.map +1 -1
- package/dist/design-system149.js +230 -18
- package/dist/design-system149.js.map +1 -1
- package/dist/design-system151.js +5 -158
- package/dist/design-system151.js.map +1 -1
- package/dist/{design-system140.js → design-system152.js} +6 -6
- package/dist/{design-system140.js.map → design-system152.js.map} +1 -1
- package/dist/design-system154.js +5 -307
- package/dist/design-system154.js.map +1 -1
- package/dist/design-system155.js +98 -0
- package/dist/design-system155.js.map +1 -0
- package/dist/design-system157.js +5 -240
- package/dist/design-system157.js.map +1 -1
- package/dist/design-system158.js +12 -0
- package/dist/design-system158.js.map +1 -0
- package/dist/design-system159.js +37 -5
- package/dist/design-system159.js.map +1 -1
- package/dist/design-system160.js +4 -189
- package/dist/design-system160.js.map +1 -1
- package/dist/design-system161.js +24 -0
- package/dist/{design-system150.js.map → design-system161.js.map} +1 -1
- package/dist/design-system162.js +2 -3
- package/dist/design-system162.js.map +1 -1
- package/dist/design-system163.js +158 -3
- package/dist/design-system163.js.map +1 -1
- package/dist/{design-system153.js → design-system165.js} +2 -2
- package/dist/{design-system153.js.map → design-system165.js.map} +1 -1
- package/dist/design-system166.js +307 -6
- package/dist/design-system166.js.map +1 -1
- package/dist/{design-system156.js → design-system168.js} +2 -2
- package/dist/{design-system156.js.map → design-system168.js.map} +1 -1
- package/dist/design-system169.js +167 -6
- package/dist/design-system169.js.map +1 -1
- package/dist/design-system171.js +8 -0
- package/dist/design-system171.js.map +1 -0
- package/dist/design-system172.js +240 -6
- package/dist/design-system172.js.map +1 -1
- package/dist/design-system174.js +8 -0
- package/dist/design-system174.js.map +1 -0
- package/dist/design-system175.js +189 -6
- package/dist/design-system175.js.map +1 -1
- package/dist/design-system177.js +8 -0
- package/dist/design-system177.js.map +1 -0
- package/dist/design-system178.js +3 -5
- package/dist/design-system178.js.map +1 -1
- package/dist/design-system179.js +58 -11
- package/dist/design-system179.js.map +1 -1
- package/dist/design-system181.js +9 -0
- package/dist/design-system181.js.map +1 -0
- package/dist/design-system182.js +56 -6
- package/dist/design-system182.js.map +1 -1
- package/dist/design-system184.js +9 -0
- package/dist/{design-system167.js.map → design-system184.js.map} +1 -1
- package/dist/design-system185.js +69 -5
- package/dist/design-system185.js.map +1 -1
- package/dist/design-system187.js +9 -0
- package/dist/{design-system170.js.map → design-system187.js.map} +1 -1
- package/dist/design-system188.js +182 -5
- package/dist/design-system188.js.map +1 -1
- package/dist/design-system190.js +9 -0
- package/dist/design-system190.js.map +1 -0
- package/dist/design-system191.js +115 -5
- package/dist/design-system191.js.map +1 -1
- package/dist/design-system193.js +8 -0
- package/dist/{design-system176.js.map → design-system193.js.map} +1 -1
- package/dist/design-system194.js +11 -5
- package/dist/design-system194.js.map +1 -1
- package/dist/design-system195.js +453 -24
- package/dist/design-system195.js.map +1 -1
- package/dist/design-system197.js +5 -4
- package/dist/design-system197.js.map +1 -1
- package/dist/design-system198.js +20 -16
- package/dist/design-system198.js.map +1 -1
- package/dist/design-system200.js +1 -1
- package/dist/design-system200.js.map +1 -1
- package/dist/design-system201.js +70 -314
- package/dist/design-system201.js.map +1 -1
- package/dist/design-system203.js +1 -1
- package/dist/design-system203.js.map +1 -1
- package/dist/design-system204.js +24 -89
- package/dist/design-system204.js.map +1 -1
- package/dist/design-system206.js +1 -1
- package/dist/design-system206.js.map +1 -1
- package/dist/design-system207.js +26 -17
- package/dist/design-system207.js.map +1 -1
- package/dist/design-system209.js +5 -3
- package/dist/design-system209.js.map +1 -1
- package/dist/design-system210.js +22 -408
- package/dist/design-system210.js.map +1 -1
- package/dist/design-system212.js +1 -1
- package/dist/design-system212.js.map +1 -1
- package/dist/design-system213.js +24 -52
- package/dist/design-system213.js.map +1 -1
- package/dist/design-system215.js +1 -1
- package/dist/design-system215.js.map +1 -1
- package/dist/design-system216.js +329 -85
- package/dist/design-system216.js.map +1 -1
- package/dist/design-system218.js +5 -108
- package/dist/design-system218.js.map +1 -1
- package/dist/design-system219.js +103 -0
- package/dist/design-system219.js.map +1 -0
- package/dist/design-system221.js +5 -106
- package/dist/design-system221.js.map +1 -1
- package/dist/design-system222.js +22 -0
- package/dist/{design-system208.js.map → design-system222.js.map} +1 -1
- package/dist/design-system223.js +4 -6
- package/dist/design-system223.js.map +1 -1
- package/dist/design-system224.js +3 -737
- package/dist/design-system224.js.map +1 -1
- package/dist/design-system225.js +422 -0
- package/dist/design-system225.js.map +1 -0
- package/dist/design-system227.js +5 -11
- package/dist/design-system227.js.map +1 -1
- package/dist/design-system228.js +51 -517
- package/dist/design-system228.js.map +1 -1
- package/dist/design-system230.js +1 -1
- package/dist/design-system230.js.map +1 -1
- package/dist/design-system231.js +88 -3
- package/dist/design-system231.js.map +1 -1
- package/dist/design-system232.js +4 -46
- package/dist/design-system232.js.map +1 -1
- package/dist/design-system233.js +108 -4
- package/dist/design-system233.js.map +1 -1
- package/dist/{design-system220.js → design-system235.js} +2 -2
- package/dist/{design-system220.js.map → design-system235.js.map} +1 -1
- package/dist/design-system236.js +106 -5
- package/dist/design-system236.js.map +1 -1
- package/dist/design-system238.js +9 -0
- package/dist/design-system238.js.map +1 -0
- package/dist/design-system239.js +737 -5
- package/dist/design-system239.js.map +1 -1
- package/dist/{design-system226.js → design-system241.js} +2 -2
- package/dist/{design-system226.js.map → design-system241.js.map} +1 -1
- package/dist/design-system242.js +3 -5
- package/dist/design-system242.js.map +1 -1
- package/dist/design-system243.js +42 -50
- package/dist/design-system243.js.map +1 -1
- package/dist/design-system244.js +1 -1
- package/dist/design-system244.js.map +1 -1
- package/dist/design-system245.js +254 -141
- package/dist/design-system245.js.map +1 -1
- package/dist/design-system247.js +1 -1
- package/dist/design-system247.js.map +1 -1
- package/dist/design-system248.js +119 -7
- package/dist/design-system248.js.map +1 -1
- package/dist/design-system250.js +8 -0
- package/dist/design-system250.js.map +1 -0
- package/dist/design-system251.js +172 -5
- package/dist/design-system251.js.map +1 -1
- package/dist/design-system253.js +8 -0
- package/dist/design-system253.js.map +1 -0
- package/dist/design-system254.js +11 -6
- package/dist/design-system254.js.map +1 -1
- package/dist/design-system255.js +525 -9
- package/dist/design-system255.js.map +1 -1
- package/dist/design-system257.js +8 -0
- package/dist/design-system257.js.map +1 -0
- package/dist/design-system258.js +112 -6
- package/dist/design-system258.js.map +1 -1
- package/dist/design-system260.js +5 -374
- package/dist/design-system260.js.map +1 -1
- package/dist/design-system261.js +57 -0
- package/dist/design-system261.js.map +1 -0
- package/dist/design-system262.js +4 -6
- package/dist/design-system262.js.map +1 -1
- package/dist/design-system263.js +173 -0
- package/dist/design-system263.js.map +1 -0
- package/dist/design-system265.js +8 -0
- package/dist/design-system265.js.map +1 -0
- package/dist/design-system266.js +10 -0
- package/dist/design-system266.js.map +1 -0
- package/dist/{design-system249.js → design-system267.js} +2 -2
- package/dist/{design-system249.js.map → design-system267.js.map} +1 -1
- package/dist/design-system269.js +8 -0
- package/dist/design-system269.js.map +1 -0
- package/dist/{design-system252.js → design-system270.js} +1 -1
- package/dist/{design-system252.js.map → design-system270.js.map} +1 -1
- package/dist/design-system272.js +9 -0
- package/dist/design-system272.js.map +1 -0
- package/dist/design-system273.js +12 -0
- package/dist/design-system273.js.map +1 -0
- package/dist/{design-system256.js → design-system274.js} +2 -2
- package/dist/{design-system256.js.map → design-system274.js.map} +1 -1
- package/dist/design-system276.js +9 -0
- package/dist/design-system276.js.map +1 -0
- package/dist/{design-system259.js → design-system277.js} +1 -1
- package/dist/{design-system259.js.map → design-system277.js.map} +1 -1
- package/dist/design-system278.js +377 -0
- package/dist/design-system278.js.map +1 -0
- package/dist/design-system280.js +9 -0
- package/dist/design-system280.js.map +1 -0
- package/dist/design-system69.js +182 -13
- package/dist/design-system69.js.map +1 -1
- package/dist/design-system71.js +8 -0
- package/dist/design-system71.js.map +1 -0
- package/dist/design-system72.js +13 -5
- package/dist/design-system72.js.map +1 -1
- package/dist/design-system73.js +677 -139
- package/dist/design-system73.js.map +1 -1
- package/dist/design-system75.js +1 -1
- package/dist/design-system75.js.map +1 -1
- package/dist/design-system76.js +152 -23
- package/dist/design-system76.js.map +1 -1
- package/dist/design-system78.js +5 -49
- package/dist/design-system78.js.map +1 -1
- package/dist/design-system79.js +32 -0
- package/dist/design-system79.js.map +1 -0
- package/dist/design-system80.js +2 -3
- package/dist/design-system80.js.map +1 -1
- package/dist/design-system81.js +38 -188
- package/dist/design-system81.js.map +1 -1
- package/dist/design-system83.js +1 -1
- package/dist/design-system83.js.map +1 -1
- package/dist/design-system84.js +199 -7
- package/dist/design-system84.js.map +1 -1
- package/dist/design-system86.js +8 -0
- package/dist/design-system86.js.map +1 -0
- package/dist/design-system87.js +7 -5
- package/dist/design-system87.js.map +1 -1
- package/dist/design-system88.js +264 -48
- package/dist/design-system88.js.map +1 -1
- package/dist/design-system90.js +1 -1
- package/dist/design-system90.js.map +1 -1
- package/dist/design-system91.js +57 -11
- package/dist/design-system91.js.map +1 -1
- package/dist/design-system93.js +8 -0
- package/dist/design-system93.js.map +1 -0
- package/dist/design-system94.js +11 -5
- package/dist/design-system94.js.map +1 -1
- package/dist/design-system95.js +92 -59
- package/dist/design-system95.js.map +1 -1
- package/dist/design-system97.js +1 -1
- package/dist/design-system97.js.map +1 -1
- package/dist/design-system98.js +56 -78
- package/dist/design-system98.js.map +1 -1
- package/dist/types/components/BContextMenu/BContextMenu.spec.d.ts +1 -0
- package/dist/types/components/BContextMenu/BContextMenu.vue.d.ts +42 -0
- package/dist/types/components/BContextMenu/index.d.ts +2 -0
- package/dist/types/components/BContextMenu/types.d.ts +23 -0
- package/dist/types/components/BInputTags/BInputTags.spec.d.ts +1 -0
- package/dist/types/components/BInputTags/BInputTags.vue.d.ts +54 -0
- package/dist/types/components/BInputTags/index.d.ts +1 -0
- package/dist/types/components/BLink/BLink.spec.d.ts +1 -0
- package/dist/types/components/BLink/BLink.vue.d.ts +100 -0
- package/dist/types/components/BLink/index.d.ts +1 -0
- package/dist/types/components/BListbox/BListbox.spec.d.ts +1 -0
- package/dist/types/components/BListbox/BListbox.vue.d.ts +52 -0
- package/dist/types/components/BListbox/index.d.ts +1 -0
- package/dist/types/components/BModal/BModal.spec.d.ts +1 -0
- package/dist/types/components/BPinInput/BPinInput.spec.d.ts +1 -0
- package/dist/types/components/BPinInput/BPinInput.vue.d.ts +43 -0
- package/dist/types/components/BPinInput/index.d.ts +1 -0
- package/dist/types/components/BProgress/BProgress.vue.d.ts +47 -2
- package/dist/types/components/BTextarea/BTextarea.spec.d.ts +1 -0
- package/dist/types/components/BTextarea/BTextarea.vue.d.ts +77 -0
- package/dist/types/components/BTextarea/index.d.ts +1 -0
- package/dist/types/components/index.d.ts +7 -1
- package/package.json +1 -1
- package/dist/design-system114.js +0 -212
- package/dist/design-system114.js.map +0 -1
- package/dist/design-system124.js +0 -277
- package/dist/design-system127.js +0 -19
- package/dist/design-system130.js +0 -15
- package/dist/design-system130.js.map +0 -1
- package/dist/design-system133.js +0 -8
- package/dist/design-system133.js.map +0 -1
- package/dist/design-system137.js +0 -236
- package/dist/design-system137.js.map +0 -1
- package/dist/design-system147.js +0 -40
- package/dist/design-system147.js.map +0 -1
- package/dist/design-system150.js +0 -7
- package/dist/design-system164.js +0 -61
- package/dist/design-system164.js.map +0 -1
- package/dist/design-system167.js +0 -59
- package/dist/design-system170.js +0 -72
- package/dist/design-system173.js +0 -185
- package/dist/design-system173.js.map +0 -1
- package/dist/design-system176.js +0 -118
- package/dist/design-system180.js +0 -465
- package/dist/design-system180.js.map +0 -1
- package/dist/design-system183.js +0 -38
- package/dist/design-system183.js.map +0 -1
- package/dist/design-system186.js +0 -91
- package/dist/design-system186.js.map +0 -1
- package/dist/design-system189.js +0 -38
- package/dist/design-system189.js.map +0 -1
- package/dist/design-system192.js +0 -31
- package/dist/design-system192.js.map +0 -1
- package/dist/design-system208.js +0 -7
- package/dist/design-system217.js +0 -7
- package/dist/design-system217.js.map +0 -1
- package/dist/design-system234.js +0 -286
- package/dist/design-system234.js.map +0 -1
- package/dist/design-system237.js +0 -122
- package/dist/design-system237.js.map +0 -1
- package/dist/design-system240.js +0 -115
- package/dist/design-system240.js.map +0 -1
- package/dist/design-system70.js +0 -699
- package/dist/design-system70.js.map +0 -1
- package/dist/design-system77.js +0 -7
- package/dist/design-system77.js.map +0 -1
- package/dist/design-system85.js +0 -276
- package/dist/design-system85.js.map +0 -1
- package/dist/design-system92.js +0 -102
- package/dist/design-system92.js.map +0 -1
package/dist/design-system81.js
CHANGED
|
@@ -1,202 +1,52 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/components/
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
class: "b-drawer__header"
|
|
6
|
-
}, w = { class: "b-drawer__header-title-wrapper" }, T = ["id"], E = {
|
|
7
|
-
key: 0,
|
|
8
|
-
class: "b-drawer__extra"
|
|
9
|
-
}, D = {
|
|
10
|
-
key: 1,
|
|
11
|
-
class: "b-drawer__body"
|
|
12
|
-
}, O = {
|
|
13
|
-
key: 0,
|
|
14
|
-
class: "b-drawer__loading",
|
|
15
|
-
"aria-live": "polite"
|
|
16
|
-
}, k = {
|
|
17
|
-
key: 2,
|
|
18
|
-
class: "b-drawer__footer"
|
|
19
|
-
}, A = /* @__PURE__ */ l({
|
|
20
|
-
__name: "BDrawer",
|
|
1
|
+
import { computed as e, createElementBlock as t, createElementVNode as n, defineComponent as r, normalizeClass as i, openBlock as a, renderSlot as o, useSlots as s } from "vue";
|
|
2
|
+
//#region src/components/BDivider/BDivider.vue?vue&type=script&setup=true&lang.ts
|
|
3
|
+
var c = { class: "b-divider__content" }, l = /* @__PURE__ */ r({
|
|
4
|
+
__name: "BDivider",
|
|
21
5
|
props: {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
closable: {
|
|
26
|
-
type: Boolean,
|
|
27
|
-
default: !0
|
|
28
|
-
},
|
|
29
|
-
mask: {
|
|
30
|
-
type: Boolean,
|
|
31
|
-
default: !0
|
|
32
|
-
},
|
|
33
|
-
maskClosable: {
|
|
34
|
-
type: Boolean,
|
|
35
|
-
default: !0
|
|
36
|
-
},
|
|
37
|
-
keyboard: {
|
|
38
|
-
type: Boolean,
|
|
39
|
-
default: !0
|
|
40
|
-
},
|
|
41
|
-
destroyOnClose: {
|
|
6
|
+
orientation: { default: "horizontal" },
|
|
7
|
+
variant: { default: "solid" },
|
|
8
|
+
dashed: {
|
|
42
9
|
type: Boolean,
|
|
43
10
|
default: !1
|
|
44
11
|
},
|
|
45
|
-
|
|
46
|
-
height: {},
|
|
47
|
-
zIndex: { default: 1e3 },
|
|
48
|
-
getContainer: {},
|
|
49
|
-
autoFocus: {
|
|
12
|
+
plain: {
|
|
50
13
|
type: Boolean,
|
|
51
14
|
default: !0
|
|
52
15
|
},
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
default: () => void 0
|
|
56
|
-
},
|
|
57
|
-
forceRender: {
|
|
58
|
-
type: Boolean,
|
|
59
|
-
default: !1
|
|
60
|
-
},
|
|
61
|
-
extra: { default: "" },
|
|
62
|
-
footer: { default: "" },
|
|
63
|
-
loading: {
|
|
64
|
-
type: Boolean,
|
|
65
|
-
default: !1
|
|
66
|
-
},
|
|
67
|
-
ariaLabel: {}
|
|
16
|
+
size: { default: "large" },
|
|
17
|
+
titlePlacement: { default: "center" }
|
|
68
18
|
},
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
let z = n(() => l.placement === "left" || l.placement === "right"), B = {
|
|
80
|
-
default: 378,
|
|
81
|
-
large: 736
|
|
82
|
-
}, V = n(() => l.width === void 0 ? z.value ? `${B[l.size]}px` : "100%" : typeof l.width == "number" ? `${l.width}px` : l.width), H = n(() => l.height === void 0 ? z.value ? "100%" : `${B[l.size]}px` : typeof l.height == "number" ? `${l.height}px` : l.height), U = n(() => !!(l.title || N.title)), W = n(() => !!(l.extra || N.extra)), G = n(() => !!(l.footer || N.footer)), K = n(() => U.value || l.closable || W.value), q = n(() => l.getContainer ? l.getContainer : "body"), J = n(() => ({
|
|
83
|
-
width: V.value,
|
|
84
|
-
height: H.value,
|
|
85
|
-
zIndex: l.zIndex
|
|
86
|
-
})), Y = h(null), X = null;
|
|
87
|
-
function Z(e) {
|
|
88
|
-
if (e.key !== "Tab" || !Y.value) return;
|
|
89
|
-
let t = Array.from(Y.value.querySelectorAll("a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])"));
|
|
90
|
-
if (t.length === 0) {
|
|
91
|
-
e.preventDefault();
|
|
92
|
-
return;
|
|
19
|
+
setup(r) {
|
|
20
|
+
let l = s(), u = e(() => r.orientation === "vertical"), d = e(() => r.orientation === "horizontal"), f = e(() => !!l.default), p = e(() => r.dashed && r.variant === "solid" ? "dashed" : r.variant), m = e(() => [
|
|
21
|
+
"b-divider",
|
|
22
|
+
`b-divider--${r.orientation}`,
|
|
23
|
+
`b-divider--${p.value}`,
|
|
24
|
+
`b-divider--size-${r.size}`,
|
|
25
|
+
{
|
|
26
|
+
"b-divider--with-text": f.value && d.value,
|
|
27
|
+
[`b-divider--text-${r.titlePlacement}`]: f.value && d.value,
|
|
28
|
+
"b-divider--plain": r.plain
|
|
93
29
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
function te(e) {
|
|
113
|
-
l.maskClosable && $(e);
|
|
114
|
-
}
|
|
115
|
-
function ne(e) {
|
|
116
|
-
e.key === "Escape" && l.keyboard && (e.stopPropagation(), $(e)), Z(e);
|
|
117
|
-
}
|
|
118
|
-
function re() {
|
|
119
|
-
M("afterOpenChange", !0);
|
|
120
|
-
}
|
|
121
|
-
function ie() {
|
|
122
|
-
M("afterOpenChange", !1), X && typeof X.focus == "function" && (X.focus(), X = null);
|
|
123
|
-
}
|
|
124
|
-
function ae() {
|
|
125
|
-
l.modelValue === void 0 ? F.value = !0 : M("update:modelValue", !0);
|
|
126
|
-
}
|
|
127
|
-
return A({ open: ae }), (n, u) => (m(), r(e, { to: q.value }, [c(t, {
|
|
128
|
-
name: "b-drawer",
|
|
129
|
-
onAfterEnter: re,
|
|
130
|
-
onAfterLeave: ie
|
|
131
|
-
}, {
|
|
132
|
-
default: x(() => [I.value ? (m(), a("div", {
|
|
133
|
-
key: 0,
|
|
134
|
-
class: d(["b-drawer-root", `b-drawer-root--${l.placement}`]),
|
|
135
|
-
style: f({ zIndex: l.zIndex })
|
|
136
|
-
}, [l.mask ? (m(), a("div", {
|
|
137
|
-
key: 0,
|
|
138
|
-
class: "b-drawer__mask",
|
|
139
|
-
"aria-hidden": "true",
|
|
140
|
-
onClick: te
|
|
141
|
-
})) : i("", !0), o("div", {
|
|
142
|
-
ref_key: "drawerRef",
|
|
143
|
-
ref: Y,
|
|
144
|
-
class: d(["b-drawer", [
|
|
145
|
-
`b-drawer--${l.placement}`,
|
|
146
|
-
`b-drawer--${l.size}`,
|
|
147
|
-
{
|
|
148
|
-
"b-drawer--has-header": K.value,
|
|
149
|
-
"b-drawer--has-footer": G.value
|
|
150
|
-
}
|
|
151
|
-
]]),
|
|
152
|
-
role: "dialog",
|
|
153
|
-
"aria-modal": "true",
|
|
154
|
-
"aria-label": U.value ? void 0 : l.ariaLabel,
|
|
155
|
-
"aria-labelledby": U.value ? v(P) : void 0,
|
|
156
|
-
style: f(J.value),
|
|
157
|
-
tabindex: "-1",
|
|
158
|
-
onKeydown: ne
|
|
159
|
-
}, [
|
|
160
|
-
K.value ? (m(), a("div", C, [o("div", w, [l.closable ? (m(), a("button", {
|
|
161
|
-
key: 0,
|
|
162
|
-
type: "button",
|
|
163
|
-
class: "b-drawer__close",
|
|
164
|
-
"aria-label": "Close drawer",
|
|
165
|
-
onClick: $
|
|
166
|
-
}, [g(n.$slots, "closeIcon", {}, () => [u[0] ||= o("svg", {
|
|
167
|
-
class: "b-drawer__close-icon",
|
|
168
|
-
viewBox: "0 0 24 24",
|
|
169
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
170
|
-
"aria-hidden": "true",
|
|
171
|
-
focusable: "false"
|
|
172
|
-
}, [o("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" })], -1)])])) : i("", !0), U.value ? (m(), a("div", {
|
|
173
|
-
key: 1,
|
|
174
|
-
id: v(P),
|
|
175
|
-
class: "b-drawer__title"
|
|
176
|
-
}, [g(n.$slots, "title", {}, () => [s(_(l.title), 1)])], 8, T)) : i("", !0)]), W.value ? (m(), a("div", E, [g(n.$slots, "extra", {}, () => [s(_(l.extra), 1)])])) : i("", !0)])) : i("", !0),
|
|
177
|
-
R.value ? (m(), a("div", D, [l.loading ? (m(), a("div", O, [...u[1] ||= [o("svg", {
|
|
178
|
-
class: "b-drawer__spinner",
|
|
179
|
-
viewBox: "0 0 24 24",
|
|
180
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
181
|
-
"aria-hidden": "true",
|
|
182
|
-
focusable: "false"
|
|
183
|
-
}, [o("circle", {
|
|
184
|
-
cx: "12",
|
|
185
|
-
cy: "12",
|
|
186
|
-
r: "10",
|
|
187
|
-
fill: "none",
|
|
188
|
-
stroke: "currentColor",
|
|
189
|
-
"stroke-width": "3",
|
|
190
|
-
"stroke-dasharray": "31.4 31.4",
|
|
191
|
-
"stroke-linecap": "round"
|
|
192
|
-
})], -1), o("span", { class: "b-drawer__loading-text" }, "Loading…", -1)]])) : g(n.$slots, "default", { key: 1 })])) : i("", !0),
|
|
193
|
-
G.value ? (m(), a("div", k, [g(n.$slots, "footer", {}, () => [s(_(l.footer), 1)])])) : i("", !0)
|
|
194
|
-
], 46, S)], 6)) : i("", !0)]),
|
|
195
|
-
_: 3
|
|
196
|
-
})], 8, ["to"]));
|
|
30
|
+
]);
|
|
31
|
+
return (e, r) => u.value ? (a(), t("span", {
|
|
32
|
+
key: 0,
|
|
33
|
+
class: i(m.value),
|
|
34
|
+
role: "separator",
|
|
35
|
+
"aria-orientation": "vertical"
|
|
36
|
+
}, null, 2)) : d.value && !f.value ? (a(), t("div", {
|
|
37
|
+
key: 1,
|
|
38
|
+
class: i(m.value),
|
|
39
|
+
role: "separator",
|
|
40
|
+
"aria-orientation": "horizontal"
|
|
41
|
+
}, null, 2)) : (a(), t("div", {
|
|
42
|
+
key: 2,
|
|
43
|
+
class: i(m.value),
|
|
44
|
+
role: "separator",
|
|
45
|
+
"aria-orientation": "horizontal"
|
|
46
|
+
}, [n("span", c, [o(e.$slots, "default")])], 2));
|
|
197
47
|
}
|
|
198
48
|
});
|
|
199
49
|
//#endregion
|
|
200
|
-
export {
|
|
50
|
+
export { l as default };
|
|
201
51
|
|
|
202
52
|
//# sourceMappingURL=design-system81.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-system81.js","names":[],"sources":["../src/components/BDrawer/BDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { BDrawerPlacement, BDrawerSize } from '@/types';\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\n\n// ─────────────────────────────────────────────\n// Props & emits\n// ─────────────────────────────────────────────\nconst {\n placement = 'right',\n size = 'default',\n title = '',\n closable = true,\n mask = true,\n maskClosable = true,\n keyboard = true,\n destroyOnClose = false,\n width,\n height,\n zIndex = 1000,\n getContainer,\n autoFocus = true,\n modelValue = undefined,\n forceRender = false,\n extra = '',\n footer = '',\n loading = false,\n ariaLabel,\n} = defineProps<{\n /** Direction from which the drawer slides in. */\n placement?: BDrawerPlacement;\n /** Preset width/height: 'default' (378px) or 'large' (736px). */\n size?: BDrawerSize;\n /** Drawer title. Also accepts the `title` slot. */\n title?: string;\n /** Whether to show the close button. */\n closable?: boolean;\n /** Whether to show the mask overlay. */\n mask?: boolean;\n /** Clicking the mask closes the drawer. */\n maskClosable?: boolean;\n /** Pressing Escape closes the drawer. */\n keyboard?: boolean;\n /** Destroy child components when closing. */\n destroyOnClose?: boolean;\n /** Custom width (overrides size) for left/right placement. */\n width?: string | number;\n /** Custom height (overrides size) for top/bottom placement. */\n height?: string | number;\n /** z-index of the drawer. */\n zIndex?: number;\n /**\n * CSS selector or element to teleport the drawer into.\n * Defaults to `body`.\n */\n getContainer?: string | HTMLElement;\n /** Whether to auto-focus the first focusable element when opened. */\n autoFocus?: boolean;\n /**\n * Controlled visibility - bind with `v-model`.\n * When not provided the drawer manages its own state.\n */\n modelValue?: boolean;\n /** Force render the drawer content even when hidden. */\n forceRender?: boolean;\n /** Extra content in the header right area (also accepts the `extra` slot). */\n extra?: string;\n /** Footer content (also accepts the `footer` slot). */\n footer?: string;\n /** Show loading spinner in body area. */\n loading?: boolean;\n /**\n * Accessible label for the dialog when no visible title is present.\n * Required when `closable=false` and no `title` prop or `#title` slot is used.\n */\n ariaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fired when the user requests to close the drawer. */\n (e: 'close', event: MouseEvent | KeyboardEvent): void;\n /** Fired after the close transition completes. */\n (e: 'afterOpenChange', open: boolean): void;\n /** v-model support */\n (e: 'update:modelValue', value: boolean): void;\n}>();\n\nconst slots = defineSlots<{\n /** Main content of the drawer. */\n default?(): unknown;\n /** Overrides the `title` prop. */\n title?(): unknown;\n /** Overrides the `extra` prop (right side of header). */\n extra?(): unknown;\n /** Overrides the `footer` prop. */\n footer?(): unknown;\n /** Custom close icon. */\n closeIcon?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Internal state\n// ─────────────────────────────────────────────\nconst titleId = useId();\n\n/** Uncontrolled visibility. */\nconst internalOpen = ref(false);\n\n/** Effective visibility. */\nconst isOpen = computed(() => (modelValue !== undefined ? modelValue : internalOpen.value));\n\n/** Whether the drawer has ever been opened (for lazy rendering). */\nconst hasBeenOpened = ref(false);\n\n/** Whether the content should render. */\nconst shouldRender = computed(() => {\n if (forceRender) return true;\n if (destroyOnClose) return isOpen.value;\n return hasBeenOpened.value || isOpen.value;\n});\n\n// Track when drawer opens at least once\nwatch(isOpen, (val) => {\n if (val) hasBeenOpened.value = true;\n});\n\n// ─────────────────────────────────────────────\n// Derived state\n// ─────────────────────────────────────────────\nconst isHorizontal = computed(() => placement === 'left' || placement === 'right');\n\nconst sizeMap: Record<BDrawerSize, number> = {\n default: 378,\n large: 736,\n};\n\nconst resolvedWidth = computed(() => {\n if (width !== undefined) return typeof width === 'number' ? `${width}px` : width;\n return isHorizontal.value ? `${sizeMap[size]}px` : '100%';\n});\n\nconst resolvedHeight = computed(() => {\n if (height !== undefined) return typeof height === 'number' ? `${height}px` : height;\n return !isHorizontal.value ? `${sizeMap[size]}px` : '100%';\n});\n\nconst hasTitle = computed(() => Boolean(title || slots.title));\nconst hasExtra = computed(() => Boolean(extra || slots.extra));\nconst hasFooter = computed(() => Boolean(footer || slots.footer));\nconst hasHeader = computed(() => hasTitle.value || closable || hasExtra.value);\n\nconst teleportTarget = computed(() => {\n if (getContainer) return getContainer;\n return 'body';\n});\n\nconst panelStyle = computed(() => ({\n width: resolvedWidth.value,\n height: resolvedHeight.value,\n zIndex,\n}));\n\n// ─────────────────────────────────────────────\n// Focus management\n// ─────────────────────────────────────────────\nconst drawerRef = ref<HTMLElement | null>(null);\nlet previouslyFocusedElement: HTMLElement | null = null;\n\nfunction trapFocus(event: KeyboardEvent) {\n if (event.key !== 'Tab' || !drawerRef.value) return;\n\n const focusableSelectors =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n const focusable = Array.from(drawerRef.value.querySelectorAll<HTMLElement>(focusableSelectors));\n\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === first) {\n event.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }\n}\n\nfunction focusFirst() {\n if (!autoFocus || !drawerRef.value) return;\n\n nextTick(() => {\n if (!drawerRef.value) return;\n const focusableSelectors =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n const first = drawerRef.value.querySelector<HTMLElement>(focusableSelectors);\n if (first) {\n first.focus();\n } else {\n // Focus the panel itself as a fallback\n drawerRef.value.focus();\n }\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n nextTick(() => focusFirst());\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n});\n\nonBeforeUnmount(() => {\n document.body.style.overflow = '';\n});\n\n// ─────────────────────────────────────────────\n// Behaviour\n// ─────────────────────────────────────────────\nfunction requestClose(event: MouseEvent | KeyboardEvent) {\n emit('close', event);\n if (modelValue !== undefined) {\n emit('update:modelValue', false);\n } else {\n internalOpen.value = false;\n }\n}\n\nfunction onMaskClick(event: MouseEvent) {\n if (maskClosable) {\n requestClose(event);\n }\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape' && keyboard) {\n event.stopPropagation();\n requestClose(event);\n }\n trapFocus(event);\n}\n\nfunction onAfterEnter() {\n emit('afterOpenChange', true);\n}\n\nfunction onAfterLeave() {\n emit('afterOpenChange', false);\n // Restore focus to the previously focused element\n if (previouslyFocusedElement && typeof previouslyFocusedElement.focus === 'function') {\n previouslyFocusedElement.focus();\n previouslyFocusedElement = null;\n }\n}\n\n// ─────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────\nfunction open() {\n if (modelValue !== undefined) {\n emit('update:modelValue', true);\n } else {\n internalOpen.value = true;\n }\n}\n\ndefineExpose({ open });\n</script>\n\n<template>\n <Teleport :to=\"teleportTarget\">\n <Transition name=\"b-drawer\" @after-enter=\"onAfterEnter\" @after-leave=\"onAfterLeave\">\n <div\n v-if=\"isOpen\"\n class=\"b-drawer-root\"\n :class=\"`b-drawer-root--${placement}`\"\n :style=\"{ zIndex }\"\n >\n <!-- Mask -->\n <div v-if=\"mask\" class=\"b-drawer__mask\" aria-hidden=\"true\" @click=\"onMaskClick\" />\n\n <!-- Panel -->\n <div\n ref=\"drawerRef\"\n class=\"b-drawer\"\n :class=\"[\n `b-drawer--${placement}`,\n `b-drawer--${size}`,\n {\n 'b-drawer--has-header': hasHeader,\n 'b-drawer--has-footer': hasFooter,\n },\n ]\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"!hasTitle ? ariaLabel : undefined\"\n :aria-labelledby=\"hasTitle ? titleId : undefined\"\n :style=\"panelStyle\"\n tabindex=\"-1\"\n @keydown=\"onKeydown\"\n >\n <!-- Header -->\n <div v-if=\"hasHeader\" class=\"b-drawer__header\">\n <div class=\"b-drawer__header-title-wrapper\">\n <!-- Close button -->\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"b-drawer__close\"\n aria-label=\"Close drawer\"\n @click=\"requestClose\"\n >\n <slot name=\"closeIcon\">\n <svg\n class=\"b-drawer__close-icon\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n />\n </svg>\n </slot>\n </button>\n\n <!-- Title -->\n <div v-if=\"hasTitle\" :id=\"titleId\" class=\"b-drawer__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n </div>\n\n <!-- Extra -->\n <div v-if=\"hasExtra\" class=\"b-drawer__extra\">\n <slot name=\"extra\">{{ extra }}</slot>\n </div>\n </div>\n\n <!-- Body -->\n <div v-if=\"shouldRender\" class=\"b-drawer__body\">\n <div v-if=\"loading\" class=\"b-drawer__loading\" aria-live=\"polite\">\n <svg\n class=\"b-drawer__spinner\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-dasharray=\"31.4 31.4\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"b-drawer__loading-text\">Loading…</span>\n </div>\n <slot v-else />\n </div>\n\n <!-- Footer -->\n <div v-if=\"hasFooter\" class=\"b-drawer__footer\">\n <slot name=\"footer\">{{ footer }}</slot>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (tokens)\n ──────────────────────────────────────────── */\n.b-drawer-root {\n --b-drawer-bg: #fff;\n --b-drawer-color: oklch(25% 0 0);\n --b-drawer-mask-bg: rgba(0, 0, 0, 0.45);\n --b-drawer-border-color: oklch(90% 0 0);\n --b-drawer-header-padding: 1rem 1.5rem;\n --b-drawer-body-padding: 1.5rem;\n --b-drawer-footer-padding: 0.5rem 1rem;\n --b-drawer-close-color: oklch(40% 0 0);\n --b-drawer-close-hover-color: oklch(20% 0 0);\n --b-drawer-title-font-size: 1rem;\n --b-drawer-title-font-weight: 600;\n --b-drawer-title-line-height: 1.5;\n --b-drawer-transition-duration: 300ms;\n --b-drawer-shadow:\n -6px 0 16px 0 rgba(0, 0, 0, 0.08), -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-drawer-root {\n --b-drawer-bg: oklch(20% 0 0);\n --b-drawer-color: oklch(90% 0 0);\n --b-drawer-mask-bg: rgba(0, 0, 0, 0.65);\n --b-drawer-border-color: oklch(30% 0 0);\n --b-drawer-close-color: oklch(65% 0 0);\n --b-drawer-close-hover-color: oklch(90% 0 0);\n --b-drawer-shadow:\n -6px 0 16px 0 rgba(0, 0, 0, 0.24), -3px 0 6px -4px rgba(0, 0, 0, 0.36),\n -9px 0 28px 8px rgba(0, 0, 0, 0.2);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-drawer-root {\n --b-drawer-bg: oklch(20% 0 0);\n --b-drawer-color: oklch(90% 0 0);\n --b-drawer-mask-bg: rgba(0, 0, 0, 0.65);\n --b-drawer-border-color: oklch(30% 0 0);\n --b-drawer-close-color: oklch(65% 0 0);\n --b-drawer-close-hover-color: oklch(90% 0 0);\n --b-drawer-shadow:\n -6px 0 16px 0 rgba(0, 0, 0, 0.24), -3px 0 6px -4px rgba(0, 0, 0, 0.36),\n -9px 0 28px 8px rgba(0, 0, 0, 0.2);\n }\n}\n\n/* ─────────────────────────────────────────────\n Root wrapper (mask + panel)\n ───────────────────────────────────────────── */\n.b-drawer-root {\n position: fixed;\n inset: 0;\n}\n\n/* ── Mask ── */\n.b-drawer__mask {\n position: absolute;\n inset: 0;\n background: var(--b-drawer-mask-bg);\n}\n\n/* ── Panel base ── */\n.b-drawer {\n position: absolute;\n display: flex;\n flex-direction: column;\n background: var(--b-drawer-bg);\n color: var(--b-drawer-color);\n box-shadow: var(--b-drawer-shadow);\n outline: none;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n/* Placement positioning */\n.b-drawer--right {\n top: 0;\n right: 0;\n bottom: 0;\n}\n\n.b-drawer--left {\n top: 0;\n left: 0;\n bottom: 0;\n}\n\n.b-drawer--top {\n top: 0;\n left: 0;\n right: 0;\n}\n\n.b-drawer--bottom {\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n/* ── Header ── */\n.b-drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--b-drawer-header-padding);\n border-bottom: 1px solid var(--b-drawer-border-color);\n flex-shrink: 0;\n}\n\n.b-drawer__header-title-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n min-width: 0;\n flex: 1;\n}\n\n.b-drawer__title {\n font-size: var(--b-drawer-title-font-size);\n font-weight: var(--b-drawer-title-font-weight);\n line-height: var(--b-drawer-title-line-height);\n color: var(--b-drawer-color);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.b-drawer__extra {\n flex-shrink: 0;\n}\n\n/* ── Close button ── */\n.b-drawer__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n border-radius: 0.25rem;\n background: transparent;\n color: var(--b-drawer-close-color);\n cursor: pointer;\n width: 1.375rem;\n height: 1.375rem;\n font-size: 1rem;\n line-height: 1;\n transition: color var(--b-drawer-transition-duration) ease;\n}\n\n.b-drawer__close:hover {\n color: var(--b-drawer-close-hover-color);\n}\n\n.b-drawer__close:focus-visible {\n outline: 2px solid oklch(62.3% 0.214 259.815);\n outline-offset: 2px;\n}\n\n.b-drawer__close-icon {\n width: 1em;\n height: 1em;\n fill: currentColor;\n display: block;\n}\n\n/* ── Body ── */\n.b-drawer__body {\n flex: 1;\n padding: var(--b-drawer-body-padding);\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n/* ── Footer ── */\n.b-drawer__footer {\n flex-shrink: 0;\n padding: var(--b-drawer-footer-padding);\n border-top: 1px solid var(--b-drawer-border-color);\n}\n\n/* ── Loading spinner ── */\n.b-drawer__loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 2rem;\n color: var(--b-drawer-close-color);\n}\n\n.b-drawer__spinner {\n width: 2rem;\n height: 2rem;\n animation: b-drawer-spin 1s linear infinite;\n}\n\n.b-drawer__loading-text {\n font-size: 0.875rem;\n}\n\n@keyframes b-drawer-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ─────────────────────────────────────────────\n Slide transitions\n ─────────────────────────────────────────────\n Vue's <Transition> adds .b-drawer-{enter|leave}-* classes\n to the root element (.b-drawer-root). We target the\n children (.b-drawer and .b-drawer__mask) from there.\n ───────────────────────────────────────────── */\n\n/*\n * Vue's <Transition> listens for `transitionend` on the root element\n * (.b-drawer-root) to know when the leave animation finishes.\n * We must put a real transition on the root itself so that event fires.\n * We use `visibility` which is invisible to the user but gives Vue\n * the transitionend signal it needs.\n */\n.b-drawer-enter-active,\n.b-drawer-leave-active {\n transition: visibility var(--b-drawer-transition-duration) linear;\n}\n\n.b-drawer-leave-to {\n visibility: hidden;\n}\n\n/* - Active phase: set transition on children - */\n.b-drawer-enter-active > .b-drawer,\n.b-drawer-leave-active > .b-drawer {\n transition: transform var(--b-drawer-transition-duration) cubic-bezier(0.7, 0.3, 0.1, 1);\n}\n\n.b-drawer-enter-active > .b-drawer__mask,\n.b-drawer-leave-active > .b-drawer__mask {\n transition: opacity var(--b-drawer-transition-duration) ease;\n}\n\n/* - From / To: mask fades - */\n.b-drawer-enter-from > .b-drawer__mask,\n.b-drawer-leave-to > .b-drawer__mask {\n opacity: 0;\n}\n\n/* - From / To: panel slides (right) - */\n.b-drawer-enter-from > .b-drawer--right,\n.b-drawer-leave-to > .b-drawer--right {\n transform: translateX(100%);\n}\n\n/* - From / To: panel slides (left) - */\n.b-drawer-enter-from > .b-drawer--left,\n.b-drawer-leave-to > .b-drawer--left {\n transform: translateX(-100%);\n}\n\n/* - From / To: panel slides (top) - */\n.b-drawer-enter-from > .b-drawer--top,\n.b-drawer-leave-to > .b-drawer--top {\n transform: translateY(-100%);\n}\n\n/* - From / To: panel slides (bottom) - */\n.b-drawer-enter-from > .b-drawer--bottom,\n.b-drawer-leave-to > .b-drawer--bottom {\n transform: translateY(100%);\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-drawer-enter-active,\n .b-drawer-leave-active,\n .b-drawer-enter-active > .b-drawer,\n .b-drawer-leave-active > .b-drawer,\n .b-drawer-enter-active > .b-drawer__mask,\n .b-drawer-leave-active > .b-drawer__mask {\n transition-duration: 0ms;\n }\n\n .b-drawer__spinner {\n animation: none;\n }\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"design-system81.js","names":[],"sources":["../src/components/BDivider/BDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type {\n BDividerOrientation,\n BDividerSize,\n BDividerTitlePlacement,\n BDividerVariant,\n} from './types.ts';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\nconst {\n orientation = 'horizontal',\n variant = 'solid',\n dashed = false,\n plain = true,\n size = 'large',\n titlePlacement = 'center',\n} = defineProps<{\n /**\n * Line direction.\n * - `'horizontal'` - a full-width horizontal rule (default)\n * - `'vertical'` - an inline vertical separator\n * @default 'horizontal'\n */\n orientation?: BDividerOrientation;\n /**\n * Line style.\n * - `'solid'` - continuous line (default)\n * - `'dashed'` - dashed line\n * - `'dotted'` - dotted line\n * @default 'solid'\n */\n variant?: BDividerVariant;\n /**\n * Shorthand for `variant=\"dashed\"`. Overridden when `variant` is also set.\n * Kept for AntD API compatibility.\n * @default false\n * @deprecated Prefer `variant` prop\n */\n dashed?: boolean;\n /**\n * Render the text in plain (normal weight) style rather than bold.\n * Only meaningful for horizontal dividers with content.\n * @default true\n */\n plain?: boolean;\n /**\n * Vertical spacing around horizontal dividers (ignored for vertical orientation).\n * - `'small'` - tighter margin\n * - `'medium'` - medium margin\n * - `'large'` - standard Ant Design margin (default)\n * @default 'large'\n */\n size?: BDividerSize;\n /**\n * Horizontal position of the title text inside a horizontal divider.\n * - `'start'` - align text to the leading edge\n * - `'center'` - centre the text (default)\n * - `'end'` - align text to the trailing edge\n * @default 'center'\n */\n titlePlacement?: BDividerTitlePlacement;\n}>();\n\nconst slots = defineSlots<{\n /** Optional title or content placed inside the divider line. */\n default?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Computed\n// ─────────────────────────────────────────────\nconst isVertical = computed(() => orientation === 'vertical');\nconst isHorizontal = computed(() => orientation === 'horizontal');\n\n/** Whether there is slot content to render. */\nconst hasContent = computed(() => Boolean(slots.default));\n\n/**\n * Resolve the effective line style.\n * `dashed` prop is a legacy alias for `variant=\"dashed\"`.\n */\nconst effectiveVariant = computed<BDividerVariant>(() => {\n if (dashed && variant === 'solid') return 'dashed';\n return variant;\n});\n\nconst rootClass = computed(() => [\n 'b-divider',\n `b-divider--${orientation}`,\n `b-divider--${effectiveVariant.value}`,\n `b-divider--size-${size}`,\n {\n 'b-divider--with-text': hasContent.value && isHorizontal.value,\n [`b-divider--text-${titlePlacement}`]: hasContent.value && isHorizontal.value,\n 'b-divider--plain': plain,\n },\n]);\n</script>\n\n<template>\n <!--\n Vertical divider: a presentational inline separator.\n role=\"separator\" with aria-orientation covers both horizontal and vertical.\n -->\n <span v-if=\"isVertical\" :class=\"rootClass\" role=\"separator\" aria-orientation=\"vertical\" />\n\n <!--\n Horizontal divider WITHOUT content.\n <div role=\"separator\"> is used instead of <hr> because axe-core evaluates\n <hr> (which carries implicit role=\"separator\") for text-colour contrast by\n reading its CSS `color` property. A <div role=\"separator\"> with no text\n content is exempt from that check (WCAG SC 1.4.3 applies only to text).\n -->\n <div\n v-else-if=\"isHorizontal && !hasContent\"\n :class=\"rootClass\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n />\n\n <!--\n Horizontal divider WITH content: <div role=\"separator\"> wrapping the text.\n <hr> cannot contain children, so we fall back to a div.\n -->\n <div v-else :class=\"rootClass\" role=\"separator\" aria-orientation=\"horizontal\">\n <span class=\"b-divider__content\">\n <slot />\n </span>\n </div>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (design tokens)\n Scoped to .b-divider — never on :root\n ──────────────────────────────────────────── */\n.b-divider {\n /* AntD token: textPaddingInline → horizontal padding around inner text */\n --b-divider-text-padding-inline: 1em;\n\n /* AntD token: orientationMargin → fraction of width from the near edge for start/end text */\n --b-divider-orientation-margin: 0.05;\n\n /* AntD token: verticalMarginInline → horizontal margin on vertical dividers */\n --b-divider-vertical-margin-inline: 8px;\n\n /* Colour */\n --b-divider-color: oklch(88% 0.01 264); /* neutral border */\n --b-divider-text-color: oklch(32% 0.02 264);\n\n /* Typography */\n --b-divider-font-size: 1rem;\n --b-divider-font-weight-text: 500; /* \"with-text\" non-plain heading weight */\n\n /* Size (margin-block for horizontal) */\n --b-divider-margin-block-large: 1.5rem; /* size=large (AntD default) */\n --b-divider-margin-block-medium: 0.75rem; /* size=medium */\n --b-divider-margin-block-small: 0.25rem; /* size=small */\n\n /* Line geometry */\n --b-divider-line-width: 1px;\n}\n\n/* ── Dark mode ───────────────────────────────────────────────────────────\n Use only the attribute selector, consistent with every other component\n in this system (BAlert, BCard, etc.). The @media (prefers-color-scheme)\n query is deliberately omitted: Storybook controls the theme by toggling\n [data-prefers-color='dark'] on <html>. A media-query override would fire\n based on the OS/test-runner's colour scheme regardless of the canvas\n setting, producing light text (#c7cedb) on a white canvas — failing\n WCAG 1.4.3 contrast in automated a11y checks.\n ──────────────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-divider {\n --b-divider-color: oklch(35% 0.02 264);\n --b-divider-text-color: oklch(85% 0.02 264);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-divider {\n --b-divider-color: oklch(35% 0.02 264);\n --b-divider-text-color: oklch(85% 0.02 264);\n }\n}\n\n/* ─────────────────────────────────────────────\n Horizontal — <div role=separator> (no text) or <div role=separator> (with text)\n ───────────────────────────────────────────── */\n.b-divider--horizontal {\n display: block;\n clear: both;\n width: 100%;\n margin-block: var(--b-divider-margin-block-large);\n border: none;\n border-block-start: var(--b-divider-line-width) var(--b-divider-color);\n /* default style is overridden by variant classes below */\n border-block-start-style: solid;\n box-sizing: border-box;\n}\n\n/* Size variants (horizontal only) */\n.b-divider--horizontal.b-divider--size-small {\n margin-block: var(--b-divider-margin-block-small);\n}\n.b-divider--horizontal.b-divider--size-medium {\n margin-block: var(--b-divider-margin-block-medium);\n}\n.b-divider--horizontal.b-divider--size-large {\n margin-block: var(--b-divider-margin-block-large);\n}\n\n/* ─────────────────────────────────────────────\n Horizontal WITH text\n ───────────────────────────────────────────── */\n.b-divider--with-text {\n display: flex;\n align-items: center;\n border-block-start-style: none; /* lines rendered via ::before / ::after */\n white-space: nowrap;\n font-size: var(--b-divider-font-size);\n color: var(--b-divider-text-color);\n font-weight: var(--b-divider-font-weight-text);\n}\n\n/* Plain text: normal weight */\n.b-divider--with-text.b-divider--plain {\n font-weight: normal;\n}\n\n/* Lines flanking the text */\n.b-divider--with-text::before,\n.b-divider--with-text::after {\n content: '';\n flex: 1;\n border-block-start: var(--b-divider-line-width) solid var(--b-divider-color);\n}\n\n/* variant overrides for ::before / ::after */\n.b-divider--dashed.b-divider--with-text::before,\n.b-divider--dashed.b-divider--with-text::after {\n border-block-start-style: dashed;\n}\n.b-divider--dotted.b-divider--with-text::before,\n.b-divider--dotted.b-divider--with-text::after {\n border-block-start-style: dotted;\n}\n\n/* Text placement — start: push text to left edge */\n.b-divider--text-start::before {\n /* orientationMargin is a unitless fraction (0.05 = 5% of width) */\n flex: calc(var(--b-divider-orientation-margin) * 1);\n min-width: 0;\n}\n.b-divider--text-start::after {\n flex: 1;\n}\n\n/* Text placement — end: push text to right edge */\n.b-divider--text-end::after {\n flex: calc(var(--b-divider-orientation-margin) * 1);\n min-width: 0;\n}\n.b-divider--text-end::before {\n flex: 1;\n}\n\n/* Text placement — center (default): equal halves */\n.b-divider--text-center::before,\n.b-divider--text-center::after {\n flex: 1;\n}\n\n.b-divider__content {\n padding-inline: var(--b-divider-text-padding-inline);\n /* prevent the text itself from shrinking below its natural width */\n flex-shrink: 0;\n}\n\n/* ─────────────────────────────────────────────\n Line-style variants (horizontal no-text)\n ───────────────────────────────────────────── */\n.b-divider--horizontal:not(.b-divider--with-text).b-divider--dashed {\n border-block-start-style: dashed;\n}\n.b-divider--horizontal:not(.b-divider--with-text).b-divider--dotted {\n border-block-start-style: dotted;\n}\n\n/* ─────────────────────────────────────────────\n Vertical divider\n ───────────────────────────────────────────── */\n.b-divider--vertical {\n display: inline-block;\n /* explicit height is not set — inherits from line-height of surrounding text */\n height: 0.9em;\n border-inline-start: var(--b-divider-line-width) solid var(--b-divider-color);\n border-block-start: none;\n vertical-align: middle;\n margin-inline: var(--b-divider-vertical-margin-inline);\n}\n\n.b-divider--vertical.b-divider--dashed {\n border-inline-start-style: dashed;\n}\n.b-divider--vertical.b-divider--dotted {\n border-inline-start-style: dotted;\n}\n\n/* ─────────────────────────────────────────────\n Reduced motion\n (dividers have no animations, but guard is here for completeness)\n ───────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-divider {\n transition: none;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAkEA,IAAM,IAAQ,GAGV,EAKE,IAAa,QAAe,EAAA,gBAAgB,WAAW,EACvD,IAAe,QAAe,EAAA,gBAAgB,aAAa,EAG3D,IAAa,QAAe,EAAQ,EAAM,QAAS,EAMnD,IAAmB,QACnB,EAAA,UAAU,EAAA,YAAY,UAAgB,WACnC,EAAA,QACP,EAEI,IAAY,QAAe;GAC/B;GACA,cAAc,EAAA;GACd,cAAc,EAAiB;GAC/B,mBAAmB,EAAA;GACnB;IACE,wBAAwB,EAAW,SAAS,EAAa;KACxD,mBAAmB,EAAA,mBAAmB,EAAW,SAAS,EAAa;IACxE,oBAAoB,EAAA;IACrB;GACF,CAAC;mBAQY,EAAA,SAAA,GAAA,EAAZ,EAA0F,QAAA;;GAAjE,OAAK,EAAE,EAAA,MAAS;GAAE,MAAK;GAAY,oBAAiB;iBAUhE,EAAA,SAAY,CAAK,EAAA,SAAA,GAAA,EAD9B,EAKE,OAAA;;GAHC,OAAK,EAAE,EAAA,MAAS;GACjB,MAAK;GACL,oBAAiB;uBAOnB,EAIM,OAAA;;GAJO,OAAK,EAAE,EAAA,MAAS;GAAE,MAAK;GAAY,oBAAiB;MAC/D,EAEO,QAFP,GAEO,CADL,EAAQ,EAAA,QAAA,UAAA,CAAA,CAAA,CAAA,EAAA,EAAA"}
|
package/dist/design-system83.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-system83.js","names":[],"sources":["../src/components/BDrawer/BDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { BDrawerPlacement, BDrawerSize } from '@/types';\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\n\n// ─────────────────────────────────────────────\n// Props & emits\n// ─────────────────────────────────────────────\nconst {\n placement = 'right',\n size = 'default',\n title = '',\n closable = true,\n mask = true,\n maskClosable = true,\n keyboard = true,\n destroyOnClose = false,\n width,\n height,\n zIndex = 1000,\n getContainer,\n autoFocus = true,\n modelValue = undefined,\n forceRender = false,\n extra = '',\n footer = '',\n loading = false,\n ariaLabel,\n} = defineProps<{\n /** Direction from which the drawer slides in. */\n placement?: BDrawerPlacement;\n /** Preset width/height: 'default' (378px) or 'large' (736px). */\n size?: BDrawerSize;\n /** Drawer title. Also accepts the `title` slot. */\n title?: string;\n /** Whether to show the close button. */\n closable?: boolean;\n /** Whether to show the mask overlay. */\n mask?: boolean;\n /** Clicking the mask closes the drawer. */\n maskClosable?: boolean;\n /** Pressing Escape closes the drawer. */\n keyboard?: boolean;\n /** Destroy child components when closing. */\n destroyOnClose?: boolean;\n /** Custom width (overrides size) for left/right placement. */\n width?: string | number;\n /** Custom height (overrides size) for top/bottom placement. */\n height?: string | number;\n /** z-index of the drawer. */\n zIndex?: number;\n /**\n * CSS selector or element to teleport the drawer into.\n * Defaults to `body`.\n */\n getContainer?: string | HTMLElement;\n /** Whether to auto-focus the first focusable element when opened. */\n autoFocus?: boolean;\n /**\n * Controlled visibility - bind with `v-model`.\n * When not provided the drawer manages its own state.\n */\n modelValue?: boolean;\n /** Force render the drawer content even when hidden. */\n forceRender?: boolean;\n /** Extra content in the header right area (also accepts the `extra` slot). */\n extra?: string;\n /** Footer content (also accepts the `footer` slot). */\n footer?: string;\n /** Show loading spinner in body area. */\n loading?: boolean;\n /**\n * Accessible label for the dialog when no visible title is present.\n * Required when `closable=false` and no `title` prop or `#title` slot is used.\n */\n ariaLabel?: string;\n}>();\n\nconst emit = defineEmits<{\n /** Fired when the user requests to close the drawer. */\n (e: 'close', event: MouseEvent | KeyboardEvent): void;\n /** Fired after the close transition completes. */\n (e: 'afterOpenChange', open: boolean): void;\n /** v-model support */\n (e: 'update:modelValue', value: boolean): void;\n}>();\n\nconst slots = defineSlots<{\n /** Main content of the drawer. */\n default?(): unknown;\n /** Overrides the `title` prop. */\n title?(): unknown;\n /** Overrides the `extra` prop (right side of header). */\n extra?(): unknown;\n /** Overrides the `footer` prop. */\n footer?(): unknown;\n /** Custom close icon. */\n closeIcon?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Internal state\n// ─────────────────────────────────────────────\nconst titleId = useId();\n\n/** Uncontrolled visibility. */\nconst internalOpen = ref(false);\n\n/** Effective visibility. */\nconst isOpen = computed(() => (modelValue !== undefined ? modelValue : internalOpen.value));\n\n/** Whether the drawer has ever been opened (for lazy rendering). */\nconst hasBeenOpened = ref(false);\n\n/** Whether the content should render. */\nconst shouldRender = computed(() => {\n if (forceRender) return true;\n if (destroyOnClose) return isOpen.value;\n return hasBeenOpened.value || isOpen.value;\n});\n\n// Track when drawer opens at least once\nwatch(isOpen, (val) => {\n if (val) hasBeenOpened.value = true;\n});\n\n// ─────────────────────────────────────────────\n// Derived state\n// ─────────────────────────────────────────────\nconst isHorizontal = computed(() => placement === 'left' || placement === 'right');\n\nconst sizeMap: Record<BDrawerSize, number> = {\n default: 378,\n large: 736,\n};\n\nconst resolvedWidth = computed(() => {\n if (width !== undefined) return typeof width === 'number' ? `${width}px` : width;\n return isHorizontal.value ? `${sizeMap[size]}px` : '100%';\n});\n\nconst resolvedHeight = computed(() => {\n if (height !== undefined) return typeof height === 'number' ? `${height}px` : height;\n return !isHorizontal.value ? `${sizeMap[size]}px` : '100%';\n});\n\nconst hasTitle = computed(() => Boolean(title || slots.title));\nconst hasExtra = computed(() => Boolean(extra || slots.extra));\nconst hasFooter = computed(() => Boolean(footer || slots.footer));\nconst hasHeader = computed(() => hasTitle.value || closable || hasExtra.value);\n\nconst teleportTarget = computed(() => {\n if (getContainer) return getContainer;\n return 'body';\n});\n\nconst panelStyle = computed(() => ({\n width: resolvedWidth.value,\n height: resolvedHeight.value,\n zIndex,\n}));\n\n// ─────────────────────────────────────────────\n// Focus management\n// ─────────────────────────────────────────────\nconst drawerRef = ref<HTMLElement | null>(null);\nlet previouslyFocusedElement: HTMLElement | null = null;\n\nfunction trapFocus(event: KeyboardEvent) {\n if (event.key !== 'Tab' || !drawerRef.value) return;\n\n const focusableSelectors =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n const focusable = Array.from(drawerRef.value.querySelectorAll<HTMLElement>(focusableSelectors));\n\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === first) {\n event.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }\n}\n\nfunction focusFirst() {\n if (!autoFocus || !drawerRef.value) return;\n\n nextTick(() => {\n if (!drawerRef.value) return;\n const focusableSelectors =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n const first = drawerRef.value.querySelector<HTMLElement>(focusableSelectors);\n if (first) {\n first.focus();\n } else {\n // Focus the panel itself as a fallback\n drawerRef.value.focus();\n }\n });\n}\n\nwatch(isOpen, (val) => {\n if (val) {\n previouslyFocusedElement = document.activeElement as HTMLElement | null;\n nextTick(() => focusFirst());\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n});\n\nonBeforeUnmount(() => {\n document.body.style.overflow = '';\n});\n\n// ─────────────────────────────────────────────\n// Behaviour\n// ─────────────────────────────────────────────\nfunction requestClose(event: MouseEvent | KeyboardEvent) {\n emit('close', event);\n if (modelValue !== undefined) {\n emit('update:modelValue', false);\n } else {\n internalOpen.value = false;\n }\n}\n\nfunction onMaskClick(event: MouseEvent) {\n if (maskClosable) {\n requestClose(event);\n }\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape' && keyboard) {\n event.stopPropagation();\n requestClose(event);\n }\n trapFocus(event);\n}\n\nfunction onAfterEnter() {\n emit('afterOpenChange', true);\n}\n\nfunction onAfterLeave() {\n emit('afterOpenChange', false);\n // Restore focus to the previously focused element\n if (previouslyFocusedElement && typeof previouslyFocusedElement.focus === 'function') {\n previouslyFocusedElement.focus();\n previouslyFocusedElement = null;\n }\n}\n\n// ─────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────\nfunction open() {\n if (modelValue !== undefined) {\n emit('update:modelValue', true);\n } else {\n internalOpen.value = true;\n }\n}\n\ndefineExpose({ open });\n</script>\n\n<template>\n <Teleport :to=\"teleportTarget\">\n <Transition name=\"b-drawer\" @after-enter=\"onAfterEnter\" @after-leave=\"onAfterLeave\">\n <div\n v-if=\"isOpen\"\n class=\"b-drawer-root\"\n :class=\"`b-drawer-root--${placement}`\"\n :style=\"{ zIndex }\"\n >\n <!-- Mask -->\n <div v-if=\"mask\" class=\"b-drawer__mask\" aria-hidden=\"true\" @click=\"onMaskClick\" />\n\n <!-- Panel -->\n <div\n ref=\"drawerRef\"\n class=\"b-drawer\"\n :class=\"[\n `b-drawer--${placement}`,\n `b-drawer--${size}`,\n {\n 'b-drawer--has-header': hasHeader,\n 'b-drawer--has-footer': hasFooter,\n },\n ]\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"!hasTitle ? ariaLabel : undefined\"\n :aria-labelledby=\"hasTitle ? titleId : undefined\"\n :style=\"panelStyle\"\n tabindex=\"-1\"\n @keydown=\"onKeydown\"\n >\n <!-- Header -->\n <div v-if=\"hasHeader\" class=\"b-drawer__header\">\n <div class=\"b-drawer__header-title-wrapper\">\n <!-- Close button -->\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"b-drawer__close\"\n aria-label=\"Close drawer\"\n @click=\"requestClose\"\n >\n <slot name=\"closeIcon\">\n <svg\n class=\"b-drawer__close-icon\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n />\n </svg>\n </slot>\n </button>\n\n <!-- Title -->\n <div v-if=\"hasTitle\" :id=\"titleId\" class=\"b-drawer__title\">\n <slot name=\"title\">{{ title }}</slot>\n </div>\n </div>\n\n <!-- Extra -->\n <div v-if=\"hasExtra\" class=\"b-drawer__extra\">\n <slot name=\"extra\">{{ extra }}</slot>\n </div>\n </div>\n\n <!-- Body -->\n <div v-if=\"shouldRender\" class=\"b-drawer__body\">\n <div v-if=\"loading\" class=\"b-drawer__loading\" aria-live=\"polite\">\n <svg\n class=\"b-drawer__spinner\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-dasharray=\"31.4 31.4\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"b-drawer__loading-text\">Loading…</span>\n </div>\n <slot v-else />\n </div>\n\n <!-- Footer -->\n <div v-if=\"hasFooter\" class=\"b-drawer__footer\">\n <slot name=\"footer\">{{ footer }}</slot>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (tokens)\n ──────────────────────────────────────────── */\n.b-drawer-root {\n --b-drawer-bg: #fff;\n --b-drawer-color: oklch(25% 0 0);\n --b-drawer-mask-bg: rgba(0, 0, 0, 0.45);\n --b-drawer-border-color: oklch(90% 0 0);\n --b-drawer-header-padding: 1rem 1.5rem;\n --b-drawer-body-padding: 1.5rem;\n --b-drawer-footer-padding: 0.5rem 1rem;\n --b-drawer-close-color: oklch(40% 0 0);\n --b-drawer-close-hover-color: oklch(20% 0 0);\n --b-drawer-title-font-size: 1rem;\n --b-drawer-title-font-weight: 600;\n --b-drawer-title-line-height: 1.5;\n --b-drawer-transition-duration: 300ms;\n --b-drawer-shadow:\n -6px 0 16px 0 rgba(0, 0, 0, 0.08), -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n -9px 0 28px 8px rgba(0, 0, 0, 0.05);\n}\n\n/* ── Dark mode ── */\n[data-prefers-color='dark'] .b-drawer-root {\n --b-drawer-bg: oklch(20% 0 0);\n --b-drawer-color: oklch(90% 0 0);\n --b-drawer-mask-bg: rgba(0, 0, 0, 0.65);\n --b-drawer-border-color: oklch(30% 0 0);\n --b-drawer-close-color: oklch(65% 0 0);\n --b-drawer-close-hover-color: oklch(90% 0 0);\n --b-drawer-shadow:\n -6px 0 16px 0 rgba(0, 0, 0, 0.24), -3px 0 6px -4px rgba(0, 0, 0, 0.36),\n -9px 0 28px 8px rgba(0, 0, 0, 0.2);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-drawer-root {\n --b-drawer-bg: oklch(20% 0 0);\n --b-drawer-color: oklch(90% 0 0);\n --b-drawer-mask-bg: rgba(0, 0, 0, 0.65);\n --b-drawer-border-color: oklch(30% 0 0);\n --b-drawer-close-color: oklch(65% 0 0);\n --b-drawer-close-hover-color: oklch(90% 0 0);\n --b-drawer-shadow:\n -6px 0 16px 0 rgba(0, 0, 0, 0.24), -3px 0 6px -4px rgba(0, 0, 0, 0.36),\n -9px 0 28px 8px rgba(0, 0, 0, 0.2);\n }\n}\n\n/* ─────────────────────────────────────────────\n Root wrapper (mask + panel)\n ───────────────────────────────────────────── */\n.b-drawer-root {\n position: fixed;\n inset: 0;\n}\n\n/* ── Mask ── */\n.b-drawer__mask {\n position: absolute;\n inset: 0;\n background: var(--b-drawer-mask-bg);\n}\n\n/* ── Panel base ── */\n.b-drawer {\n position: absolute;\n display: flex;\n flex-direction: column;\n background: var(--b-drawer-bg);\n color: var(--b-drawer-color);\n box-shadow: var(--b-drawer-shadow);\n outline: none;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n/* Placement positioning */\n.b-drawer--right {\n top: 0;\n right: 0;\n bottom: 0;\n}\n\n.b-drawer--left {\n top: 0;\n left: 0;\n bottom: 0;\n}\n\n.b-drawer--top {\n top: 0;\n left: 0;\n right: 0;\n}\n\n.b-drawer--bottom {\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n/* ── Header ── */\n.b-drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--b-drawer-header-padding);\n border-bottom: 1px solid var(--b-drawer-border-color);\n flex-shrink: 0;\n}\n\n.b-drawer__header-title-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n min-width: 0;\n flex: 1;\n}\n\n.b-drawer__title {\n font-size: var(--b-drawer-title-font-size);\n font-weight: var(--b-drawer-title-font-weight);\n line-height: var(--b-drawer-title-line-height);\n color: var(--b-drawer-color);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.b-drawer__extra {\n flex-shrink: 0;\n}\n\n/* ── Close button ── */\n.b-drawer__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n border-radius: 0.25rem;\n background: transparent;\n color: var(--b-drawer-close-color);\n cursor: pointer;\n width: 1.375rem;\n height: 1.375rem;\n font-size: 1rem;\n line-height: 1;\n transition: color var(--b-drawer-transition-duration) ease;\n}\n\n.b-drawer__close:hover {\n color: var(--b-drawer-close-hover-color);\n}\n\n.b-drawer__close:focus-visible {\n outline: 2px solid oklch(62.3% 0.214 259.815);\n outline-offset: 2px;\n}\n\n.b-drawer__close-icon {\n width: 1em;\n height: 1em;\n fill: currentColor;\n display: block;\n}\n\n/* ── Body ── */\n.b-drawer__body {\n flex: 1;\n padding: var(--b-drawer-body-padding);\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n/* ── Footer ── */\n.b-drawer__footer {\n flex-shrink: 0;\n padding: var(--b-drawer-footer-padding);\n border-top: 1px solid var(--b-drawer-border-color);\n}\n\n/* ── Loading spinner ── */\n.b-drawer__loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n padding: 2rem;\n color: var(--b-drawer-close-color);\n}\n\n.b-drawer__spinner {\n width: 2rem;\n height: 2rem;\n animation: b-drawer-spin 1s linear infinite;\n}\n\n.b-drawer__loading-text {\n font-size: 0.875rem;\n}\n\n@keyframes b-drawer-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ─────────────────────────────────────────────\n Slide transitions\n ─────────────────────────────────────────────\n Vue's <Transition> adds .b-drawer-{enter|leave}-* classes\n to the root element (.b-drawer-root). We target the\n children (.b-drawer and .b-drawer__mask) from there.\n ───────────────────────────────────────────── */\n\n/*\n * Vue's <Transition> listens for `transitionend` on the root element\n * (.b-drawer-root) to know when the leave animation finishes.\n * We must put a real transition on the root itself so that event fires.\n * We use `visibility` which is invisible to the user but gives Vue\n * the transitionend signal it needs.\n */\n.b-drawer-enter-active,\n.b-drawer-leave-active {\n transition: visibility var(--b-drawer-transition-duration) linear;\n}\n\n.b-drawer-leave-to {\n visibility: hidden;\n}\n\n/* - Active phase: set transition on children - */\n.b-drawer-enter-active > .b-drawer,\n.b-drawer-leave-active > .b-drawer {\n transition: transform var(--b-drawer-transition-duration) cubic-bezier(0.7, 0.3, 0.1, 1);\n}\n\n.b-drawer-enter-active > .b-drawer__mask,\n.b-drawer-leave-active > .b-drawer__mask {\n transition: opacity var(--b-drawer-transition-duration) ease;\n}\n\n/* - From / To: mask fades - */\n.b-drawer-enter-from > .b-drawer__mask,\n.b-drawer-leave-to > .b-drawer__mask {\n opacity: 0;\n}\n\n/* - From / To: panel slides (right) - */\n.b-drawer-enter-from > .b-drawer--right,\n.b-drawer-leave-to > .b-drawer--right {\n transform: translateX(100%);\n}\n\n/* - From / To: panel slides (left) - */\n.b-drawer-enter-from > .b-drawer--left,\n.b-drawer-leave-to > .b-drawer--left {\n transform: translateX(-100%);\n}\n\n/* - From / To: panel slides (top) - */\n.b-drawer-enter-from > .b-drawer--top,\n.b-drawer-leave-to > .b-drawer--top {\n transform: translateY(-100%);\n}\n\n/* - From / To: panel slides (bottom) - */\n.b-drawer-enter-from > .b-drawer--bottom,\n.b-drawer-leave-to > .b-drawer--bottom {\n transform: translateY(100%);\n}\n\n/* ── Reduced motion ── */\n@media (prefers-reduced-motion: reduce) {\n .b-drawer-enter-active,\n .b-drawer-leave-active,\n .b-drawer-enter-active > .b-drawer,\n .b-drawer-leave-active > .b-drawer,\n .b-drawer-enter-active > .b-drawer__mask,\n .b-drawer-leave-active > .b-drawer__mask {\n transition-duration: 0ms;\n }\n\n .b-drawer__spinner {\n animation: none;\n }\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"design-system83.js","names":[],"sources":["../src/components/BDivider/BDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type {\n BDividerOrientation,\n BDividerSize,\n BDividerTitlePlacement,\n BDividerVariant,\n} from './types.ts';\n\n// ─────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────\nconst {\n orientation = 'horizontal',\n variant = 'solid',\n dashed = false,\n plain = true,\n size = 'large',\n titlePlacement = 'center',\n} = defineProps<{\n /**\n * Line direction.\n * - `'horizontal'` - a full-width horizontal rule (default)\n * - `'vertical'` - an inline vertical separator\n * @default 'horizontal'\n */\n orientation?: BDividerOrientation;\n /**\n * Line style.\n * - `'solid'` - continuous line (default)\n * - `'dashed'` - dashed line\n * - `'dotted'` - dotted line\n * @default 'solid'\n */\n variant?: BDividerVariant;\n /**\n * Shorthand for `variant=\"dashed\"`. Overridden when `variant` is also set.\n * Kept for AntD API compatibility.\n * @default false\n * @deprecated Prefer `variant` prop\n */\n dashed?: boolean;\n /**\n * Render the text in plain (normal weight) style rather than bold.\n * Only meaningful for horizontal dividers with content.\n * @default true\n */\n plain?: boolean;\n /**\n * Vertical spacing around horizontal dividers (ignored for vertical orientation).\n * - `'small'` - tighter margin\n * - `'medium'` - medium margin\n * - `'large'` - standard Ant Design margin (default)\n * @default 'large'\n */\n size?: BDividerSize;\n /**\n * Horizontal position of the title text inside a horizontal divider.\n * - `'start'` - align text to the leading edge\n * - `'center'` - centre the text (default)\n * - `'end'` - align text to the trailing edge\n * @default 'center'\n */\n titlePlacement?: BDividerTitlePlacement;\n}>();\n\nconst slots = defineSlots<{\n /** Optional title or content placed inside the divider line. */\n default?(): unknown;\n}>();\n\n// ─────────────────────────────────────────────\n// Computed\n// ─────────────────────────────────────────────\nconst isVertical = computed(() => orientation === 'vertical');\nconst isHorizontal = computed(() => orientation === 'horizontal');\n\n/** Whether there is slot content to render. */\nconst hasContent = computed(() => Boolean(slots.default));\n\n/**\n * Resolve the effective line style.\n * `dashed` prop is a legacy alias for `variant=\"dashed\"`.\n */\nconst effectiveVariant = computed<BDividerVariant>(() => {\n if (dashed && variant === 'solid') return 'dashed';\n return variant;\n});\n\nconst rootClass = computed(() => [\n 'b-divider',\n `b-divider--${orientation}`,\n `b-divider--${effectiveVariant.value}`,\n `b-divider--size-${size}`,\n {\n 'b-divider--with-text': hasContent.value && isHorizontal.value,\n [`b-divider--text-${titlePlacement}`]: hasContent.value && isHorizontal.value,\n 'b-divider--plain': plain,\n },\n]);\n</script>\n\n<template>\n <!--\n Vertical divider: a presentational inline separator.\n role=\"separator\" with aria-orientation covers both horizontal and vertical.\n -->\n <span v-if=\"isVertical\" :class=\"rootClass\" role=\"separator\" aria-orientation=\"vertical\" />\n\n <!--\n Horizontal divider WITHOUT content.\n <div role=\"separator\"> is used instead of <hr> because axe-core evaluates\n <hr> (which carries implicit role=\"separator\") for text-colour contrast by\n reading its CSS `color` property. A <div role=\"separator\"> with no text\n content is exempt from that check (WCAG SC 1.4.3 applies only to text).\n -->\n <div\n v-else-if=\"isHorizontal && !hasContent\"\n :class=\"rootClass\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n />\n\n <!--\n Horizontal divider WITH content: <div role=\"separator\"> wrapping the text.\n <hr> cannot contain children, so we fall back to a div.\n -->\n <div v-else :class=\"rootClass\" role=\"separator\" aria-orientation=\"horizontal\">\n <span class=\"b-divider__content\">\n <slot />\n </span>\n </div>\n</template>\n\n<style>\n/* ────────────────────────────────────────────\n CSS Custom Properties (design tokens)\n Scoped to .b-divider — never on :root\n ──────────────────────────────────────────── */\n.b-divider {\n /* AntD token: textPaddingInline → horizontal padding around inner text */\n --b-divider-text-padding-inline: 1em;\n\n /* AntD token: orientationMargin → fraction of width from the near edge for start/end text */\n --b-divider-orientation-margin: 0.05;\n\n /* AntD token: verticalMarginInline → horizontal margin on vertical dividers */\n --b-divider-vertical-margin-inline: 8px;\n\n /* Colour */\n --b-divider-color: oklch(88% 0.01 264); /* neutral border */\n --b-divider-text-color: oklch(32% 0.02 264);\n\n /* Typography */\n --b-divider-font-size: 1rem;\n --b-divider-font-weight-text: 500; /* \"with-text\" non-plain heading weight */\n\n /* Size (margin-block for horizontal) */\n --b-divider-margin-block-large: 1.5rem; /* size=large (AntD default) */\n --b-divider-margin-block-medium: 0.75rem; /* size=medium */\n --b-divider-margin-block-small: 0.25rem; /* size=small */\n\n /* Line geometry */\n --b-divider-line-width: 1px;\n}\n\n/* ── Dark mode ───────────────────────────────────────────────────────────\n Use only the attribute selector, consistent with every other component\n in this system (BAlert, BCard, etc.). The @media (prefers-color-scheme)\n query is deliberately omitted: Storybook controls the theme by toggling\n [data-prefers-color='dark'] on <html>. A media-query override would fire\n based on the OS/test-runner's colour scheme regardless of the canvas\n setting, producing light text (#c7cedb) on a white canvas — failing\n WCAG 1.4.3 contrast in automated a11y checks.\n ──────────────────────────────────────────────────────────────────────── */\n[data-prefers-color='dark'] .b-divider {\n --b-divider-color: oklch(35% 0.02 264);\n --b-divider-text-color: oklch(85% 0.02 264);\n}\n\n@media (prefers-color-scheme: dark) {\n [data-prefers-color='system'] .b-divider {\n --b-divider-color: oklch(35% 0.02 264);\n --b-divider-text-color: oklch(85% 0.02 264);\n }\n}\n\n/* ─────────────────────────────────────────────\n Horizontal — <div role=separator> (no text) or <div role=separator> (with text)\n ───────────────────────────────────────────── */\n.b-divider--horizontal {\n display: block;\n clear: both;\n width: 100%;\n margin-block: var(--b-divider-margin-block-large);\n border: none;\n border-block-start: var(--b-divider-line-width) var(--b-divider-color);\n /* default style is overridden by variant classes below */\n border-block-start-style: solid;\n box-sizing: border-box;\n}\n\n/* Size variants (horizontal only) */\n.b-divider--horizontal.b-divider--size-small {\n margin-block: var(--b-divider-margin-block-small);\n}\n.b-divider--horizontal.b-divider--size-medium {\n margin-block: var(--b-divider-margin-block-medium);\n}\n.b-divider--horizontal.b-divider--size-large {\n margin-block: var(--b-divider-margin-block-large);\n}\n\n/* ─────────────────────────────────────────────\n Horizontal WITH text\n ───────────────────────────────────────────── */\n.b-divider--with-text {\n display: flex;\n align-items: center;\n border-block-start-style: none; /* lines rendered via ::before / ::after */\n white-space: nowrap;\n font-size: var(--b-divider-font-size);\n color: var(--b-divider-text-color);\n font-weight: var(--b-divider-font-weight-text);\n}\n\n/* Plain text: normal weight */\n.b-divider--with-text.b-divider--plain {\n font-weight: normal;\n}\n\n/* Lines flanking the text */\n.b-divider--with-text::before,\n.b-divider--with-text::after {\n content: '';\n flex: 1;\n border-block-start: var(--b-divider-line-width) solid var(--b-divider-color);\n}\n\n/* variant overrides for ::before / ::after */\n.b-divider--dashed.b-divider--with-text::before,\n.b-divider--dashed.b-divider--with-text::after {\n border-block-start-style: dashed;\n}\n.b-divider--dotted.b-divider--with-text::before,\n.b-divider--dotted.b-divider--with-text::after {\n border-block-start-style: dotted;\n}\n\n/* Text placement — start: push text to left edge */\n.b-divider--text-start::before {\n /* orientationMargin is a unitless fraction (0.05 = 5% of width) */\n flex: calc(var(--b-divider-orientation-margin) * 1);\n min-width: 0;\n}\n.b-divider--text-start::after {\n flex: 1;\n}\n\n/* Text placement — end: push text to right edge */\n.b-divider--text-end::after {\n flex: calc(var(--b-divider-orientation-margin) * 1);\n min-width: 0;\n}\n.b-divider--text-end::before {\n flex: 1;\n}\n\n/* Text placement — center (default): equal halves */\n.b-divider--text-center::before,\n.b-divider--text-center::after {\n flex: 1;\n}\n\n.b-divider__content {\n padding-inline: var(--b-divider-text-padding-inline);\n /* prevent the text itself from shrinking below its natural width */\n flex-shrink: 0;\n}\n\n/* ─────────────────────────────────────────────\n Line-style variants (horizontal no-text)\n ───────────────────────────────────────────── */\n.b-divider--horizontal:not(.b-divider--with-text).b-divider--dashed {\n border-block-start-style: dashed;\n}\n.b-divider--horizontal:not(.b-divider--with-text).b-divider--dotted {\n border-block-start-style: dotted;\n}\n\n/* ─────────────────────────────────────────────\n Vertical divider\n ───────────────────────────────────────────── */\n.b-divider--vertical {\n display: inline-block;\n /* explicit height is not set — inherits from line-height of surrounding text */\n height: 0.9em;\n border-inline-start: var(--b-divider-line-width) solid var(--b-divider-color);\n border-block-start: none;\n vertical-align: middle;\n margin-inline: var(--b-divider-vertical-margin-inline);\n}\n\n.b-divider--vertical.b-divider--dashed {\n border-inline-start-style: dashed;\n}\n.b-divider--vertical.b-divider--dotted {\n border-inline-start-style: dotted;\n}\n\n/* ─────────────────────────────────────────────\n Reduced motion\n (dividers have no animations, but guard is here for completeness)\n ───────────────────────────────────────────── */\n@media (prefers-reduced-motion: reduce) {\n .b-divider {\n transition: none;\n }\n}\n</style>\n"],"mappings":""}
|
package/dist/design-system84.js
CHANGED
|
@@ -1,10 +1,202 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
1
|
+
import { Teleport as e, Transition as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, createTextVNode as s, createVNode as c, defineComponent as l, nextTick as u, normalizeClass as d, normalizeStyle as f, onBeforeUnmount as p, openBlock as m, ref as h, renderSlot as g, toDisplayString as _, unref as v, useId as y, useSlots as ee, watch as b, withCtx as x } from "vue";
|
|
2
|
+
//#region src/components/BDrawer/BDrawer.vue?vue&type=script&setup=true&lang.ts
|
|
3
|
+
var S = ["aria-label", "aria-labelledby"], C = {
|
|
4
|
+
key: 0,
|
|
5
|
+
class: "b-drawer__header"
|
|
6
|
+
}, w = { class: "b-drawer__header-title-wrapper" }, T = ["id"], E = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "b-drawer__extra"
|
|
9
|
+
}, D = {
|
|
10
|
+
key: 1,
|
|
11
|
+
class: "b-drawer__body"
|
|
12
|
+
}, O = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "b-drawer__loading",
|
|
15
|
+
"aria-live": "polite"
|
|
16
|
+
}, k = {
|
|
17
|
+
key: 2,
|
|
18
|
+
class: "b-drawer__footer"
|
|
19
|
+
}, A = /* @__PURE__ */ l({
|
|
20
|
+
__name: "BDrawer",
|
|
21
|
+
props: {
|
|
22
|
+
placement: { default: "right" },
|
|
23
|
+
size: { default: "default" },
|
|
24
|
+
title: { default: "" },
|
|
25
|
+
closable: {
|
|
26
|
+
type: Boolean,
|
|
27
|
+
default: !0
|
|
28
|
+
},
|
|
29
|
+
mask: {
|
|
30
|
+
type: Boolean,
|
|
31
|
+
default: !0
|
|
32
|
+
},
|
|
33
|
+
maskClosable: {
|
|
34
|
+
type: Boolean,
|
|
35
|
+
default: !0
|
|
36
|
+
},
|
|
37
|
+
keyboard: {
|
|
38
|
+
type: Boolean,
|
|
39
|
+
default: !0
|
|
40
|
+
},
|
|
41
|
+
destroyOnClose: {
|
|
42
|
+
type: Boolean,
|
|
43
|
+
default: !1
|
|
44
|
+
},
|
|
45
|
+
width: {},
|
|
46
|
+
height: {},
|
|
47
|
+
zIndex: { default: 1e3 },
|
|
48
|
+
getContainer: {},
|
|
49
|
+
autoFocus: {
|
|
50
|
+
type: Boolean,
|
|
51
|
+
default: !0
|
|
52
|
+
},
|
|
53
|
+
modelValue: {
|
|
54
|
+
type: Boolean,
|
|
55
|
+
default: () => void 0
|
|
56
|
+
},
|
|
57
|
+
forceRender: {
|
|
58
|
+
type: Boolean,
|
|
59
|
+
default: !1
|
|
60
|
+
},
|
|
61
|
+
extra: { default: "" },
|
|
62
|
+
footer: { default: "" },
|
|
63
|
+
loading: {
|
|
64
|
+
type: Boolean,
|
|
65
|
+
default: !1
|
|
66
|
+
},
|
|
67
|
+
ariaLabel: {}
|
|
68
|
+
},
|
|
69
|
+
emits: [
|
|
70
|
+
"close",
|
|
71
|
+
"afterOpenChange",
|
|
72
|
+
"update:modelValue"
|
|
73
|
+
],
|
|
74
|
+
setup(l, { expose: A, emit: j }) {
|
|
75
|
+
let M = j, N = ee(), P = y(), F = h(!1), I = n(() => l.modelValue === void 0 ? F.value : l.modelValue), L = h(!1), R = n(() => l.forceRender ? !0 : l.destroyOnClose ? I.value : L.value || I.value);
|
|
76
|
+
b(I, (e) => {
|
|
77
|
+
e && (L.value = !0);
|
|
78
|
+
});
|
|
79
|
+
let z = n(() => l.placement === "left" || l.placement === "right"), B = {
|
|
80
|
+
default: 378,
|
|
81
|
+
large: 736
|
|
82
|
+
}, V = n(() => l.width === void 0 ? z.value ? `${B[l.size]}px` : "100%" : typeof l.width == "number" ? `${l.width}px` : l.width), H = n(() => l.height === void 0 ? z.value ? "100%" : `${B[l.size]}px` : typeof l.height == "number" ? `${l.height}px` : l.height), U = n(() => !!(l.title || N.title)), W = n(() => !!(l.extra || N.extra)), G = n(() => !!(l.footer || N.footer)), K = n(() => U.value || l.closable || W.value), q = n(() => l.getContainer ? l.getContainer : "body"), J = n(() => ({
|
|
83
|
+
width: V.value,
|
|
84
|
+
height: H.value,
|
|
85
|
+
zIndex: l.zIndex
|
|
86
|
+
})), Y = h(null), X = null;
|
|
87
|
+
function Z(e) {
|
|
88
|
+
if (e.key !== "Tab" || !Y.value) return;
|
|
89
|
+
let t = Array.from(Y.value.querySelectorAll("a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])"));
|
|
90
|
+
if (t.length === 0) {
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
let n = t[0], r = t[t.length - 1];
|
|
95
|
+
e.shiftKey ? document.activeElement === n && (e.preventDefault(), r.focus()) : document.activeElement === r && (e.preventDefault(), n.focus());
|
|
96
|
+
}
|
|
97
|
+
function Q() {
|
|
98
|
+
!l.autoFocus || !Y.value || u(() => {
|
|
99
|
+
if (!Y.value) return;
|
|
100
|
+
let e = Y.value.querySelector("a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])");
|
|
101
|
+
e ? e.focus() : Y.value.focus();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
b(I, (e) => {
|
|
105
|
+
e ? (X = document.activeElement, u(() => Q()), document.body.style.overflow = "hidden") : document.body.style.overflow = "";
|
|
106
|
+
}), p(() => {
|
|
107
|
+
document.body.style.overflow = "";
|
|
108
|
+
});
|
|
109
|
+
function $(e) {
|
|
110
|
+
M("close", e), l.modelValue === void 0 ? F.value = !1 : M("update:modelValue", !1);
|
|
111
|
+
}
|
|
112
|
+
function te(e) {
|
|
113
|
+
l.maskClosable && $(e);
|
|
114
|
+
}
|
|
115
|
+
function ne(e) {
|
|
116
|
+
e.key === "Escape" && l.keyboard && (e.stopPropagation(), $(e)), Z(e);
|
|
117
|
+
}
|
|
118
|
+
function re() {
|
|
119
|
+
M("afterOpenChange", !0);
|
|
120
|
+
}
|
|
121
|
+
function ie() {
|
|
122
|
+
M("afterOpenChange", !1), X && typeof X.focus == "function" && (X.focus(), X = null);
|
|
123
|
+
}
|
|
124
|
+
function ae() {
|
|
125
|
+
l.modelValue === void 0 ? F.value = !0 : M("update:modelValue", !0);
|
|
126
|
+
}
|
|
127
|
+
return A({ open: ae }), (n, u) => (m(), r(e, { to: q.value }, [c(t, {
|
|
128
|
+
name: "b-drawer",
|
|
129
|
+
onAfterEnter: re,
|
|
130
|
+
onAfterLeave: ie
|
|
131
|
+
}, {
|
|
132
|
+
default: x(() => [I.value ? (m(), a("div", {
|
|
133
|
+
key: 0,
|
|
134
|
+
class: d(["b-drawer-root", `b-drawer-root--${l.placement}`]),
|
|
135
|
+
style: f({ zIndex: l.zIndex })
|
|
136
|
+
}, [l.mask ? (m(), a("div", {
|
|
137
|
+
key: 0,
|
|
138
|
+
class: "b-drawer__mask",
|
|
139
|
+
"aria-hidden": "true",
|
|
140
|
+
onClick: te
|
|
141
|
+
})) : i("", !0), o("div", {
|
|
142
|
+
ref_key: "drawerRef",
|
|
143
|
+
ref: Y,
|
|
144
|
+
class: d(["b-drawer", [
|
|
145
|
+
`b-drawer--${l.placement}`,
|
|
146
|
+
`b-drawer--${l.size}`,
|
|
147
|
+
{
|
|
148
|
+
"b-drawer--has-header": K.value,
|
|
149
|
+
"b-drawer--has-footer": G.value
|
|
150
|
+
}
|
|
151
|
+
]]),
|
|
152
|
+
role: "dialog",
|
|
153
|
+
"aria-modal": "true",
|
|
154
|
+
"aria-label": U.value ? void 0 : l.ariaLabel,
|
|
155
|
+
"aria-labelledby": U.value ? v(P) : void 0,
|
|
156
|
+
style: f(J.value),
|
|
157
|
+
tabindex: "-1",
|
|
158
|
+
onKeydown: ne
|
|
159
|
+
}, [
|
|
160
|
+
K.value ? (m(), a("div", C, [o("div", w, [l.closable ? (m(), a("button", {
|
|
161
|
+
key: 0,
|
|
162
|
+
type: "button",
|
|
163
|
+
class: "b-drawer__close",
|
|
164
|
+
"aria-label": "Close drawer",
|
|
165
|
+
onClick: $
|
|
166
|
+
}, [g(n.$slots, "closeIcon", {}, () => [u[0] ||= o("svg", {
|
|
167
|
+
class: "b-drawer__close-icon",
|
|
168
|
+
viewBox: "0 0 24 24",
|
|
169
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
170
|
+
"aria-hidden": "true",
|
|
171
|
+
focusable: "false"
|
|
172
|
+
}, [o("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" })], -1)])])) : i("", !0), U.value ? (m(), a("div", {
|
|
173
|
+
key: 1,
|
|
174
|
+
id: v(P),
|
|
175
|
+
class: "b-drawer__title"
|
|
176
|
+
}, [g(n.$slots, "title", {}, () => [s(_(l.title), 1)])], 8, T)) : i("", !0)]), W.value ? (m(), a("div", E, [g(n.$slots, "extra", {}, () => [s(_(l.extra), 1)])])) : i("", !0)])) : i("", !0),
|
|
177
|
+
R.value ? (m(), a("div", D, [l.loading ? (m(), a("div", O, [...u[1] ||= [o("svg", {
|
|
178
|
+
class: "b-drawer__spinner",
|
|
179
|
+
viewBox: "0 0 24 24",
|
|
180
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
181
|
+
"aria-hidden": "true",
|
|
182
|
+
focusable: "false"
|
|
183
|
+
}, [o("circle", {
|
|
184
|
+
cx: "12",
|
|
185
|
+
cy: "12",
|
|
186
|
+
r: "10",
|
|
187
|
+
fill: "none",
|
|
188
|
+
stroke: "currentColor",
|
|
189
|
+
"stroke-width": "3",
|
|
190
|
+
"stroke-dasharray": "31.4 31.4",
|
|
191
|
+
"stroke-linecap": "round"
|
|
192
|
+
})], -1), o("span", { class: "b-drawer__loading-text" }, "Loading…", -1)]])) : g(n.$slots, "default", { key: 1 })])) : i("", !0),
|
|
193
|
+
G.value ? (m(), a("div", k, [g(n.$slots, "footer", {}, () => [s(_(l.footer), 1)])])) : i("", !0)
|
|
194
|
+
], 46, S)], 6)) : i("", !0)]),
|
|
195
|
+
_: 3
|
|
196
|
+
})], 8, ["to"]));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
7
199
|
//#endregion
|
|
8
|
-
export {
|
|
200
|
+
export { A as default };
|
|
9
201
|
|
|
10
202
|
//# sourceMappingURL=design-system84.js.map
|