@expressivecss/expressive 0.9.1 → 0.10.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/CHANGELOG.md +157 -1
- package/README.md +178 -25
- package/dist/css/expressive.css +365 -1222
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs +509 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +7 -0
- package/dist/js/chunks/chunk-7UXHSYIA.mjs +183 -0
- package/dist/js/chunks/chunk-7UXHSYIA.mjs.map +7 -0
- package/dist/js/chunks/chunk-A3BJA7V4.mjs +28 -0
- package/dist/js/chunks/chunk-A3BJA7V4.mjs.map +7 -0
- package/dist/js/chunks/chunk-AOGFNMXS.mjs +691 -0
- package/dist/js/chunks/chunk-AOGFNMXS.mjs.map +7 -0
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs +560 -0
- package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +7 -0
- package/dist/js/chunks/chunk-EP3CVKB5.mjs +88 -0
- package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +7 -0
- package/dist/js/chunks/chunk-G576EP5O.mjs +459 -0
- package/dist/js/chunks/chunk-G576EP5O.mjs.map +7 -0
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs +320 -0
- package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +7 -0
- package/dist/js/chunks/chunk-JKNPQQWY.mjs +191 -0
- package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +7 -0
- package/dist/js/chunks/chunk-JNPIWFJT.mjs +365 -0
- package/dist/js/chunks/chunk-JNPIWFJT.mjs.map +7 -0
- package/dist/js/chunks/chunk-JODJAGFS.mjs +267 -0
- package/dist/js/chunks/chunk-JODJAGFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-JR24UB4X.mjs +100 -0
- package/dist/js/chunks/chunk-JR24UB4X.mjs.map +7 -0
- package/dist/js/chunks/chunk-KR44BSYQ.mjs +55 -0
- package/dist/js/chunks/chunk-KR44BSYQ.mjs.map +7 -0
- package/dist/js/chunks/chunk-LZVBJ33S.mjs +102 -0
- package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +7 -0
- package/dist/js/chunks/chunk-MISGHDUU.mjs +326 -0
- package/dist/js/chunks/chunk-MISGHDUU.mjs.map +7 -0
- package/dist/js/chunks/chunk-N3UHGN3N.mjs +175 -0
- package/dist/js/chunks/chunk-N3UHGN3N.mjs.map +7 -0
- package/dist/js/chunks/chunk-PB5L3EXF.mjs +7 -0
- package/dist/js/chunks/chunk-PB5L3EXF.mjs.map +7 -0
- package/dist/js/chunks/chunk-PIIAEYAJ.mjs +85 -0
- package/dist/js/chunks/chunk-PIIAEYAJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-QSQ24FYT.mjs +59 -0
- package/dist/js/chunks/chunk-QSQ24FYT.mjs.map +7 -0
- package/dist/js/chunks/chunk-QYCYP443.mjs +1111 -0
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +7 -0
- package/dist/js/chunks/chunk-SLFNPY5M.mjs +78 -0
- package/dist/js/chunks/chunk-SLFNPY5M.mjs.map +7 -0
- package/dist/js/chunks/chunk-TK6PX2GC.mjs +663 -0
- package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +7 -0
- package/dist/js/chunks/chunk-TYM6U5DY.mjs +76 -0
- package/dist/js/chunks/chunk-TYM6U5DY.mjs.map +7 -0
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +154 -0
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +7 -0
- package/dist/js/chunks/chunk-VAS6JQ6P.mjs +94 -0
- package/dist/js/chunks/chunk-VAS6JQ6P.mjs.map +7 -0
- package/dist/js/chunks/chunk-WWPAPHMA.mjs +1 -0
- package/dist/js/chunks/chunk-WWPAPHMA.mjs.map +7 -0
- package/dist/js/chunks/chunk-XDB3G6RL.mjs +114 -0
- package/dist/js/chunks/chunk-XDB3G6RL.mjs.map +7 -0
- package/dist/js/chunks/chunk-XO5WX3TK.mjs +226 -0
- package/dist/js/chunks/chunk-XO5WX3TK.mjs.map +7 -0
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs +286 -0
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZIZVUWRL.mjs +120 -0
- package/dist/js/chunks/chunk-ZIZVUWRL.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs +338 -0
- package/dist/js/chunks/chunk-ZZBZI2XN.mjs.map +7 -0
- package/dist/js/expressive.cjs +747 -754
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +747 -754
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +11 -15
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +83 -7490
- package/dist/js/expressive.mjs.map +4 -4
- package/dist/js/internal/behaviors/bottomSheets.mjs +9 -0
- package/dist/js/internal/behaviors/bottomSheets.mjs.map +7 -0
- package/dist/js/internal/behaviors/dialogs.mjs +8 -0
- package/dist/js/internal/behaviors/dialogs.mjs.map +7 -0
- package/dist/js/internal/behaviors/forms.mjs +8 -0
- package/dist/js/internal/behaviors/forms.mjs.map +7 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs +8 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs.map +7 -0
- package/dist/js/internal/behaviors/sideSheets.mjs +9 -0
- package/dist/js/internal/behaviors/sideSheets.mjs.map +7 -0
- package/dist/js/internal/components/appBar.mjs +8 -0
- package/dist/js/internal/components/appBar.mjs.map +7 -0
- package/dist/js/internal/components/autocomplete.mjs +10 -0
- package/dist/js/internal/components/autocomplete.mjs.map +7 -0
- package/dist/js/internal/components/buttonGroup.mjs +8 -0
- package/dist/js/internal/components/buttonGroup.mjs.map +7 -0
- package/dist/js/internal/components/buttons.mjs +9 -0
- package/dist/js/internal/components/buttons.mjs.map +7 -0
- package/dist/js/internal/components/cards.mjs +13 -0
- package/dist/js/internal/components/cards.mjs.map +7 -0
- package/dist/js/internal/components/carousel.mjs +9 -0
- package/dist/js/internal/components/carousel.mjs.map +7 -0
- package/dist/js/internal/components/characterCounter.mjs +8 -0
- package/dist/js/internal/components/characterCounter.mjs.map +7 -0
- package/dist/js/internal/components/chips.mjs +11 -0
- package/dist/js/internal/components/chips.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +12 -0
- package/dist/js/internal/components/datepicker.mjs.map +7 -0
- package/dist/js/internal/components/expandingCard.mjs +11 -0
- package/dist/js/internal/components/expandingCard.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +88 -0
- package/dist/js/internal/components/index.mjs.map +7 -0
- package/dist/js/internal/components/lightbox.mjs +9 -0
- package/dist/js/internal/components/lightbox.mjs.map +7 -0
- package/dist/js/internal/components/menu.mjs +9 -0
- package/dist/js/internal/components/menu.mjs.map +7 -0
- package/dist/js/internal/components/navigationRail.mjs +8 -0
- package/dist/js/internal/components/navigationRail.mjs.map +7 -0
- package/dist/js/internal/components/registry.mjs +33 -0
- package/dist/js/internal/components/registry.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +8 -0
- package/dist/js/internal/components/scrollspy.mjs.map +7 -0
- package/dist/js/internal/components/select.mjs +10 -0
- package/dist/js/internal/components/select.mjs.map +7 -0
- package/dist/js/internal/components/slider.mjs +9 -0
- package/dist/js/internal/components/slider.mjs.map +7 -0
- package/dist/js/internal/components/snackbar.mjs +8 -0
- package/dist/js/internal/components/snackbar.mjs.map +7 -0
- package/dist/js/internal/components/tabs.mjs +10 -0
- package/dist/js/internal/components/tabs.mjs.map +7 -0
- package/dist/js/internal/components/timepicker.mjs +10 -0
- package/dist/js/internal/components/timepicker.mjs.map +7 -0
- package/dist/js/internal/components/tooltip.mjs +9 -0
- package/dist/js/internal/components/tooltip.mjs.map +7 -0
- package/dist/js/internal/core/component.mjs +7 -0
- package/dist/js/internal/core/component.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +7 -0
- package/dist/js/internal/core/utils.mjs.map +7 -0
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +8 -0
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs.map +7 -0
- package/dist/js/modular.mjs +113 -0
- package/dist/js/modular.mjs.map +7 -0
- package/dist/types/behaviors/sheetDrag.d.ts +1 -1
- package/dist/types/components/appBar.d.ts +1 -1
- package/dist/types/components/autocomplete.d.ts +9 -0
- package/dist/types/components/buttons.d.ts +4 -39
- package/dist/types/components/carousel.d.ts +10 -1
- package/dist/types/components/chips.d.ts +1 -0
- package/dist/types/components/datepicker.d.ts +7 -0
- package/dist/types/components/index.d.ts +0 -2
- package/dist/types/components/lightbox.d.ts +12 -0
- package/dist/types/components/menu.d.ts +3 -0
- package/dist/types/components/registry.d.ts +0 -4
- package/dist/types/components/select.d.ts +4 -0
- package/dist/types/components/slider.d.ts +2 -1
- package/dist/types/components/snackbar.d.ts +4 -2
- package/dist/types/components/tabs.d.ts +2 -1
- package/dist/types/components/timepicker.d.ts +5 -3
- package/dist/types/components/tooltip.d.ts +5 -3
- package/dist/types/index.d.ts +1 -8
- package/dist/types/modular.d.ts +28 -0
- package/package.json +16 -4
- package/src/sass/README.md +8 -0
- package/src/sass/components/_badges.scss +1 -6
- package/src/sass/components/_button-groups.scss +5 -1
- package/src/sass/components/_buttons.scss +8 -287
- package/src/sass/components/_chips.scss +17 -2
- package/src/sass/components/_dialog.scss +9 -4
- package/src/sass/components/_fab-menu.scss +11 -9
- package/src/sass/components/_icon-buttons.scss +0 -5
- package/src/sass/components/_index.scss +0 -5
- package/src/sass/components/_menu.scss +2 -2
- package/src/sass/components/_navigation-rail.scss +1 -1
- package/src/sass/components/_panes.scss +50 -78
- package/src/sass/components/_progress.scss +73 -13
- package/src/sass/components/_scrim.scss +4 -4
- package/src/sass/components/_side-sheet.scss +22 -12
- package/src/sass/components/_toolbar.scss +1 -4
- package/src/sass/components/_tooltip.scss +20 -2
- package/src/sass/components/forms/_input-fields.scss +5 -1
- package/src/sass/components/forms/_select.scss +1 -0
- package/src/sass/components/forms/_slider.scss +81 -25
- package/src/sass/custom.scss +38 -0
- package/dist/types/components/navigationDrawer.d.ts +0 -110
- package/src/sass/components/_banners.scss +0 -298
- package/src/sass/components/_bottom-app-bar.scss +0 -180
- package/src/sass/components/_floating-sheet.scss +0 -86
- package/src/sass/components/_navigation-drawer.scss +0 -476
- package/src/sass/components/_segmented-buttons.scss +0 -188
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Tabs
|
|
3
|
+
} from "./chunk-YFXEJ7GR.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Timepicker
|
|
6
|
+
} from "./chunk-D4UZ4HFN.mjs";
|
|
7
|
+
import {
|
|
8
|
+
Tooltip
|
|
9
|
+
} from "./chunk-JODJAGFS.mjs";
|
|
10
|
+
import {
|
|
11
|
+
EXPANDING_CARD_SELECTOR,
|
|
12
|
+
ExpandingCard
|
|
13
|
+
} from "./chunk-N3UHGN3N.mjs";
|
|
14
|
+
import {
|
|
15
|
+
Lightbox
|
|
16
|
+
} from "./chunk-JNPIWFJT.mjs";
|
|
17
|
+
import {
|
|
18
|
+
NavigationRail
|
|
19
|
+
} from "./chunk-XDB3G6RL.mjs";
|
|
20
|
+
import {
|
|
21
|
+
ScrollSpy
|
|
22
|
+
} from "./chunk-TZZ24ZQS.mjs";
|
|
23
|
+
import {
|
|
24
|
+
ButtonGroup
|
|
25
|
+
} from "./chunk-XO5WX3TK.mjs";
|
|
26
|
+
import {
|
|
27
|
+
FloatingActionButton
|
|
28
|
+
} from "./chunk-VAS6JQ6P.mjs";
|
|
29
|
+
import {
|
|
30
|
+
CARDS_SELECTOR,
|
|
31
|
+
Cards,
|
|
32
|
+
isCardReveal
|
|
33
|
+
} from "./chunk-7UXHSYIA.mjs";
|
|
34
|
+
import {
|
|
35
|
+
Carousel
|
|
36
|
+
} from "./chunk-AOGFNMXS.mjs";
|
|
37
|
+
import {
|
|
38
|
+
Chips
|
|
39
|
+
} from "./chunk-ZZBZI2XN.mjs";
|
|
40
|
+
import {
|
|
41
|
+
Autocomplete
|
|
42
|
+
} from "./chunk-7MM4VJJO.mjs";
|
|
43
|
+
import {
|
|
44
|
+
Datepicker
|
|
45
|
+
} from "./chunk-QYCYP443.mjs";
|
|
46
|
+
import {
|
|
47
|
+
FormSelect
|
|
48
|
+
} from "./chunk-G576EP5O.mjs";
|
|
49
|
+
import {
|
|
50
|
+
Menu
|
|
51
|
+
} from "./chunk-TK6PX2GC.mjs";
|
|
52
|
+
import {
|
|
53
|
+
AppBar
|
|
54
|
+
} from "./chunk-EP3CVKB5.mjs";
|
|
55
|
+
|
|
56
|
+
// src/ts/components/registry.ts
|
|
57
|
+
var AUTO_INIT_COMPONENTS = {
|
|
58
|
+
AppBar: {
|
|
59
|
+
component: AppBar,
|
|
60
|
+
selector: "header.medium, header.large, header:has(> :is(nav:not(.tabs, .navigation-bar, .navigation-rail), .bar) > :is(.search-bar, .searchbar))"
|
|
61
|
+
},
|
|
62
|
+
Autocomplete: {
|
|
63
|
+
component: Autocomplete,
|
|
64
|
+
selector: ".autocomplete"
|
|
65
|
+
},
|
|
66
|
+
ButtonGroup: {
|
|
67
|
+
component: ButtonGroup,
|
|
68
|
+
selector: ".button-group"
|
|
69
|
+
},
|
|
70
|
+
// Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read
|
|
71
|
+
// '.cards', which no card markup uses.
|
|
72
|
+
Cards: { component: Cards, selector: CARDS_SELECTOR, filter: isCardReveal },
|
|
73
|
+
ExpandingCard: {
|
|
74
|
+
component: ExpandingCard,
|
|
75
|
+
selector: EXPANDING_CARD_SELECTOR
|
|
76
|
+
},
|
|
77
|
+
Carousel: { component: Carousel, selector: ".carousel" },
|
|
78
|
+
Chips: { component: Chips, selector: ".chips" },
|
|
79
|
+
Datepicker: {
|
|
80
|
+
component: Datepicker,
|
|
81
|
+
selector: ".datepicker, .date-picker"
|
|
82
|
+
},
|
|
83
|
+
Menu: { component: Menu, selector: ".menu-trigger" },
|
|
84
|
+
Lightbox: { component: Lightbox, selector: ".lightboxed" },
|
|
85
|
+
ScrollSpy: { component: ScrollSpy, selector: ".scrollspy" },
|
|
86
|
+
FormSelect: { component: FormSelect, selector: "select" },
|
|
87
|
+
NavigationRail: {
|
|
88
|
+
component: NavigationRail,
|
|
89
|
+
selector: ".navigation-rail"
|
|
90
|
+
},
|
|
91
|
+
Tabs: { component: Tabs, selector: ".tabs" },
|
|
92
|
+
Timepicker: {
|
|
93
|
+
component: Timepicker,
|
|
94
|
+
selector: ".timepicker, .time-picker"
|
|
95
|
+
},
|
|
96
|
+
Tooltip: { component: Tooltip, selector: ".tooltipped" },
|
|
97
|
+
FloatingActionButton: {
|
|
98
|
+
component: FloatingActionButton,
|
|
99
|
+
selector: ".fab-menu"
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
function AutoInit(context = document.body, options) {
|
|
103
|
+
for (const name of Object.keys(AUTO_INIT_COMPONENTS)) {
|
|
104
|
+
const { component, selector, filter } = AUTO_INIT_COMPONENTS[name];
|
|
105
|
+
const els = context.querySelectorAll(`:is(${selector}):not(.no-autoinit)`);
|
|
106
|
+
if (filter) {
|
|
107
|
+
els.forEach((el) => {
|
|
108
|
+
if (filter(el)) component.init(el, options?.[name] ?? {});
|
|
109
|
+
});
|
|
110
|
+
} else {
|
|
111
|
+
component.init(els, options?.[name] ?? {});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export {
|
|
117
|
+
AUTO_INIT_COMPONENTS,
|
|
118
|
+
AutoInit
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=chunk-ZIZVUWRL.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/registry.ts"],
|
|
4
|
+
"sourcesContent": ["import { InitElements, InitElement } from \"../core/component\";\nimport * as Components from \"./index\";\nimport { CARDS_SELECTOR, isCardReveal } from \"./cards\";\nimport { EXPANDING_CARD_SELECTOR } from \"./expandingCard\";\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Snackbar,\n * CharacterCounter, Range, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n AppBar: {\n component: Components.AppBar,\n selector:\n \"header.medium, header.large, header:has(> :is(nav:not(.tabs, .navigation-bar, .navigation-rail), .bar) > :is(.search-bar, .searchbar))\",\n },\n Autocomplete: {\n component: Components.Autocomplete,\n selector: \".autocomplete\",\n },\n ButtonGroup: {\n component: Components.ButtonGroup,\n selector: \".button-group\",\n },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR, filter: isCardReveal },\n ExpandingCard: {\n component: Components.ExpandingCard,\n selector: EXPANDING_CARD_SELECTOR,\n },\n Carousel: { component: Components.Carousel, selector: \".carousel\" },\n Chips: { component: Components.Chips, selector: \".chips\" },\n Datepicker: {\n component: Components.Datepicker,\n selector: \".datepicker, .date-picker\",\n },\n Menu: { component: Components.Menu, selector: \".menu-trigger\" },\n Lightbox: { component: Components.Lightbox, selector: \".lightboxed\" },\n ScrollSpy: { component: Components.ScrollSpy, selector: \".scrollspy\" },\n FormSelect: { component: Components.FormSelect, selector: \"select\" },\n NavigationRail: {\n component: Components.NavigationRail,\n selector: \".navigation-rail\",\n },\n Tabs: { component: Components.Tabs, selector: \".tabs\" },\n Timepicker: {\n component: Components.Timepicker,\n selector: \".timepicker, .time-picker\",\n },\n Tooltip: { component: Components.Tooltip, selector: \".tooltipped\" },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: \".fab-menu\",\n },\n};\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<\n InstanceType<Registry[K][\"component\"]>[\"options\"]\n >;\n};\n\n/** The shape every entry in the table satisfies; see the cast in AutoInit. */\ntype AutoInitable = {\n init(els: InitElement | InitElements<InitElement>, options: Partial<object>): unknown;\n};\n\ntype AutoInitEntry = {\n component: AutoInitable;\n selector: string;\n filter?: (el: Element) => boolean;\n};\n\n/**\n * Automatically initialize components.\n * @param context Root element to initialize. Defaults to `document.body`.\n * @param options Options for each component.\n */\nexport function AutoInit(\n context: HTMLElement = document.body,\n options?: Partial<AutoInitOptions>,\n) {\n for (const name of Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[]) {\n const { component, selector, filter } = AUTO_INIT_COMPONENTS[\n name\n ] as unknown as AutoInitEntry;\n // `:is()` so that `:not(.no-autoinit)` applies to the whole selector. A\n // bare `${selector}:not(...)` binds the negation to the last alternative\n // only, which would silently break the opt-out for any comma-separated\n // entry (Cards is the first).\n const els = context.querySelectorAll(`:is(${selector}):not(.no-autoinit)`);\n // Each component's static `init` is overloaded; indexing the table widens\n // it to a union TypeScript cannot call, so narrow it once, here.\n if (filter) {\n els.forEach((el) => {\n if (filter(el)) component.init(el, options?.[name] ?? {});\n });\n } else {\n component.init(els, options?.[name] ?? {});\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,IAAM,uBAAuB;AAAA,EAClC,QAAQ;AAAA,IACN,WAAsB;AAAA,IACtB,UACE;AAAA,EACJ;AAAA,EACA,cAAc;AAAA,IACZ,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,IACX,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA,EAGA,OAAO,EAAE,WAAsB,OAAO,UAAU,gBAAgB,QAAQ,aAAa;AAAA,EACrF,eAAe;AAAA,IACb,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,UAAU,EAAE,WAAsB,UAAU,UAAU,YAAY;AAAA,EAClE,OAAO,EAAE,WAAsB,OAAO,UAAU,SAAS;AAAA,EACzD,YAAY;AAAA,IACV,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,MAAM,EAAE,WAAsB,MAAM,UAAU,gBAAgB;AAAA,EAC9D,UAAU,EAAE,WAAsB,UAAU,UAAU,cAAc;AAAA,EACpE,WAAW,EAAE,WAAsB,WAAW,UAAU,aAAa;AAAA,EACrE,YAAY,EAAE,WAAsB,YAAY,UAAU,SAAS;AAAA,EACnE,gBAAgB;AAAA,IACd,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,MAAM,EAAE,WAAsB,MAAM,UAAU,QAAQ;AAAA,EACtD,YAAY;AAAA,IACV,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,SAAS,EAAE,WAAsB,SAAS,UAAU,cAAc;AAAA,EAClE,sBAAsB;AAAA,IACpB,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AACF;AA8BO,SAAS,SACd,UAAuB,SAAS,MAChC,SACA;AACA,aAAW,QAAQ,OAAO,KAAK,oBAAoB,GAAyB;AAC1E,UAAM,EAAE,WAAW,UAAU,OAAO,IAAI,qBACtC,IACF;AAKA,UAAM,MAAM,QAAQ,iBAAiB,OAAO,QAAQ,qBAAqB;AAGzE,QAAI,QAAQ;AACV,UAAI,QAAQ,CAAC,OAAO;AAClB,YAAI,OAAO,EAAE,EAAG,WAAU,KAAK,IAAI,UAAU,IAAI,KAAK,CAAC,CAAC;AAAA,MAC1D,CAAC;AAAA,IACH,OAAO;AACL,gBAAU,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Autocomplete
|
|
3
|
+
} from "./chunk-7MM4VJJO.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Utils
|
|
6
|
+
} from "./chunk-MISGHDUU.mjs";
|
|
7
|
+
import {
|
|
8
|
+
Component
|
|
9
|
+
} from "./chunk-QSQ24FYT.mjs";
|
|
10
|
+
|
|
11
|
+
// src/ts/components/chips.ts
|
|
12
|
+
var _defaults = {
|
|
13
|
+
data: [],
|
|
14
|
+
placeholder: "",
|
|
15
|
+
secondaryPlaceholder: "",
|
|
16
|
+
closeIconClass: "material-symbols",
|
|
17
|
+
autocompleteOptions: {},
|
|
18
|
+
autocompleteOnly: false,
|
|
19
|
+
limit: Infinity,
|
|
20
|
+
allowUserInput: false,
|
|
21
|
+
i18n: { remove: "Remove" },
|
|
22
|
+
onChipAdd: null,
|
|
23
|
+
onChipSelect: null,
|
|
24
|
+
onChipDelete: null
|
|
25
|
+
};
|
|
26
|
+
var _Chips = class _Chips extends Component {
|
|
27
|
+
constructor(el, options) {
|
|
28
|
+
super(el, options, _Chips);
|
|
29
|
+
this._handleChipClick = (e) => {
|
|
30
|
+
const _chip = e.target.closest(".chip");
|
|
31
|
+
const clickedClose = !!e.target.closest(".close");
|
|
32
|
+
if (_chip) {
|
|
33
|
+
const index = this._chips.indexOf(_chip);
|
|
34
|
+
if (index < 0) return;
|
|
35
|
+
if (clickedClose) {
|
|
36
|
+
this._deleteChip(index, "input");
|
|
37
|
+
} else {
|
|
38
|
+
this.selectChip(index);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
this._input.focus();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
this._handleInputFocus = () => {
|
|
45
|
+
this.el.classList.add("focus");
|
|
46
|
+
};
|
|
47
|
+
this._handleInputBlur = () => {
|
|
48
|
+
this.el.classList.remove("focus");
|
|
49
|
+
};
|
|
50
|
+
this._handleInputKeydown = (e) => {
|
|
51
|
+
_Chips._keydown = true;
|
|
52
|
+
if (e.key === Utils.keys.ENTER) {
|
|
53
|
+
if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
if (!this.hasAutocomplete || this.hasAutocomplete && !this.options.autocompleteOnly) {
|
|
58
|
+
this.addChip({ id: this._input.value });
|
|
59
|
+
}
|
|
60
|
+
this._input.value = "";
|
|
61
|
+
} else if ((e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.ARROW_LEFT) && this._input.value === "" && this.chipsData.length) {
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
this.selectChip(this.chipsData.length - 1);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
this.el["Expressive_Chips"] = this;
|
|
67
|
+
this.options = {
|
|
68
|
+
..._Chips.defaults,
|
|
69
|
+
...options
|
|
70
|
+
};
|
|
71
|
+
if (options?.i18n) this.options.i18n = { ..._Chips.defaults.i18n, ...options.i18n };
|
|
72
|
+
this.el.classList.add("chips");
|
|
73
|
+
this.chipsData = [];
|
|
74
|
+
this._chips = [];
|
|
75
|
+
if (this.options.data.length) {
|
|
76
|
+
this.chipsData = this.options.data;
|
|
77
|
+
this._renderChips();
|
|
78
|
+
}
|
|
79
|
+
if (this.options.allowUserInput) {
|
|
80
|
+
this.el.classList.add("field");
|
|
81
|
+
this._setupInput();
|
|
82
|
+
this._setupEventHandlers();
|
|
83
|
+
this.el.append(this._input);
|
|
84
|
+
}
|
|
85
|
+
this._setupLabel();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Selection is drawn by a class now, not by `:focus`, so it does not clear
|
|
89
|
+
* itself when focus moves - every path that changes the selection has to go
|
|
90
|
+
* through here or the class and the field drift apart.
|
|
91
|
+
*
|
|
92
|
+
* Deliberately no `aria-selected`: the chip is not an option in a listbox,
|
|
93
|
+
* and putting the attribute on an element with no such role is the same
|
|
94
|
+
* defect the semantics standard exists to remove.
|
|
95
|
+
*/
|
|
96
|
+
_setSelected(chip) {
|
|
97
|
+
this._selectedChip?.classList.remove("selected");
|
|
98
|
+
this._selectedChip = chip;
|
|
99
|
+
chip?.classList.add("selected");
|
|
100
|
+
}
|
|
101
|
+
static get defaults() {
|
|
102
|
+
return _defaults;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Initializes instances of Chips.
|
|
106
|
+
* @param els HTML elements.
|
|
107
|
+
* @param options Component options.
|
|
108
|
+
*/
|
|
109
|
+
static init(els, options = {}) {
|
|
110
|
+
return super.init(els, options, _Chips);
|
|
111
|
+
}
|
|
112
|
+
static getInstance(el) {
|
|
113
|
+
return el["Expressive_Chips"];
|
|
114
|
+
}
|
|
115
|
+
getData() {
|
|
116
|
+
return this.chipsData;
|
|
117
|
+
}
|
|
118
|
+
destroy() {
|
|
119
|
+
if (this.options.allowUserInput) {
|
|
120
|
+
this._removeEventHandlers();
|
|
121
|
+
}
|
|
122
|
+
this._chips.forEach((c) => c.remove());
|
|
123
|
+
this._chips = [];
|
|
124
|
+
this.el["Expressive_Chips"] = void 0;
|
|
125
|
+
}
|
|
126
|
+
_setupEventHandlers() {
|
|
127
|
+
this.el.addEventListener("click", this._handleChipClick);
|
|
128
|
+
this.el.addEventListener("keydown", _Chips._handleChipsKeydown);
|
|
129
|
+
this.el.addEventListener("keyup", _Chips._handleChipsKeyup);
|
|
130
|
+
this.el.addEventListener("blur", _Chips._handleChipsBlur, true);
|
|
131
|
+
this._input.addEventListener("focus", this._handleInputFocus);
|
|
132
|
+
this._input.addEventListener("blur", this._handleInputBlur);
|
|
133
|
+
this._input.addEventListener("keydown", this._handleInputKeydown);
|
|
134
|
+
}
|
|
135
|
+
_removeEventHandlers() {
|
|
136
|
+
this.el.removeEventListener("click", this._handleChipClick);
|
|
137
|
+
this.el.removeEventListener("keydown", _Chips._handleChipsKeydown);
|
|
138
|
+
this.el.removeEventListener("keyup", _Chips._handleChipsKeyup);
|
|
139
|
+
this.el.removeEventListener("blur", _Chips._handleChipsBlur, true);
|
|
140
|
+
this._input.removeEventListener("focus", this._handleInputFocus);
|
|
141
|
+
this._input.removeEventListener("blur", this._handleInputBlur);
|
|
142
|
+
this._input.removeEventListener("keydown", this._handleInputKeydown);
|
|
143
|
+
}
|
|
144
|
+
static _handleChipsKeydown(e) {
|
|
145
|
+
_Chips._keydown = true;
|
|
146
|
+
const chips = e.target.closest(".chips");
|
|
147
|
+
const chipsKeydown = e.target && chips;
|
|
148
|
+
const tag = e.target.tagName;
|
|
149
|
+
if (tag === "INPUT" || tag === "TEXTAREA" || !chipsKeydown) return;
|
|
150
|
+
const currChips = chips["Expressive_Chips"];
|
|
151
|
+
if (!currChips) return;
|
|
152
|
+
if (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.DELETE) {
|
|
153
|
+
const index = currChips._chips.indexOf(e.target.closest(".chip"));
|
|
154
|
+
if (index < 0) return;
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
currChips._deleteChip(index, "previous");
|
|
157
|
+
} else if (e.key === Utils.keys.ARROW_LEFT) {
|
|
158
|
+
if (currChips._selectedChip) {
|
|
159
|
+
const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;
|
|
160
|
+
if (selectIndex < 0) return;
|
|
161
|
+
currChips.selectChip(selectIndex);
|
|
162
|
+
}
|
|
163
|
+
} else if (e.key === Utils.keys.ARROW_RIGHT) {
|
|
164
|
+
if (currChips._selectedChip) {
|
|
165
|
+
const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;
|
|
166
|
+
if (selectIndex >= currChips.chipsData.length) {
|
|
167
|
+
currChips._setSelected(null);
|
|
168
|
+
currChips._input.focus();
|
|
169
|
+
} else currChips.selectChip(selectIndex);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
static _handleChipsKeyup() {
|
|
174
|
+
_Chips._keydown = false;
|
|
175
|
+
}
|
|
176
|
+
static _handleChipsBlur(e) {
|
|
177
|
+
if (!_Chips._keydown && document.hidden) {
|
|
178
|
+
const chips = e.target.closest(".chips");
|
|
179
|
+
const currChips = chips?.["Expressive_Chips"];
|
|
180
|
+
if (currChips) currChips._setSelected(null);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
_renderChip(chip) {
|
|
184
|
+
if (!chip.id) return;
|
|
185
|
+
const label = chip.text || chip.id;
|
|
186
|
+
const renderedChip = document.createElement("span");
|
|
187
|
+
renderedChip.classList.add("chip");
|
|
188
|
+
renderedChip.innerText = label;
|
|
189
|
+
if (chip.image) {
|
|
190
|
+
const img = document.createElement("img");
|
|
191
|
+
img.setAttribute("src", chip.image);
|
|
192
|
+
renderedChip.insertBefore(img, renderedChip.firstChild);
|
|
193
|
+
}
|
|
194
|
+
if (this.options.allowUserInput) {
|
|
195
|
+
const closeButton = document.createElement("button");
|
|
196
|
+
closeButton.type = "button";
|
|
197
|
+
closeButton.classList.add("close");
|
|
198
|
+
closeButton.setAttribute("aria-label", `${this.options.i18n.remove} ${label}`);
|
|
199
|
+
const closeIcon = document.createElement("span");
|
|
200
|
+
closeIcon.classList.add(this.options.closeIconClass);
|
|
201
|
+
closeIcon.setAttribute("aria-hidden", "true");
|
|
202
|
+
closeIcon.innerText = "close";
|
|
203
|
+
closeButton.appendChild(closeIcon);
|
|
204
|
+
renderedChip.appendChild(closeButton);
|
|
205
|
+
}
|
|
206
|
+
return renderedChip;
|
|
207
|
+
}
|
|
208
|
+
_renderChips() {
|
|
209
|
+
this._chips = [];
|
|
210
|
+
for (let i = 0; i < this.chipsData.length; i++) {
|
|
211
|
+
const chipElem = this._renderChip(this.chipsData[i]);
|
|
212
|
+
this.el.appendChild(chipElem);
|
|
213
|
+
this._chips.push(chipElem);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
_setupAutocomplete() {
|
|
217
|
+
this.options.autocompleteOptions.onAutocomplete = (items) => {
|
|
218
|
+
if (items.length > 0)
|
|
219
|
+
this.addChip({
|
|
220
|
+
id: items[0].id,
|
|
221
|
+
text: items[0].text,
|
|
222
|
+
image: items[0].image
|
|
223
|
+
});
|
|
224
|
+
this._input.value = "";
|
|
225
|
+
this._input.focus();
|
|
226
|
+
};
|
|
227
|
+
this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);
|
|
228
|
+
}
|
|
229
|
+
_setupInput() {
|
|
230
|
+
this._input = this.el.querySelector("input");
|
|
231
|
+
if (!this._input) {
|
|
232
|
+
this._input = document.createElement("input");
|
|
233
|
+
this.el.append(this._input);
|
|
234
|
+
}
|
|
235
|
+
this._input.classList.add("input");
|
|
236
|
+
this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;
|
|
237
|
+
if (this.hasAutocomplete) this._setupAutocomplete();
|
|
238
|
+
this._setPlaceholder();
|
|
239
|
+
if (!this._input.getAttribute("id")) this._input.setAttribute("id", Utils.guid());
|
|
240
|
+
}
|
|
241
|
+
_setupLabel() {
|
|
242
|
+
this._label = this.el.querySelector("label");
|
|
243
|
+
if (this._label && this._input) this._label.setAttribute("for", this._input.getAttribute("id"));
|
|
244
|
+
}
|
|
245
|
+
_setPlaceholder() {
|
|
246
|
+
if (this.chipsData !== void 0 && !this.chipsData.length && this.options.placeholder) {
|
|
247
|
+
this._input.placeholder = this.options.placeholder;
|
|
248
|
+
} else if ((this.chipsData === void 0 || !!this.chipsData.length) && this.options.secondaryPlaceholder) {
|
|
249
|
+
this._input.placeholder = this.options.secondaryPlaceholder;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
_isValidAndNotExist(chip) {
|
|
253
|
+
const isValid = !!chip.id;
|
|
254
|
+
const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);
|
|
255
|
+
return isValid && doesNotExist;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Add chip to input.
|
|
259
|
+
* @param chip Chip data object
|
|
260
|
+
*/
|
|
261
|
+
addChip(chip) {
|
|
262
|
+
if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;
|
|
263
|
+
const renderedChip = this._renderChip(chip);
|
|
264
|
+
this._chips.push(renderedChip);
|
|
265
|
+
this.chipsData.push(chip);
|
|
266
|
+
this._input.before(renderedChip);
|
|
267
|
+
this._setPlaceholder();
|
|
268
|
+
if (typeof this.options.onChipAdd === "function") {
|
|
269
|
+
this.options.onChipAdd(this.el, renderedChip);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Delete nth chip.
|
|
274
|
+
* @param chipIndex Index of chip
|
|
275
|
+
*/
|
|
276
|
+
deleteChip(chipIndex) {
|
|
277
|
+
const root = this.el.getRootNode();
|
|
278
|
+
this._deleteChip(chipIndex, this._chips[chipIndex]?.contains(root.activeElement) ? "input" : null);
|
|
279
|
+
}
|
|
280
|
+
_deleteChip(chipIndex, focus) {
|
|
281
|
+
const chip = this._chips[chipIndex];
|
|
282
|
+
if (!chip) return;
|
|
283
|
+
if (this._selectedChip === chip) this._setSelected(null);
|
|
284
|
+
chip.remove();
|
|
285
|
+
this._chips.splice(chipIndex, 1);
|
|
286
|
+
this.chipsData.splice(chipIndex, 1);
|
|
287
|
+
this._setPlaceholder();
|
|
288
|
+
const focusPath = [];
|
|
289
|
+
let root = this.el.getRootNode();
|
|
290
|
+
while (root) {
|
|
291
|
+
focusPath.push({ root, element: root.activeElement });
|
|
292
|
+
root = "host" in root ? root.host.getRootNode() : null;
|
|
293
|
+
}
|
|
294
|
+
if (typeof this.options.onChipDelete === "function") {
|
|
295
|
+
this.options.onChipDelete(this.el, chip);
|
|
296
|
+
}
|
|
297
|
+
if (!focus || focusPath.some(({ root: root2, element }) => root2.activeElement !== element) || this.el["Expressive_Chips"] !== this) return;
|
|
298
|
+
if (focus === "previous" && this._chips.length) this.selectChip(Math.max(chipIndex - 1, 0));
|
|
299
|
+
else {
|
|
300
|
+
this._setSelected(null);
|
|
301
|
+
this._input?.focus();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Select nth chip.
|
|
306
|
+
* @param chipIndex Index of chip
|
|
307
|
+
*/
|
|
308
|
+
selectChip(chipIndex) {
|
|
309
|
+
const chip = this._chips[chipIndex];
|
|
310
|
+
if (!chip) return;
|
|
311
|
+
this._setSelected(chip);
|
|
312
|
+
chip.querySelector(".close")?.focus();
|
|
313
|
+
if (typeof this.options.onChipSelect === "function") {
|
|
314
|
+
this.options.onChipSelect(this.el, chip);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
static Init() {
|
|
318
|
+
Utils.onDocumentReady(() => {
|
|
319
|
+
const chips = document.querySelectorAll(".chips");
|
|
320
|
+
chips.forEach((el) => {
|
|
321
|
+
el.addEventListener("click", (e) => {
|
|
322
|
+
if (el["Expressive_Chips"]) return;
|
|
323
|
+
if (e.target.closest(".close")) {
|
|
324
|
+
const chip = e.target.closest(".chip");
|
|
325
|
+
if (chip) chip.remove();
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
_Chips._keydown = false;
|
|
333
|
+
var Chips = _Chips;
|
|
334
|
+
|
|
335
|
+
export {
|
|
336
|
+
Chips
|
|
337
|
+
};
|
|
338
|
+
//# sourceMappingURL=chunk-ZZBZI2XN.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/chips.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\nexport interface ChipsI18nOptions {\n /** Prefix for the delete button's accessible name. */\n remove: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button.\n * @default 'material-symbols'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Strings the component generates. `remove` prefixes the delete button's\n * accessible name, giving \"Remove Apple\".\n * @default { remove: 'Remove' }\n */\n i18n: Partial<ChipsI18nOptions>;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-symbols',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n i18n: { remove: 'Remove' },\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n static _keydown: boolean;\n private _selectedChip: HTMLElement;\n\n /**\n * Selection is drawn by a class now, not by `:focus`, so it does not clear\n * itself when focus moves - every path that changes the selection has to go\n * through here or the class and the field drift apart.\n *\n * Deliberately no `aria-selected`: the chip is not an option in a listbox,\n * and putting the attribute on an element with no such role is the same\n * defect the semantics standard exists to remove.\n */\n private _setSelected(chip: HTMLElement | null) {\n this._selectedChip?.classList.remove('selected');\n this._selectedChip = chip;\n chip?.classList.add('selected');\n }\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options, Chips);\n this.el['Expressive_Chips'] = this;\n\n this.options = {\n ...Chips.defaults,\n ...options\n };\n // Spreading options over the defaults replaces the i18n object wholesale,\n // so passing one string would drop the rest. Same fix as Datepicker.\n if (options?.i18n) this.options.i18n = { ...Chips.defaults.i18n, ...options.i18n };\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n\n // Render initial chips\n if (this.options.data.length) {\n this.chipsData = this.options.data;\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end\n this.el.append(this._input);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Chips.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ChipsOptions>): Chips;\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<ChipsOptions>): Chips[];\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ChipsOptions> = {}\n ): Chips | Chips[] {\n return super.init(els, options, Chips);\n }\n\n static getInstance(el: HTMLElement): Chips {\n return el['Expressive_Chips'];\n }\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.options.allowUserInput) {\n this._removeEventHandlers();\n }\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this.el['Expressive_Chips'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleChipClick);\n this.el.addEventListener('keydown', Chips._handleChipsKeydown);\n this.el.addEventListener('keyup', Chips._handleChipsKeyup);\n this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n this._input.addEventListener('focus', this._handleInputFocus);\n this._input.addEventListener('blur', this._handleInputBlur);\n this._input.addEventListener('keydown', this._handleInputKeydown);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleChipClick);\n this.el.removeEventListener('keydown', Chips._handleChipsKeydown);\n this.el.removeEventListener('keyup', Chips._handleChipsKeyup);\n this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n this._input.removeEventListener('focus', this._handleInputFocus);\n this._input.removeEventListener('blur', this._handleInputBlur);\n this._input.removeEventListener('keydown', this._handleInputKeydown);\n }\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n // closest, not classList: the close button now wraps an icon span, so a\n // click on the glyph reports the span as the target.\n const clickedClose = !!(<HTMLElement>e.target).closest('.close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this._deleteChip(index, 'input');\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n Chips._keydown = true;\n const chips = (<HTMLElement>e.target).closest('.chips');\n const chipsKeydown = e.target && chips;\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chipsKeydown) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.DELETE) {\n const index = currChips._chips.indexOf((e.target as HTMLElement).closest('.chip'));\n if (index < 0) return;\n e.preventDefault();\n currChips._deleteChip(index, 'previous');\n } else if (e.key === Utils.keys.ARROW_LEFT) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;\n if (selectIndex < 0) return;\n currChips.selectChip(selectIndex);\n }\n } else if (e.key === Utils.keys.ARROW_RIGHT) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;\n if (selectIndex >= currChips.chipsData.length) {\n // Walking off the end returns to the input, so nothing is selected\n // any more - without this the last chip kept the class.\n currChips._setSelected(null);\n currChips._input.focus();\n }\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n static _handleChipsKeyup() {\n Chips._keydown = false;\n }\n\n static _handleChipsBlur(e: Event) {\n if (!Chips._keydown && document.hidden) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n const currChips: Chips = chips?.['Expressive_Chips'];\n if (currChips) currChips._setSelected(null);\n }\n }\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Chips._keydown = true;\n if (e.key === Utils.keys.ENTER) {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || (this.hasAutocomplete && !this.options.autocompleteOnly)) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n } else if (\n (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.ARROW_LEFT) &&\n this._input.value === '' &&\n this.chipsData.length\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLElement {\n if (!chip.id) return;\n const label = chip.text || <string>chip.id;\n // <span>, not <div>: a chip is inline, and the container itself is not a\n // control. It used to be a <div tabindex=\"0\"> with no role - focusable,\n // and announcing nothing.\n const renderedChip = document.createElement('span');\n renderedChip.classList.add('chip');\n renderedChip.innerText = label;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n // The delete affordance is the control, so it is the <button> and it\n // carries the name. `type` is explicit because a bare button inside a\n // form submits it.\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.classList.add('close');\n closeButton.setAttribute('aria-label', `${this.options.i18n.remove} ${label}`);\n // The ligature is text and is read out, so the glyph is hidden and the\n // button's own label is what gets announced.\n const closeIcon = document.createElement('span');\n closeIcon.classList.add(this.options.closeIconClass);\n closeIcon.setAttribute('aria-hidden', 'true');\n closeIcon.innerText = 'close';\n closeButton.appendChild(closeIcon);\n renderedChip.appendChild(closeButton);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (items.length > 0)\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n };\n this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (\n (this.chipsData === undefined || !!this.chipsData.length) &&\n this.options.secondaryPlaceholder\n ) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n this._input.before(renderedChip);\n this._setPlaceholder();\n // fire chipAdd callback\n if (typeof this.options.onChipAdd === 'function') {\n this.options.onChipAdd(this.el, renderedChip);\n }\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n this._deleteChip(chipIndex, this._chips[chipIndex]?.contains(root.activeElement) ? 'input' : null);\n }\n\n private _deleteChip(chipIndex: number, focus: 'input' | 'previous' | null) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n if (this._selectedChip === chip) this._setSelected(null);\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n const focusPath: { root: Document | ShadowRoot; element: Element | null }[] = [];\n let root = this.el.getRootNode() as Document | ShadowRoot;\n while (root) {\n focusPath.push({ root, element: root.activeElement });\n root = 'host' in root ? root.host.getRootNode() as Document | ShadowRoot : null;\n }\n // fire chipDelete callback\n if (typeof this.options.onChipDelete === 'function') {\n this.options.onChipDelete(this.el, chip);\n }\n if (!focus || focusPath.some(({ root, element }) => root.activeElement !== element) || this.el['Expressive_Chips'] !== this) return;\n if (focus === 'previous' && this._chips.length) this.selectChip(Math.max(chipIndex - 1, 0));\n else {\n this._setSelected(null);\n this._input?.focus();\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._setSelected(chip);\n // The chip is not a control any more, so focus goes to the one thing in it\n // that is - the delete button.\n (chip.querySelector('.close') as HTMLElement | null)?.focus();\n // fire chipSelect callback\n if (typeof this.options.onChipSelect === 'function') {\n this.options.onChipSelect(this.el, chip);\n }\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, with no Chips\n // instance behind it. Where there *is* an instance, _handleChipClick owns\n // the close button: removing the node here as well left chipsData holding\n // an entry whose element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n if (el['Expressive_Chips']) return;\n // closest: the close button wraps an icon span, so a click on the\n // glyph reports the span.\n if ((<HTMLElement>e.target).closest('.close')) {\n const chip = (<HTMLElement>e.target).closest('.chip');\n if (chip) chip.remove();\n }\n });\n });\n });\n }\n\n static {\n Chips._keydown = false;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["root"]
|
|
7
|
+
}
|