@unleash/toolbar 1.0.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/LICENSE +202 -0
- package/README.md +599 -0
- package/dist/__tests__/setup.d.ts +5 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +2 -0
- package/dist/index.es.js.map +1 -0
- package/dist/next/client.d.ts +11 -0
- package/dist/next/client.d.ts.map +1 -0
- package/dist/next/index.d.ts +41 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/server.d.ts +68 -0
- package/dist/next/server.d.ts.map +1 -0
- package/dist/next-server.es.js +2 -0
- package/dist/next-server.es.js.map +1 -0
- package/dist/next.es.js +4 -0
- package/dist/next.es.js.map +1 -0
- package/dist/react/__tests__/index.test.d.ts +2 -0
- package/dist/react/__tests__/index.test.d.ts.map +1 -0
- package/dist/react/hooks.d.ts +8 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/index.d.ts +94 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react.es.js +2 -0
- package/dist/react.es.js.map +1 -0
- package/dist/state.d.ts +90 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/toolbar.css +1 -0
- package/dist/types.d.ts +162 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/ui-LKEosjLO.js +212 -0
- package/dist/ui-LKEosjLO.js.map +1 -0
- package/dist/ui.d.ts +41 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/wrapper.d.ts +16 -0
- package/dist/wrapper.d.ts.map +1 -0
- package/package.json +107 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { UnleashClient } from 'unleash-proxy-client';
|
|
2
|
+
/**
|
|
3
|
+
* Unleash context used for feature flag evaluation
|
|
4
|
+
*/
|
|
5
|
+
export interface UnleashContext {
|
|
6
|
+
userId?: string;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
remoteAddress?: string;
|
|
9
|
+
environment?: string;
|
|
10
|
+
appName?: string;
|
|
11
|
+
properties?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Unleash variant structure
|
|
15
|
+
*/
|
|
16
|
+
export interface UnleashVariant {
|
|
17
|
+
name: string;
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
payload?: {
|
|
20
|
+
type: string;
|
|
21
|
+
value: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Flag override types
|
|
26
|
+
*/
|
|
27
|
+
export type FlagOverride = {
|
|
28
|
+
type: 'flag';
|
|
29
|
+
value: boolean;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'variant';
|
|
32
|
+
variantKey: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Metadata for a single flag evaluation
|
|
36
|
+
*/
|
|
37
|
+
export interface FlagMetadata {
|
|
38
|
+
flagType: 'flag' | 'variant';
|
|
39
|
+
lastDefaultValue: FlagValue;
|
|
40
|
+
lastEffectiveValue: FlagValue;
|
|
41
|
+
lastContext: UnleashContext | null;
|
|
42
|
+
override: FlagOverride | null;
|
|
43
|
+
}
|
|
44
|
+
export type FlagValue = boolean | UnleashVariant | null;
|
|
45
|
+
/**
|
|
46
|
+
* Complete toolbar state
|
|
47
|
+
*/
|
|
48
|
+
export interface ToolbarState {
|
|
49
|
+
flags: {
|
|
50
|
+
[featureName: string]: FlagMetadata;
|
|
51
|
+
};
|
|
52
|
+
contextOverrides: Partial<UnleashContext>;
|
|
53
|
+
isVisible?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Storage mode options
|
|
57
|
+
*
|
|
58
|
+
* - **local**: Persists across browser tabs and page reloads. Best for development
|
|
59
|
+
* as overrides remain active across the entire browser session and even after
|
|
60
|
+
* closing/reopening the browser. (DEFAULT)
|
|
61
|
+
*
|
|
62
|
+
* - **session**: Persists only within the current browser tab. Overrides survive
|
|
63
|
+
* page reloads but are lost when the tab is closed. Useful when testing different
|
|
64
|
+
* configurations in different tabs without interference.
|
|
65
|
+
*
|
|
66
|
+
* - **memory**: No persistence - overrides lost on page reload. Useful for
|
|
67
|
+
* quick temporary testing or when you need complete isolation between page loads.
|
|
68
|
+
* Also appropriate for strict security/privacy requirements where no data should
|
|
69
|
+
* be written to disk.
|
|
70
|
+
*/
|
|
71
|
+
export type StorageMode = 'memory' | 'session' | 'local';
|
|
72
|
+
/**
|
|
73
|
+
* Theme customization options
|
|
74
|
+
*/
|
|
75
|
+
export interface ToolbarThemeOptions {
|
|
76
|
+
primaryColor?: string;
|
|
77
|
+
backgroundColor?: string;
|
|
78
|
+
textColor?: string;
|
|
79
|
+
borderColor?: string;
|
|
80
|
+
fontFamily?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Built-in theme presets
|
|
84
|
+
*/
|
|
85
|
+
export type ThemePreset = 'light' | 'dark';
|
|
86
|
+
/**
|
|
87
|
+
* Initialization options for the toolbar
|
|
88
|
+
*/
|
|
89
|
+
export interface InitToolbarOptions {
|
|
90
|
+
/** Storage persistence mode (default: 'local') */
|
|
91
|
+
storageMode?: StorageMode;
|
|
92
|
+
/** Storage key for persisted state (default: 'unleash-toolbar-state') */
|
|
93
|
+
storageKey?: string;
|
|
94
|
+
/** Built-in theme preset (default: 'light') */
|
|
95
|
+
themePreset?: ThemePreset;
|
|
96
|
+
/** Custom theme colors (overrides themePreset if provided) */
|
|
97
|
+
theme?: ToolbarThemeOptions;
|
|
98
|
+
/** Container element (default: document.body) */
|
|
99
|
+
container?: HTMLElement | null;
|
|
100
|
+
/** Toolbar position (default: 'bottom-right') */
|
|
101
|
+
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'left' | 'right';
|
|
102
|
+
/** Whether toolbar is visible on initialization (default: true, but respects persisted state if available) */
|
|
103
|
+
initiallyVisible?: boolean;
|
|
104
|
+
/** Sort flags alphabetically instead of by evaluation order (default: false) */
|
|
105
|
+
sortAlphabetically?: boolean;
|
|
106
|
+
/** Enable cookie synchronization for server-side rendering (Next.js) (default: false) */
|
|
107
|
+
enableCookieSync?: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Toolbar event types (internal use only - not part of public API)
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
export type ToolbarEvent = {
|
|
114
|
+
type: 'flag_override_changed';
|
|
115
|
+
name: string;
|
|
116
|
+
override: FlagOverride | null;
|
|
117
|
+
timestamp: number;
|
|
118
|
+
} | {
|
|
119
|
+
type: 'context_override_changed';
|
|
120
|
+
contextOverrides: Partial<UnleashContext>;
|
|
121
|
+
} | {
|
|
122
|
+
type: 'sdk_updated';
|
|
123
|
+
timestamp: number;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Event listener function (internal use only - not part of public API)
|
|
127
|
+
* @internal
|
|
128
|
+
*/
|
|
129
|
+
export type ToolbarEventListener = (event: ToolbarEvent) => void;
|
|
130
|
+
/**
|
|
131
|
+
* Toolbar UI interface (implemented by UI modules)
|
|
132
|
+
*/
|
|
133
|
+
export interface IToolbarUI {
|
|
134
|
+
show(): void;
|
|
135
|
+
hide(): void;
|
|
136
|
+
destroy(): void;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Main toolbar instance API
|
|
140
|
+
*/
|
|
141
|
+
export interface UnleashToolbarInstance {
|
|
142
|
+
readonly client: WrappedUnleashClient;
|
|
143
|
+
show(): void;
|
|
144
|
+
hide(): void;
|
|
145
|
+
destroy(): void;
|
|
146
|
+
getState(): ToolbarState;
|
|
147
|
+
getFlagNames(): string[];
|
|
148
|
+
setFlagOverride(name: string, override: FlagOverride | null): void;
|
|
149
|
+
setContextOverride(context: Partial<UnleashContext>): void;
|
|
150
|
+
removeContextOverride(fieldName: keyof UnleashContext): void;
|
|
151
|
+
resetOverrides(): void;
|
|
152
|
+
resetContextOverrides(): void;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Wrapped Unleash client with override support.
|
|
156
|
+
* Extends the SDK client type and adds the __original property.
|
|
157
|
+
*/
|
|
158
|
+
export interface WrappedUnleashClient extends UnleashClient {
|
|
159
|
+
__original: UnleashClient;
|
|
160
|
+
__toolbar?: UnleashToolbarInstance;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
const t=globalThis,e=t=>t,s=t.trustedTypes,i=s?s.createPolicy("lit-html",{createHTML:t=>t}):void 0,r="$lit$",n=`lit$${Math.random().toFixed(9).slice(2)}$`,a="?"+n,o=`<${a}>`,l=document,d=()=>l.createComment(""),h=t=>null===t||"object"!=typeof t&&"function"!=typeof t,u=Array.isArray,c="[ \t\n\f\r]",v=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,p=/-->/g,g=/>/g,$=RegExp(`>|${c}(?:([^\\s"'>=/]+)(${c}*=${c}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),m=/'/g,f=/"/g,b=/^(?:script|style|textarea|title)$/i,A=(t,...e)=>({_$litType$:1,strings:t,values:e}),y=Symbol.for("lit-noChange"),_=Symbol.for("lit-nothing"),x=new WeakMap,C=l.createTreeWalker(l,129);function T(t,e){if(!u(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==i?i.createHTML(e):e}const O=(t,e)=>{const s=t.length-1,i=[];let a,l=2===e?"<svg>":3===e?"<math>":"",d=v;for(let h=0;h<s;h++){const e=t[h];let s,u,c=-1,A=0;for(;A<e.length&&(d.lastIndex=A,u=d.exec(e),null!==u);)A=d.lastIndex,d===v?"!--"===u[1]?d=p:void 0!==u[1]?d=g:void 0!==u[2]?(b.test(u[2])&&(a=RegExp("</"+u[2],"g")),d=$):void 0!==u[3]&&(d=$):d===$?">"===u[0]?(d=a??v,c=-1):void 0===u[1]?c=-2:(c=d.lastIndex-u[2].length,s=u[1],d=void 0===u[3]?$:'"'===u[3]?f:m):d===f||d===m?d=$:d===p||d===g?d=v:(d=$,a=void 0);const y=d===$&&t[h+1].startsWith("/>")?" ":"";l+=d===v?e+o:c>=0?(i.push(s),e.slice(0,c)+r+e.slice(c)+n+y):e+n+(-2===c?h:y)}return[T(t,l+(t[s]||"<?>")+(2===e?"</svg>":3===e?"</math>":"")),i]};class F{constructor({strings:t,_$litType$:e},i){let o;this.parts=[];let l=0,h=0;const u=t.length-1,c=this.parts,[v,p]=O(t,e);if(this.el=F.createElement(v,i),C.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(o=C.nextNode())&&c.length<u;){if(1===o.nodeType){if(o.hasAttributes())for(const t of o.getAttributeNames())if(t.endsWith(r)){const e=p[h++],s=o.getAttribute(t).split(n),i=/([.?@])?(.*)/.exec(e);c.push({type:1,index:l,name:i[2],strings:s,ctor:"."===i[1]?V:"?"===i[1]?k:"@"===i[1]?E:w}),o.removeAttribute(t)}else t.startsWith(n)&&(c.push({type:6,index:l}),o.removeAttribute(t));if(b.test(o.tagName)){const t=o.textContent.split(n),e=t.length-1;if(e>0){o.textContent=s?s.emptyScript:"";for(let s=0;s<e;s++)o.append(t[s],d()),C.nextNode(),c.push({type:2,index:++l});o.append(t[e],d())}}}else if(8===o.nodeType)if(o.data===a)c.push({type:2,index:l});else{let t=-1;for(;-1!==(t=o.data.indexOf(n,t+1));)c.push({type:7,index:l}),t+=n.length-1}l++}}static createElement(t,e){const s=l.createElement("template");return s.innerHTML=t,s}}function M(t,e,s=t,i){if(e===y)return e;let r=void 0!==i?s._$Co?.[i]:s._$Cl;const n=h(e)?void 0:e._$litDirective$;return r?.constructor!==n&&(r?._$AO?.(!1),void 0===n?r=void 0:(r=new n(t),r._$AT(t,s,i)),void 0!==i?(s._$Co??=[])[i]=r:s._$Cl=r),void 0!==r&&(e=M(t,r._$AS(t,e.values),r,i)),e}class N{constructor(t,e){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:e},parts:s}=this._$AD,i=(t?.creationScope??l).importNode(e,!0);C.currentNode=i;let r=C.nextNode(),n=0,a=0,o=s[0];for(;void 0!==o;){if(n===o.index){let e;2===o.type?e=new H(r,r.nextSibling,this,t):1===o.type?e=new o.ctor(r,o.name,o.strings,this,t):6===o.type&&(e=new P(r,this,t)),this._$AV.push(e),o=s[++a]}n!==o?.index&&(r=C.nextNode(),n++)}return C.currentNode=l,i}p(t){let e=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,e),e+=s.strings.length-2):s._$AI(t[e])),e++}}class H{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,e,s,i){this.type=2,this._$AH=_,this._$AN=void 0,this._$AA=t,this._$AB=e,this._$AM=s,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const e=this._$AM;return void 0!==e&&11===t?.nodeType&&(t=e.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,e=this){t=M(this,t,e),h(t)?t===_||null==t||""===t?(this._$AH!==_&&this._$AR(),this._$AH=_):t!==this._$AH&&t!==y&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):(t=>u(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==_&&h(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:s}=t,i="number"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=F.createElement(T(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(e);else{const t=new N(i,this),s=t.u(this.options);t.p(e),this.T(s),this._$AH=t}}_$AC(t){let e=x.get(t.strings);return void 0===e&&x.set(t.strings,e=new F(t)),e}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let s,i=0;for(const r of t)i===e.length?e.push(s=new H(this.O(d()),this.O(d()),this,this.options)):s=e[i],s._$AI(r),i++;i<e.length&&(this._$AR(s&&s._$AB.nextSibling,i),e.length=i)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=e(t).nextSibling;e(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class w{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,e,s,i,r){this.type=1,this._$AH=_,this._$AN=void 0,this.element=t,this.name=e,this._$AM=i,this.options=r,s.length>2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=_}_$AI(t,e=this,s,i){const r=this.strings;let n=!1;if(void 0===r)t=M(this,t,e,0),n=!h(t)||t!==this._$AH&&t!==y,n&&(this._$AH=t);else{const i=t;let a,o;for(t=r[0],a=0;a<r.length-1;a++)o=M(this,i[s+a],e,a),o===y&&(o=this._$AH[a]),n||=!h(o)||o!==this._$AH[a],o===_?t=_:t!==_&&(t+=(o??"")+r[a+1]),this._$AH[a]=o}n&&!i&&this.j(t)}j(t){t===_?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}class V extends w{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===_?void 0:t}}class k extends w{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==_)}}class E extends w{constructor(t,e,s,i,r){super(t,e,s,i,r),this.type=5}_$AI(t,e=this){if((t=M(this,t,e,0)??_)===y)return;const s=this._$AH,i=t===_&&s!==_||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,r=t!==_&&(s===_||i);i&&this.element.removeEventListener(this.name,this,s),r&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){"function"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class P{constructor(t,e,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=e,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const I=t.litHtmlPolyfillSupport;I?.(F,H),(t.litHtmlVersions??=[]).push("3.3.2");const S="https://cdn.getunleash.io/docs-assets/unleash_logo_icon.svg";class U{container;rootElement;stateManager;currentTab="flags";position;themePreset;customTheme;originalBaseContext;searchQuery="";constructor(t,e,s={}){this.stateManager=t,this.position=s.position||"bottom-right",this.themePreset=s.themePreset||"light",this.customTheme=s.theme,this.originalBaseContext=e.__original.getContext();const i=this.stateManager.getVisibility();void 0===i&&this.stateManager.setVisibility(void 0!==i?i:s.initiallyVisible??!1),this.rootElement=document.createElement("div"),this.rootElement.className=`unleash-toolbar-container position-${this.position}`,"dark"===this.themePreset&&this.rootElement.classList.add("ut-theme-dark"),this.applyCustomTheme(this.rootElement),this.container=s.container||document.body,this.container.appendChild(this.rootElement),this.stateManager.subscribe(()=>{this.render()}),this.render()}applyCustomTheme(t){if(!this.customTheme)return;const e=t.style;this.customTheme.primaryColor&&e.setProperty("--ut-primary",this.customTheme.primaryColor),this.customTheme.backgroundColor&&e.setProperty("--ut-bg",this.customTheme.backgroundColor),this.customTheme.textColor&&e.setProperty("--ut-text",this.customTheme.textColor),this.customTheme.borderColor&&e.setProperty("--ut-border",this.customTheme.borderColor),this.customTheme.fontFamily&&e.setProperty("--ut-font",this.customTheme.fontFamily)}show(){this.stateManager.setVisibility(!0),this.render()}hide(){this.stateManager.setVisibility(!1),this.render()}destroy(){this.rootElement.remove()}render(){const t=this.stateManager.getState(),e=this.stateManager.getFlagNames(),s=this.stateManager.getVisibility();((t,e)=>{let s=e._$litPart$;if(void 0===s){const t=null;e._$litPart$=s=new H(e.insertBefore(d(),t),t,void 0,{})}s._$AI(t)})(A`
|
|
2
|
+
<button
|
|
3
|
+
class="ut-toggle"
|
|
4
|
+
style=${s?"display: none;":"display: flex;"}
|
|
5
|
+
@click=${()=>this.show()}
|
|
6
|
+
title="Open Unleash Toolbar"
|
|
7
|
+
>
|
|
8
|
+
<img src="${S}" alt="Unleash" />
|
|
9
|
+
</button>
|
|
10
|
+
|
|
11
|
+
<div
|
|
12
|
+
class="unleash-toolbar"
|
|
13
|
+
style=${s?"display: flex;":"display: none;"}
|
|
14
|
+
>
|
|
15
|
+
${this.renderHeader(t)}
|
|
16
|
+
${this.renderTabsNavigation()}
|
|
17
|
+
<div class="ut-content">
|
|
18
|
+
<div style=${"flags"===this.currentTab?"":"display: none;"}>
|
|
19
|
+
${this.renderFlagsTab(e)}
|
|
20
|
+
</div>
|
|
21
|
+
<div style=${"context"===this.currentTab?"":"display: none;"}>
|
|
22
|
+
${this.renderContextTab(t.contextOverrides)}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
`,this.rootElement)}renderHeader(t){const e=Object.keys(t.flags).length,s=Object.values(t.flags).filter(t=>null!==t.override).length;return A`
|
|
27
|
+
<div class="ut-header">
|
|
28
|
+
<div class="ut-title">
|
|
29
|
+
<img src="${S}" alt="Unleash" />
|
|
30
|
+
<div>
|
|
31
|
+
<div class="ut-title-main">Unleash Toolbar</div>
|
|
32
|
+
<div class="ut-title-sub">${e} flags • ${s} overrides</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
<button class="ut-btn-close" @click=${()=>this.hide()} title="Close toolbar">×</button>
|
|
36
|
+
</div>
|
|
37
|
+
`}renderTabsNavigation(){return A`
|
|
38
|
+
<div class="ut-tabs">
|
|
39
|
+
<button
|
|
40
|
+
class=${"ut-tab "+("flags"===this.currentTab?"active":"")}
|
|
41
|
+
@click=${()=>this.switchTab("flags")}
|
|
42
|
+
>
|
|
43
|
+
Feature Flags
|
|
44
|
+
</button>
|
|
45
|
+
<button
|
|
46
|
+
class=${"ut-tab "+("context"===this.currentTab?"active":"")}
|
|
47
|
+
@click=${()=>this.switchTab("context")}
|
|
48
|
+
>
|
|
49
|
+
Context
|
|
50
|
+
</button>
|
|
51
|
+
</div>
|
|
52
|
+
`}switchTab(t){this.currentTab=t,this.render()}renderFlagsTab(t){if(0===t.length)return A`
|
|
53
|
+
<div class="ut-empty">
|
|
54
|
+
No flags evaluated yet. Use feature flags in your app to see them here.
|
|
55
|
+
</div>
|
|
56
|
+
`;const e=this.searchQuery?t.filter(t=>t.toLowerCase().includes(this.searchQuery.toLowerCase())):t;return A`
|
|
57
|
+
<div class="ut-tab-header">
|
|
58
|
+
<div class="ut-search-container">
|
|
59
|
+
<input
|
|
60
|
+
type="text"
|
|
61
|
+
class="ut-search-input"
|
|
62
|
+
placeholder="Search flags..."
|
|
63
|
+
.value=${this.searchQuery}
|
|
64
|
+
@input=${t=>this.updateSearch(t.target.value)}
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
<button class="ut-btn" @click=${()=>this.stateManager.resetOverrides()}>
|
|
68
|
+
Reset All Overrides
|
|
69
|
+
</button>
|
|
70
|
+
</div>
|
|
71
|
+
<div class="ut-flag-list">
|
|
72
|
+
${e.length>0?e.map(t=>this.renderFlagItem(t)):A`<div class="ut-empty">No flags match "${this.searchQuery}"</div>`}
|
|
73
|
+
</div>
|
|
74
|
+
`}updateSearch(t){this.searchQuery=t,this.render()}renderFlagItem(t){const e=this.stateManager.getFlagMetadata(t);if(!e)return null;const s="variant"===e.flagType,i=null!==e.override;let r="default";return i&&"flag"===e.override?.type&&(r=e.override.value?"on":"off"),A`
|
|
75
|
+
<div class="ut-flag-item">
|
|
76
|
+
<div class="ut-flag-main">
|
|
77
|
+
<div class="ut-flag-header">
|
|
78
|
+
<div class="ut-flag-title-row">
|
|
79
|
+
<div class="ut-flag-name">${t}</div>
|
|
80
|
+
</div>
|
|
81
|
+
<div class="ut-flag-meta">
|
|
82
|
+
<div class="ut-flag-default-value" title="Default value from Unleash">
|
|
83
|
+
${this.renderValueBadge(e.lastDefaultValue)}
|
|
84
|
+
</div>
|
|
85
|
+
${i?A`
|
|
86
|
+
<span class="ut-override-indicator" title="Override value (overriding the default)">
|
|
87
|
+
→ ${this.renderValueBadge(e.lastEffectiveValue)}
|
|
88
|
+
</span>
|
|
89
|
+
`:null}
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<div class="ut-flag-control">
|
|
95
|
+
${s?A`
|
|
96
|
+
<div class="ut-variant-control">
|
|
97
|
+
${i&&"variant"===e.override?.type?A`
|
|
98
|
+
<input
|
|
99
|
+
type="text"
|
|
100
|
+
class="ut-input-small"
|
|
101
|
+
placeholder="Variant name"
|
|
102
|
+
.value=${e.override.variantKey}
|
|
103
|
+
@input=${e=>this.setVariant(t,e.target.value)}
|
|
104
|
+
title="Enter variant name to override with"
|
|
105
|
+
/>
|
|
106
|
+
<button
|
|
107
|
+
class="ut-btn-small active"
|
|
108
|
+
@click=${()=>this.toggleVariantOverride(t)}
|
|
109
|
+
title="Clear variant override"
|
|
110
|
+
>Clear Override</button>
|
|
111
|
+
`:A`
|
|
112
|
+
<button
|
|
113
|
+
class="ut-btn-small"
|
|
114
|
+
@click=${()=>this.toggleVariantOverride(t)}
|
|
115
|
+
title="Set a variant override"
|
|
116
|
+
>Override Variant</button>
|
|
117
|
+
`}
|
|
118
|
+
</div>
|
|
119
|
+
`:A`
|
|
120
|
+
<div class="ut-toggle-group">
|
|
121
|
+
<button
|
|
122
|
+
class=${"ut-toggle-btn "+("off"===r?"active":"")}
|
|
123
|
+
@click=${()=>this.setFlagOverride(t,"off")}
|
|
124
|
+
title="Force this flag to OFF"
|
|
125
|
+
>OFF</button>
|
|
126
|
+
<button
|
|
127
|
+
class=${"ut-toggle-btn "+("default"===r?"active":"")}
|
|
128
|
+
@click=${()=>this.setFlagOverride(t,"default")}
|
|
129
|
+
title="Use default value from Unleash (no override)"
|
|
130
|
+
>—</button>
|
|
131
|
+
<button
|
|
132
|
+
class=${"ut-toggle-btn "+("on"===r?"active":"")}
|
|
133
|
+
@click=${()=>this.setFlagOverride(t,"on")}
|
|
134
|
+
title="Force this flag to ON"
|
|
135
|
+
>ON</button>
|
|
136
|
+
</div>
|
|
137
|
+
`}
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
`}renderValueBadge(t){return"boolean"==typeof t?A`<span class=${"ut-badge ut-badge-"+(t?"success":"danger")}>${t?"ON":"OFF"}</span>`:t&&"object"==typeof t&&"name"in t?A`<span class="ut-badge ut-badge-default">${t.name}</span>`:A`<span class="ut-badge ut-badge-default">null</span>`}setFlagOverride(t,e){"default"===e?this.stateManager.setFlagOverride(t,null):"on"===e?this.stateManager.setFlagOverride(t,{type:"flag",value:!0}):"off"===e&&this.stateManager.setFlagOverride(t,{type:"flag",value:!1})}toggleVariantOverride(t){const e=this.stateManager.getFlagMetadata(t);this.stateManager.setFlagOverride(t,e?.override?null:{type:"variant",variantKey:"default"})}setVariant(t,e){this.stateManager.setFlagOverride(t,{type:"variant",variantKey:e})}isFieldOverridden(t,e,s){if("properties"===t)return!1;const i=s[t];return void 0!==i&&i!==e[t]}renderContextField(t,e,s,i,r,n=!1){return A`
|
|
141
|
+
<div class="ut-form-group">
|
|
142
|
+
<label class="ut-label">
|
|
143
|
+
${t}${n?A` <span class="ut-readonly-label">(read-only)</span>`:null}
|
|
144
|
+
</label>
|
|
145
|
+
<div class="ut-input-with-reset">
|
|
146
|
+
<input
|
|
147
|
+
type="text"
|
|
148
|
+
class=${n?"ut-input ut-input-readonly":"ut-input"}
|
|
149
|
+
placeholder=${s}
|
|
150
|
+
.value=${i}
|
|
151
|
+
@input=${n?null:t=>this.updateContextField(e,t.target.value)}
|
|
152
|
+
?readonly=${n}
|
|
153
|
+
title=${n?"This context field is static and cannot be modified.":""}
|
|
154
|
+
/>
|
|
155
|
+
${r&&!n?A`
|
|
156
|
+
<button
|
|
157
|
+
class="ut-reset-field"
|
|
158
|
+
@click=${()=>this.resetContextField(e)}
|
|
159
|
+
title="Reset to original value"
|
|
160
|
+
>↻</button>
|
|
161
|
+
`:null}
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
`}updateContextField(t,e){this.stateManager.setContextOverride({[t]:e||void 0})}resetContextField(t){this.stateManager.removeContextOverride(t)}renderContextTab(t){const e=this.originalBaseContext,s={...e,...t},i=["userId","sessionId","remoteAddress","environment","appName","properties"],r=e.properties||{},n=t.properties||{},a={...r,...n},o=Object.entries(a).filter(([t,e])=>!i.includes(t)&&""!==e),l=Object.fromEntries(o);return A`
|
|
165
|
+
<div class="ut-tab-header">
|
|
166
|
+
<button class="ut-btn" @click=${()=>this.stateManager.resetContextOverrides()}>
|
|
167
|
+
Reset All Context
|
|
168
|
+
</button>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="ut-context-form">
|
|
171
|
+
${this.renderContextField("User ID","userId","user-123",s.userId||"",this.isFieldOverridden("userId",e,t))}
|
|
172
|
+
${this.renderContextField("Session ID","sessionId","session-456",s.sessionId||"",this.isFieldOverridden("sessionId",e,t))}
|
|
173
|
+
${this.renderContextField("Remote Address","remoteAddress","192.168.1.1",s.remoteAddress||"",this.isFieldOverridden("remoteAddress",e,t))}
|
|
174
|
+
${this.renderContextField("Environment","environment","development",s.environment||"",!1,!0)}
|
|
175
|
+
${this.renderContextField("App Name","appName","my-app",s.appName||"",!1,!0)}
|
|
176
|
+
|
|
177
|
+
<div class="ut-form-group">
|
|
178
|
+
<div class="ut-label">Custom Properties</div>
|
|
179
|
+
<div class="ut-properties">
|
|
180
|
+
${this.renderProperties(l||{},r)}
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
`}renderProperties(t,e={}){const s=Object.entries(t);return 0===s.length?A`
|
|
185
|
+
<div class="ut-empty-properties">
|
|
186
|
+
No custom properties defined in base context
|
|
187
|
+
</div>
|
|
188
|
+
`:A`
|
|
189
|
+
${s.map(([t,s])=>{const i=e[t],r=void 0!==i&&i!==s;return A`
|
|
190
|
+
<div class="ut-property-row">
|
|
191
|
+
<div class="ut-property-key" title="Property key (read-only)">${t}</div>
|
|
192
|
+
<div class="ut-input-with-reset">
|
|
193
|
+
<input
|
|
194
|
+
type="text"
|
|
195
|
+
class="ut-input"
|
|
196
|
+
placeholder="Value"
|
|
197
|
+
.value=${s}
|
|
198
|
+
@input=${e=>this.updatePropertyValue(t,e.target.value)}
|
|
199
|
+
title=${r?`Original: ${i}`:""}
|
|
200
|
+
/>
|
|
201
|
+
${r?A`
|
|
202
|
+
<button
|
|
203
|
+
class="ut-reset-field"
|
|
204
|
+
@click=${()=>this.resetProperty(t)}
|
|
205
|
+
title="Reset to original value"
|
|
206
|
+
>↻</button>
|
|
207
|
+
`:null}
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
`})}
|
|
211
|
+
`}updatePropertyValue(t,e){const s={...this.stateManager.getState().contextOverrides.properties||{},[t]:e};this.stateManager.setContextOverride({properties:s})}resetProperty(t){const e=this.originalBaseContext.properties||{},s={...this.stateManager.getState().contextOverrides.properties||{}};void 0!==e[t]?s[t]=e[t]:delete s[t],this.stateManager.setContextOverride({properties:s})}}export{U as ToolbarUI};
|
|
212
|
+
//# sourceMappingURL=ui-LKEosjLO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-LKEosjLO.js","sources":["../node_modules/lit-html/lit-html.js","../src/ui.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import { html, render } from 'lit-html';\nimport type { ToolbarStateManager } from './state';\nimport type {\n FlagValue,\n InitToolbarOptions,\n IToolbarUI,\n ToolbarState,\n UnleashContext,\n WrappedUnleashClient,\n} from './types';\n\n// Unleash logo from CDN\nconst UNLEASH_LOGO = 'https://cdn.getunleash.io/docs-assets/unleash_logo_icon.svg';\n\n/**\n * Create the toolbar UI component using Lit\n */\nexport class ToolbarUI implements IToolbarUI {\n private container: HTMLElement;\n private rootElement: HTMLElement;\n private stateManager: ToolbarStateManager;\n private currentTab: 'flags' | 'context' = 'flags';\n private position: string;\n private themePreset: 'light' | 'dark';\n private customTheme?: InitToolbarOptions['theme'];\n private originalBaseContext: Partial<UnleashContext>;\n private searchQuery: string = '';\n\n constructor(\n stateManager: ToolbarStateManager,\n wrappedClient: WrappedUnleashClient,\n options: InitToolbarOptions = {},\n ) {\n this.stateManager = stateManager;\n this.position = options.position || 'bottom-right';\n this.themePreset = options.themePreset || 'light';\n this.customTheme = options.theme;\n\n // Capture original base context before any overrides are applied\n this.originalBaseContext = wrappedClient.__original.getContext();\n\n // Initialize visibility from persisted state, or use initiallyVisible option\n const persistedVisibility = this.stateManager.getVisibility();\n const isVisible =\n persistedVisibility !== undefined ? persistedVisibility : (options.initiallyVisible ?? false);\n\n // Persist the initial visibility if not already set\n if (persistedVisibility === undefined) {\n this.stateManager.setVisibility(isVisible);\n }\n\n // Create single root container\n this.rootElement = document.createElement('div');\n this.rootElement.className = `unleash-toolbar-container position-${this.position}`;\n if (this.themePreset === 'dark') {\n this.rootElement.classList.add('ut-theme-dark');\n }\n this.applyCustomTheme(this.rootElement);\n\n // Attach to container or body\n this.container = options.container || document.body;\n this.container.appendChild(this.rootElement);\n\n // Subscribe to state changes\n this.stateManager.subscribe(() => {\n this.render();\n });\n\n // Initial render\n this.render();\n }\n\n private applyCustomTheme(element: HTMLElement): void {\n if (!this.customTheme) return;\n\n const style = element.style;\n if (this.customTheme.primaryColor)\n style.setProperty('--ut-primary', this.customTheme.primaryColor);\n if (this.customTheme.backgroundColor)\n style.setProperty('--ut-bg', this.customTheme.backgroundColor);\n if (this.customTheme.textColor) style.setProperty('--ut-text', this.customTheme.textColor);\n if (this.customTheme.borderColor)\n style.setProperty('--ut-border', this.customTheme.borderColor);\n if (this.customTheme.fontFamily) style.setProperty('--ut-font', this.customTheme.fontFamily);\n }\n\n show(): void {\n this.stateManager.setVisibility(true);\n this.render();\n }\n\n hide(): void {\n this.stateManager.setVisibility(false);\n this.render();\n }\n\n destroy(): void {\n this.rootElement.remove();\n }\n\n private render(): void {\n const state = this.stateManager.getState();\n const flagNames = this.stateManager.getFlagNames();\n const isVisible = this.stateManager.getVisibility();\n\n // Single unified template for everything\n const template = html`\n <button \n class=\"ut-toggle\" \n style=${isVisible ? 'display: none;' : 'display: flex;'}\n @click=${() => this.show()}\n title=\"Open Unleash Toolbar\"\n >\n <img src=\"${UNLEASH_LOGO}\" alt=\"Unleash\" />\n </button>\n\n <div \n class=\"unleash-toolbar\" \n style=${isVisible ? 'display: flex;' : 'display: none;'}\n >\n ${this.renderHeader(state)}\n ${this.renderTabsNavigation()}\n <div class=\"ut-content\">\n <div style=${this.currentTab === 'flags' ? '' : 'display: none;'}>\n ${this.renderFlagsTab(flagNames)}\n </div>\n <div style=${this.currentTab === 'context' ? '' : 'display: none;'}>\n ${this.renderContextTab(state.contextOverrides)}\n </div>\n </div>\n </div>\n `;\n\n render(template, this.rootElement);\n }\n\n private renderHeader(state: ToolbarState) {\n const flagCount = Object.keys(state.flags).length;\n const overrideCount = Object.values(state.flags).filter((f) => f.override !== null).length;\n\n return html`\n <div class=\"ut-header\">\n <div class=\"ut-title\">\n <img src=\"${UNLEASH_LOGO}\" alt=\"Unleash\" />\n <div>\n <div class=\"ut-title-main\">Unleash Toolbar</div>\n <div class=\"ut-title-sub\">${flagCount} flags • ${overrideCount} overrides</div>\n </div>\n </div>\n <button class=\"ut-btn-close\" @click=${() => this.hide()} title=\"Close toolbar\">×</button>\n </div>\n `;\n }\n\n private renderTabsNavigation() {\n return html`\n <div class=\"ut-tabs\">\n <button \n class=${`ut-tab ${this.currentTab === 'flags' ? 'active' : ''}`}\n @click=${() => this.switchTab('flags')}\n >\n Feature Flags\n </button>\n <button \n class=${`ut-tab ${this.currentTab === 'context' ? 'active' : ''}`}\n @click=${() => this.switchTab('context')}\n >\n Context\n </button>\n </div>\n `;\n }\n\n private switchTab(tab: 'flags' | 'context'): void {\n this.currentTab = tab;\n this.render();\n }\n\n private renderFlagsTab(flagNames: string[]) {\n if (flagNames.length === 0) {\n return html`\n <div class=\"ut-empty\">\n No flags evaluated yet. Use feature flags in your app to see them here.\n </div>\n `;\n }\n\n // Filter flags based on search query\n const filteredFlags = this.searchQuery\n ? flagNames.filter((name) => name.toLowerCase().includes(this.searchQuery.toLowerCase()))\n : flagNames;\n\n return html`\n <div class=\"ut-tab-header\">\n <div class=\"ut-search-container\">\n <input\n type=\"text\"\n class=\"ut-search-input\"\n placeholder=\"Search flags...\"\n .value=${this.searchQuery}\n @input=${(e: Event) => this.updateSearch((e.target as HTMLInputElement).value)}\n />\n </div>\n <button class=\"ut-btn\" @click=${() => this.stateManager.resetOverrides()}>\n Reset All Overrides\n </button>\n </div>\n <div class=\"ut-flag-list\">\n ${\n filteredFlags.length > 0\n ? filteredFlags.map((name) => this.renderFlagItem(name))\n : html`<div class=\"ut-empty\">No flags match \"${this.searchQuery}\"</div>`\n }\n </div>\n `;\n }\n\n private updateSearch(query: string): void {\n this.searchQuery = query;\n this.render();\n }\n\n private renderFlagItem(name: string) {\n const metadata = this.stateManager.getFlagMetadata(name);\n if (!metadata) return null;\n\n // Use the explicitly stored flag type\n const isVariant = metadata.flagType === 'variant';\n const hasOverride = metadata.override !== null;\n\n // Determine current state for toggle\n let toggleState = 'default';\n if (hasOverride && metadata.override?.type === 'flag') {\n toggleState = metadata.override.value ? 'on' : 'off';\n }\n\n return html`\n <div class=\"ut-flag-item\">\n <div class=\"ut-flag-main\">\n <div class=\"ut-flag-header\">\n <div class=\"ut-flag-title-row\">\n <div class=\"ut-flag-name\">${name}</div>\n </div>\n <div class=\"ut-flag-meta\">\n <div class=\"ut-flag-default-value\" title=\"Default value from Unleash\">\n ${this.renderValueBadge(metadata.lastDefaultValue)}\n </div>\n ${\n hasOverride\n ? html`\n <span class=\"ut-override-indicator\" title=\"Override value (overriding the default)\">\n → ${this.renderValueBadge(metadata.lastEffectiveValue)}\n </span>\n `\n : null\n }\n </div>\n </div>\n </div>\n \n <div class=\"ut-flag-control\">\n ${\n !isVariant\n ? html`\n <div class=\"ut-toggle-group\">\n <button \n class=${`ut-toggle-btn ${toggleState === 'off' ? 'active' : ''}`}\n @click=${() => this.setFlagOverride(name, 'off')}\n title=\"Force this flag to OFF\"\n >OFF</button>\n <button \n class=${`ut-toggle-btn ${toggleState === 'default' ? 'active' : ''}`}\n @click=${() => this.setFlagOverride(name, 'default')}\n title=\"Use default value from Unleash (no override)\"\n >—</button>\n <button \n class=${`ut-toggle-btn ${toggleState === 'on' ? 'active' : ''}`}\n @click=${() => this.setFlagOverride(name, 'on')}\n title=\"Force this flag to ON\"\n >ON</button>\n </div>\n `\n : html`\n <div class=\"ut-variant-control\">\n ${\n hasOverride && metadata.override?.type === 'variant'\n ? html`\n <input \n type=\"text\" \n class=\"ut-input-small\" \n placeholder=\"Variant name\" \n .value=${metadata.override.variantKey}\n @input=${(e: Event) => this.setVariant(name, (e.target as HTMLInputElement).value)}\n title=\"Enter variant name to override with\"\n />\n <button \n class=\"ut-btn-small active\" \n @click=${() => this.toggleVariantOverride(name)}\n title=\"Clear variant override\"\n >Clear Override</button>\n `\n : html`\n <button \n class=\"ut-btn-small\" \n @click=${() => this.toggleVariantOverride(name)}\n title=\"Set a variant override\"\n >Override Variant</button>\n `\n }\n </div>\n `\n }\n </div>\n </div>\n `;\n }\n\n private renderValueBadge(value: FlagValue) {\n if (typeof value === 'boolean') {\n return html`<span class=${`ut-badge ut-badge-${value ? 'success' : 'danger'}`}>${value ? 'ON' : 'OFF'}</span>`;\n }\n if (value && typeof value === 'object' && 'name' in value) {\n return html`<span class=\"ut-badge ut-badge-default\">${value.name}</span>`;\n }\n return html`<span class=\"ut-badge ut-badge-default\">null</span>`;\n }\n\n private setFlagOverride(flagName: string, value: 'on' | 'off' | 'default'): void {\n if (value === 'default') {\n this.stateManager.setFlagOverride(flagName, null);\n } else if (value === 'on') {\n this.stateManager.setFlagOverride(flagName, { type: 'flag', value: true });\n } else if (value === 'off') {\n this.stateManager.setFlagOverride(flagName, { type: 'flag', value: false });\n }\n }\n\n private toggleVariantOverride(flagName: string): void {\n const metadata = this.stateManager.getFlagMetadata(flagName);\n\n if (metadata?.override) {\n // Clear override\n this.stateManager.setFlagOverride(flagName, null);\n } else {\n // Set default variant override\n this.stateManager.setFlagOverride(flagName, { type: 'variant', variantKey: 'default' });\n }\n }\n\n private setVariant(flagName: string, variantKey: string): void {\n this.stateManager.setFlagOverride(flagName, { type: 'variant', variantKey });\n }\n\n private isFieldOverridden(\n fieldName: string,\n baseContext: Partial<UnleashContext>,\n contextOverrides: Partial<UnleashContext>,\n ): boolean {\n if (fieldName === 'properties') {\n return false; // Handle properties separately\n }\n const baseValue = baseContext[fieldName as keyof UnleashContext];\n const overrideValue = contextOverrides[fieldName as keyof UnleashContext];\n\n // Only consider it overridden if there's an override AND it differs from base\n return overrideValue !== undefined && overrideValue !== baseValue;\n }\n\n private renderContextField(\n label: string,\n fieldName: string,\n placeholder: string,\n value: string,\n isOverridden: boolean,\n readonly = false,\n ) {\n return html`\n <div class=\"ut-form-group\">\n <label class=\"ut-label\">\n ${label}${readonly ? html` <span class=\"ut-readonly-label\">(read-only)</span>` : null}\n </label>\n <div class=\"ut-input-with-reset\">\n <input \n type=\"text\" \n class=${readonly ? 'ut-input ut-input-readonly' : 'ut-input'}\n placeholder=${placeholder}\n .value=${value}\n @input=${readonly ? null : (e: Event) => this.updateContextField(fieldName, (e.target as HTMLInputElement).value)}\n ?readonly=${readonly}\n title=${readonly ? 'This context field is static and cannot be modified.' : ''}\n />\n ${\n isOverridden && !readonly\n ? html`\n <button \n class=\"ut-reset-field\" \n @click=${() => this.resetContextField(fieldName)}\n title=\"Reset to original value\"\n >↻</button>\n `\n : null\n }\n </div>\n </div>\n `;\n }\n\n private updateContextField(field: string, value: string): void {\n this.stateManager.setContextOverride({ [field]: value || undefined });\n }\n\n private resetContextField(field: string): void {\n this.stateManager.removeContextOverride(field as keyof UnleashContext);\n }\n\n private renderContextTab(contextOverrides: Partial<UnleashContext>) {\n // Use original base context (not current client context which includes overrides)\n const baseContext = this.originalBaseContext;\n const mergedContext = { ...baseContext, ...contextOverrides };\n\n // Standard context fields that should not appear in custom properties\n const standardFields = [\n 'userId',\n 'sessionId',\n 'remoteAddress',\n 'environment',\n 'appName',\n 'properties',\n ];\n\n // Merge properties and exclude any that are standard fields\n const baseProperties = baseContext.properties || {};\n const overrideProperties = contextOverrides.properties || {};\n const mergedProperties = { ...baseProperties, ...overrideProperties };\n\n // Filter out standard fields and show only non-empty properties\n const customPropertiesArray = Object.entries(mergedProperties).filter(([key, value]) => {\n if (standardFields.includes(key)) return false;\n // Only show properties that have a non-empty value\n return value !== '';\n });\n\n const customProperties = Object.fromEntries(customPropertiesArray);\n\n return html`\n <div class=\"ut-tab-header\">\n <button class=\"ut-btn\" @click=${() => this.stateManager.resetContextOverrides()}>\n Reset All Context\n </button>\n </div>\n <div class=\"ut-context-form\">\n ${this.renderContextField('User ID', 'userId', 'user-123', mergedContext.userId || '', this.isFieldOverridden('userId', baseContext, contextOverrides))}\n ${this.renderContextField('Session ID', 'sessionId', 'session-456', mergedContext.sessionId || '', this.isFieldOverridden('sessionId', baseContext, contextOverrides))}\n ${this.renderContextField('Remote Address', 'remoteAddress', '192.168.1.1', mergedContext.remoteAddress || '', this.isFieldOverridden('remoteAddress', baseContext, contextOverrides))}\n ${this.renderContextField('Environment', 'environment', 'development', mergedContext.environment || '', false, true)}\n ${this.renderContextField('App Name', 'appName', 'my-app', mergedContext.appName || '', false, true)}\n\n <div class=\"ut-form-group\">\n <div class=\"ut-label\">Custom Properties</div>\n <div class=\"ut-properties\">\n ${this.renderProperties(customProperties || {}, baseProperties)}\n </div>\n </div>\n </div>\n `;\n }\n\n private renderProperties(\n properties: Record<string, string>,\n baseProperties: Record<string, string> = {},\n ) {\n const entries = Object.entries(properties);\n\n if (entries.length === 0) {\n return html`\n <div class=\"ut-empty-properties\">\n No custom properties defined in base context\n </div>\n `;\n }\n\n return html`\n ${entries.map(([key, value]) => {\n const baseValue = baseProperties[key];\n const isOverridden = baseValue !== undefined && baseValue !== value;\n return html`\n <div class=\"ut-property-row\">\n <div class=\"ut-property-key\" title=\"Property key (read-only)\">${key}</div>\n <div class=\"ut-input-with-reset\">\n <input \n type=\"text\" \n class=\"ut-input\" \n placeholder=\"Value\"\n .value=${value}\n @input=${(e: Event) => this.updatePropertyValue(key, (e.target as HTMLInputElement).value)}\n title=${isOverridden ? `Original: ${baseValue}` : ''}\n />\n ${\n isOverridden\n ? html`\n <button \n class=\"ut-reset-field\" \n @click=${() => this.resetProperty(key)}\n title=\"Reset to original value\"\n >↻</button>\n `\n : null\n }\n </div>\n </div>\n `;\n })}\n `;\n }\n\n private updatePropertyValue(key: string, value: string): void {\n const state = this.stateManager.getState();\n const properties = { ...(state.contextOverrides.properties || {}), [key]: value };\n this.stateManager.setContextOverride({ properties });\n }\n\n private resetProperty(key: string): void {\n const baseProperties = this.originalBaseContext.properties || {};\n const state = this.stateManager.getState();\n const properties = { ...(state.contextOverrides.properties || {}) };\n\n // Restore to base value\n if (baseProperties[key] !== undefined) {\n properties[key] = baseProperties[key];\n } else {\n delete properties[key];\n }\n\n this.stateManager.setContextOverride({ properties });\n }\n}\n"],"names":["t","globalThis","i","s","trustedTypes","e","createPolicy","createHTML","h","o","Math","random","toFixed","slice","n","r","l","document","c","createComment","a","u","Array","isArray","f","v","_","m","p","RegExp","g","$","y","b","_$litType$","strings","values","E","Symbol","for","A","C","WeakMap","P","createTreeWalker","V","hasOwnProperty","Error","N","length","d","lastIndex","exec","test","x","startsWith","push","S","constructor","this","parts","el","createElement","currentNode","content","firstChild","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","split","type","index","name","ctor","I","L","z","H","removeAttribute","tagName","textContent","emptyScript","append","data","indexOf","innerHTML","M","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","parentNode","_$AU","creationScope","importNode","k","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","options","isConnected","startNode","endNode","_$AR","T","iterator","O","insertBefore","createTextNode","_$AC","get","set","_$AP","remove","setConnected","element","fill","String","j","setAttribute","super","arguments","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","call","host","B","litHtmlPolyfillSupport","litHtmlVersions","UNLEASH_LOGO","ToolbarUI","container","rootElement","stateManager","currentTab","position","themePreset","customTheme","originalBaseContext","searchQuery","wrappedClient","theme","__original","getContext","persistedVisibility","getVisibility","setVisibility","initiallyVisible","className","classList","add","applyCustomTheme","body","appendChild","subscribe","render","style","primaryColor","setProperty","backgroundColor","textColor","borderColor","fontFamily","show","hide","destroy","state","getState","flagNames","getFlagNames","isVisible","_$litPart$","html","renderHeader","renderTabsNavigation","renderFlagsTab","renderContextTab","contextOverrides","flagCount","Object","keys","flags","overrideCount","filter","override","switchTab","tab","filteredFlags","toLowerCase","includes","updateSearch","target","value","resetOverrides","map","renderFlagItem","query","metadata","getFlagMetadata","isVariant","flagType","hasOverride","toggleState","renderValueBadge","lastDefaultValue","lastEffectiveValue","variantKey","setVariant","toggleVariantOverride","setFlagOverride","flagName","isFieldOverridden","fieldName","baseContext","overrideValue","renderContextField","label","placeholder","isOverridden","readonly","updateContextField","resetContextField","field","setContextOverride","removeContextOverride","mergedContext","standardFields","baseProperties","properties","overrideProperties","mergedProperties","customPropertiesArray","entries","key","customProperties","fromEntries","resetContextOverrides","userId","sessionId","remoteAddress","environment","appName","renderProperties","baseValue","updatePropertyValue","resetProperty"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ToolbarStateManager } from './state';
|
|
2
|
+
import { InitToolbarOptions, IToolbarUI, WrappedUnleashClient } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Create the toolbar UI component using Lit
|
|
5
|
+
*/
|
|
6
|
+
export declare class ToolbarUI implements IToolbarUI {
|
|
7
|
+
private container;
|
|
8
|
+
private rootElement;
|
|
9
|
+
private stateManager;
|
|
10
|
+
private currentTab;
|
|
11
|
+
private position;
|
|
12
|
+
private themePreset;
|
|
13
|
+
private customTheme?;
|
|
14
|
+
private originalBaseContext;
|
|
15
|
+
private searchQuery;
|
|
16
|
+
constructor(stateManager: ToolbarStateManager, wrappedClient: WrappedUnleashClient, options?: InitToolbarOptions);
|
|
17
|
+
private applyCustomTheme;
|
|
18
|
+
show(): void;
|
|
19
|
+
hide(): void;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
private render;
|
|
22
|
+
private renderHeader;
|
|
23
|
+
private renderTabsNavigation;
|
|
24
|
+
private switchTab;
|
|
25
|
+
private renderFlagsTab;
|
|
26
|
+
private updateSearch;
|
|
27
|
+
private renderFlagItem;
|
|
28
|
+
private renderValueBadge;
|
|
29
|
+
private setFlagOverride;
|
|
30
|
+
private toggleVariantOverride;
|
|
31
|
+
private setVariant;
|
|
32
|
+
private isFieldOverridden;
|
|
33
|
+
private renderContextField;
|
|
34
|
+
private updateContextField;
|
|
35
|
+
private resetContextField;
|
|
36
|
+
private renderContextTab;
|
|
37
|
+
private renderProperties;
|
|
38
|
+
private updatePropertyValue;
|
|
39
|
+
private resetProperty;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAEV,kBAAkB,EAClB,UAAU,EAGV,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAKjB;;GAEG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,WAAW,CAAC,CAA8B;IAClD,OAAO,CAAC,mBAAmB,CAA0B;IACrD,OAAO,CAAC,WAAW,CAAc;gBAG/B,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,oBAAoB,EACnC,OAAO,GAAE,kBAAuB;IAyClC,OAAO,CAAC,gBAAgB;IAcxB,IAAI,IAAI,IAAI;IAKZ,IAAI,IAAI,IAAI;IAKZ,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,MAAM;IAoCd,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,cAAc;IA+FtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;IAoDxB,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,aAAa;CActB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { UnleashClient } from 'unleash-proxy-client';
|
|
2
|
+
import { ToolbarStateManager } from './state';
|
|
3
|
+
import { WrappedUnleashClient } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Wrap an Unleash client to intercept evaluations and apply overrides
|
|
6
|
+
*/
|
|
7
|
+
export declare function wrapUnleashClient(baseClient: UnleashClient, stateManager: ToolbarStateManager): WrappedUnleashClient;
|
|
8
|
+
/**
|
|
9
|
+
* Unwrap a client to get the original
|
|
10
|
+
*/
|
|
11
|
+
export declare function unwrapUnleashClient(client: UnleashClient): UnleashClient;
|
|
12
|
+
/**
|
|
13
|
+
* Check if a client is wrapped
|
|
14
|
+
*/
|
|
15
|
+
export declare function isWrappedClient(client: UnleashClient): client is WrappedUnleashClient;
|
|
16
|
+
//# sourceMappingURL=wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../src/wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAgC,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAElF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,aAAa,EACzB,YAAY,EAAE,mBAAmB,GAChC,oBAAoB,CA2LtB;AAkCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAKxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI,oBAAoB,CAErF"}
|