@telia-ace/widget-runtime-flamingo 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/component-platform-factory.d.ts +13 -0
  2. package/context/children.context.d.ts +4 -0
  3. package/context/component-node.context.d.ts +4 -0
  4. package/context/container.context.d.ts +4 -0
  5. package/context/context.context.d.ts +3 -0
  6. package/context/layout.context.d.ts +3 -0
  7. package/context/properties.context.d.ts +3 -0
  8. package/controllers/actions-controller.d.ts +14 -0
  9. package/core/create-lit-component.d.ts +11 -0
  10. package/core/get-render-state.d.ts +4 -0
  11. package/data-provider/data-provider.d.ts +24 -0
  12. package/data-provider/providers/guide-provider.plugin.d.ts +2 -0
  13. package/index-4be3f206.mjs +3409 -0
  14. package/index-5087564d.mjs +335 -0
  15. package/index-6dd00f59.js +1 -0
  16. package/index-e07bd0fb.js +206 -0
  17. package/{src/index.ts → index.d.ts} +1 -13
  18. package/index.js +1 -0
  19. package/index.mjs +17 -0
  20. package/mixins/widget-component.mixin.d.ts +24 -0
  21. package/package.json +1 -1
  22. package/render-049911af.mjs +458 -0
  23. package/render-f343a6c5.js +120 -0
  24. package/services.d.ts +5 -0
  25. package/ui/area.d.ts +9 -0
  26. package/ui/branding.d.ts +1 -0
  27. package/ui/get-css-props.d.ts +5 -0
  28. package/ui/get-layout-props.d.ts +9 -0
  29. package/ui/html-element-handlers.d.ts +14 -0
  30. package/ui/prepare-dom.d.ts +21 -0
  31. package/ui/render.d.ts +3 -0
  32. package/ui/trigger-component.d.ts +20 -0
  33. package/ui/view-outlet.d.ts +36 -0
  34. package/ui/wrapper.d.ts +21 -0
  35. package/widget.d.ts +54 -0
  36. package/.eslintrc.json +0 -30
  37. package/README.md +0 -11
  38. package/project.json +0 -48
  39. package/src/component-platform-factory.ts +0 -163
  40. package/src/context/children.context.ts +0 -4
  41. package/src/context/component-node.context.ts +0 -6
  42. package/src/context/container.context.ts +0 -6
  43. package/src/context/context.context.ts +0 -3
  44. package/src/context/layout.context.ts +0 -3
  45. package/src/context/properties.context.ts +0 -3
  46. package/src/controllers/actions-controller.ts +0 -55
  47. package/src/core/create-lit-component.ts +0 -31
  48. package/src/core/get-render-state.ts +0 -25
  49. package/src/data-provider/data-provider.ts +0 -87
  50. package/src/data-provider/providers/guide-provider.plugin.ts +0 -64
  51. package/src/declaration.d.ts +0 -2
  52. package/src/mixins/widget-component.mixin.ts +0 -231
  53. package/src/services.ts +0 -27
  54. package/src/ui/area.ts +0 -97
  55. package/src/ui/branding.ts +0 -25
  56. package/src/ui/get-css-props.ts +0 -23
  57. package/src/ui/get-layout-props.ts +0 -41
  58. package/src/ui/html-element-handlers.ts +0 -140
  59. package/src/ui/index.ts +0 -6
  60. package/src/ui/prepare-dom.ts +0 -164
  61. package/src/ui/render.ts +0 -19
  62. package/src/ui/trigger-component.ts +0 -200
  63. package/src/ui/view-outlet.ts +0 -172
  64. package/src/ui/wrapper.ts +0 -247
  65. package/src/vite.env.d.ts +0 -1
  66. package/src/widget.ts +0 -748
  67. package/tsconfig.json +0 -23
  68. package/tsconfig.lib.json +0 -10
  69. package/tsconfig.spec.json +0 -19
  70. package/vite.config.ts +0 -56
@@ -1,164 +0,0 @@
1
- import { ViewOutletOptions } from './view-outlet';
2
- import { TriggerComponent } from './trigger-component';
3
- import { Container } from '@webprovisions/platform';
4
-
5
- enum ProvidedElements {
6
- None = 'none',
7
- WidgetDOM = 'widgetDOM',
8
- TriggerDOM = 'triggerDOM',
9
- Both = 'both',
10
- }
11
-
12
- export enum TriggerType {
13
- Inline = 'inline',
14
- Link = 'link',
15
- Badge = 'badge',
16
- Unsupported = 'unsupported',
17
- }
18
-
19
- export const determineProvidedElements = (
20
- widgetDOMElement?: HTMLElement,
21
- triggerDOMElement?: HTMLElement
22
- ): ProvidedElements => {
23
- if (widgetDOMElement && triggerDOMElement) {
24
- return ProvidedElements.Both;
25
- }
26
- if (widgetDOMElement) {
27
- return ProvidedElements.WidgetDOM;
28
- }
29
- if (triggerDOMElement) {
30
- return ProvidedElements.TriggerDOM;
31
- }
32
- return ProvidedElements.None;
33
- };
34
-
35
- export const determineTriggerType = (triggerDefinition?: any) => {
36
- if (!triggerDefinition) {
37
- return TriggerType.Inline;
38
- }
39
- if (typeof triggerDefinition === 'boolean' && triggerDefinition) {
40
- return TriggerType.Link;
41
- }
42
- if (
43
- typeof triggerDefinition === 'object' &&
44
- !Array.isArray(triggerDefinition)
45
- ) {
46
- return TriggerType.Badge;
47
- }
48
- return TriggerType.Unsupported;
49
- };
50
-
51
- type PrepareDOMElementsOutput = ViewOutletOptions & {
52
- callback?: () => void;
53
- };
54
-
55
- export const prepareDOMElements = async (
56
- container: Container,
57
- name: string,
58
- providedWidgetElement?: HTMLElement,
59
- providedTriggerElement?: HTMLElement,
60
- triggerDefinition?: any,
61
- waitWithReplace = false
62
- ): Promise<PrepareDOMElementsOutput> => {
63
- const providedElements = determineProvidedElements(
64
- providedWidgetElement,
65
- providedTriggerElement
66
- );
67
- const triggerType = determineTriggerType(triggerDefinition);
68
-
69
- const cachedOriginals = {
70
- widgetDOMElement: providedWidgetElement
71
- ? providedWidgetElement.cloneNode(true)
72
- : undefined,
73
- triggerDOMElement: providedTriggerElement
74
- ? providedTriggerElement.cloneNode(true)
75
- : undefined,
76
- };
77
-
78
- const output: PrepareDOMElementsOutput = {
79
- triggerType,
80
- cachedOriginals,
81
- widgetDOMElement: document.createElement('div'),
82
- };
83
-
84
- switch (providedElements) {
85
- case ProvidedElements.Both: {
86
- output.widgetDOMElement =
87
- providedWidgetElement || document.createElement('div');
88
- if (triggerType !== TriggerType.Inline) {
89
- output.triggerDOMElement = providedTriggerElement;
90
- }
91
- break;
92
- }
93
- case ProvidedElements.WidgetDOM: {
94
- output.widgetDOMElement =
95
- providedWidgetElement || document.createElement('div');
96
- if (triggerType !== TriggerType.Inline) {
97
- const triggerElement = document.body.appendChild(
98
- document.createElement('a')
99
- );
100
- if (triggerType === TriggerType.Link) {
101
- triggerElement.innerText = name;
102
- }
103
- output.triggerDOMElement = triggerElement;
104
- }
105
- break;
106
- }
107
- case ProvidedElements.TriggerDOM: {
108
- const widgetElement = document.createElement('div');
109
- output.widgetDOMElement = widgetElement;
110
- if (triggerType === TriggerType.Inline) {
111
- // replace with widgetDOMElement in the DOM
112
- widgetElement.id = providedTriggerElement?.id || '';
113
- if (waitWithReplace) {
114
- widgetElement.style.display = 'none';
115
- providedTriggerElement?.parentNode?.appendChild(widgetElement);
116
-
117
- output.callback = () => {
118
- providedTriggerElement?.parentNode?.replaceChild(
119
- widgetElement,
120
- providedTriggerElement
121
- );
122
- widgetElement.style.display =
123
- providedTriggerElement?.style.display || 'block';
124
- };
125
- } else {
126
- providedTriggerElement?.parentNode?.replaceChild(
127
- widgetElement,
128
- providedTriggerElement
129
- );
130
- }
131
- output.cachedOriginals.widgetDOMElement = providedTriggerElement;
132
- output.cachedOriginals.triggerDOMElement = undefined;
133
- } else {
134
- output.widgetDOMElement = document.body.appendChild(widgetElement);
135
- output.triggerDOMElement = providedTriggerElement;
136
- }
137
- break;
138
- }
139
- case ProvidedElements.None: {
140
- const widgetElement = document.body.appendChild(
141
- document.createElement('div')
142
- );
143
- output.widgetDOMElement = widgetElement;
144
- if (triggerType !== TriggerType.Inline) {
145
- if (!customElements.get('ace-widget-trigger')) {
146
- customElements.define('ace-widget-trigger', TriggerComponent);
147
- }
148
- const trigger: any = document.createElement('ace-widget-trigger');
149
- trigger.symbol = triggerDefinition.symbol;
150
- trigger.container = container;
151
-
152
- document.body.appendChild(trigger);
153
- console.log('Created trigger');
154
- // if (triggerType === TriggerType.Link) {
155
- // triggerElement.innerText = name;
156
- // }
157
- output.triggerDOMElement = trigger;
158
- }
159
- break;
160
- }
161
- }
162
-
163
- return output;
164
- };
package/src/ui/render.ts DELETED
@@ -1,19 +0,0 @@
1
- import { Container } from '@webprovisions/platform';
2
- import { WrapperComponent } from './wrapper';
3
- import './area';
4
-
5
- export default (container: Container, element: HTMLElement) => {
6
- // element.addEventListener('request', (event: any) => {
7
- // if (event.detail.type === 'container') {
8
- // event.detail.instance = container;
9
- // }
10
- // });
11
-
12
- // TODO: figure out why this tick is needed
13
- setTimeout(() => {
14
- const root = new WrapperComponent();
15
- root.container = container.parent; // TODO: change back to just container?
16
-
17
- element.appendChild(root);
18
- }, 0);
19
- };
@@ -1,200 +0,0 @@
1
- import { Container } from '@webprovisions/platform';
2
- import { LitElement, html, css, nothing } from 'lit';
3
- import { property, state } from 'lit/decorators.js';
4
- import { classMap } from 'lit/directives/class-map.js';
5
- import { mapBranding } from './branding';
6
-
7
- type SymbolType = {
8
- type: 'Uri' | 'Svg' | 'FontAwesome' | 'Text' | string;
9
- content: string;
10
- };
11
-
12
- // @customElement('ace-widget-trigger')
13
- export class TriggerComponent extends LitElement {
14
- static override styles = [
15
- css`
16
- :host {
17
- --voca-rem-multiplier: 0.625;
18
- display: block;
19
- box-sizing: border-box;
20
- }
21
-
22
- .trigger {
23
- position: fixed;
24
- transform: scale(0);
25
- box-shadow: rgba(0, 0, 0, 0.16) 0px 5px 40px;
26
- bottom: 20px;
27
- right: 20px;
28
- z-index: 5;
29
- display: flex;
30
- align-items: center;
31
- justify-content: center;
32
- border: none;
33
- line-height: 55px;
34
- height: 55px;
35
- width: 55px;
36
- border-radius: 55px;
37
- cursor: pointer;
38
- background-color: var(--trigger-bg, var(--primary-color));
39
- font-family: Lato;
40
- text-decoration: none;
41
- border: 3px dashed transparent;
42
- box-sizing: border-box;
43
- transition: transform 200ms ease-out;
44
- }
45
- .trigger:hover {
46
- transform: scale(1.1) !important;
47
- }
48
- .trigger.rendered {
49
- transform: scale(1);
50
- }
51
- .trigger.active .trigger-icon {
52
- opacity: 0;
53
- transform: rotate(-180deg) scale(0);
54
- }
55
- .trigger.active .trigger-close {
56
- opacity: 1;
57
- transform: rotate(0deg) scale(1);
58
- }
59
-
60
- .trigger-icon {
61
- display: inline-block;
62
- line-height: inherit;
63
- text-align: center;
64
- opacity: 1;
65
- transform: rotate(0deg) scale(1);
66
- transition: opacity 200ms ease-out, transform 200ms ease-out;
67
- color: var(--trigger-text-color, #fff);
68
- }
69
- .trigger-close {
70
- opacity: 0;
71
- transition: transform 200ms ease-out;
72
- transform: rotate(180deg) scale(0);
73
- position: absolute;
74
- top: 0;
75
- bottom: 0;
76
- left: 0;
77
- right: 0;
78
- display: flex;
79
- justify-content: center;
80
- align-items: center;
81
- fill: var(--trigger-text-color, #fff);
82
- }
83
- `,
84
- ];
85
-
86
- @property({ attribute: false })
87
- symbol?: SymbolType;
88
-
89
- @property({ attribute: false })
90
- container?: Container;
91
-
92
- @state()
93
- active = false;
94
-
95
- @state()
96
- loaded = false;
97
-
98
- @state()
99
- icon: any;
100
-
101
- override async connectedCallback() {
102
- super.connectedCallback();
103
-
104
- this.icon = await this._renderSymbol(this.symbol);
105
- this.loaded = true;
106
-
107
- this._applyBranding();
108
- }
109
-
110
- _toggleActive() {
111
- this.active = !this.active;
112
- }
113
-
114
- _applyBranding() {
115
- const settings = this.container?.get('$settings') ?? {};
116
-
117
- const root = settings?.components[settings?.entry];
118
-
119
- if (root) {
120
- mapBranding(root.context, this);
121
- }
122
- }
123
-
124
- async _renderSymbol(symbol?: SymbolType) {
125
- const importIcon = async (iconName: string) => {
126
- const icon = await import('@teliads/icons').then(
127
- (m: Record<string, unknown>) => {
128
- return m[iconName];
129
- }
130
- );
131
- return icon;
132
- };
133
-
134
- if (symbol) {
135
- const { type, content } = symbol;
136
- switch (type) {
137
- case 'Telia': {
138
- const icon: any = await importIcon(content);
139
- if (icon) {
140
- return html`<telia-icon
141
- class="trigger-icon"
142
- svg=${icon.svg}
143
- size="lg"
144
- ></telia-icon>`;
145
- }
146
- return nothing;
147
- }
148
- case 'FontAwesome':
149
- return html`<i class="trigger-fa-icon fa fa-${content}"></i>`;
150
- case 'Uri':
151
- return html`<i
152
- class="trigger-custom-icon"
153
- style="background: url(${content}) no-repeat center center;background-size: contain;"
154
- ></i>`;
155
- default:
156
- return nothing;
157
- }
158
- }
159
- }
160
-
161
- override render() {
162
- return html`<button
163
- class=${classMap({
164
- trigger: true,
165
- active: this.active,
166
- rendered: this.loaded,
167
- })}
168
- @click=${this._toggleActive}
169
- >
170
- ${this.icon}
171
- <span class="trigger-close">
172
- <svg
173
- width="18"
174
- height="9"
175
- viewBox="0 0 18 9"
176
- fill="none"
177
- xmlns="http://www.w3.org/2000/svg"
178
- >
179
- <path
180
- d="M9 9C8.81794 9.00045 8.63759 8.96634 8.46939 8.89965C8.3012 8.83295 8.14851 8.735 8.02015 8.61145L0.194523 1.12367C0.068294 0.99862 -0.00155266 0.831133 2.61958e-05 0.657285C0.00160506 0.483436 0.0744832 0.317136 0.202964 0.194202C0.331445 0.0712675 0.505249 0.00153576 0.686941 2.50649e-05C0.868634 -0.00148563 1.04368 0.0653456 1.17437 0.186125L9 7.6739L16.8256 0.186125C16.9563 0.0653456 17.1314 -0.00148563 17.3131 2.50649e-05C17.4948 0.00153576 17.6686 0.0712675 17.797 0.194202C17.9255 0.317136 17.9984 0.483436 18 0.657285C18.0016 0.831133 17.9317 0.99862 17.8055 1.12367L9.97985 8.61145C9.85149 8.735 9.6988 8.83295 9.53061 8.89965C9.36241 8.96634 9.18206 9.00045 9 9Z"
181
- fill="white"
182
- />
183
- </svg>
184
- </span>
185
- <span class="trigger-loader">
186
- <svg viewBox="25 25 50 50">
187
- <circle
188
- cx="50"
189
- cy="50"
190
- r="20"
191
- fill="none"
192
- stroke="#000"
193
- stroke-width="2"
194
- stroke-miterlimit="10"
195
- />
196
- </svg>
197
- </span>
198
- </button>`;
199
- }
200
- }
@@ -1,172 +0,0 @@
1
- import { readStorage, StorageMedium } from '@telia-ace/widget-services';
2
- import { notifyDataLoaded } from '@telia-ace/widget-utilities';
3
- import { Container, Widget } from '@webprovisions/platform';
4
- import {
5
- createTriggerElement,
6
- setActive,
7
- setLoading,
8
- } from './html-element-handlers';
9
- import { TriggerType } from './prepare-dom';
10
-
11
- const MODALS_STORAGE_KEY = 'modals';
12
-
13
- type SymbolType = {
14
- type: 'Uri' | 'Svg' | 'FontAwesome' | 'Text' | string;
15
- content: string;
16
- };
17
-
18
- export type BadgeOptions = {
19
- symbol?: SymbolType;
20
- label?: string;
21
- ariaLabel?: string;
22
- openTooltip?: string;
23
- closedTooltip?: string;
24
- };
25
-
26
- export type ViewOutletOptions = {
27
- widgetDOMElement: HTMLElement;
28
- triggerDOMElement?: HTMLElement;
29
- triggerOptions?: BadgeOptions | boolean;
30
- triggerType: TriggerType;
31
- cachedOriginals: {
32
- widgetDOMElement?: Node;
33
- triggerDOMElement?: Node;
34
- };
35
- };
36
-
37
- type Modals = {
38
- name: string;
39
- ref?: HTMLElement;
40
- selector?: string;
41
- };
42
-
43
- export class ViewOutlet {
44
- container: Container;
45
- private unsubscribe: (() => void)[] = [];
46
-
47
- constructor(container: Container, public options: ViewOutletOptions) {
48
- this.container = container.createChild(this);
49
- this.container.register('widgetDOMElement', this.options.widgetDOMElement);
50
- this.container.register(
51
- 'triggerDOMElement',
52
- this.options.triggerDOMElement
53
- );
54
-
55
- const widget: Widget = this.container.get('$widget');
56
- this.options.widgetDOMElement.classList.add('ace-widget');
57
- this.options.widgetDOMElement.classList.add(`ace-widget_${widget.name}`);
58
-
59
- const widgetDOMElements = container.get('widgetDOMElements') || [];
60
- container.register('widgetDOMElements', [
61
- ...widgetDOMElements,
62
- this.options.widgetDOMElement,
63
- ]);
64
- }
65
-
66
- /**
67
- * Renders the view outlet to the DOM.
68
- */
69
- render() {
70
- const { widgetDOMElement, triggerDOMElement } = this.options;
71
-
72
- const widget: Widget = this.container.get('$widget');
73
-
74
- if (widgetDOMElement.getAttribute('data-rendered') === 'true') {
75
- return Promise.resolve();
76
- }
77
-
78
- if (triggerDOMElement && this.options.triggerType === TriggerType.Badge) {
79
- setLoading(triggerDOMElement);
80
- }
81
-
82
- return import('./render')
83
- .then((module) => module.default(this.container, widgetDOMElement))
84
- .then(() => {
85
- widgetDOMElement.setAttribute('data-rendered', 'true');
86
-
87
- if (
88
- triggerDOMElement &&
89
- this.options.triggerType === TriggerType.Badge
90
- ) {
91
- const tooltip = (this.options.triggerOptions as BadgeOptions)
92
- .openTooltip;
93
- setActive(triggerDOMElement, tooltip);
94
- }
95
- notifyDataLoaded(this.container, widgetDOMElement);
96
-
97
- const widgets = this.container.get('$environment').widgets.all();
98
-
99
- readStorage<Modals[]>(
100
- this.container,
101
- MODALS_STORAGE_KEY,
102
- StorageMedium.Session
103
- ).then((modals: any) => {
104
- if (modals) {
105
- modals.forEach((modal: any) => {
106
- if (
107
- widgets.find(
108
- (w: Widget) =>
109
- w.name === modal.name && w.state === 'activated'
110
- )
111
- ) {
112
- widget.events.dispatch('widget:modal-opened', modal);
113
- }
114
- });
115
- }
116
- });
117
- });
118
- }
119
-
120
- renderBadge(options: BadgeOptions) {
121
- const { triggerDOMElement } = this.options;
122
-
123
- if (!triggerDOMElement) {
124
- return;
125
- }
126
-
127
- if (!triggerDOMElement.getAttribute('role')) {
128
- triggerDOMElement.setAttribute('role', 'button');
129
- }
130
-
131
- const { name }: Widget = this.container.get('$widget');
132
-
133
- const { label, symbol, ariaLabel, closedTooltip, openTooltip } = options;
134
-
135
- const triggerOptions = { closedTooltip, openTooltip };
136
- this.options.triggerOptions = triggerOptions;
137
-
138
- const removeTriggerListeners = createTriggerElement(triggerDOMElement, {
139
- label,
140
- symbol,
141
- ariaLabel,
142
- widgetName: name,
143
- tooltip: closedTooltip,
144
- });
145
- this.unsubscribe.push(removeTriggerListeners);
146
- }
147
-
148
- async dispose() {
149
- const { triggerDOMElement, widgetDOMElement } = this.options;
150
- if (this.options.cachedOriginals.widgetDOMElement) {
151
- if (widgetDOMElement) {
152
- widgetDOMElement.parentNode?.replaceChild(
153
- this.options.cachedOriginals.widgetDOMElement,
154
- widgetDOMElement
155
- );
156
- }
157
- }
158
- if (this.options.cachedOriginals.triggerDOMElement) {
159
- if (triggerDOMElement) {
160
- triggerDOMElement.parentNode?.replaceChild(
161
- this.options.cachedOriginals.triggerDOMElement,
162
- triggerDOMElement
163
- );
164
- }
165
- }
166
- this.unsubscribe.forEach((unsubscribe) => {
167
- unsubscribe();
168
- });
169
- widgetDOMElement.parentNode?.removeChild(widgetDOMElement);
170
- triggerDOMElement?.parentNode?.removeChild(triggerDOMElement);
171
- }
172
- }