@tylertech/forge 3.0.0-next.17 → 3.0.0-next.19
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/custom-elements.json +231 -124
- package/dist/esm/accordion/index.js +1 -1
- package/dist/esm/app-bar/app-bar/index.js +1 -1
- package/dist/esm/app-bar/help-button/index.js +1 -1
- package/dist/esm/app-bar/index.js +1 -1
- package/dist/esm/app-bar/menu-button/index.js +1 -1
- package/dist/esm/app-bar/notification-button/index.js +1 -1
- package/dist/esm/app-bar/profile-button/index.js +1 -1
- package/dist/esm/app-bar/search/index.js +1 -1
- package/dist/esm/autocomplete/index.js +1 -1
- package/dist/esm/banner/index.js +1 -1
- package/dist/esm/bottom-sheet/index.js +1 -1
- package/dist/esm/busy-indicator/index.js +1 -1
- package/dist/esm/button/index.js +1 -1
- package/dist/esm/button-area/index.js +1 -1
- package/dist/esm/button-toggle/button-toggle/index.js +1 -1
- package/dist/esm/button-toggle/button-toggle-group/index.js +1 -1
- package/dist/esm/button-toggle/index.js +1 -1
- package/dist/esm/calendar/calendar-dropdown/index.js +1 -1
- package/dist/esm/calendar/calendar-menu/index.js +1 -1
- package/dist/esm/calendar/index.js +1 -1
- package/dist/esm/checkbox/index.js +1 -1
- package/dist/esm/chip-field/index.js +1 -1
- package/dist/esm/chips/chip/index.js +1 -1
- package/dist/esm/chips/chip-set/index.js +1 -1
- package/dist/esm/chips/index.js +1 -1
- package/dist/esm/chunks/{chunk.6J27XSTE.js → chunk.2AVJJJNS.js} +2 -2
- package/dist/esm/chunks/{chunk.H6AG3EFX.js → chunk.2F2N4WBN.js} +2 -2
- package/dist/esm/chunks/chunk.3WT7HPA7.js +12 -0
- package/dist/esm/chunks/{chunk.W7CM652O.js → chunk.4EBFMRTJ.js} +2 -2
- package/dist/esm/chunks/{chunk.6RZCV4ZV.js → chunk.4HZ6SNRV.js} +2 -2
- package/dist/esm/chunks/{chunk.HPCXVNG6.js → chunk.4SP42UG3.js} +2 -2
- package/dist/esm/chunks/{chunk.HPCXVNG6.js.map → chunk.4SP42UG3.js.map} +3 -3
- package/dist/esm/chunks/{chunk.XPIAOMSC.js → chunk.4YKLCBP2.js} +2 -2
- package/dist/esm/chunks/{chunk.O47OSK6Z.js → chunk.54DNA2QP.js} +2 -2
- package/dist/esm/chunks/{chunk.O47OSK6Z.js.map → chunk.54DNA2QP.js.map} +1 -1
- package/dist/esm/chunks/{chunk.2NGPMBVU.js → chunk.5JSCGQ7H.js} +2 -2
- package/dist/esm/chunks/{chunk.42VNZ74O.js → chunk.5NHGVUVR.js} +2 -2
- package/dist/esm/chunks/{chunk.Z7SLVU2O.js → chunk.5PNJOQDZ.js} +2 -2
- package/dist/esm/chunks/{chunk.IDB4KFSQ.js → chunk.66RZ2CUB.js} +2 -2
- package/dist/esm/chunks/{chunk.PR76A5VF.js → chunk.6DPDC4ON.js} +2 -2
- package/dist/esm/chunks/{chunk.ZZRAZZ3N.js → chunk.7AE3ATT3.js} +2 -2
- package/dist/esm/chunks/{chunk.AWEDY45N.js → chunk.AXBMJBED.js} +2 -2
- package/dist/esm/chunks/{chunk.NHYJMP25.js → chunk.B2RYZJGJ.js} +2 -2
- package/dist/esm/chunks/{chunk.S3KKICL3.js → chunk.CISGGM56.js} +2 -2
- package/dist/esm/chunks/{chunk.LXFL2C62.js → chunk.CJUX3PL5.js} +2 -2
- package/dist/esm/chunks/{chunk.VOL4DT5F.js → chunk.DYBD4IRT.js} +2 -2
- package/dist/esm/chunks/{chunk.LDHY3O6H.js → chunk.E2FS4PJS.js} +2 -2
- package/dist/esm/chunks/chunk.E7TIN4JS.js +7 -0
- package/dist/esm/chunks/chunk.E7TIN4JS.js.map +7 -0
- package/dist/esm/chunks/{chunk.OJHNLDNM.js → chunk.F3FWXBDS.js} +2 -2
- package/dist/esm/chunks/{chunk.3PHNRX5D.js → chunk.FOQH2SSU.js} +2 -2
- package/dist/esm/chunks/{chunk.GFKYBECY.js → chunk.FXDHZCID.js} +2 -2
- package/dist/esm/chunks/{chunk.SN3VXOWN.js → chunk.FZC3WXSY.js} +2 -2
- package/dist/esm/chunks/chunk.GAQ3POUT.js +7 -0
- package/dist/esm/chunks/chunk.GAQ3POUT.js.map +7 -0
- package/dist/esm/chunks/{chunk.HBFU4EGB.js → chunk.IE42X2LV.js} +2 -2
- package/dist/esm/chunks/{chunk.JRROGJ2G.js → chunk.IO3A5OM6.js} +2 -2
- package/dist/esm/chunks/{chunk.EPVNVBZI.js → chunk.J5MWS2KZ.js} +2 -2
- package/dist/esm/chunks/{chunk.6YDMW2GO.js → chunk.JO6GPIMF.js} +2 -2
- package/dist/esm/chunks/{chunk.5YTYVHYR.js → chunk.JUXSSZ3B.js} +2 -2
- package/dist/esm/chunks/{chunk.FTADCSFT.js → chunk.KIQZLNDG.js} +2 -2
- package/dist/esm/chunks/{chunk.VX7H6YHF.js → chunk.LNMQ5A25.js} +2 -2
- package/dist/esm/chunks/{chunk.YCG7OVYF.js → chunk.MBXBM6UI.js} +2 -2
- package/dist/esm/chunks/{chunk.SUR46MJG.js → chunk.N2DHFDXD.js} +2 -2
- package/dist/esm/chunks/{chunk.OD54UG2G.js → chunk.NSKIEZWE.js} +2 -2
- package/dist/esm/chunks/{chunk.6JR2HMWB.js → chunk.NY3N6KUZ.js} +2 -2
- package/dist/esm/chunks/{chunk.ZTBOQMRE.js → chunk.O6WN2UP6.js} +2 -2
- package/dist/esm/chunks/{chunk.JMIUB3S3.js → chunk.OWYOZF53.js} +2 -2
- package/dist/esm/chunks/{chunk.ND2X5OQ4.js → chunk.OXGCNOUY.js} +2 -2
- package/dist/esm/chunks/{chunk.OAZXY4Q5.js → chunk.QIMAHW7V.js} +2 -2
- package/dist/esm/chunks/{chunk.ZJQLVAJY.js → chunk.QXZ3AAXD.js} +2 -2
- package/dist/esm/chunks/{chunk.TGGC2THA.js → chunk.RB435MRJ.js} +2 -2
- package/dist/esm/chunks/{chunk.O7DID7GP.js → chunk.RBG6AMLV.js} +2 -2
- package/dist/esm/chunks/{chunk.ZZV7P3FR.js → chunk.RN634NOB.js} +2 -2
- package/dist/esm/chunks/{chunk.7QO5JEOC.js → chunk.RQ3RHGLB.js} +2 -2
- package/dist/esm/chunks/{chunk.NPCUVYWP.js → chunk.S2KPWTRW.js} +2 -2
- package/dist/esm/chunks/{chunk.ME7ICFCZ.js → chunk.SWDOKJUF.js} +2 -2
- package/dist/esm/chunks/{chunk.MMMG4MZ3.js → chunk.ULZJYWM2.js} +2 -2
- package/dist/esm/chunks/{chunk.PGSL6NFZ.js → chunk.VGKNQYHG.js} +2 -2
- package/dist/esm/chunks/{chunk.VLADAZRB.js → chunk.VRTR7WMN.js} +2 -2
- package/dist/esm/chunks/{chunk.NBYCIDFC.js → chunk.W2W3NTFC.js} +2 -2
- package/dist/esm/chunks/{chunk.ZSHN7Z45.js → chunk.WKLDPPHS.js} +2 -2
- package/dist/esm/chunks/{chunk.4X4SSZQU.js → chunk.WM6ZUVDR.js} +2 -2
- package/dist/esm/chunks/{chunk.TRSICKKS.js → chunk.XH63INIK.js} +2 -2
- package/dist/esm/chunks/{chunk.VNH44AGF.js → chunk.Y7ZZ7HDC.js} +2 -2
- package/dist/esm/chunks/{chunk.MTZOQQXR.js → chunk.YGXXWF52.js} +2 -2
- package/dist/esm/chunks/{chunk.KVPKVWCZ.js → chunk.YHIHHGMQ.js} +2 -2
- package/dist/esm/chunks/{chunk.OVDO5RVX.js → chunk.YOKBWEXF.js} +2 -2
- package/dist/esm/chunks/{chunk.L5OB7WM2.js → chunk.ZYYPOLIG.js} +2 -2
- package/dist/esm/color-picker/index.js +1 -1
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/utils/index.js +1 -1
- package/dist/esm/date-picker/index.js +1 -1
- package/dist/esm/date-range-picker/index.js +1 -1
- package/dist/esm/deprecated/button/index.js +1 -1
- package/dist/esm/deprecated/index.js +1 -1
- package/dist/esm/expansion-panel/index.js +1 -1
- package/dist/esm/file-picker/index.js +1 -1
- package/dist/esm/floating-action-button/index.js +1 -1
- package/dist/esm/focus-indicator/index.js +1 -1
- package/dist/esm/icon/index.js +1 -1
- package/dist/esm/icon-button/index.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/label/index.js +1 -1
- package/dist/esm/list/index.js +1 -1
- package/dist/esm/list/list/index.js +1 -1
- package/dist/esm/list/list-item/index.js +1 -1
- package/dist/esm/list-dropdown/index.js +1 -1
- package/dist/esm/menu/index.js +1 -1
- package/dist/esm/open-icon/index.js +1 -1
- package/dist/esm/overlay/index.js +1 -1
- package/dist/esm/paginator/index.js +1 -1
- package/dist/esm/popover/index.js +1 -1
- package/dist/esm/profile-card/index.js +1 -1
- package/dist/esm/quantity-field/index.js +1 -1
- package/dist/esm/radio/index.js +1 -1
- package/dist/esm/radio/radio/index.js +1 -1
- package/dist/esm/radio/radio-group/index.js +1 -1
- package/dist/esm/select/core/index.js +1 -1
- package/dist/esm/select/index.js +1 -1
- package/dist/esm/select/select/index.js +1 -1
- package/dist/esm/select/select-dropdown/index.js +1 -1
- package/dist/esm/slider/index.js +1 -1
- package/dist/esm/split-button/index.js +1 -1
- package/dist/esm/split-view/index.js +1 -1
- package/dist/esm/split-view/split-view/index.js +1 -1
- package/dist/esm/split-view/split-view-panel/index.js +1 -1
- package/dist/esm/state-layer/index.js +1 -1
- package/dist/esm/stepper/index.js +1 -1
- package/dist/esm/stepper/step/index.js +1 -1
- package/dist/esm/stepper/stepper/index.js +1 -1
- package/dist/esm/switch/index.js +1 -1
- package/dist/esm/table/index.js +1 -1
- package/dist/esm/tabs/index.js +1 -1
- package/dist/esm/tabs/tab/index.js +1 -1
- package/dist/esm/tabs/tab-bar/index.js +1 -1
- package/dist/esm/time-picker/index.js +1 -1
- package/dist/esm/toast/index.js +1 -1
- package/dist/esm/tooltip/index.js +1 -1
- package/dist/forge-dark.css +1 -1
- package/esm/banner/banner-adapter.d.ts +18 -18
- package/esm/banner/banner-adapter.js +26 -23
- package/esm/banner/banner-constants.d.ts +20 -16
- package/esm/banner/banner-constants.js +19 -21
- package/esm/banner/banner-foundation.d.ts +15 -14
- package/esm/banner/banner-foundation.js +54 -43
- package/esm/banner/banner.d.ts +36 -7
- package/esm/banner/banner.js +51 -18
- package/esm/core/utils/position-utils.d.ts +2 -10
- package/esm/core/utils/position-utils.js +8 -17
- package/esm/core/utils/utils.d.ts +6 -0
- package/esm/core/utils/utils.js +9 -0
- package/esm/overlay/overlay-adapter.d.ts +1 -2
- package/esm/overlay/overlay-adapter.js +9 -13
- package/esm/overlay/overlay-constants.d.ts +6 -1
- package/esm/overlay/overlay-constants.js +22 -0
- package/esm/overlay/overlay-foundation.js +1 -5
- package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
- package/package.json +1 -1
- package/styles/banner/_core.scss +59 -0
- package/styles/banner/_token-utils.scss +30 -0
- package/styles/banner/banner.scss +137 -9
- package/styles/banner/index.scss +6 -0
- package/styles/core/styles/tokens/banner/_tokens.scss +26 -0
- package/styles/theme/_theme-dark.scss +0 -6
- package/dist/esm/chunks/chunk.53HPDCFR.js +0 -7
- package/dist/esm/chunks/chunk.53HPDCFR.js.map +0 -7
- package/dist/esm/chunks/chunk.DFRD7A2Y.js +0 -7
- package/dist/esm/chunks/chunk.DFRD7A2Y.js.map +0 -7
- package/dist/esm/chunks/chunk.YVCGGQQG.js +0 -12
- package/styles/badge/_mixins.scss +0 -125
- package/styles/badge/_variables.scss +0 -87
- package/styles/banner/_mixins.scss +0 -219
- package/styles/banner/_variables.scss +0 -88
- /package/dist/esm/chunks/{chunk.6J27XSTE.js.map → chunk.2AVJJJNS.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.H6AG3EFX.js.map → chunk.2F2N4WBN.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.YVCGGQQG.js.map → chunk.3WT7HPA7.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.W7CM652O.js.map → chunk.4EBFMRTJ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.6RZCV4ZV.js.map → chunk.4HZ6SNRV.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.XPIAOMSC.js.map → chunk.4YKLCBP2.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.2NGPMBVU.js.map → chunk.5JSCGQ7H.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.42VNZ74O.js.map → chunk.5NHGVUVR.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.Z7SLVU2O.js.map → chunk.5PNJOQDZ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.IDB4KFSQ.js.map → chunk.66RZ2CUB.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.PR76A5VF.js.map → chunk.6DPDC4ON.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ZZRAZZ3N.js.map → chunk.7AE3ATT3.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.AWEDY45N.js.map → chunk.AXBMJBED.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.NHYJMP25.js.map → chunk.B2RYZJGJ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.S3KKICL3.js.map → chunk.CISGGM56.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.LXFL2C62.js.map → chunk.CJUX3PL5.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.VOL4DT5F.js.map → chunk.DYBD4IRT.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.LDHY3O6H.js.map → chunk.E2FS4PJS.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.OJHNLDNM.js.map → chunk.F3FWXBDS.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.3PHNRX5D.js.map → chunk.FOQH2SSU.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.GFKYBECY.js.map → chunk.FXDHZCID.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.SN3VXOWN.js.map → chunk.FZC3WXSY.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.HBFU4EGB.js.map → chunk.IE42X2LV.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.JRROGJ2G.js.map → chunk.IO3A5OM6.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.EPVNVBZI.js.map → chunk.J5MWS2KZ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.6YDMW2GO.js.map → chunk.JO6GPIMF.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.5YTYVHYR.js.map → chunk.JUXSSZ3B.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.FTADCSFT.js.map → chunk.KIQZLNDG.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.VX7H6YHF.js.map → chunk.LNMQ5A25.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.YCG7OVYF.js.map → chunk.MBXBM6UI.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.SUR46MJG.js.map → chunk.N2DHFDXD.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.OD54UG2G.js.map → chunk.NSKIEZWE.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.6JR2HMWB.js.map → chunk.NY3N6KUZ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ZTBOQMRE.js.map → chunk.O6WN2UP6.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.JMIUB3S3.js.map → chunk.OWYOZF53.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ND2X5OQ4.js.map → chunk.OXGCNOUY.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.OAZXY4Q5.js.map → chunk.QIMAHW7V.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ZJQLVAJY.js.map → chunk.QXZ3AAXD.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.TGGC2THA.js.map → chunk.RB435MRJ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.O7DID7GP.js.map → chunk.RBG6AMLV.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ZZV7P3FR.js.map → chunk.RN634NOB.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.7QO5JEOC.js.map → chunk.RQ3RHGLB.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.NPCUVYWP.js.map → chunk.S2KPWTRW.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ME7ICFCZ.js.map → chunk.SWDOKJUF.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.MMMG4MZ3.js.map → chunk.ULZJYWM2.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.PGSL6NFZ.js.map → chunk.VGKNQYHG.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.VLADAZRB.js.map → chunk.VRTR7WMN.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.NBYCIDFC.js.map → chunk.W2W3NTFC.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.ZSHN7Z45.js.map → chunk.WKLDPPHS.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.4X4SSZQU.js.map → chunk.WM6ZUVDR.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.TRSICKKS.js.map → chunk.XH63INIK.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.VNH44AGF.js.map → chunk.Y7ZZ7HDC.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.MTZOQQXR.js.map → chunk.YGXXWF52.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.KVPKVWCZ.js.map → chunk.YHIHHGMQ.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.OVDO5RVX.js.map → chunk.YOKBWEXF.js.map} +0 -0
- /package/dist/esm/chunks/{chunk.L5OB7WM2.js.map → chunk.ZYYPOLIG.js.map} +0 -0
|
@@ -5,37 +5,35 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { COMPONENT_NAME_PREFIX } from '../constants';
|
|
7
7
|
const elementName = `${COMPONENT_NAME_PREFIX}banner`;
|
|
8
|
+
const observedAttributes = {
|
|
9
|
+
DISMISSED: 'dismissed',
|
|
10
|
+
PERSISTENT: 'persistent',
|
|
11
|
+
CAN_DISMISS: 'can-dismiss',
|
|
12
|
+
THEME: 'theme'
|
|
13
|
+
};
|
|
14
|
+
const attributes = Object.assign({}, observedAttributes);
|
|
8
15
|
const classes = {
|
|
9
|
-
|
|
10
|
-
|
|
16
|
+
HAS_ICON: 'has-icon',
|
|
17
|
+
HAS_BUTTON: 'has-button'
|
|
11
18
|
};
|
|
12
19
|
const selectors = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
ICON: 'i',
|
|
17
|
-
FORGE_BUTTON: 'forge-button'
|
|
18
|
-
};
|
|
19
|
-
const attributes = {
|
|
20
|
-
SLOT: 'slot',
|
|
21
|
-
DISMISSED: 'dismissed',
|
|
22
|
-
CAN_DISMISS: 'can-dismiss',
|
|
23
|
-
HIDDEN: 'hidden'
|
|
20
|
+
DISMISS_BUTTON: '[part=dismiss-button]',
|
|
21
|
+
ICON_SLOT: 'slot[name=icon]',
|
|
22
|
+
BUTTON_SLOT: 'slot[name=button]'
|
|
24
23
|
};
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
TEXT: 'text',
|
|
28
|
-
BUTTON: 'button'
|
|
24
|
+
const defaults = {
|
|
25
|
+
THEME: 'info'
|
|
29
26
|
};
|
|
30
27
|
const events = {
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
BEFORE_DISMISS: `${elementName}-before-dismiss`,
|
|
29
|
+
DISMISSED: `${elementName}-dismissed`
|
|
33
30
|
};
|
|
34
31
|
export const BANNER_CONSTANTS = {
|
|
35
32
|
elementName,
|
|
33
|
+
observedAttributes,
|
|
34
|
+
attributes,
|
|
36
35
|
classes,
|
|
37
36
|
selectors,
|
|
38
|
-
|
|
39
|
-
slots,
|
|
37
|
+
defaults,
|
|
40
38
|
events
|
|
41
39
|
};
|
|
@@ -5,27 +5,28 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { ICustomElementFoundation } from '@tylertech/forge-core';
|
|
7
7
|
import { IBannerAdapter } from './banner-adapter';
|
|
8
|
+
import { BannerTheme } from './banner-constants';
|
|
8
9
|
export interface IBannerFoundation extends ICustomElementFoundation {
|
|
9
10
|
dismissed: boolean;
|
|
10
|
-
|
|
11
|
+
persistent: boolean;
|
|
12
|
+
theme: BannerTheme;
|
|
11
13
|
}
|
|
12
14
|
export declare class BannerFoundation implements IBannerFoundation {
|
|
13
15
|
private _adapter;
|
|
14
16
|
private _dismissed;
|
|
15
|
-
private
|
|
16
|
-
private
|
|
17
|
+
private _persistent;
|
|
18
|
+
private _theme;
|
|
19
|
+
private _dismissListener;
|
|
17
20
|
constructor(_adapter: IBannerAdapter);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
-
private _syncDismissedState;
|
|
22
|
-
private _setUndissmissedClass;
|
|
23
|
-
private _setDismissedClass;
|
|
24
|
-
private _syncCanDismissState;
|
|
25
|
-
private _addDismissEventListener;
|
|
21
|
+
initialize(): void;
|
|
22
|
+
private _onDismiss;
|
|
23
|
+
private _addDismissListener;
|
|
26
24
|
private _removeDismissEventListener;
|
|
25
|
+
private _applyPersistent;
|
|
27
26
|
get dismissed(): boolean;
|
|
28
|
-
set dismissed(
|
|
29
|
-
get
|
|
30
|
-
set
|
|
27
|
+
set dismissed(value: boolean);
|
|
28
|
+
get persistent(): boolean;
|
|
29
|
+
set persistent(value: boolean);
|
|
30
|
+
get theme(): BannerTheme;
|
|
31
|
+
set theme(value: BannerTheme);
|
|
31
32
|
}
|
|
@@ -8,66 +8,77 @@ export class BannerFoundation {
|
|
|
8
8
|
constructor(_adapter) {
|
|
9
9
|
this._adapter = _adapter;
|
|
10
10
|
this._dismissed = false;
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
11
|
+
this._persistent = false;
|
|
12
|
+
this._theme = BANNER_CONSTANTS.defaults.THEME;
|
|
13
|
+
this._dismissListener = this._onDismiss.bind(this);
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
_dismiss() {
|
|
21
|
-
this.dismissed = true;
|
|
15
|
+
initialize() {
|
|
16
|
+
this._adapter.initialize();
|
|
17
|
+
if (!this._persistent) {
|
|
18
|
+
this._addDismissListener();
|
|
19
|
+
}
|
|
22
20
|
}
|
|
23
|
-
|
|
24
|
-
if (this.
|
|
25
|
-
|
|
26
|
-
this._adapter.emitHostEvent(BANNER_CONSTANTS.events.DISMISSED);
|
|
21
|
+
async _onDismiss() {
|
|
22
|
+
if (this._dismissed || this._persistent) {
|
|
23
|
+
return;
|
|
27
24
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
const originalDismissed = this._dismissed;
|
|
26
|
+
this._dismissed = !this._dismissed;
|
|
27
|
+
const evt = new CustomEvent(BANNER_CONSTANTS.events.BEFORE_DISMISS, { bubbles: true, composed: true, cancelable: true });
|
|
28
|
+
this._adapter.dispatchHostEvent(evt);
|
|
29
|
+
this._dismissed = originalDismissed;
|
|
30
|
+
if (evt.defaultPrevented) {
|
|
31
|
+
return;
|
|
31
32
|
}
|
|
33
|
+
const dismissComplete = this._adapter.startDismissCompleteListener();
|
|
34
|
+
this.dismissed = !this._dismissed;
|
|
35
|
+
await dismissComplete;
|
|
36
|
+
this._adapter.dispatchHostEvent(new CustomEvent(BANNER_CONSTANTS.events.DISMISSED, { bubbles: true, composed: true }));
|
|
32
37
|
}
|
|
33
|
-
|
|
34
|
-
this._adapter.
|
|
38
|
+
_addDismissListener() {
|
|
39
|
+
this._adapter.addDismissListener(this._dismissListener);
|
|
35
40
|
}
|
|
36
|
-
|
|
37
|
-
this._adapter.
|
|
41
|
+
_removeDismissEventListener() {
|
|
42
|
+
this._adapter.removeDismissListener(this._dismissListener);
|
|
38
43
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
_applyPersistent() {
|
|
45
|
+
this._adapter.setDismissButtonVisibility(!this._persistent);
|
|
46
|
+
if (this._persistent) {
|
|
47
|
+
this._removeDismissEventListener();
|
|
42
48
|
}
|
|
43
49
|
else {
|
|
44
|
-
this.
|
|
50
|
+
this._addDismissListener();
|
|
45
51
|
}
|
|
46
52
|
}
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
get dismissed() {
|
|
54
|
+
return this._dismissed;
|
|
49
55
|
}
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
set dismissed(value) {
|
|
57
|
+
value = Boolean(value);
|
|
58
|
+
if (this.dismissed !== value) {
|
|
59
|
+
this._dismissed = value;
|
|
60
|
+
this._adapter.setDismissed(this._dismissed);
|
|
61
|
+
this._adapter.toggleHostAttribute(BANNER_CONSTANTS.attributes.DISMISSED, this.dismissed);
|
|
62
|
+
}
|
|
52
63
|
}
|
|
53
|
-
get
|
|
54
|
-
return
|
|
64
|
+
get persistent() {
|
|
65
|
+
return this._persistent;
|
|
55
66
|
}
|
|
56
|
-
set
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
set persistent(value) {
|
|
68
|
+
value = Boolean(value);
|
|
69
|
+
if (this._persistent !== value) {
|
|
70
|
+
this._persistent = value;
|
|
71
|
+
this._applyPersistent();
|
|
72
|
+
this._adapter.toggleHostAttribute(BANNER_CONSTANTS.attributes.PERSISTENT, this._persistent);
|
|
59
73
|
}
|
|
60
|
-
this._dismissed = !!val;
|
|
61
|
-
this._syncDismissedState();
|
|
62
74
|
}
|
|
63
|
-
get
|
|
64
|
-
return
|
|
75
|
+
get theme() {
|
|
76
|
+
return this._theme;
|
|
65
77
|
}
|
|
66
|
-
set
|
|
67
|
-
if (this.
|
|
68
|
-
|
|
78
|
+
set theme(value) {
|
|
79
|
+
if (this._theme !== value) {
|
|
80
|
+
this._theme = value !== null && value !== void 0 ? value : BANNER_CONSTANTS.defaults.THEME;
|
|
81
|
+
this._adapter.setHostAttribute(BANNER_CONSTANTS.attributes.THEME, this._theme);
|
|
69
82
|
}
|
|
70
|
-
this._canDismiss = !!val;
|
|
71
|
-
this._syncCanDismissState();
|
|
72
83
|
}
|
|
73
84
|
}
|
package/esm/banner/banner.d.ts
CHANGED
|
@@ -4,9 +4,13 @@
|
|
|
4
4
|
* License: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { BaseComponent, IBaseComponent } from '../core/base/base-component';
|
|
7
|
+
import { BannerTheme } from './banner-constants';
|
|
7
8
|
import { BannerFoundation } from './banner-foundation';
|
|
8
9
|
export interface IBannerComponent extends IBaseComponent {
|
|
9
10
|
dismissed: boolean;
|
|
11
|
+
persistent: boolean;
|
|
12
|
+
theme: BannerTheme;
|
|
13
|
+
/** @deprecated Use `persistent` instead. */
|
|
10
14
|
canDismiss: boolean;
|
|
11
15
|
}
|
|
12
16
|
declare global {
|
|
@@ -14,24 +18,49 @@ declare global {
|
|
|
14
18
|
'forge-banner': IBannerComponent;
|
|
15
19
|
}
|
|
16
20
|
interface HTMLElementEventMap {
|
|
21
|
+
'forge-banner-before-dismiss': CustomEvent<void>;
|
|
17
22
|
'forge-banner-dismissed': CustomEvent<void>;
|
|
18
|
-
'forge-banner-undismissed': CustomEvent<void>;
|
|
19
23
|
}
|
|
20
24
|
}
|
|
21
25
|
/**
|
|
22
|
-
* The custom element class behind the `<forge-banner>` element.
|
|
23
|
-
*
|
|
24
26
|
* @tag forge-banner
|
|
27
|
+
*
|
|
28
|
+
* @summary Banners are used to inform users of important information, such as errors, warnings, or success messages.
|
|
29
|
+
*
|
|
30
|
+
* @property {boolean} dismissed - Controls the visibility of the banner.
|
|
31
|
+
* @property {boolean} persistent - Controls the visibility of the built-in dismiss button.
|
|
32
|
+
* @property {BannerTheme} theme - The theme of the banner.
|
|
33
|
+
*
|
|
34
|
+
* @attribute {boolean} dismissed - Controls the visibility of the banner.
|
|
35
|
+
* @attribute {boolean} persistent - Controls the visibility of the built-in dismiss button.
|
|
36
|
+
* @attribute {BannerTheme} theme - The theme of the banner.
|
|
37
|
+
*
|
|
38
|
+
* @event {CustomEvent} forge-banner-before-dismiss - Dispatched before the banner is dismissed. Cancelable to prevent dismissal.
|
|
39
|
+
* @event {CustomEvent} forge-banner-dismissed - Dispatched when the banner is dismissed.
|
|
40
|
+
*
|
|
41
|
+
* @cssproperty --forge-banner-background - The background color of the banner.
|
|
42
|
+
* @cssproperty --forge-banner-color - The text color of the banner.
|
|
43
|
+
* @cssproperty --forge-banner-icon-color - The color of the icon.
|
|
44
|
+
* @cssproperty --forge-banner-gap - The gap between the contents.
|
|
45
|
+
* @cssproperty --forge-banner-padding-inline - The inline padding.
|
|
46
|
+
* @cssproperty --forge-banner-padding-block - The block padding.
|
|
47
|
+
* @cssproperty --forge-banner-transition-duration - The transition duration.
|
|
48
|
+
* @cssproperty --forge-banner-transition-easing - The transition easing function.
|
|
49
|
+
*
|
|
50
|
+
* @slot - The content of the banner.
|
|
51
|
+
* @slot icon - The icon to display.
|
|
52
|
+
* @slot button - The optional button to display.
|
|
25
53
|
*/
|
|
26
54
|
export declare class BannerComponent extends BaseComponent implements IBannerComponent {
|
|
27
55
|
static get observedAttributes(): string[];
|
|
28
56
|
protected _foundation: BannerFoundation;
|
|
29
57
|
constructor();
|
|
30
58
|
connectedCallback(): void;
|
|
31
|
-
disconnectedCallback(): void;
|
|
32
59
|
attributeChangedCallback(name: string, oldValue: string, newValue: string): void;
|
|
33
|
-
/** Controls whether the component is dismissed (hidden) or not. */
|
|
34
60
|
dismissed: boolean;
|
|
35
|
-
|
|
36
|
-
|
|
61
|
+
persistent: boolean;
|
|
62
|
+
theme: BannerTheme;
|
|
63
|
+
/** @deprecated Use `persistent` instead. */
|
|
64
|
+
get canDismiss(): boolean;
|
|
65
|
+
set canDismiss(value: boolean);
|
|
37
66
|
}
|
package/esm/banner/banner.js
CHANGED
|
@@ -7,25 +7,46 @@ import { __decorate } from "tslib";
|
|
|
7
7
|
import { attachShadowTemplate, coerceBoolean, CustomElement, FoundationProperty } from '@tylertech/forge-core';
|
|
8
8
|
import { tylIconCancel } from '@tylertech/tyler-icons/standard';
|
|
9
9
|
import { BaseComponent } from '../core/base/base-component';
|
|
10
|
-
import {
|
|
10
|
+
import { IconRegistry } from '../icon';
|
|
11
11
|
import { IconButtonComponent } from '../icon-button';
|
|
12
12
|
import { TooltipComponent } from '../tooltip';
|
|
13
13
|
import { BannerAdapter } from './banner-adapter';
|
|
14
14
|
import { BANNER_CONSTANTS } from './banner-constants';
|
|
15
15
|
import { BannerFoundation } from './banner-foundation';
|
|
16
|
-
const template = '<template><div class=\"forge-banner\" part=\"root\"><div class=\"
|
|
17
|
-
const styles = '
|
|
16
|
+
const template = '<template><div class=\"forge-banner\" part=\"root\"><div class=\"inner\"><div class=\"container\"><slot name=\"icon\"></slot><slot></slot><div class=\"button-container\"><slot name=\"button\"></slot></div></div><div class=\"dismiss-button-container\"><slot name=\"dismiss-button\"><forge-icon-button part=\"dismiss-button\"><forge-icon name=\"cancel\"></forge-icon></forge-icon-button><forge-tooltip type=\"label\" placement=\"bottom\"><slot name=\"dismiss-tooltip\">Dismiss</slot></forge-tooltip></slot></div></div></div></template>';
|
|
17
|
+
const styles = ':host{display:block;container-type:inline-size}:host([hidden]){display:none}.forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-info-container, #c7daf0));--_banner-color:var(--forge-banner-color, var(--forge-theme-text-high, rgba(0, 0, 0, 0.87)));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-info-container, #0b3768));--_banner-gap:var(--forge-banner-gap, var(--forge-spacing-small, 12px));--_banner-padding-inline:var(--forge-banner-padding-inline, var(--forge-spacing-large, 24px));--_banner-padding-block:var(--forge-banner-padding-block, var(--forge-spacing-small, 12px));--_banner-transition-duration:var(--forge-banner-transition-duration, var(--forge-animation-duration-short4, 200ms));--_banner-transition-easing:var(--forge-banner-transition-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)))}.forge-banner{display:grid;grid-template-columns:1fr;grid-template-rows:1fr;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition-property:opacity,grid-template-rows,min-height;transition-property:opacity,grid-template-rows,min-height;transition-property:opacity,grid-template-rows,min-height,-ms-grid-rows;-webkit-transition-duration:var(--_banner-transition-duration);transition-duration:var(--_banner-transition-duration);-webkit-transition-timing-function:var(--_banner-transition-easing);transition-timing-function:var(--_banner-transition-easing);background:var(--_banner-background);color:var(--_banner-color);opacity:1}.forge-banner .inner{display:grid;grid-template-columns:1fr auto;place-items:center;gap:var(--_banner-gap);overflow:hidden;padding-inline:var(--_banner-padding-inline)}.forge-banner .container{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;gap:var(--_banner-gap);-webkit-box-flex:1;flex:1 1 auto;padding-block:var(--_banner-padding-block)}.forge-banner .dismiss-button-container{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;gap:var(--_banner-gap)}.forge-banner ::slotted(forge-button[slot=dismiss-button]){--forge-button-primary-color:var(--_banner-color)}.forge-banner ::slotted(forge-icon-button[slot=dismiss-button]),.forge-banner forge-icon-button[part=dismiss-button]{color:var(--_banner-icon-color);--forge-icon-button-focus-indicator-color:var(--_banner-color)}::slotted(forge-button[slot=button]){--forge-button-primary-color:var(--_banner-color)}::slotted([slot=icon]){color:var(--_banner-icon-color)}:host([dismissed]) .forge-banner{grid-template-rows:0fr;opacity:0}:host([theme=primary]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-primary-container, #d1d5ed));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-primary-container, #222c62))}:host([theme=secondary]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-secondary-container, #fff0c3));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-secondary-container, #8a6804))}:host([theme=tertiary]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-tertiary-container, #d0d7ff));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-tertiary-container, #213189))}:host([theme=success]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-success-container, #cde0ce));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-success-container, #19441b))}:host([theme=error]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-error-container, #ecc2c9));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-error-container, #5f0011))}:host([theme=warning]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-warning-container, #f4d3c2));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-warning-container, #712700))}:host([theme=danger]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-error-container, #ecc2c9));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-error-container, #5f0011))}:host([theme=info-secondary]) .forge-banner{--_banner-background:var(--forge-banner-background, var(--forge-theme-surface-container, #e0e0e0));--_banner-icon-color:var(--forge-banner-icon-color, var(--forge-theme-on-surface-container, #000000))}@container (max-width:600px){.forge-banner.has-button .container{display:grid;grid-template-rows:[content] 1fr [button] auto;grid-template-columns:[content] 1fr;place-items:normal}.forge-banner.has-button.has-icon .container{grid-template-columns:[icon] auto [content] 1fr}.forge-banner.has-button .inner{place-items:normal}.forge-banner.has-button .button-container{grid-row:button;grid-column:content}.forge-banner.has-button .dismiss-button-container{-webkit-box-align:start;align-items:flex-start}}';
|
|
18
18
|
/**
|
|
19
|
-
* The custom element class behind the `<forge-banner>` element.
|
|
20
|
-
*
|
|
21
19
|
* @tag forge-banner
|
|
20
|
+
*
|
|
21
|
+
* @summary Banners are used to inform users of important information, such as errors, warnings, or success messages.
|
|
22
|
+
*
|
|
23
|
+
* @property {boolean} dismissed - Controls the visibility of the banner.
|
|
24
|
+
* @property {boolean} persistent - Controls the visibility of the built-in dismiss button.
|
|
25
|
+
* @property {BannerTheme} theme - The theme of the banner.
|
|
26
|
+
*
|
|
27
|
+
* @attribute {boolean} dismissed - Controls the visibility of the banner.
|
|
28
|
+
* @attribute {boolean} persistent - Controls the visibility of the built-in dismiss button.
|
|
29
|
+
* @attribute {BannerTheme} theme - The theme of the banner.
|
|
30
|
+
*
|
|
31
|
+
* @event {CustomEvent} forge-banner-before-dismiss - Dispatched before the banner is dismissed. Cancelable to prevent dismissal.
|
|
32
|
+
* @event {CustomEvent} forge-banner-dismissed - Dispatched when the banner is dismissed.
|
|
33
|
+
*
|
|
34
|
+
* @cssproperty --forge-banner-background - The background color of the banner.
|
|
35
|
+
* @cssproperty --forge-banner-color - The text color of the banner.
|
|
36
|
+
* @cssproperty --forge-banner-icon-color - The color of the icon.
|
|
37
|
+
* @cssproperty --forge-banner-gap - The gap between the contents.
|
|
38
|
+
* @cssproperty --forge-banner-padding-inline - The inline padding.
|
|
39
|
+
* @cssproperty --forge-banner-padding-block - The block padding.
|
|
40
|
+
* @cssproperty --forge-banner-transition-duration - The transition duration.
|
|
41
|
+
* @cssproperty --forge-banner-transition-easing - The transition easing function.
|
|
42
|
+
*
|
|
43
|
+
* @slot - The content of the banner.
|
|
44
|
+
* @slot icon - The icon to display.
|
|
45
|
+
* @slot button - The optional button to display.
|
|
22
46
|
*/
|
|
23
47
|
let BannerComponent = class BannerComponent extends BaseComponent {
|
|
24
48
|
static get observedAttributes() {
|
|
25
|
-
return
|
|
26
|
-
BANNER_CONSTANTS.attributes.DISMISSED,
|
|
27
|
-
BANNER_CONSTANTS.attributes.CAN_DISMISS
|
|
28
|
-
];
|
|
49
|
+
return Object.values(BANNER_CONSTANTS.observedAttributes);
|
|
29
50
|
}
|
|
30
51
|
constructor() {
|
|
31
52
|
super();
|
|
@@ -34,34 +55,46 @@ let BannerComponent = class BannerComponent extends BaseComponent {
|
|
|
34
55
|
this._foundation = new BannerFoundation(new BannerAdapter(this));
|
|
35
56
|
}
|
|
36
57
|
connectedCallback() {
|
|
37
|
-
this._foundation.
|
|
38
|
-
}
|
|
39
|
-
disconnectedCallback() {
|
|
40
|
-
this._foundation.disconnect();
|
|
58
|
+
this._foundation.initialize();
|
|
41
59
|
}
|
|
42
60
|
attributeChangedCallback(name, oldValue, newValue) {
|
|
43
61
|
switch (name) {
|
|
44
|
-
case BANNER_CONSTANTS.
|
|
62
|
+
case BANNER_CONSTANTS.observedAttributes.DISMISSED:
|
|
45
63
|
this.dismissed = coerceBoolean(newValue);
|
|
46
64
|
break;
|
|
47
|
-
case BANNER_CONSTANTS.
|
|
48
|
-
this.
|
|
65
|
+
case BANNER_CONSTANTS.observedAttributes.PERSISTENT:
|
|
66
|
+
this.persistent = coerceBoolean(newValue);
|
|
67
|
+
break;
|
|
68
|
+
case BANNER_CONSTANTS.observedAttributes.CAN_DISMISS:
|
|
69
|
+
this.persistent = coerceBoolean(newValue) === false;
|
|
70
|
+
break;
|
|
71
|
+
case BANNER_CONSTANTS.observedAttributes.THEME:
|
|
72
|
+
this.theme = newValue;
|
|
49
73
|
break;
|
|
50
74
|
}
|
|
51
75
|
}
|
|
76
|
+
/** @deprecated Use `persistent` instead. */
|
|
77
|
+
get canDismiss() {
|
|
78
|
+
return !this.persistent;
|
|
79
|
+
}
|
|
80
|
+
set canDismiss(value) {
|
|
81
|
+
this.persistent = !value;
|
|
82
|
+
}
|
|
52
83
|
};
|
|
53
84
|
__decorate([
|
|
54
85
|
FoundationProperty()
|
|
55
86
|
], BannerComponent.prototype, "dismissed", void 0);
|
|
56
87
|
__decorate([
|
|
57
88
|
FoundationProperty()
|
|
58
|
-
], BannerComponent.prototype, "
|
|
89
|
+
], BannerComponent.prototype, "persistent", void 0);
|
|
90
|
+
__decorate([
|
|
91
|
+
FoundationProperty()
|
|
92
|
+
], BannerComponent.prototype, "theme", void 0);
|
|
59
93
|
BannerComponent = __decorate([
|
|
60
94
|
CustomElement({
|
|
61
95
|
name: BANNER_CONSTANTS.elementName,
|
|
62
96
|
dependencies: [
|
|
63
97
|
IconButtonComponent,
|
|
64
|
-
IconComponent,
|
|
65
98
|
TooltipComponent
|
|
66
99
|
]
|
|
67
100
|
})
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2023 Tyler Technologies, Inc.
|
|
4
4
|
* License: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { FlipOptions, ShiftOptions,
|
|
6
|
+
import { FlipOptions, ShiftOptions, HideOptions, Middleware, Placement, Strategy, OffsetOptions, MiddlewareData, ArrowOptions } from '@floating-ui/dom';
|
|
7
7
|
export type PositionPlacement = Placement;
|
|
8
8
|
export type PositionStrategy = Strategy;
|
|
9
9
|
export declare const DEFAULT_FALLBACK_PLACEMENTS: PositionPlacement[];
|
|
@@ -45,10 +45,6 @@ export interface IPositionElementConfig {
|
|
|
45
45
|
hide?: boolean;
|
|
46
46
|
/** Options to provide to the hide middleware. */
|
|
47
47
|
hideOptions?: Partial<HideOptions>;
|
|
48
|
-
/** Should the element automatically attempt to locate the best placement, */
|
|
49
|
-
auto?: boolean;
|
|
50
|
-
/** Options to provide to the autoPlacement middleware. */
|
|
51
|
-
autoOptions?: Partial<AutoPlacementOptions>;
|
|
52
48
|
/** Should any offset values be applied to the element. */
|
|
53
49
|
offset?: boolean;
|
|
54
50
|
/** The options provide to the offset middleware. */
|
|
@@ -61,17 +57,13 @@ export interface IPositionElementConfig {
|
|
|
61
57
|
topLayer?: boolean;
|
|
62
58
|
/** The positioning strategy. */
|
|
63
59
|
strategy?: PositionStrategy;
|
|
64
|
-
/** Should positioning be applied using a `transform` style. */
|
|
65
|
-
transform?: boolean;
|
|
66
|
-
/** The CSS `translate` function to apply to the `transform`. Only applied when `transform` is `true`. */
|
|
67
|
-
translateFunction?: 'translate3d' | 'translate';
|
|
68
60
|
}
|
|
69
61
|
/**
|
|
70
62
|
* Calculates an elements position relative to another element.
|
|
71
63
|
* @param {IPositionElementConfig} config Configuration to provide when positioning the element.
|
|
72
64
|
* @returns {IPositionElementResult} The result of the positioning logic.
|
|
73
65
|
*/
|
|
74
|
-
export declare function positionElementAsync({ element, anchorElement, placement, offset, offsetOptions, strategy, apply, flip, flipOptions,
|
|
66
|
+
export declare function positionElementAsync({ element, anchorElement, placement, offset, offsetOptions, strategy, apply, flip, flipOptions, shift, shiftOptions, hide, hideOptions, arrowElement, arrowOptions, topLayer }: IPositionElementConfig): Promise<IPositionElementResult>;
|
|
75
67
|
/**
|
|
76
68
|
* Custom middleware to handle positioning when the element is on the top layer AND within a containing block.
|
|
77
69
|
*/
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* Copyright 2023 Tyler Technologies, Inc.
|
|
4
4
|
* License: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { computePosition, flip as flipMiddleware, hide as hideMiddleware, shift as shiftMiddleware, offset as offsetMiddleware, arrow as arrowMiddleware
|
|
6
|
+
import { computePosition, flip as flipMiddleware, hide as hideMiddleware, shift as shiftMiddleware, offset as offsetMiddleware, arrow as arrowMiddleware } from '@floating-ui/dom';
|
|
7
7
|
import { getContainingBlock, isContainingBlock, getWindow } from '@floating-ui/utils/dom';
|
|
8
|
+
import { roundByDPR } from './utils';
|
|
8
9
|
export const DEFAULT_FALLBACK_PLACEMENTS = ['top-start', 'top', 'top-end', 'left-start', 'left', 'left-end', 'right-start', 'right', 'right-end'];
|
|
9
10
|
export class VirtualElement {
|
|
10
11
|
constructor(x, y, height = 0, width = 0) {
|
|
@@ -47,10 +48,10 @@ export class VirtualElement {
|
|
|
47
48
|
* @param {IPositionElementConfig} config Configuration to provide when positioning the element.
|
|
48
49
|
* @returns {IPositionElementResult} The result of the positioning logic.
|
|
49
50
|
*/
|
|
50
|
-
export async function positionElementAsync({ element, anchorElement, placement = 'bottom', offset = false, offsetOptions, strategy = '
|
|
51
|
+
export async function positionElementAsync({ element, anchorElement, placement = 'bottom', offset = false, offsetOptions, strategy = 'fixed', apply = true, flip = true, flipOptions = {
|
|
51
52
|
fallbackPlacements: DEFAULT_FALLBACK_PLACEMENTS,
|
|
52
53
|
fallbackStrategy: 'initialPlacement'
|
|
53
|
-
},
|
|
54
|
+
}, shift = true, shiftOptions, hide = false, hideOptions, arrowElement, arrowOptions = {}, topLayer = false }) {
|
|
54
55
|
var _a, _b, _c;
|
|
55
56
|
const middleware = [];
|
|
56
57
|
//
|
|
@@ -62,12 +63,9 @@ export async function positionElementAsync({ element, anchorElement, placement =
|
|
|
62
63
|
if (shift) {
|
|
63
64
|
middleware.push(shiftMiddleware(shiftOptions));
|
|
64
65
|
}
|
|
65
|
-
if (flip
|
|
66
|
+
if (flip) {
|
|
66
67
|
middleware.push(flipMiddleware(flipOptions));
|
|
67
68
|
}
|
|
68
|
-
if (auto) {
|
|
69
|
-
middleware.push(autoPlacementMiddleware(autoOptions));
|
|
70
|
-
}
|
|
71
69
|
if (hide) {
|
|
72
70
|
middleware.push(hideMiddleware(hideOptions));
|
|
73
71
|
}
|
|
@@ -81,17 +79,10 @@ export async function positionElementAsync({ element, anchorElement, placement =
|
|
|
81
79
|
// Should we apply the position information to the element?
|
|
82
80
|
if (apply) {
|
|
83
81
|
const styles = {
|
|
84
|
-
left:
|
|
85
|
-
top:
|
|
82
|
+
left: '0',
|
|
83
|
+
top: '0',
|
|
84
|
+
translate: `${roundByDPR(x)}px ${roundByDPR(y)}px`
|
|
86
85
|
};
|
|
87
|
-
if (transform) {
|
|
88
|
-
if (translateFunction === 'translate') {
|
|
89
|
-
styles.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
styles.transform = `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
86
|
Object.assign(element.style, styles);
|
|
96
87
|
// We use `display` here to ensure that any child overlays are also hidden
|
|
97
88
|
if ((_a = middlewareData.hide) === null || _a === void 0 ? void 0 : _a.referenceHidden) {
|
|
@@ -112,3 +112,9 @@ export declare function replaceElement<T extends HTMLElement>(oldElement: HTMLEl
|
|
|
112
112
|
* @returns An array of strings.
|
|
113
113
|
*/
|
|
114
114
|
export declare function coerceStringToArray<T extends string>(value: string, separator?: string): T[];
|
|
115
|
+
/**
|
|
116
|
+
* Rounds a value to the nearest pixel based on the device pixel ratio.
|
|
117
|
+
* @param {number} value The value to round.
|
|
118
|
+
* @returns {number} The rounded value.
|
|
119
|
+
*/
|
|
120
|
+
export declare function roundByDPR(value: number): number;
|
package/esm/core/utils/utils.js
CHANGED
|
@@ -214,3 +214,12 @@ export function replaceElement(oldElement, newElement, preserveChildren = true)
|
|
|
214
214
|
export function coerceStringToArray(value, separator = ',') {
|
|
215
215
|
return value.split(separator).map(p => p.trim());
|
|
216
216
|
}
|
|
217
|
+
/**
|
|
218
|
+
* Rounds a value to the nearest pixel based on the device pixel ratio.
|
|
219
|
+
* @param {number} value The value to round.
|
|
220
|
+
* @returns {number} The rounded value.
|
|
221
|
+
*/
|
|
222
|
+
export function roundByDPR(value) {
|
|
223
|
+
const dpr = window.devicePixelRatio || 1;
|
|
224
|
+
return Math.round(value * dpr) / dpr;
|
|
225
|
+
}
|
|
@@ -22,7 +22,6 @@ export interface IPositionElementConfig {
|
|
|
22
22
|
anchorElement: HTMLElement | VirtualElement;
|
|
23
23
|
strategy: OverlayPositionStrategy;
|
|
24
24
|
placement: PositionPlacement;
|
|
25
|
-
auto: boolean;
|
|
26
25
|
hide: OverlayHideState;
|
|
27
26
|
offset: IOverlayOffset;
|
|
28
27
|
shift: boolean;
|
|
@@ -41,7 +40,7 @@ export declare class OverlayAdapter extends BaseAdapter<IOverlayComponent> imple
|
|
|
41
40
|
hide(): void;
|
|
42
41
|
tryHideDescendantOverlays(): void;
|
|
43
42
|
locateAnchorElement(id: string | null): HTMLElement | null;
|
|
44
|
-
positionElement({ anchorElement, strategy, placement,
|
|
43
|
+
positionElement({ anchorElement, strategy, placement, hide, offset, shift, flip, boundary, boundaryElement, fallbackPlacements }: IPositionElementConfig): void;
|
|
45
44
|
tryCleanupAutoUpdate(): void;
|
|
46
45
|
isMostRecentOpenOverlay(): boolean;
|
|
47
46
|
addLightDismissListener(listener: (reason: OverlayLightDismissReason) => void): void;
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
import { autoUpdate } from '@floating-ui/dom';
|
|
7
7
|
import { getShadowElement } from '@tylertech/forge-core';
|
|
8
8
|
import { BaseAdapter } from '../core/base/base-adapter';
|
|
9
|
-
import { positionElementAsync, VirtualElement } from '../core/utils/position-utils';
|
|
9
|
+
import { DEFAULT_FALLBACK_PLACEMENTS, positionElementAsync, VirtualElement } from '../core/utils/position-utils';
|
|
10
10
|
import { locateElementById } from '../core/utils/utils';
|
|
11
11
|
import { OverlayComponent } from './overlay';
|
|
12
|
-
import { overlayStack, OVERLAY_CONSTANTS, SUPPORTS_POPOVER } from './overlay-constants';
|
|
12
|
+
import { overlayStack, OVERLAY_CONSTANTS, OVERLAY_FALLBACK_PLACEMENT_MAP, SUPPORTS_POPOVER } from './overlay-constants';
|
|
13
13
|
export class OverlayAdapter extends BaseAdapter {
|
|
14
14
|
constructor(component) {
|
|
15
15
|
super(component);
|
|
@@ -52,12 +52,13 @@ export class OverlayAdapter extends BaseAdapter {
|
|
|
52
52
|
locateAnchorElement(id) {
|
|
53
53
|
return locateElementById(this._component, id);
|
|
54
54
|
}
|
|
55
|
-
positionElement({ anchorElement, strategy, placement,
|
|
55
|
+
positionElement({ anchorElement, strategy, placement, hide, offset, shift, flip, boundary, boundaryElement, fallbackPlacements }) {
|
|
56
56
|
var _a;
|
|
57
57
|
this.tryCleanupAutoUpdate();
|
|
58
58
|
const originalOffset = Object.assign({}, offset);
|
|
59
59
|
const boundaryEl = (_a = (boundaryElement ? boundaryElement : boundary ? this._component.closest(`#${boundary}`) : null)) !== null && _a !== void 0 ? _a : 'clippingAncestors';
|
|
60
60
|
this._autoUpdateCleanup = autoUpdate(anchorElement, this._rootElement, async () => {
|
|
61
|
+
var _a;
|
|
61
62
|
const offsetOptions = Object.assign({}, originalOffset);
|
|
62
63
|
// If we have an arrow element and an offset, we need to adjust the current offset to account for the arrow length
|
|
63
64
|
if (this._component.arrowElement) {
|
|
@@ -77,23 +78,18 @@ export class OverlayAdapter extends BaseAdapter {
|
|
|
77
78
|
shiftOptions: {
|
|
78
79
|
boundary: boundaryEl
|
|
79
80
|
},
|
|
80
|
-
|
|
81
|
-
autoOptions: {
|
|
82
|
-
boundary: boundaryEl
|
|
83
|
-
},
|
|
84
|
-
flip: !auto && flip !== 'never',
|
|
81
|
+
flip: flip !== 'never',
|
|
85
82
|
flipOptions: {
|
|
86
|
-
boundary:
|
|
87
|
-
|
|
88
|
-
fallbackPlacements,
|
|
83
|
+
boundary: SUPPORTS_POPOVER ? document.body : 'clippingAncestors',
|
|
84
|
+
fallbackStrategy: 'initialPlacement',
|
|
85
|
+
fallbackPlacements: (_a = fallbackPlacements !== null && fallbackPlacements !== void 0 ? fallbackPlacements : OVERLAY_FALLBACK_PLACEMENT_MAP[placement]) !== null && _a !== void 0 ? _a : DEFAULT_FALLBACK_PLACEMENTS,
|
|
89
86
|
crossAxis: flip === 'cross' || flip === 'auto',
|
|
90
87
|
mainAxis: flip === 'main' || flip === 'auto'
|
|
91
88
|
},
|
|
92
89
|
arrowElement: this._component.arrowElement,
|
|
93
90
|
topLayer: !this._component.inline && SUPPORTS_POPOVER,
|
|
94
91
|
offset: Boolean(offsetOptions),
|
|
95
|
-
offsetOptions
|
|
96
|
-
transform: false
|
|
92
|
+
offsetOptions
|
|
97
93
|
});
|
|
98
94
|
const side = result.placement.split('-')[0];
|
|
99
95
|
const staticSide = { top: 'bottom', right: 'left', bottom: 'top', left: 'right' }[side];
|