@limetech/lime-elements 37.72.2 → 37.73.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/lime-elements.cjs.js +1 -1
  3. package/dist/cjs/limel-breadcrumbs_7.cjs.entry.js +15 -4
  4. package/dist/cjs/limel-breadcrumbs_7.cjs.entry.js.map +1 -1
  5. package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js +4 -1
  6. package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js.map +1 -1
  7. package/dist/cjs/limel-shortcut.cjs.entry.js.map +1 -1
  8. package/dist/cjs/limel-text-editor.cjs.entry.js +1 -1
  9. package/dist/cjs/limel-text-editor.cjs.entry.js.map +1 -1
  10. package/dist/cjs/loader.cjs.js +1 -1
  11. package/dist/collection/components/list/list.js +27 -2
  12. package/dist/collection/components/list/list.js.map +1 -1
  13. package/dist/collection/components/menu-list/menu-list.js +26 -2
  14. package/dist/collection/components/menu-list/menu-list.js.map +1 -1
  15. package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js +22 -1
  16. package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js.map +1 -1
  17. package/dist/collection/components/text-editor/text-editor.js +1 -1
  18. package/dist/collection/components/text-editor/text-editor.js.map +1 -1
  19. package/dist/collection/style/internal/lime-theme.scss +1 -1
  20. package/dist/collection/style/shadows.scss +8 -4
  21. package/dist/esm/lime-elements.js +1 -1
  22. package/dist/esm/limel-breadcrumbs_7.entry.js +15 -4
  23. package/dist/esm/limel-breadcrumbs_7.entry.js.map +1 -1
  24. package/dist/esm/limel-prosemirror-adapter.entry.js +4 -1
  25. package/dist/esm/limel-prosemirror-adapter.entry.js.map +1 -1
  26. package/dist/esm/limel-shortcut.entry.js.map +1 -1
  27. package/dist/esm/limel-text-editor.entry.js +1 -1
  28. package/dist/esm/limel-text-editor.entry.js.map +1 -1
  29. package/dist/esm/loader.js +1 -1
  30. package/dist/lime-elements/lime-elements.css +8 -4
  31. package/dist/lime-elements/lime-elements.esm.js +1 -1
  32. package/dist/lime-elements/lime-elements.esm.js.map +1 -1
  33. package/dist/lime-elements/{p-7172c8e7.entry.js → p-209cd952.entry.js} +3 -3
  34. package/dist/lime-elements/p-209cd952.entry.js.map +1 -0
  35. package/dist/lime-elements/{p-414fee31.entry.js → p-67e7d211.entry.js} +2 -2
  36. package/dist/lime-elements/p-67e7d211.entry.js.map +1 -0
  37. package/dist/lime-elements/{p-e91c54af.entry.js → p-830d655c.entry.js} +2 -2
  38. package/dist/lime-elements/{p-e91c54af.entry.js.map → p-830d655c.entry.js.map} +1 -1
  39. package/dist/lime-elements/p-f3a613a3.entry.js.map +1 -1
  40. package/dist/lime-elements/style/internal/lime-theme.scss +1 -1
  41. package/dist/lime-elements/style/shadows.scss +8 -4
  42. package/dist/types/components/list/list.d.ts +5 -0
  43. package/dist/types/components/menu-list/menu-list.d.ts +6 -0
  44. package/dist/types/components/text-editor/prosemirror-adapter/prosemirror-adapter.d.ts +7 -0
  45. package/dist/types/components.d.ts +16 -0
  46. package/package.json +14 -14
  47. package/dist/lime-elements/p-414fee31.entry.js.map +0 -1
  48. package/dist/lime-elements/p-7172c8e7.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["shortcutCss","Shortcut","this","renderLabel","label","h","getAriaLabel","_a","link","title","_b","undefined","renderNotification","badge","render","disabled","href","target","tabindex","_c","name","icon"],"sources":["./src/components/shortcut/shortcut.scss?tag=limel-shortcut&encapsulation=shadow","./src/components/shortcut/shortcut.tsx"],"sourcesContent":["/**\n* @prop --shortcut-border-radius: defines the radius of corners of the shortcut. Defaults to `1rem`\n* @prop --shortcut-icon-color: defines the fill color of the shortcut icon. Defaults to `--contrast-1000`\n* @prop --shortcut-label-color: defines the color of the shortcut label. Defaults to `--contrast-1100`\n* @prop --shortcut-background-color: defines the backgrounds color of the shortcut icon. Defaults to `--lime-elevated-surface-background-color`\n* @prop --shortcut-badge-text-color: Text color of the notification badge. Defaults to `--color-white`\n* @prop --shortcut-badge-background-color: Background color of the notification badge. Defaults to `--color-red-default`\n*/\n\n@use '../../style/mixins';\n\n:host(limel-shortcut) {\n --badge-text-color: var(\n --shortcut-badge-text-color,\n rgb(var(--color-white))\n );\n --badge-background-color: var(\n --shortcut-badge-background-color,\n rgb(var(--color-red-default))\n );\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n row-gap: 0.0625rem; //1px\n\n * {\n box-sizing: border-box;\n }\n}\n\n:host(limel-shortcut[disabled]) {\n a {\n opacity: 0.5;\n box-shadow: unset;\n cursor: not-allowed;\n }\n}\n\na {\n all: unset;\n @include mixins.is-elevated-clickable(\n $background-color:\n var(\n --shortcut-background-color,\n var(--lime-elevated-surface-background-color)\n ),\n $background-color--hovered:\n var(\n --shortcut-background-color,\n var(--lime-elevated-surface-background-color)\n )\n );\n @include mixins.visualize-keyboard-focus;\n text-align: center;\n\n height: calc(100% - 1rem);\n width: calc(100% - 1rem);\n padding: 0.5rem;\n\n border-radius: var(--shortcut-border-radius, 1rem);\n}\n\nlimel-icon {\n display: flex;\n height: 100%;\n width: 100%;\n justify-content: center;\n color: var(--shortcut-icon-color, rgb(var(--contrast-1000)));\n border-radius: var(--shortcut-border-radius, 1rem);\n}\n\nspan {\n @include mixins.truncate-text;\n width: 100%;\n color: var(--shortcut-label-color, rgb(var(--contrast-1100)));\n font-size: 0.75rem;\n text-align: center;\n}\n\nlimel-badge {\n position: absolute;\n top: -0.25rem;\n right: 0.125rem;\n}\n","import { Component, Prop, h } from '@stencil/core';\nimport { Link } from '../../global/shared-types/link.types';\n\n/**\n * This component can be used on places such as a start page or a dashboard.\n * Clicking on the component should navigate the user to a new screen,\n * to which you need to provide a URL, by specifying an `href` for the `link` property.\n *\n * By default, this navigation will happen within the same browser tab.\n * However, it is possible to override that behavior, by specifying a `target`\n * for the `link` property\n *\n * @exampleComponent limel-example-shortcut\n * @exampleComponent limel-example-shortcut-notification\n * @exampleComponent limel-example-shortcut-styling\n * @exampleComponent limel-example-shortcut-with-click-handler\n */\n\n@Component({\n tag: 'limel-shortcut',\n shadow: true,\n styleUrl: 'shortcut.scss',\n})\nexport class Shortcut {\n /**\n * Name of icon for the shortcut.\n */\n @Prop({ reflect: true })\n public icon: string;\n\n /**\n * The text to show below the shortcut. Long label will be truncated.\n */\n @Prop({ reflect: true })\n public label?: string = null;\n\n /**\n * Set to `true` if shortcut is disabled.\n */\n @Prop({ reflect: true })\n public disabled?: boolean = false;\n\n /**\n * If specified, will display a notification badge\n * on the shortcut.\n */\n @Prop({ reflect: true })\n public badge?: number | string;\n\n /**\n * If supplied, the shortcut will be a clickable link.\n */\n @Prop()\n public link?: Link;\n\n public render() {\n return [\n <a\n aria-disabled={this.disabled}\n href={this.link?.href}\n target={this.link?.target}\n tabindex=\"0\"\n aria-label={this.getAriaLabel()}\n title={this.link?.title}\n >\n <limel-icon name={this.icon} />\n </a>,\n this.renderLabel(),\n this.renderNotification(),\n ];\n }\n\n private renderLabel = () => {\n if (this.label) {\n return <span aria-hidden=\"true\">{this.label}</span>;\n }\n };\n\n private getAriaLabel = () => {\n if (this.label && this.link?.title) {\n return this.label + '. ' + this.link.title;\n }\n\n if (this.label) {\n return this.label;\n }\n\n if (this.link?.title) {\n return this.link.title;\n }\n\n return undefined;\n };\n\n private renderNotification = () => {\n if (this.badge) {\n return <limel-badge label={this.badge} />;\n }\n };\n}\n"],"mappings":"sCAAA,MAAMA,EAAc,8rE,MCuBPC,EAAQ,M,yBAiDTC,KAAAC,YAAc,KAClB,GAAID,KAAKE,MAAO,CACZ,OAAOC,EAAA,sBAAkB,QAAQH,KAAKE,M,GAItCF,KAAAI,aAAe,K,QACnB,GAAIJ,KAAKE,SAASG,EAAAL,KAAKM,QAAI,MAAAD,SAAA,SAAAA,EAAEE,OAAO,CAChC,OAAOP,KAAKE,MAAQ,KAAOF,KAAKM,KAAKC,K,CAGzC,GAAIP,KAAKE,MAAO,CACZ,OAAOF,KAAKE,K,CAGhB,IAAIM,EAAAR,KAAKM,QAAI,MAAAE,SAAA,SAAAA,EAAED,MAAO,CAClB,OAAOP,KAAKM,KAAKC,K,CAGrB,OAAOE,SAAS,EAGZT,KAAAU,mBAAqB,KACzB,GAAIV,KAAKW,MAAO,CACZ,OAAOR,EAAA,eAAaD,MAAOF,KAAKW,O,kCA9DhB,K,cAMI,M,yCAerBC,S,UACH,MAAO,CACHT,EAAA,qBACmBH,KAAKa,SACpBC,MAAMT,EAAAL,KAAKM,QAAI,MAAAD,SAAA,SAAAA,EAAES,KACjBC,QAAQP,EAAAR,KAAKM,QAAI,MAAAE,SAAA,SAAAA,EAAEO,OACnBC,SAAS,IAAG,aACAhB,KAAKI,eACjBG,OAAOU,EAAAjB,KAAKM,QAAI,MAAAW,SAAA,SAAAA,EAAEV,OAElBJ,EAAA,cAAYe,KAAMlB,KAAKmB,QAE3BnB,KAAKC,cACLD,KAAKU,qB"}
1
+ {"version":3,"names":["shortcutCss","Shortcut","this","renderLabel","label","h","getAriaLabel","_a","link","title","_b","undefined","renderNotification","badge","render","disabled","href","target","tabindex","_c","name","icon"],"sources":["./src/components/shortcut/shortcut.scss?tag=limel-shortcut&encapsulation=shadow","./src/components/shortcut/shortcut.tsx"],"sourcesContent":["/**\n* @prop --shortcut-border-radius: defines the radius of corners of the shortcut. Defaults to `1rem`\n* @prop --shortcut-icon-color: defines the fill color of the shortcut icon. Defaults to `--contrast-1000`\n* @prop --shortcut-label-color: defines the color of the shortcut label. Defaults to `--contrast-1100`\n* @prop --shortcut-background-color: defines the backgrounds color of the shortcut icon. Defaults to `--lime-elevated-surface-background-color`\n* @prop --shortcut-badge-text-color: Text color of the notification badge. Defaults to `--color-white`\n* @prop --shortcut-badge-background-color: Background color of the notification badge. Defaults to `--color-red-default`\n*/\n\n@use '../../style/mixins';\n\n:host(limel-shortcut) {\n --badge-text-color: var(\n --shortcut-badge-text-color,\n rgb(var(--color-white))\n );\n --badge-background-color: var(\n --shortcut-badge-background-color,\n rgb(var(--color-red-default))\n );\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n row-gap: 0.0625rem; //1px\n\n * {\n box-sizing: border-box;\n }\n}\n\n:host(limel-shortcut[disabled]) {\n a {\n opacity: 0.5;\n box-shadow: unset;\n cursor: not-allowed;\n }\n}\n\na {\n all: unset;\n @include mixins.is-elevated-clickable(\n $background-color: var(\n --shortcut-background-color,\n var(--lime-elevated-surface-background-color)\n ),\n $background-color--hovered: var(\n --shortcut-background-color,\n var(--lime-elevated-surface-background-color)\n )\n );\n @include mixins.visualize-keyboard-focus;\n text-align: center;\n\n height: calc(100% - 1rem);\n width: calc(100% - 1rem);\n padding: 0.5rem;\n\n border-radius: var(--shortcut-border-radius, 1rem);\n}\n\nlimel-icon {\n display: flex;\n height: 100%;\n width: 100%;\n justify-content: center;\n color: var(--shortcut-icon-color, rgb(var(--contrast-1000)));\n border-radius: var(--shortcut-border-radius, 1rem);\n}\n\nspan {\n @include mixins.truncate-text;\n width: 100%;\n color: var(--shortcut-label-color, rgb(var(--contrast-1100)));\n font-size: 0.75rem;\n text-align: center;\n}\n\nlimel-badge {\n position: absolute;\n top: -0.25rem;\n right: 0.125rem;\n}\n","import { Component, Prop, h } from '@stencil/core';\nimport { Link } from '../../global/shared-types/link.types';\n\n/**\n * This component can be used on places such as a start page or a dashboard.\n * Clicking on the component should navigate the user to a new screen,\n * to which you need to provide a URL, by specifying an `href` for the `link` property.\n *\n * By default, this navigation will happen within the same browser tab.\n * However, it is possible to override that behavior, by specifying a `target`\n * for the `link` property\n *\n * @exampleComponent limel-example-shortcut\n * @exampleComponent limel-example-shortcut-notification\n * @exampleComponent limel-example-shortcut-styling\n * @exampleComponent limel-example-shortcut-with-click-handler\n */\n\n@Component({\n tag: 'limel-shortcut',\n shadow: true,\n styleUrl: 'shortcut.scss',\n})\nexport class Shortcut {\n /**\n * Name of icon for the shortcut.\n */\n @Prop({ reflect: true })\n public icon: string;\n\n /**\n * The text to show below the shortcut. Long label will be truncated.\n */\n @Prop({ reflect: true })\n public label?: string = null;\n\n /**\n * Set to `true` if shortcut is disabled.\n */\n @Prop({ reflect: true })\n public disabled?: boolean = false;\n\n /**\n * If specified, will display a notification badge\n * on the shortcut.\n */\n @Prop({ reflect: true })\n public badge?: number | string;\n\n /**\n * If supplied, the shortcut will be a clickable link.\n */\n @Prop()\n public link?: Link;\n\n public render() {\n return [\n <a\n aria-disabled={this.disabled}\n href={this.link?.href}\n target={this.link?.target}\n tabindex=\"0\"\n aria-label={this.getAriaLabel()}\n title={this.link?.title}\n >\n <limel-icon name={this.icon} />\n </a>,\n this.renderLabel(),\n this.renderNotification(),\n ];\n }\n\n private renderLabel = () => {\n if (this.label) {\n return <span aria-hidden=\"true\">{this.label}</span>;\n }\n };\n\n private getAriaLabel = () => {\n if (this.label && this.link?.title) {\n return this.label + '. ' + this.link.title;\n }\n\n if (this.label) {\n return this.label;\n }\n\n if (this.link?.title) {\n return this.link.title;\n }\n\n return undefined;\n };\n\n private renderNotification = () => {\n if (this.badge) {\n return <limel-badge label={this.badge} />;\n }\n };\n}\n"],"mappings":"sCAAA,MAAMA,EAAc,8rE,MCuBPC,EAAQ,M,yBAiDTC,KAAAC,YAAc,KAClB,GAAID,KAAKE,MAAO,CACZ,OAAOC,EAAA,sBAAkB,QAAQH,KAAKE,M,GAItCF,KAAAI,aAAe,K,QACnB,GAAIJ,KAAKE,SAASG,EAAAL,KAAKM,QAAI,MAAAD,SAAA,SAAAA,EAAEE,OAAO,CAChC,OAAOP,KAAKE,MAAQ,KAAOF,KAAKM,KAAKC,K,CAGzC,GAAIP,KAAKE,MAAO,CACZ,OAAOF,KAAKE,K,CAGhB,IAAIM,EAAAR,KAAKM,QAAI,MAAAE,SAAA,SAAAA,EAAED,MAAO,CAClB,OAAOP,KAAKM,KAAKC,K,CAGrB,OAAOE,SAAS,EAGZT,KAAAU,mBAAqB,KACzB,GAAIV,KAAKW,MAAO,CACZ,OAAOR,EAAA,eAAaD,MAAOF,KAAKW,O,kCA9DhB,K,cAMI,M,yCAerBC,S,UACH,MAAO,CACHT,EAAA,qBACmBH,KAAKa,SACpBC,MAAMT,EAAAL,KAAKM,QAAI,MAAAD,SAAA,SAAAA,EAAES,KACjBC,QAAQP,EAAAR,KAAKM,QAAI,MAAAE,SAAA,SAAAA,EAAEO,OACnBC,SAAS,IAAG,aACAhB,KAAKI,eACjBG,OAAOU,EAAAjB,KAAKM,QAAI,MAAAW,SAAA,SAAAA,EAAEV,OAElBJ,EAAA,cAAYe,KAAMlB,KAAKmB,QAE3BnB,KAAKC,cACLD,KAAKU,qB"}
@@ -38,7 +38,7 @@
38
38
  // $text-secondary-on-dark: rgba(255, 255, 255, 0.7),
39
39
  // $text-hint-on-dark: rgba(255, 255, 255, 0.5),
40
40
  // $text-disabled-on-dark: rgba(255, 255, 255, 0.5),
41
- // $text-icon-on-dark: rgba(255, 255, 255, 0.5),
41
+ // $text-icon-on-dark: rgba(255, 255, 255, 0.5),
42
42
  );
43
43
  @forward '@material/theme';
44
44
 
@@ -45,7 +45,8 @@
45
45
  // Same as above, but when element is indicating error or warning
46
46
  --shadow-depth-8-error: var(--shadow-depth-8), var(--shadow-error-state);
47
47
  // Same as above, but light source is below the element, good for bottom bars, etc...
48
- --shadow-depth-8-reversed: 0 -0.2rem 0.45rem 0 rgb(var(--color-black), 0.132),
48
+ --shadow-depth-8-reversed: 0 -0.2rem 0.45rem 0
49
+ rgb(var(--color-black), 0.132),
49
50
  0 -0.0375rem 0.1125rem 0 rgb(var(--color-black), 0.108);
50
51
 
51
52
  // Good for Teaching callouts, Search results dropdown, cards, Tooltips
@@ -64,19 +65,22 @@
64
65
  --shadow-depth-64-focused: var(--shadow-depth-64),
65
66
  var(--shadow-focused-state);
66
67
 
67
- --shadow-inflated-8: -0.125rem -0.125rem 0.375rem rgb(var(--color-black), 0.01),
68
+ --shadow-inflated-8: -0.125rem -0.125rem 0.375rem
69
+ rgb(var(--color-black), 0.01),
68
70
  -0.25rem -0.25rem 0.625rem rgb(var(--color-white), 0.6),
69
71
  0.25rem 0.25rem 0.625rem rgb(var(--color-black), 0.05),
70
72
  0.0625rem 0.0625rem 0.625rem rgb(var(--color-white), 0.7),
71
73
  -1px -1px 0 1px rgb(var(--color-black), 0.07) inset,
72
74
  0 0 1px 1px rgb(var(--color-white), 0.98) inset;
73
- --shadow-inflated-16: -0.1875rem -0.1875rem 0.375rem rgb(var(--color-black), 0.01),
75
+ --shadow-inflated-16: -0.1875rem -0.1875rem 0.375rem
76
+ rgb(var(--color-black), 0.01),
74
77
  -0.375rem -0.375rem 1rem rgb(var(--color-white), 0.8),
75
78
  0.375rem 0.375rem 1rem rgb(var(--color-black), 0.05),
76
79
  0.125rem 0.125rem 0.625rem rgb(var(--color-white), 0.7),
77
80
  -1px -1px 0 1px rgb(var(--color-black), 0.07) inset,
78
81
  0 0 1px 1px rgb(var(--color-white), 0.98) inset;
79
- --shadow-inflated-64: -0.1875rem -0.1875rem 0.375rem rgb(var(--color-black), 0.01),
82
+ --shadow-inflated-64: -0.1875rem -0.1875rem 0.375rem
83
+ rgb(var(--color-black), 0.01),
80
84
  -0.625rem -0.625rem 1.875rem rgb(var(--color-white), 1),
81
85
  0.625rem 0.625rem 2.25rem rgb(var(--color-black), 0.06),
82
86
  0.125rem 0.125rem 0.625rem rgb(var(--color-white), 0.7),
@@ -61,6 +61,11 @@ export declare class List {
61
61
  * Fired when an action has been selected from the action menu of a list item
62
62
  */
63
63
  protected select: EventEmitter<ListItem | ListItem[]>;
64
+ /**
65
+ * Fires when a user interacts with an item in the list (e.g., click,
66
+ * keyboard select).
67
+ */
68
+ interact: EventEmitter<ListItem>;
64
69
  connectedCallback(): void;
65
70
  disconnectedCallback(): void;
66
71
  componentDidLoad(): void;
@@ -2,6 +2,7 @@ import { IconSize } from '../icon/icon.types';
2
2
  import { ListSeparator } from '../list/list-item.types';
3
3
  import { MenuItem } from '../menu/menu.types';
4
4
  import { MenuListType } from '../menu-list/menu-list.types';
5
+ import { EventEmitter } from '../../stencil-public-runtime';
5
6
  /**
6
7
  * @private
7
8
  */
@@ -39,6 +40,11 @@ export declare class MenuList {
39
40
  * Fired when a new value has been selected from the list.
40
41
  */
41
42
  private select;
43
+ /**
44
+ * Fires when a user interacts with an item in the list (e.g., click,
45
+ * keyboard select).
46
+ */
47
+ interact: EventEmitter<MenuItem>;
42
48
  connectedCallback(): void;
43
49
  disconnectedCallback(): void;
44
50
  componentDidLoad(): void;
@@ -25,6 +25,13 @@ export declare class ProsemirrorAdapter {
25
25
  * Defines the language for translations.
26
26
  */
27
27
  language: Languages;
28
+ /**
29
+ * Set to `true` to disable the field.
30
+ * Use `disabled` to indicate that the field can normally be interacted
31
+ * with, but is currently disabled. This tells the user that if certain
32
+ * requirements are met, the field may become enabled again.
33
+ */
34
+ disabled?: boolean;
28
35
  /**
29
36
  * set to private to avoid usage while under development
30
37
  *
@@ -2247,6 +2247,10 @@ export namespace Components {
2247
2247
  * @alpha
2248
2248
  */
2249
2249
  "customElements": CustomElementDefinition[];
2250
+ /**
2251
+ * Set to `true` to disable the field. Use `disabled` to indicate that the field can normally be interacted with, but is currently disabled. This tells the user that if certain requirements are met, the field may become enabled again.
2252
+ */
2253
+ "disabled"?: boolean;
2250
2254
  /**
2251
2255
  * Defines the language for translations.
2252
2256
  */
@@ -6432,6 +6436,10 @@ declare namespace LocalJSX {
6432
6436
  * Fired when a new value has been selected from the list. Only fired if `type` is set to `selectable`, `radio` or `checkbox`.
6433
6437
  */
6434
6438
  "onChange"?: (event: LimelListCustomEvent<ListItem | ListItem[]>) => void;
6439
+ /**
6440
+ * Fires when a user interacts with an item in the list (e.g., click, keyboard select).
6441
+ */
6442
+ "onInteract"?: (event: LimelListCustomEvent<ListItem>) => void;
6435
6443
  /**
6436
6444
  * Fired when an action has been selected from the action menu of a list item
6437
6445
  */
@@ -6561,6 +6569,10 @@ declare namespace LocalJSX {
6561
6569
  * By default, lists will display 3 lines of text, and then truncate the rest. Consumers can increase or decrease this number by specifying `maxLinesSecondaryText`. If consumer enters zero or negative numbers we default to 1; and if they type decimals we round up.
6562
6570
  */
6563
6571
  "maxLinesSecondaryText"?: number;
6572
+ /**
6573
+ * Fires when a user interacts with an item in the list (e.g., click, keyboard select).
6574
+ */
6575
+ "onInteract"?: (event: LimelMenuListCustomEvent<MenuItem>) => void;
6564
6576
  /**
6565
6577
  * Fired when a new value has been selected from the list.
6566
6578
  */
@@ -6870,6 +6882,10 @@ declare namespace LocalJSX {
6870
6882
  * @alpha
6871
6883
  */
6872
6884
  "customElements"?: CustomElementDefinition[];
6885
+ /**
6886
+ * Set to `true` to disable the field. Use `disabled` to indicate that the field can normally be interacted with, but is currently disabled. This tells the user that if certain requirements are met, the field may become enabled again.
6887
+ */
6888
+ "disabled"?: boolean;
6873
6889
  /**
6874
6890
  * Defines the language for translations.
6875
6891
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@limetech/lime-elements",
3
- "version": "37.72.2",
3
+ "version": "37.73.0",
4
4
  "description": "Lime Elements",
5
5
  "author": "Lime Technologies",
6
6
  "license": "Apache-2.0",
@@ -27,9 +27,9 @@
27
27
  "lint": "npm run lint:src && npm run lint:scss",
28
28
  "lint:fix": "npm run lint:src:fix && npm run lint:scss:fix",
29
29
  "lint:prod": "npm run lint:src:prod && npm run lint:scss:prod",
30
- "lint:src": "eslint \"**/*.{ts,tsx,js}\" --max-warnings=655 && prettier -c \"{!(package*).json,.prettierrc}\"",
30
+ "lint:src": "eslint \"**/*.{ts,tsx,js}\" --max-warnings=99 && prettier -c \"{!(package*).json,.prettierrc}\"",
31
31
  "lint:src:fix": "eslint \"**/*.{ts,tsx,js}\" --fix && prettier --write \"{!(package*).json,.prettierrc}\"",
32
- "lint:src:prod": "eslint \"**/*.{ts,tsx,js}\" --rule \"linebreak-style: [error, unix]\" --max-warnings=655 && prettier -c \"{!(package*).json,.prettierrc}\"",
32
+ "lint:src:prod": "eslint \"**/*.{ts,tsx,js}\" --rule \"linebreak-style: [error, unix]\" --max-warnings=99 && prettier -c \"{!(package*).json,.prettierrc}\"",
33
33
  "lint:scss": "prettier -c --ignore-path ./.gitignore **/*.scss",
34
34
  "lint:scss:fix": "prettier --write --ignore-path ./.gitignore **/*.scss",
35
35
  "lint:scss:prod": "prettier -c --end-of-line lf --ignore-path ./.gitignore **/*.scss",
@@ -43,10 +43,10 @@
43
43
  "generate": "stencil generate"
44
44
  },
45
45
  "devDependencies": {
46
- "@commitlint/config-conventional": "^19.5.0",
47
- "@eslint/eslintrc": "^3.1.0",
48
- "@eslint/js": "^9.13.0",
49
- "@microsoft/api-extractor": "^7.47.11",
46
+ "@commitlint/config-conventional": "^19.6.0",
47
+ "@eslint/eslintrc": "^3.2.0",
48
+ "@eslint/js": "^9.16.0",
49
+ "@microsoft/api-extractor": "^7.48.0",
50
50
  "@popperjs/core": "^2.11.8",
51
51
  "@rjsf/core": "^2.4.2",
52
52
  "@rollup/plugin-node-resolve": "^13.3.0",
@@ -59,21 +59,21 @@
59
59
  "@types/react": "^18.3.12",
60
60
  "@types/react-dom": "^18.3.1",
61
61
  "@types/tabulator-tables": "^4.9.4",
62
- "@typescript-eslint/eslint-plugin": "^8.14.0",
63
- "@typescript-eslint/parser": "^8.14.0",
62
+ "@typescript-eslint/eslint-plugin": "^8.17.0",
63
+ "@typescript-eslint/parser": "^8.17.0",
64
64
  "codemirror": "^5.65.9",
65
65
  "cross-env": "^7.0.3",
66
66
  "dayjs": "^1.11.13",
67
- "eslint": "^9.14.0",
67
+ "eslint": "^9.16.0",
68
68
  "eslint-config-prettier": "^9.1.0",
69
69
  "eslint-plugin-ban": "^1.6.0",
70
70
  "eslint-plugin-prefer-arrow": "^1.2.3",
71
71
  "eslint-plugin-prettier": "^5.2.1",
72
72
  "eslint-plugin-react": "^7.37.2",
73
- "eslint-plugin-sonarjs": "^2.0.4",
74
- "eslint-plugin-tsdoc": "^0.3.0",
73
+ "eslint-plugin-sonarjs": "^3.0.0",
74
+ "eslint-plugin-tsdoc": "^0.4.0",
75
75
  "flatpickr": "^4.6.13",
76
- "globals": "^15.12.0",
76
+ "globals": "^15.13.0",
77
77
  "html-escaper": "^3.0.3",
78
78
  "jest": "^27.5.1",
79
79
  "jest-cli": "^27.5.1",
@@ -85,7 +85,7 @@
85
85
  "moment": "^2.30.1",
86
86
  "number-abbreviate": "^2.0.0",
87
87
  "parse-css-color": "^0.2.1",
88
- "prettier": "^3.3.3",
88
+ "prettier": "^3.4.1",
89
89
  "prosemirror-example-setup": "^1.2.3",
90
90
  "prosemirror-markdown": "^1.13.1",
91
91
  "prosemirror-model": ">=1.22.1",
@@ -1 +0,0 @@
1
- {"version":3,"names":["textEditorCss","TextEditor","constructor","hostRef","this","renderHelperLine","helperText","h","helperTextId","invalid","isInvalid","readonly","handleChange","event","stopPropagation","change","emit","detail","createRandomString","editorId","render","Host","class","renderLabel","renderEditor","value","id","renderPlaceholder","placeholder","contentType","onChange","customElements","tabindex","disabled","language","triggerCharacters","triggers","label","htmlFor"],"sources":["./src/components/text-editor/text-editor.scss?tag=limel-text-editor&encapsulation=shadow","./src/components/text-editor/text-editor.tsx"],"sourcesContent":["@use '../../style/internal/shared_input-select-picker';\n@use '../../style/mixins.scss';\n\n/**\n * @prop --text-editor-max-height: the tallest height the text editor can become when auto-resizing itself. Defaults to `calc(100vh - (env(safe-area-inset-top) + env(safe-area-inset-bottom)) - 4rem)`.\n * @prop --text-editor-fade-out-background-color: the color of the fade-out effect at the top and bottom of the text editor, when the text-editor is in readonly state. Defaults to rgb(var(--contrast-100)).\n */\n\n@include shared_input-select-picker.lime-looks-like-input-value;\n.lime-looks-like-input-value {\n padding: var(--limel-text-editor-padding);\n}\n\n* {\n box-sizing: border-box;\n}\n\n:host(limel-text-editor) {\n --limel-text-editor-outline-color: #{shared_input-select-picker.$lime-text-field-outline-color};\n --limel-text-editor-background-color: #{shared_input-select-picker.$background-color-normal};\n --limel-text-editor-label-color: #{shared_input-select-picker.$label-color};\n --limel-prosemirror-adapter-toolbar-opacity: 0.6;\n --limel-text-editor-padding: 0.25rem 1rem 0.75rem 1rem;\n --limel-prosemirror-adapter-toolbar-grid-template-rows: 1fr;\n --limel-prosemirror-adapter-toolbar-grid-template-rows-transition-duration: 0.3s;\n --limel-prosemirror-adapter-toolbar-transition-timing-function: cubic-bezier(\n 0.19,\n 0.23,\n 0.26,\n 0.89\n );\n\n position: relative;\n isolation: isolate;\n display: flex;\n flex-direction: column;\n\n width: 100%;\n min-width: 5rem;\n min-height: 5rem;\n height: 100%;\n max-height: var(\n --text-editor-max-height,\n calc(\n 100vh - (env(safe-area-inset-top) + env(safe-area-inset-bottom)) -\n 4rem\n )\n );\n padding: 1px; // prevents visual defects that can appear due to the backdrop-filter and closeness to borders\n}\n\n:host(limel-text-editor:focus-within),\n:host(limel-text-editor:not([ui='minimal']):hover) {\n --limel-prosemirror-adapter-toolbar-opacity: 1;\n}\n\n:host(limel-text-editor[ui='minimal']:not(:focus-within)) {\n --limel-text-editor-padding: 0.75rem 1rem 0.75rem 1rem;\n --limel-prosemirror-adapter-toolbar-grid-template-rows: 0fr;\n --limel-prosemirror-adapter-toolbar-grid-template-rows-transition-duration: 0.46s;\n --limel-prosemirror-adapter-action-bar-padding-top-bottom: 0;\n --limel-prosemirror-adapter-toolbar-opacity: 0;\n --limel-text-editor-placeholder-top: 0;\n min-height: 2.5rem;\n}\n\n:host(limel-text-editor:hover) {\n --limel-text-editor-outline-color: #{shared_input-select-picker.$lime-text-field-outline-color--hovered};\n}\n\n:host(limel-text-editor:focus-within) {\n --limel-text-editor-outline-color: #{shared_input-select-picker.$lime-text-field-outline-color--focused};\n}\n\n:host(limel-text-editor[disabled]:not([disabled='false'])) {\n @include shared_input-select-picker.looks-disabled;\n\n limel-prosemirror-adapter {\n pointer-events: none;\n }\n}\n\n:host(limel-text-editor[invalid]:not([invalid='false'])) {\n --limel-text-editor-outline-color: var(--lime-error-text-color);\n}\n\n:host(limel-text-editor[readonly]:not([readonly='false'])) {\n --limel-text-editor-padding: 0.75rem 1rem 0.75rem 1rem;\n --limel-text-editor-placeholder-top: 0;\n --limel-text-editor-outline-color: transparent;\n --limel-text-editor-background-color: transparent;\n\n limel-markdown {\n // displayed when `readonly` instead of the adapter\n display: block;\n padding: var(--limel-text-editor-padding);\n overflow-y: auto;\n\n &:before,\n &:after {\n z-index: 1;\n pointer-events: none;\n content: '';\n display: block;\n position: absolute;\n width: 100%;\n }\n &:after {\n height: 1.75rem;\n top: 0;\n background: linear-gradient(\n var(\n --text-editor-fade-out-background-color,\n rgb(var(--contrast-100))\n ),\n transparent\n );\n }\n\n &:before {\n height: 2rem;\n bottom: -0.25rem;\n background: linear-gradient(\n transparent,\n var(\n --text-editor-fade-out-background-color,\n rgb(var(--contrast-100))\n )\n );\n }\n }\n}\n\n.notched-outline {\n transition: bottom\n var(--limel-h-l-grid-template-rows-transition-speed, 0.46s)\n cubic-bezier(1, 0.09, 0, 0.89);\n pointer-events: none;\n position: absolute;\n inset: 0;\n bottom: var(--limel-text-editor-notched-outline-bottom, 0);\n\n display: flex;\n background-color: var(--limel-text-editor-background-color);\n}\n\n.leading-outline,\n.notch,\n.trailing-outline {\n transition: border-color 0.2s ease;\n border-width: 1px;\n border-style: solid;\n border-color: var(--limel-text-editor-outline-color);\n}\n\n.leading-outline {\n flex-shrink: 0;\n width: 0.75rem;\n border-right-width: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.notch {\n flex-shrink: 0;\n\n position: relative;\n z-index: 2;\n\n border-top-width: 0;\n border-right-width: 0;\n border-left-width: 0;\n\n max-width: calc(100% - 1.5rem);\n}\n\n.trailing-outline {\n flex-grow: 1;\n border-left-width: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\nlabel {\n transform: translateY(-50%);\n\n @include mixins.truncate-text;\n display: block;\n padding: 0 0.25rem;\n\n color: var(--limel-text-editor-label-color);\n font-size: 0.65rem; // `10.4px` similar to MDC's floating label\n letter-spacing: var(--mdc-typography-subtitle1-letter-spacing, 0.009375em);\n\n :host(limel-text-editor[required]) & {\n &::after {\n content: '*';\n }\n }\n}\n\n.placeholder {\n transition-property: top, padding;\n transition-duration: var(\n --limel-prosemirror-adapter-toolbar-grid-template-rows-transition-duration\n );\n transition-timing-function: var(\n --limel-prosemirror-adapter-toolbar-transition-timing-function\n );\n @include mixins.truncate-text;\n pointer-events: none;\n position: absolute;\n top: var(--limel-text-editor-placeholder-top, 2.25rem);\n left: 0;\n right: 0;\n\n padding: var(--limel-text-editor-padding);\n font-style: italic;\n font-size: 0.875rem;\n color: shared_input-select-picker.$input-placeholder-color;\n}\n\nlimel-prosemirror-adapter {\n flex-grow: 1;\n\n min-width: 0;\n min-height: 0;\n height: 100%;\n overflow: hidden auto;\n}\n\n@include mixins.hide-helper-line-when-not-needed(limel-text-editor);\n:host(limel-text-editor.has-helper-text:focus-within),\n:host(limel-text-editor.has-helper-text[invalid]:not([invalid='false'])) {\n .notched-outline {\n --limel-text-editor-notched-outline-bottom: 1rem;\n }\n}\n\n:host(limel-text-editor[allow-resize]) {\n limel-prosemirror-adapter {\n resize: vertical;\n }\n}\n","import { Component, Event, EventEmitter, Host, Prop, h } from '@stencil/core';\nimport { FormComponent } from '../form/form.types';\nimport { Languages } from '../date-picker/date.types';\nimport { createRandomString } from '../../util/random-string';\nimport { CustomElementDefinition } from '../../global/shared-types/custom-element.types';\nimport { TriggerCharacter, TriggerEventDetail } from './text-editor.types';\nimport { EditorUiType } from './types';\n\n/**\n * A rich text editor that offers a rich text editing experience with markdown support,\n * in the sense that you can easily type markdown syntax and see the rendered\n * result as rich text in real-time. For instance, you can type `# Hello, world!`\n * and see it directly turning to a heading 1 (an `<h1>` HTML element).\n *\n * Naturally, you can use standard keyboard hotkeys such as <kbd>Ctrl</kbd> + <kbd>B</kbd>\n * to toggle bold text, <kbd>Ctrl</kbd> + <kbd>I</kbd> to toggle italic text, and so on.\n *\n * @exampleComponent limel-example-text-editor-basic\n * @exampleComponent limel-example-text-editor-as-form-component\n * @exampleComponent limel-example-text-editor-with-markdown\n * @exampleComponent limel-example-text-editor-with-html\n * @exampleComponent limel-example-text-editor-with-tables\n * @exampleComponent limel-example-text-editor-allow-resize\n * @exampleComponent limel-example-text-editor-size\n * @exampleComponent limel-example-text-editor-ui\n * @exampleComponent limel-example-text-editor-composite\n * @exampleComponent limel-example-text-editor-custom-element\n * @exampleComponent limel-example-text-editor-triggers\n * @beta\n */\n@Component({\n tag: 'limel-text-editor',\n shadow: { delegatesFocus: true },\n styleUrl: 'text-editor.scss',\n})\nexport class TextEditor implements FormComponent<string> {\n /** The type of content that the editor should handle and emit, defaults to `markdown`\n *\n * Assumed to be set only once, so not reactive to changes\n */\n @Prop()\n public contentType: 'markdown' | 'html' = 'markdown';\n\n /**\n * Defines the language for translations.\n */\n @Prop({ reflect: true })\n public language: Languages = 'en';\n\n /**\n * Set to `true` to disable the field.\n * Use `disabled` to indicate that the field can normally be interacted\n * with, but is currently disabled. This tells the user that if certain\n * requirements are met, the field may become enabled again.\n */\n @Prop({ reflect: true })\n public disabled?: boolean = false;\n\n /**\n * Set to `true` to make the component read-only.\n * Use `readonly` when the field is only there to present the data it holds,\n * and will not become possible for the current user to edit.\n * :::note\n * Consider that it might be better to use `limel-markdown`\n * instead of `limel-text-editor` when the goal is visualizing data.\n * :::\n */\n @Prop({ reflect: true })\n public readonly?: boolean = false;\n\n /**\n * Optional helper text to display below the input field when it has focus\n */\n @Prop({ reflect: true })\n public helperText?: string;\n\n /**\n * The placeholder text shown inside the input field,\n * when the field is empty.\n */\n @Prop({ reflect: true })\n public placeholder?: string;\n\n /**\n * The label of the editor\n */\n @Prop({ reflect: true })\n public label?: string;\n\n /**\n * Set to `true` to indicate that the current value of the editor is\n * invalid.\n */\n @Prop({ reflect: true })\n public invalid?: boolean = false;\n\n /**\n * Description of the text inside the editor as markdown\n */\n @Prop({ reflect: true })\n public value: string;\n\n /**\n * A list of custom elements\n *\n * Any `CustomElement` that should be used inside the text editor needs\n * to be defined here.\n *\n * @private\n * @alpha\n */\n @Prop()\n public customElements: CustomElementDefinition[] = [];\n\n /**\n * A set of trigger characters\n *\n * Defining a character here will enable trigger events to be sent if the\n * character is detected in the editor.\n *\n * @private\n * @alpha\n */\n @Prop()\n public triggers: TriggerCharacter[] = [];\n\n /**\n * Set to `true` to indicate that the field is required.\n *\n * :::important\n * An empty but required field is not automatically considered invalid.\n * You must make sure to check the validity of the field on your own,\n * and properly handle the `invalid` state.\n * :::\n */\n @Prop({ reflect: true })\n public required?: boolean = false;\n\n /**\n * Set to `true` to allow the user to vertically resize the editor.\n * Set to `false` to disable the resize functionality.\n */\n @Prop({ reflect: true })\n public allowResize: boolean = true;\n\n /**\n * Specifies the visual appearance of the editor.\n *\n * - `standard`: The default editor appearance with a full toolbar and\n * standard layout.\n * - `minimal`: A compact editor appearance, ideal for limited space\n * scenarios such as mobile devices. In this mode, the toolbar is hidden\n * until the editor is focused.\n */\n @Prop({ reflect: true })\n public ui?: EditorUiType = 'standard';\n\n /**\n * Dispatched when a change is made to the editor\n */\n @Event()\n public change: EventEmitter<string>;\n\n /**\n * Dispatched if a trigger character is detected.\n *\n * @private\n * @alpha\n */\n @Event()\n public triggerStart: EventEmitter<TriggerEventDetail>;\n\n /**\n * Dispatched if a trigger session is ended. That is if the selection\n * goes outside the trigger input or if something is inserted using the\n * supplied `TextEditor` insert function.\n *\n * @private\n * @alpha\n */\n @Event()\n public triggerStop: EventEmitter<TriggerEventDetail>;\n\n /**\n * Dispatched if a input is changed during an active trigger.\n *\n * @private\n * @alpha\n */\n @Event()\n public triggerChange: EventEmitter<TriggerEventDetail>;\n\n private helperTextId: string;\n private editorId: string;\n\n public constructor() {\n this.helperTextId = createRandomString();\n this.editorId = createRandomString();\n }\n\n public render() {\n return (\n <Host\n class={{\n 'has-helper-text': !!this.helperText,\n }}\n >\n <span class=\"notched-outline\">\n <span class=\"leading-outline\" />\n {this.renderLabel()}\n <span class=\"trailing-outline\" />\n </span>\n {this.renderEditor()}\n </Host>\n );\n }\n\n private renderEditor() {\n if (this.readonly && !this.value) {\n return [\n <span class=\"lime-looks-like-input-value\">–</span>,\n this.renderHelperLine(),\n ];\n }\n\n if (this.readonly) {\n return [\n <limel-markdown\n value={this.value}\n aria-controls={this.helperTextId}\n id={this.editorId}\n />,\n this.renderPlaceholder(),\n this.renderHelperLine(),\n ];\n }\n\n return [\n <limel-prosemirror-adapter\n aria-placeholder={this.placeholder}\n contentType={this.contentType}\n onChange={this.handleChange}\n customElements={this.customElements}\n value={this.value}\n aria-controls={this.helperTextId}\n id={this.editorId}\n tabindex={this.disabled ? -1 : 0}\n aria-disabled={this.disabled}\n language={this.language}\n triggerCharacters={this.triggers}\n />,\n this.renderPlaceholder(),\n this.renderHelperLine(),\n ];\n }\n\n private renderLabel() {\n if (!this.label) {\n return;\n }\n\n return (\n <span class=\"notch\">\n <label htmlFor={this.editorId}>{this.label}</label>\n </span>\n );\n }\n\n private renderPlaceholder() {\n if (!this.placeholder || this.value) {\n return;\n }\n\n return (\n <span class=\"placeholder\" aria-hidden=\"true\">\n {this.placeholder}\n </span>\n );\n }\n\n private renderHelperLine = () => {\n if (!this.helperText) {\n return;\n }\n\n return (\n <limel-helper-line\n helperText={this.helperText}\n helperTextId={this.helperTextId}\n invalid={this.isInvalid()}\n />\n );\n };\n\n private isInvalid = () => {\n if (this.readonly) {\n // A readonly field can never be invalid.\n return false;\n }\n\n if (this.invalid) {\n return true;\n }\n };\n\n private handleChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.change.emit(event.detail);\n };\n}\n"],"mappings":"6FAAA,MAAMA,EAAgB,qlO,MCmCTC,EAAU,MAgKnBC,YAAAC,G,0KAqFQC,KAAAC,iBAAmB,KACvB,IAAKD,KAAKE,WAAY,CAClB,M,CAGJ,OACIC,EAAA,qBACID,WAAYF,KAAKE,WACjBE,aAAcJ,KAAKI,aACnBC,QAASL,KAAKM,aAChB,EAIFN,KAAAM,UAAY,KAChB,GAAIN,KAAKO,SAAU,CAEf,OAAO,K,CAGX,GAAIP,KAAKK,QAAS,CACd,OAAO,I,GAIPL,KAAAQ,aAAgBC,IACpBA,EAAMC,kBACNV,KAAKW,OAAOC,KAAKH,EAAMI,OAAO,E,iBA1QQ,W,cAMb,K,cASD,M,cAYA,M,uFA0BD,M,yCAkBwB,G,cAYb,G,cAYV,M,iBAOE,K,QAYH,WAyCvBb,KAAKI,aAAeU,IACpBd,KAAKe,SAAWD,G,CAGbE,SACH,OACIb,EAACc,EAAI,CACDC,MAAO,CACH,oBAAqBlB,KAAKE,aAG9BC,EAAA,QAAMe,MAAM,mBACRf,EAAA,QAAMe,MAAM,oBACXlB,KAAKmB,cACNhB,EAAA,QAAMe,MAAM,sBAEflB,KAAKoB,e,CAKVA,eACJ,GAAIpB,KAAKO,WAAaP,KAAKqB,MAAO,CAC9B,MAAO,CACHlB,EAAA,QAAMe,MAAM,+BAA6B,KACzClB,KAAKC,mB,CAIb,GAAID,KAAKO,SAAU,CACf,MAAO,CACHJ,EAAA,kBACIkB,MAAOrB,KAAKqB,MAAK,gBACFrB,KAAKI,aACpBkB,GAAItB,KAAKe,WAEbf,KAAKuB,oBACLvB,KAAKC,mB,CAIb,MAAO,CACHE,EAAA,gDACsBH,KAAKwB,YACvBC,YAAazB,KAAKyB,YAClBC,SAAU1B,KAAKQ,aACfmB,eAAgB3B,KAAK2B,eACrBN,MAAOrB,KAAKqB,MAAK,gBACFrB,KAAKI,aACpBkB,GAAItB,KAAKe,SACTa,SAAU5B,KAAK6B,UAAY,EAAI,EAAC,gBACjB7B,KAAK6B,SACpBC,SAAU9B,KAAK8B,SACfC,kBAAmB/B,KAAKgC,WAE5BhC,KAAKuB,oBACLvB,KAAKC,mB,CAILkB,cACJ,IAAKnB,KAAKiC,MAAO,CACb,M,CAGJ,OACI9B,EAAA,QAAMe,MAAM,SACRf,EAAA,SAAO+B,QAASlC,KAAKe,UAAWf,KAAKiC,O,CAKzCV,oBACJ,IAAKvB,KAAKwB,aAAexB,KAAKqB,MAAO,CACjC,M,CAGJ,OACIlB,EAAA,QAAMe,MAAM,cAAa,cAAa,QACjClB,KAAKwB,Y"}