@aquera/nile-elements 0.1.64-beta-1.1 → 0.1.64-beta-1.2
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/demo/index.html +70 -53
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +590 -545
- package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.cjs.js.map +1 -1
- package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
- package/dist/nile-badge/index.cjs.js +1 -1
- package/dist/nile-badge/index.esm.js +1 -1
- package/dist/nile-badge/nile-badge.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.cjs.js.map +1 -1
- package/dist/nile-badge/nile-badge.esm.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js.map +1 -1
- package/dist/nile-badge/nile-badge.test.esm.js +1 -1
- package/dist/nile-button/index.cjs.js +1 -1
- package/dist/nile-button/index.esm.js +1 -1
- package/dist/nile-button/nile-button.cjs.js +1 -1
- package/dist/nile-button/nile-button.cjs.js.map +1 -1
- package/dist/nile-button/nile-button.esm.js +2 -2
- package/dist/nile-button/nile-button.test.cjs.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js.map +1 -1
- package/dist/nile-button/nile-button.test.esm.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js.map +1 -1
- package/dist/nile-calendar/nile-calendar.test.esm.js +5 -5
- package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js.map +1 -1
- package/dist/nile-chip/nile-chip.test.esm.js +1 -1
- package/dist/nile-dialog/index.cjs.js +1 -1
- package/dist/nile-dialog/index.esm.js +1 -1
- package/dist/nile-dialog/nile-dialog.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.cjs.js.map +1 -1
- package/dist/nile-dialog/nile-dialog.esm.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.cjs.js.map +1 -1
- package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
- package/dist/nile-drawer/index.cjs.js +1 -1
- package/dist/nile-drawer/index.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.cjs.js.map +1 -1
- package/dist/nile-drawer/nile-drawer.esm.js +2 -2
- package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js.map +1 -1
- package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
- package/dist/nile-icon/icons/svg/bold-try.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/bold-try.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/bold-try.esm.js +1 -0
- package/dist/nile-icon/icons/svg/index.cjs.js +1 -1
- package/dist/nile-icon/icons/svg/index.esm.js +1 -1
- package/dist/nile-icon/icons/svg/nile-bold.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-bold.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-bold.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-centeralign.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-centeralign.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-centeralign.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-italic.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-italic.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-italic.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-justify.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-justify.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-justify.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-leftalign.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-leftalign.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-leftalign.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-ol.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-ol.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-ol.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-rightalign.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-rightalign.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-rightalign.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-ul.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-ul.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-ul.esm.js +1 -0
- package/dist/nile-icon/icons/svg/nile-underline.cjs.js +2 -0
- package/dist/nile-icon/icons/svg/nile-underline.cjs.js.map +1 -0
- package/dist/nile-icon/icons/svg/nile-underline.esm.js +1 -0
- package/dist/nile-icon/index.cjs.js +1 -1
- package/dist/nile-icon/index.cjs.js.map +1 -1
- package/dist/nile-icon/index.esm.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js.map +1 -1
- package/dist/nile-icon/nile-icon.test.esm.js +1 -1
- package/dist/nile-icon-button/index.cjs.js +1 -1
- package/dist/nile-icon-button/index.esm.js +1 -1
- package/dist/nile-icon-button/nile-icon-button.cjs.js +1 -1
- package/dist/nile-icon-button/nile-icon-button.cjs.js.map +1 -1
- package/dist/nile-icon-button/nile-icon-button.esm.js +1 -1
- package/dist/nile-input/index.cjs.js +1 -1
- package/dist/nile-input/index.esm.js +1 -1
- package/dist/nile-input/nile-input.cjs.js +1 -1
- package/dist/nile-input/nile-input.cjs.js.map +1 -1
- package/dist/nile-input/nile-input.esm.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js.map +1 -1
- package/dist/nile-input/nile-input.test.esm.js +1 -1
- package/dist/nile-menu-item/index.cjs.js +1 -1
- package/dist/nile-menu-item/index.esm.js +1 -1
- package/dist/nile-menu-item/nile-menu-item.cjs.js +1 -1
- package/dist/nile-menu-item/nile-menu-item.cjs.js.map +1 -1
- package/dist/nile-menu-item/nile-menu-item.esm.js +1 -1
- package/dist/nile-option/index.cjs.js +1 -1
- package/dist/nile-option/index.esm.js +1 -1
- package/dist/nile-option/nile-option.cjs.js +1 -1
- package/dist/nile-option/nile-option.cjs.js.map +1 -1
- package/dist/nile-option/nile-option.esm.js +1 -1
- package/dist/nile-rich-text-editor/index.cjs.js +1 -1
- package/dist/nile-rich-text-editor/index.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +41 -4
- package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-mentions-item.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-mentions-item.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rte-mentions-item.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-mentions.cjs.js +2 -2
- package/dist/nile-rich-text-editor/nile-rte-mentions.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rte-mentions.esm.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.cjs.js +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.cjs.js.map +1 -1
- package/dist/nile-rich-text-editor/nile-rte-select.esm.js +14 -12
- package/dist/nile-select/index.cjs.js +1 -1
- package/dist/nile-select/index.esm.js +1 -1
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.esm.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.test.esm.js +1 -1
- package/dist/nile-tab/index.cjs.js +1 -1
- package/dist/nile-tab/index.esm.js +1 -1
- package/dist/nile-tab/nile-tab.cjs.js +1 -1
- package/dist/nile-tab/nile-tab.cjs.js.map +1 -1
- package/dist/nile-tab/nile-tab.esm.js +1 -1
- package/dist/nile-tab-group/index.cjs.js +1 -1
- package/dist/nile-tab-group/index.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.cjs.js.map +1 -1
- package/dist/nile-tab-group/nile-tab-group.esm.js +2 -2
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js.map +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
- package/dist/nile-tag/index.cjs.js +1 -1
- package/dist/nile-tag/index.esm.js +1 -1
- package/dist/nile-tag/nile-tag.cjs.js +1 -1
- package/dist/nile-tag/nile-tag.cjs.js.map +1 -1
- package/dist/nile-tag/nile-tag.esm.js +1 -1
- package/dist/nile-toast/index.cjs.js +1 -1
- package/dist/nile-toast/index.esm.js +1 -1
- package/dist/nile-toast/nile-toast.cjs.js +1 -1
- package/dist/nile-toast/nile-toast.cjs.js.map +1 -1
- package/dist/nile-toast/nile-toast.esm.js +1 -1
- package/dist/nile-tree/index.cjs.js +1 -1
- package/dist/nile-tree/index.esm.js +1 -1
- package/dist/nile-tree/nile-tree.cjs.js +1 -1
- package/dist/nile-tree/nile-tree.cjs.js.map +1 -1
- package/dist/nile-tree/nile-tree.esm.js +1 -1
- package/dist/nile-tree-item/index.cjs.js +1 -1
- package/dist/nile-tree-item/index.esm.js +1 -1
- package/dist/nile-tree-item/nile-tree-item.cjs.js +1 -1
- package/dist/nile-tree-item/nile-tree-item.cjs.js.map +1 -1
- package/dist/nile-tree-item/nile-tree-item.esm.js +1 -1
- package/dist/src/nile-icon/icons/svg/bold-try.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/bold-try.js +5 -0
- package/dist/src/nile-icon/icons/svg/bold-try.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/index.d.ts +10 -0
- package/dist/src/nile-icon/icons/svg/index.js +10 -0
- package/dist/src/nile-icon/icons/svg/index.js.map +1 -1
- package/dist/src/nile-icon/icons/svg/nile-bold.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-bold.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-bold.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-centeralign.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-centeralign.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-centeralign.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-italic.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-italic.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-italic.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-justify.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-justify.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-justify.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-leftalign.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-leftalign.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-leftalign.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-ol.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-ol.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-ol.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-rightalign.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-rightalign.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-rightalign.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-ul.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-ul.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-ul.js.map +1 -0
- package/dist/src/nile-icon/icons/svg/nile-underline.d.ts +5 -0
- package/dist/src/nile-icon/icons/svg/nile-underline.js +5 -0
- package/dist/src/nile-icon/icons/svg/nile-underline.js.map +1 -0
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.d.ts +0 -9
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +40 -11
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +1 -1
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +23 -70
- package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-mentions-item.d.ts +1 -0
- package/dist/src/nile-rich-text-editor/nile-rte-mentions-item.js +5 -0
- package/dist/src/nile-rich-text-editor/nile-rte-mentions-item.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-mentions.d.ts +3 -0
- package/dist/src/nile-rich-text-editor/nile-rte-mentions.js +39 -2
- package/dist/src/nile-rich-text-editor/nile-rte-mentions.js.map +1 -1
- package/dist/src/nile-rich-text-editor/nile-rte-select.js +26 -3
- package/dist/src/nile-rich-text-editor/nile-rte-select.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-icon/icons/svg/bold-try.ts +5 -0
- package/src/nile-icon/icons/svg/index.ts +10 -0
- package/src/nile-icon/icons/svg/nile-bold.ts +5 -0
- package/src/nile-icon/icons/svg/nile-centeralign.ts +5 -0
- package/src/nile-icon/icons/svg/nile-italic.ts +5 -0
- package/src/nile-icon/icons/svg/nile-justify.ts +5 -0
- package/src/nile-icon/icons/svg/nile-leftalign.ts +5 -0
- package/src/nile-icon/icons/svg/nile-ol.ts +5 -0
- package/src/nile-icon/icons/svg/nile-rightalign.ts +5 -0
- package/src/nile-icon/icons/svg/nile-ul.ts +5 -0
- package/src/nile-icon/icons/svg/nile-underline.ts +5 -0
- package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +42 -14
- package/src/nile-rich-text-editor/nile-rich-text-editor.ts +29 -67
- package/src/nile-rich-text-editor/nile-rte-mentions-item.ts +5 -0
- package/src/nile-rich-text-editor/nile-rte-mentions.ts +38 -4
- package/src/nile-rich-text-editor/nile-rte-select.ts +26 -4
- package/vscode-html-custom-data.json +10 -2
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nile-rte-mentions-item.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-mentions-item.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKrD,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAA5C;;QAGL,iDAAiD;QAEjD,sBAAiB,GAAW,EAAE,CAAC;
|
1
|
+
{"version":3,"file":"nile-rte-mentions-item.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-mentions-item.ts"],"names":[],"mappings":";AAAA,4BAA4B;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKrD,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAA5C;;QAGL,iDAAiD;QAEjD,sBAAiB,GAAW,EAAE,CAAC;QAI/B,kBAAa,GAAW,EAAE,CAAC,CAAC,MAAM;QAElC,mCAAmC;QAgBnC,iBAAY,GAAkB,EAAE,CAAC;IACnC,CAAC;IA3BW,gBAAgB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;CA2B3D,CAAA;AAvBC;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;8DACd;AAI/B;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;0DACd;AAkB3B;IAfC,QAAQ,CAAC;QACR,SAAS,EAAE,cAAc;QACzB,SAAS,EAAE;YACT,aAAa,EAAE,CAAC,KAAoB,EAAiB,EAAE;gBACrD,IAAI,CAAC,KAAK;oBAAE,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACjC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;wBAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;wBACnF,CAAC,CAAC,EAAE,CAAC;gBACT,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;YACxB,CAAC;YACD,WAAW,EAAE,CAAC,CAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;SAC3D;KACF,CAAC;yDAC+B;AA3BtB,mBAAmB;IAD/B,aAAa,CAAC,wBAAwB,CAAC;GAC3B,mBAAmB,CA4B/B","sourcesContent":["// nile-rte-mentions-item.ts\nimport { LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nexport type MentionItem = { key: string; label: string };\n\n@customElement('nile-rte-mentions-item')\nexport class NileRteMentionsItem extends LitElement {\n protected createRenderRoot() { return this; } // Light DOM\n\n /** Single-character trigger, e.g., '@' or '#' */\n @property({ attribute: 'mentionscharacter' })\n mentionsCharacter: string = '';\n\n \n @property({ attribute: 'mentionscolor' })\n mentionsColor: string = ''; // NEW\n\n /** JSON array of { key, label } */\n @property({\n attribute: 'mentionsdata',\n converter: {\n fromAttribute: (value: string | null): MentionItem[] => {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed)\n ? parsed.filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n : [];\n } catch { return []; }\n },\n toAttribute: (v: MentionItem[]) => JSON.stringify(v ?? []),\n }\n })\n mentionsData: MentionItem[] = [];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-mentions-item': NileRteMentionsItem;\n }\n}\n"]}
|
@@ -4,10 +4,12 @@ type MentionsConfig = Record<string, MentionItem[]>;
|
|
4
4
|
export declare class NileRteMentions extends LitElement {
|
5
5
|
protected createRenderRoot(): this;
|
6
6
|
mentions: MentionsConfig;
|
7
|
+
mentionColors: Record<string, string>;
|
7
8
|
/** External config from the editor (lowest priority) */
|
8
9
|
private externalConfig;
|
9
10
|
/** Config gathered from child <nile-rte-mentions-item> (highest priority) */
|
10
11
|
private itemsConfig;
|
12
|
+
private itemsColors;
|
11
13
|
private get config();
|
12
14
|
private editorEl;
|
13
15
|
private hostEl;
|
@@ -29,6 +31,7 @@ export declare class NileRteMentions extends LitElement {
|
|
29
31
|
disconnectedCallback(): void;
|
30
32
|
private rebuildConfigFromChildren;
|
31
33
|
private injectStyles;
|
34
|
+
private getTriggerColor;
|
32
35
|
private ensureMentionDropdown;
|
33
36
|
private onSelectionChange;
|
34
37
|
private saveSelection;
|
@@ -5,14 +5,15 @@ let NileRteMentions = class NileRteMentions extends LitElement {
|
|
5
5
|
constructor() {
|
6
6
|
super(...arguments);
|
7
7
|
this.mentions = {};
|
8
|
+
this.mentionColors = {}; // NEW
|
8
9
|
/** External config from the editor (lowest priority) */
|
9
10
|
this.externalConfig = {};
|
10
11
|
/** Config gathered from child <nile-rte-mentions-item> (highest priority) */
|
11
12
|
this.itemsConfig = {};
|
13
|
+
this.itemsColors = {}; // NEW
|
12
14
|
// wired from editor
|
13
15
|
this.editorEl = null;
|
14
16
|
this.hostEl = null;
|
15
|
-
// dropdown & menu elements we’ll create once and reuse
|
16
17
|
this.dropdownEl = null; // <nile-dropdown>
|
17
18
|
this.menuEl = null; // <nile-menu>
|
18
19
|
// selection caret
|
@@ -137,9 +138,9 @@ let NileRteMentions = class NileRteMentions extends LitElement {
|
|
137
138
|
// ---------- gather child items ----------
|
138
139
|
rebuildConfigFromChildren() {
|
139
140
|
const cfg = {};
|
141
|
+
const colors = {}; // NEW
|
140
142
|
const items = Array.from(this.querySelectorAll('nile-rte-mentions-item'));
|
141
143
|
for (const item of items) {
|
142
|
-
// read live properties first (if Lit already upgraded), else read attributes
|
143
144
|
const trig = item.mentionsCharacter ??
|
144
145
|
item.getAttribute('mentionscharacter') ??
|
145
146
|
'';
|
@@ -160,11 +161,17 @@ let NileRteMentions = class NileRteMentions extends LitElement {
|
|
160
161
|
return [];
|
161
162
|
}
|
162
163
|
})();
|
164
|
+
const color = item.mentionsColor ??
|
165
|
+
item.getAttribute('mentionscolor') ??
|
166
|
+
'';
|
163
167
|
if (!Array.isArray(data))
|
164
168
|
data = [];
|
165
169
|
cfg[trig] = data;
|
170
|
+
if (color)
|
171
|
+
colors[trig] = String(color); // record color if provided
|
166
172
|
}
|
167
173
|
this.itemsConfig = cfg;
|
174
|
+
this.itemsColors = colors; // NEW
|
168
175
|
}
|
169
176
|
// ---------- styles ----------
|
170
177
|
injectStyles() {
|
@@ -184,6 +191,10 @@ let NileRteMentions = class NileRteMentions extends LitElement {
|
|
184
191
|
`;
|
185
192
|
this.insertBefore(style, this.firstChild);
|
186
193
|
}
|
194
|
+
getTriggerColor(trigger) {
|
195
|
+
// Priority: child item color > attribute JSON color
|
196
|
+
return this.itemsColors[trigger] ?? this.mentionColors[trigger];
|
197
|
+
}
|
187
198
|
ensureMentionDropdown() {
|
188
199
|
if (this.dropdownEl || !this.hostEl)
|
189
200
|
return;
|
@@ -346,6 +357,12 @@ let NileRteMentions = class NileRteMentions extends LitElement {
|
|
346
357
|
const span = document.createElement('span');
|
347
358
|
span.classList.add('mention');
|
348
359
|
span.textContent = `${this.mentionTrigger}${item.label}`;
|
360
|
+
const bg = this.getTriggerColor(this.mentionTrigger);
|
361
|
+
if (bg) {
|
362
|
+
span.style.backgroundColor = bg;
|
363
|
+
// Optional: if you prefer colored text instead of bg
|
364
|
+
// span.style.color = bg;
|
365
|
+
}
|
349
366
|
mentionRange.insertNode(span);
|
350
367
|
const spaceNode = document.createTextNode('\u00A0');
|
351
368
|
span.after(spaceNode);
|
@@ -387,12 +404,32 @@ __decorate([
|
|
387
404
|
}
|
388
405
|
})
|
389
406
|
], NileRteMentions.prototype, "mentions", void 0);
|
407
|
+
__decorate([
|
408
|
+
property({
|
409
|
+
attribute: 'mentioncolors',
|
410
|
+
converter: {
|
411
|
+
fromAttribute: (value) => {
|
412
|
+
try {
|
413
|
+
const o = JSON.parse(value);
|
414
|
+
return (o && typeof o === 'object') ? o : {};
|
415
|
+
}
|
416
|
+
catch {
|
417
|
+
return {};
|
418
|
+
}
|
419
|
+
},
|
420
|
+
toAttribute: (v) => JSON.stringify(v ?? {})
|
421
|
+
}
|
422
|
+
})
|
423
|
+
], NileRteMentions.prototype, "mentionColors", void 0);
|
390
424
|
__decorate([
|
391
425
|
state()
|
392
426
|
], NileRteMentions.prototype, "externalConfig", void 0);
|
393
427
|
__decorate([
|
394
428
|
state()
|
395
429
|
], NileRteMentions.prototype, "itemsConfig", void 0);
|
430
|
+
__decorate([
|
431
|
+
state()
|
432
|
+
], NileRteMentions.prototype, "itemsColors", void 0);
|
396
433
|
NileRteMentions = __decorate([
|
397
434
|
customElement('nile-rte-mentions')
|
398
435
|
], NileRteMentions);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nile-rte-mentions.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-mentions.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { MentionItem } from './nile-rte-mentions-item';\n\ntype MentionsConfig = Record<string, MentionItem[]>;\n\n@customElement('nile-rte-mentions')\nexport class NileRteMentions extends LitElement {\n protected createRenderRoot() { return this; } \n\n \n @property({\n attribute: 'mentions',\n converter: {\n fromAttribute: (value: string): MentionsConfig => {\n try {\n const parsed = JSON.parse(value);\n const out: MentionsConfig = {};\n for (const trig of Object.keys(parsed)) {\n const arr = parsed[trig];\n if (Array.isArray(arr)) {\n out[trig] = arr\n .filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n .map(i => ({ key: i.key, label: i.label }));\n }\n }\n return out;\n } catch { return {}; }\n },\n toAttribute: (v: MentionsConfig) => JSON.stringify(v),\n }\n })\n mentions: MentionsConfig = {};\n\n /** External config from the editor (lowest priority) */\n @state() private externalConfig: MentionsConfig = {};\n\n /** Config gathered from child <nile-rte-mentions-item> (highest priority) */\n @state() private itemsConfig: MentionsConfig = {};\n\n private get config(): MentionsConfig {\n // Priority: external < attribute < child-items\n return { ...this.externalConfig, ...this.mentions, ...this.itemsConfig };\n }\n\n // wired from editor\n private editorEl: HTMLElement | null = null;\n private hostEl: HTMLElement | null = null;\n\n // dropdown & menu elements we’ll create once and reuse\nprivate dropdownEl: HTMLElement | null = null; // <nile-dropdown>\nprivate menuEl: HTMLElement | null = null; // <nile-menu>\n\n\n // selection caret\n private lastRange: Range | null = null;\n\n // dropdown state\n private mentionOpen = false;\n private mentionTrigger: string | null = null;\n private mentionQuery = '';\n private mentionSuggestions: MentionItem[] = [];\n private mentionFiltered: MentionItem[] = [];\n private mentionX = 0;\n private mentionY = 0;\nprivate triggerBtn: HTMLElement | null = null;\n\n \n\n // Observe child items & their attributes\n private mo: MutationObserver | null = null;\n\n // Public API used by <nile-rich-text-editor>\n attach(editorEl: HTMLElement, hostEl: HTMLElement) {\n this.editorEl = editorEl;\n this.hostEl = hostEl;\n\n this.injectStyles();\n this.ensureMentionDropdown();\n this.rebuildConfigFromChildren();\n\n // Watch for <nile-rte-mentions-item> add/remove/attr changes\n this.mo = new MutationObserver(() => this.rebuildConfigFromChildren());\n this.mo.observe(this, { childList: true, subtree: true, attributes: true });\n\n // listeners on editor\n this.editorEl.addEventListener('input', this.onEditorInput);\n this.editorEl.addEventListener('mouseup', this.saveSelection);\n this.editorEl.addEventListener('keyup', this.onEditorKeyUp);\n this.editorEl.addEventListener('keydown', this.onEditorKeyDown);\n this.editorEl.addEventListener('scroll', this.repositionMention);\n\n // keep range fresh\n document.addEventListener('selectionchange', this.onSelectionChange, true);\n }\n\n detach() {\n if (this.mo) { this.mo.disconnect(); this.mo = null; }\n if (this.editorEl) {\n this.editorEl.removeEventListener('input', this.onEditorInput);\n this.editorEl.removeEventListener('mouseup', this.saveSelection);\n this.editorEl.removeEventListener('keyup', this.onEditorKeyUp);\n this.editorEl.removeEventListener('keydown', this.onEditorKeyDown);\n this.editorEl.removeEventListener('scroll', this.repositionMention);\n }\n document.removeEventListener('selectionchange', this.onSelectionChange, true);\n }\n\n setExternalConfig(cfg: MentionsConfig) {\n this.externalConfig = cfg || {};\n }\n\n disconnectedCallback(): void {\n this.detach();\n super.disconnectedCallback();\n }\n\n // ---------- gather child items ----------\n private rebuildConfigFromChildren() {\n const cfg: MentionsConfig = {};\n const items = Array.from(this.querySelectorAll('nile-rte-mentions-item')) as Array<\n HTMLElement & { mentionsCharacter?: string; mentionsData?: MentionItem[] }\n >;\n\n for (const item of items) {\n // read live properties first (if Lit already upgraded), else read attributes\n const trig =\n (item as any).mentionsCharacter ??\n item.getAttribute('mentionscharacter') ??\n '';\n\n if (!trig || typeof trig !== 'string') continue;\n\n let data: MentionItem[] | null =\n (item as any).mentionsData ??\n (() => {\n const raw = item.getAttribute('mentionsdata');\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed)\n ? parsed.filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n : [];\n } catch { return []; }\n })();\n\n if (!Array.isArray(data)) data = [];\n cfg[trig] = data;\n }\n this.itemsConfig = cfg;\n }\n\n // ---------- styles ----------\n private injectStyles() {\n if (this.querySelector('style[data-mentions-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-mentions-style', 'true');\n style.textContent = `\n .mention-dropdown {\n position: absolute; z-index: 1000; list-style: none; margin: 0; padding: 4px;\n border: 1px solid #e5e7eb; border-radius: 6px; background: #fff;\n box-shadow: 0 4px 10px rgba(0,0,0,.08); max-height: 180px; overflow: auto; font-size: 14px;\n }\n .mention-dropdown li { padding: 6px 8px; cursor: pointer; border-radius: 4px; }\n .mention-dropdown li:hover { background: #f1f5f9; }\n .mention { background: #eef2ff; padding: 0 3px; border-radius: 3px; }\n `;\n this.insertBefore(style, this.firstChild);\n }\n\n \nprivate ensureMentionDropdown() {\n if (this.dropdownEl || !this.hostEl) return;\n\n const dd = document.createElement('nile-dropdown');\n dd.style.zIndex = '1000';\n\n const btn = document.createElement('nile-button'); // invisible trigger\n btn.setAttribute('slot', 'trigger');\n btn.style.position = 'absolute'; \n btn.style.width = '1px';\n btn.style.height = '1px';\n btn.style.border = '0';\n btn.style.padding = '0';\n btn.style.opacity = '0'; \n btn.style.pointerEvents = 'none'; \n dd.appendChild(btn);\n this.triggerBtn = btn; \n const menu = document.createElement('nile-menu');\n dd.appendChild(menu);\n\n this.hostEl.appendChild(dd);\n this.dropdownEl = dd;\n this.menuEl = menu;\n}\n\n // ---------- selection helpers ----------\n private onSelectionChange = () => {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (this.editorEl.contains(range.commonAncestorContainer)) {\n this.lastRange = range.cloneRange();\n }\n };\n private saveSelection = () => {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) this.lastRange = sel.getRangeAt(0).cloneRange();\n };\n private restoreSelection() {\n if (!this.lastRange) return;\n const sel = document.getSelection(); if (!sel) return;\n sel.removeAllRanges(); sel.addRange(this.lastRange);\n }\n private focusAndRestore() { this.editorEl?.focus(); this.restoreSelection(); }\n\n private getCaretClientRect(): DOMRect | null {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n\n const range = sel.getRangeAt(0).cloneRange();\n range.collapse(false);\n\n const rects = range.getClientRects();\n if (rects && rects.length > 0) return rects[0];\n\n const marker = document.createElement('span');\n marker.setAttribute('data-caret-marker', '1');\n marker.textContent = '\\u200B';\n range.insertNode(marker);\n\n const rect = marker.getBoundingClientRect();\n\n const after = document.createRange();\n after.setStartAfter(marker);\n after.collapse(true);\n sel.removeAllRanges();\n sel.addRange(after);\n marker.remove();\n\n return rect || null;\n }\n\n // ---------- editor events ----------\n private onEditorInput = () => {\n if (this.mentionOpen) this.handleMention();\n };\n\n private onEditorKeyUp = (e: KeyboardEvent) => {\n this.saveSelection();\n const key = e.key;\n const cfg = this.config;\n if (!this.mentionOpen && key && cfg[key]) {\n this.openMention(key);\n return;\n }\n if (this.mentionOpen) this.handleMention();\n };\n\n private onEditorKeyDown = (e: KeyboardEvent) => {\n if (!this.mentionOpen) return;\n const key = e.key;\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter') {\n e.preventDefault();\n if (key === 'Enter' && this.mentionFiltered.length) {\n this.selectMention(this.mentionFiltered[0]);\n }\n } else if (key === 'Escape') {\n e.preventDefault();\n this.closeMention();\n }\n };\n\n // ---------- mentions flow ----------\n private openMention(trigger: string) {\n this.saveSelection();\n if (!this.editorEl || !this.dropdownEl || !this.hostEl) return;\n\n const caretRect = this.getCaretClientRect();\n if (!caretRect) return;\n\n const hostRect = this.hostEl.getBoundingClientRect();\n\n this.mentionX = caretRect.left - hostRect.left;\n this.mentionY = caretRect.bottom - hostRect.top;\n\n this.mentionTrigger = trigger;\n this.mentionSuggestions = this.config[trigger] || [];\n this.mentionQuery = '';\n this.updateMentionFiltered();\n\n this.mentionOpen = true;\n this.renderMentionList();\n }\n\n private closeMention() {\n this.mentionOpen = false;\n this.mentionTrigger = null;\n this.mentionQuery = '';\n this.mentionFiltered = [];\n // hide dropdown\n this.dropdownEl?.removeAttribute('open');\n }\n\n private handleMention() {\n if (!this.mentionOpen || !this.mentionTrigger) return;\n const sel = window.getSelection(); if (!sel || !sel.anchorNode) return;\n\n let node: Node | null = sel.anchorNode;\n if (node.nodeType !== Node.TEXT_NODE) {\n const c = (node as HTMLElement).childNodes?.[sel.anchorOffset] || node.firstChild;\n if (c?.nodeType === Node.TEXT_NODE) node = c;\n }\n const text = (node && node.nodeType === Node.TEXT_NODE) ? (node.textContent || '') : '';\n const idx = text.lastIndexOf(this.mentionTrigger);\n if (idx >= 0) {\n this.mentionQuery = text.substring(idx + 1);\n this.updateMentionFiltered();\n this.renderMentionList();\n } else {\n this.closeMention();\n }\n }\n\n private updateMentionFiltered() {\n const q = this.mentionQuery.toLowerCase();\n this.mentionFiltered = (this.mentionSuggestions || []).filter(item =>\n item.label.toLowerCase().startsWith(q)\n );\n }\n\n private renderMentionList() {\n if (!this.dropdownEl || !this.menuEl) return;\n \n if (!this.triggerBtn) return;\n this.triggerBtn.style.position = 'absolute';\n this.triggerBtn.style.left = `${this.mentionX}px`;\n this.triggerBtn.style.top = `${this.mentionY}px`;\n \n \n // clear old items\n this.menuEl.innerHTML = '';\n \n if (!this.mentionOpen || !this.mentionFiltered.length) {\n this.dropdownEl.removeAttribute('open');\n return;\n }\n \n // build menu items\n for (const item of this.mentionFiltered) {\n const mi = document.createElement('nile-menu-item');\n mi.textContent = item.label;\n mi.addEventListener('mousedown', (e) => {\n e.preventDefault();\n this.selectMention(item);\n });\n this.menuEl.appendChild(mi);\n }\n \n // show dropdown\n this.dropdownEl.setAttribute('open', '');\n }\n \n\n private repositionMention = () => {\n if (!this.mentionOpen || !this.hostEl || !this.triggerBtn) return;\n\n const caretRect = this.getCaretClientRect();\n if (!caretRect) return;\n\n const hostRect = this.hostEl.getBoundingClientRect();\n\n this.mentionX = caretRect.left - hostRect.left;\n this.mentionY = caretRect.bottom - hostRect.top;\n\n this.triggerBtn.style.left = `${this.mentionX}px`;\n this.triggerBtn.style.top = `${this.mentionY}px`;\n };\n\n private selectMention(item: MentionItem) {\n this.restoreSelection(); if (!this.lastRange || !this.mentionTrigger || !this.editorEl) return;\n\n let node: Node = this.lastRange.startContainer;\n let offset = this.lastRange.startOffset;\n if (node.nodeType !== Node.TEXT_NODE) {\n const child = node.childNodes[offset];\n if (child?.nodeType === Node.TEXT_NODE) { node = child; offset = 0; } else return;\n }\n const textNode = node as Text;\n const text = textNode.textContent || '';\n const atIndex = text.lastIndexOf(this.mentionTrigger, offset);\n if (atIndex < 0) return;\n\n const endIndex = atIndex + 1 + this.mentionQuery.length;\n const mentionRange = document.createRange();\n mentionRange.setStart(textNode, atIndex);\n mentionRange.setEnd(textNode, endIndex);\n mentionRange.deleteContents();\n\n const span = document.createElement('span');\n span.classList.add('mention');\n span.textContent = `${this.mentionTrigger}${item.label}`;\n mentionRange.insertNode(span);\n\n const spaceNode = document.createTextNode('\\u00A0');\n span.after(spaceNode);\n\n const sel = window.getSelection();\n const afterRange = document.createRange();\n afterRange.setStartAfter(spaceNode); afterRange.collapse(true);\n sel?.removeAllRanges(); sel?.addRange(afterRange);\n this.lastRange = afterRange.cloneRange();\n\n this.closeMention();\n\n // bubble an input event so the editor updates preview/state\n this.editorEl.dispatchEvent(new InputEvent('input', { bubbles: true }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-mentions': NileRteMentions;\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"nile-rte-mentions.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-mentions.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { MentionItem } from './nile-rte-mentions-item';\n\ntype MentionsConfig = Record<string, MentionItem[]>;\n\n@customElement('nile-rte-mentions')\nexport class NileRteMentions extends LitElement {\n protected createRenderRoot() { return this; } \n\n \n @property({\n attribute: 'mentions',\n converter: {\n fromAttribute: (value: string): MentionsConfig => {\n try {\n const parsed = JSON.parse(value);\n const out: MentionsConfig = {};\n for (const trig of Object.keys(parsed)) {\n const arr = parsed[trig];\n if (Array.isArray(arr)) {\n out[trig] = arr\n .filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n .map(i => ({ key: i.key, label: i.label }));\n }\n }\n return out;\n } catch { return {}; }\n },\n toAttribute: (v: MentionsConfig) => JSON.stringify(v),\n }\n })\n mentions: MentionsConfig = {};\n\n @property({\n attribute: 'mentioncolors',\n converter: {\n fromAttribute: (value: string): Record<string,string> => {\n try { const o = JSON.parse(value); return (o && typeof o === 'object') ? o : {}; }\n catch { return {}; }\n },\n toAttribute: (v: Record<string,string>) => JSON.stringify(v ?? {})\n }\n })\n mentionColors: Record<string, string> = {}; // NEW\n\n /** External config from the editor (lowest priority) */\n @state() private externalConfig: MentionsConfig = {};\n\n /** Config gathered from child <nile-rte-mentions-item> (highest priority) */\n @state() private itemsConfig: MentionsConfig = {};\n\n @state() private itemsColors: Record<string,string> = {}; // NEW\n\n private get config(): MentionsConfig {\n // Priority: external < attribute < child-items\n return { ...this.externalConfig, ...this.mentions, ...this.itemsConfig };\n }\n\n // wired from editor\n private editorEl: HTMLElement | null = null;\n private hostEl: HTMLElement | null = null;\n\n \nprivate dropdownEl: HTMLElement | null = null; // <nile-dropdown>\nprivate menuEl: HTMLElement | null = null; // <nile-menu>\n\n\n // selection caret\n private lastRange: Range | null = null;\n\n // dropdown state\n private mentionOpen = false;\n private mentionTrigger: string | null = null;\n private mentionQuery = '';\n private mentionSuggestions: MentionItem[] = [];\n private mentionFiltered: MentionItem[] = [];\n private mentionX = 0;\n private mentionY = 0;\nprivate triggerBtn: HTMLElement | null = null;\n\n \n\n // Observe child items & their attributes\n private mo: MutationObserver | null = null;\n\n // Public API used by <nile-rich-text-editor>\n attach(editorEl: HTMLElement, hostEl: HTMLElement) {\n this.editorEl = editorEl;\n this.hostEl = hostEl;\n\n this.injectStyles();\n this.ensureMentionDropdown();\n this.rebuildConfigFromChildren();\n\n // Watch for <nile-rte-mentions-item> add/remove/attr changes\n this.mo = new MutationObserver(() => this.rebuildConfigFromChildren());\n this.mo.observe(this, { childList: true, subtree: true, attributes: true });\n\n // listeners on editor\n this.editorEl.addEventListener('input', this.onEditorInput);\n this.editorEl.addEventListener('mouseup', this.saveSelection);\n this.editorEl.addEventListener('keyup', this.onEditorKeyUp);\n this.editorEl.addEventListener('keydown', this.onEditorKeyDown);\n this.editorEl.addEventListener('scroll', this.repositionMention);\n\n // keep range fresh\n document.addEventListener('selectionchange', this.onSelectionChange, true);\n }\n\n detach() {\n if (this.mo) { this.mo.disconnect(); this.mo = null; }\n if (this.editorEl) {\n this.editorEl.removeEventListener('input', this.onEditorInput);\n this.editorEl.removeEventListener('mouseup', this.saveSelection);\n this.editorEl.removeEventListener('keyup', this.onEditorKeyUp);\n this.editorEl.removeEventListener('keydown', this.onEditorKeyDown);\n this.editorEl.removeEventListener('scroll', this.repositionMention);\n }\n document.removeEventListener('selectionchange', this.onSelectionChange, true);\n }\n\n setExternalConfig(cfg: MentionsConfig) {\n this.externalConfig = cfg || {};\n }\n\n disconnectedCallback(): void {\n this.detach();\n super.disconnectedCallback();\n }\n\n // ---------- gather child items ----------\n private rebuildConfigFromChildren() {\n const cfg: MentionsConfig = {};\n const colors: Record<string,string> = {}; // NEW\n\n const items = Array.from(this.querySelectorAll('nile-rte-mentions-item')) as Array<\n HTMLElement & { mentionsCharacter?: string; mentionsData?: MentionItem[]; mentionsColor?: string }\n >;\n\n for (const item of items) {\n const trig =\n (item as any).mentionsCharacter ??\n item.getAttribute('mentionscharacter') ??\n '';\n\n if (!trig || typeof trig !== 'string') continue;\n\n let data: MentionItem[] | null =\n (item as any).mentionsData ??\n (() => {\n const raw = item.getAttribute('mentionsdata');\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed)\n ? parsed.filter(i => i && typeof i.key === 'string' && typeof i.label === 'string')\n : [];\n } catch { return []; }\n })();\n\n const color =\n (item as any).mentionsColor ??\n item.getAttribute('mentionscolor') ??\n '';\n\n if (!Array.isArray(data)) data = [];\n cfg[trig] = data;\n if (color) colors[trig] = String(color); // record color if provided\n }\n\n this.itemsConfig = cfg;\n this.itemsColors = colors; // NEW\n }\n // ---------- styles ----------\n private injectStyles() {\n if (this.querySelector('style[data-mentions-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-mentions-style', 'true');\n style.textContent = `\n .mention-dropdown {\n position: absolute; z-index: 1000; list-style: none; margin: 0; padding: 4px;\n border: 1px solid #e5e7eb; border-radius: 6px; background: #fff;\n box-shadow: 0 4px 10px rgba(0,0,0,.08); max-height: 180px; overflow: auto; font-size: 14px;\n }\n .mention-dropdown li { padding: 6px 8px; cursor: pointer; border-radius: 4px; }\n .mention-dropdown li:hover { background: #f1f5f9; }\n .mention { background: #eef2ff; padding: 0 3px; border-radius: 3px; }\n `;\n this.insertBefore(style, this.firstChild);\n }\n\n private getTriggerColor(trigger: string): string | undefined {\n // Priority: child item color > attribute JSON color\n return this.itemsColors[trigger] ?? this.mentionColors[trigger];\n }\n\n \nprivate ensureMentionDropdown() {\n if (this.dropdownEl || !this.hostEl) return;\n\n const dd = document.createElement('nile-dropdown');\n dd.style.zIndex = '1000';\n\n const btn = document.createElement('nile-button'); // invisible trigger\n btn.setAttribute('slot', 'trigger');\n btn.style.position = 'absolute'; \n btn.style.width = '1px';\n btn.style.height = '1px';\n btn.style.border = '0';\n btn.style.padding = '0';\n btn.style.opacity = '0'; \n btn.style.pointerEvents = 'none'; \n dd.appendChild(btn);\n this.triggerBtn = btn; \n const menu = document.createElement('nile-menu');\n dd.appendChild(menu);\n\n this.hostEl.appendChild(dd);\n this.dropdownEl = dd;\n this.menuEl = menu;\n}\n\n // ---------- selection helpers ----------\n private onSelectionChange = () => {\n if (!this.editorEl) return;\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n if (this.editorEl.contains(range.commonAncestorContainer)) {\n this.lastRange = range.cloneRange();\n }\n };\n private saveSelection = () => {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) this.lastRange = sel.getRangeAt(0).cloneRange();\n };\n private restoreSelection() {\n if (!this.lastRange) return;\n const sel = document.getSelection(); if (!sel) return;\n sel.removeAllRanges(); sel.addRange(this.lastRange);\n }\n private focusAndRestore() { this.editorEl?.focus(); this.restoreSelection(); }\n\n private getCaretClientRect(): DOMRect | null {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n\n const range = sel.getRangeAt(0).cloneRange();\n range.collapse(false);\n\n const rects = range.getClientRects();\n if (rects && rects.length > 0) return rects[0];\n\n const marker = document.createElement('span');\n marker.setAttribute('data-caret-marker', '1');\n marker.textContent = '\\u200B';\n range.insertNode(marker);\n\n const rect = marker.getBoundingClientRect();\n\n const after = document.createRange();\n after.setStartAfter(marker);\n after.collapse(true);\n sel.removeAllRanges();\n sel.addRange(after);\n marker.remove();\n\n return rect || null;\n }\n\n // ---------- editor events ----------\n private onEditorInput = () => {\n if (this.mentionOpen) this.handleMention();\n };\n\n private onEditorKeyUp = (e: KeyboardEvent) => {\n this.saveSelection();\n const key = e.key;\n const cfg = this.config;\n if (!this.mentionOpen && key && cfg[key]) {\n this.openMention(key);\n return;\n }\n if (this.mentionOpen) this.handleMention();\n };\n\n private onEditorKeyDown = (e: KeyboardEvent) => {\n if (!this.mentionOpen) return;\n const key = e.key;\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter') {\n e.preventDefault();\n if (key === 'Enter' && this.mentionFiltered.length) {\n this.selectMention(this.mentionFiltered[0]);\n }\n } else if (key === 'Escape') {\n e.preventDefault();\n this.closeMention();\n }\n };\n\n // ---------- mentions flow ----------\n private openMention(trigger: string) {\n this.saveSelection();\n if (!this.editorEl || !this.dropdownEl || !this.hostEl) return;\n\n const caretRect = this.getCaretClientRect();\n if (!caretRect) return;\n\n const hostRect = this.hostEl.getBoundingClientRect();\n\n this.mentionX = caretRect.left - hostRect.left;\n this.mentionY = caretRect.bottom - hostRect.top;\n\n this.mentionTrigger = trigger;\n this.mentionSuggestions = this.config[trigger] || [];\n this.mentionQuery = '';\n this.updateMentionFiltered();\n\n this.mentionOpen = true;\n this.renderMentionList();\n }\n\n private closeMention() {\n this.mentionOpen = false;\n this.mentionTrigger = null;\n this.mentionQuery = '';\n this.mentionFiltered = [];\n // hide dropdown\n this.dropdownEl?.removeAttribute('open');\n }\n\n private handleMention() {\n if (!this.mentionOpen || !this.mentionTrigger) return;\n const sel = window.getSelection(); if (!sel || !sel.anchorNode) return;\n\n let node: Node | null = sel.anchorNode;\n if (node.nodeType !== Node.TEXT_NODE) {\n const c = (node as HTMLElement).childNodes?.[sel.anchorOffset] || node.firstChild;\n if (c?.nodeType === Node.TEXT_NODE) node = c;\n }\n const text = (node && node.nodeType === Node.TEXT_NODE) ? (node.textContent || '') : '';\n const idx = text.lastIndexOf(this.mentionTrigger);\n if (idx >= 0) {\n this.mentionQuery = text.substring(idx + 1);\n this.updateMentionFiltered();\n this.renderMentionList();\n } else {\n this.closeMention();\n }\n }\n\n private updateMentionFiltered() {\n const q = this.mentionQuery.toLowerCase();\n this.mentionFiltered = (this.mentionSuggestions || []).filter(item =>\n item.label.toLowerCase().startsWith(q)\n );\n }\n\n private renderMentionList() {\n if (!this.dropdownEl || !this.menuEl) return;\n \n if (!this.triggerBtn) return;\n this.triggerBtn.style.position = 'absolute';\n this.triggerBtn.style.left = `${this.mentionX}px`;\n this.triggerBtn.style.top = `${this.mentionY}px`;\n \n \n // clear old items\n this.menuEl.innerHTML = '';\n \n if (!this.mentionOpen || !this.mentionFiltered.length) {\n this.dropdownEl.removeAttribute('open');\n return;\n }\n \n // build menu items\n for (const item of this.mentionFiltered) {\n const mi = document.createElement('nile-menu-item');\n mi.textContent = item.label;\n mi.addEventListener('mousedown', (e) => {\n e.preventDefault();\n this.selectMention(item);\n });\n this.menuEl.appendChild(mi);\n }\n \n // show dropdown\n this.dropdownEl.setAttribute('open', '');\n }\n \n\n private repositionMention = () => {\n if (!this.mentionOpen || !this.hostEl || !this.triggerBtn) return;\n\n const caretRect = this.getCaretClientRect();\n if (!caretRect) return;\n\n const hostRect = this.hostEl.getBoundingClientRect();\n\n this.mentionX = caretRect.left - hostRect.left;\n this.mentionY = caretRect.bottom - hostRect.top;\n\n this.triggerBtn.style.left = `${this.mentionX}px`;\n this.triggerBtn.style.top = `${this.mentionY}px`;\n };\n\n private selectMention(item: MentionItem) {\n this.restoreSelection(); if (!this.lastRange || !this.mentionTrigger || !this.editorEl) return;\n\n let node: Node = this.lastRange.startContainer;\n let offset = this.lastRange.startOffset;\n if (node.nodeType !== Node.TEXT_NODE) {\n const child = node.childNodes[offset];\n if (child?.nodeType === Node.TEXT_NODE) { node = child; offset = 0; } else return;\n }\n const textNode = node as Text;\n const text = textNode.textContent || '';\n const atIndex = text.lastIndexOf(this.mentionTrigger, offset);\n if (atIndex < 0) return;\n\n const endIndex = atIndex + 1 + this.mentionQuery.length;\n const mentionRange = document.createRange();\n mentionRange.setStart(textNode, atIndex);\n mentionRange.setEnd(textNode, endIndex);\n mentionRange.deleteContents();\n\n const span = document.createElement('span');\n span.classList.add('mention');\n span.textContent = `${this.mentionTrigger}${item.label}`;\n const bg = this.getTriggerColor(this.mentionTrigger);\n if (bg) {\n span.style.backgroundColor = bg;\n // Optional: if you prefer colored text instead of bg\n // span.style.color = bg;\n }\n\n mentionRange.insertNode(span);\n\n const spaceNode = document.createTextNode('\\u00A0');\n span.after(spaceNode);\n\n const sel = window.getSelection();\n const afterRange = document.createRange();\n afterRange.setStartAfter(spaceNode); afterRange.collapse(true);\n sel?.removeAllRanges(); sel?.addRange(afterRange);\n this.lastRange = afterRange.cloneRange();\n\n this.closeMention();\n\n // bubble an input event so the editor updates preview/state\n this.editorEl.dispatchEvent(new InputEvent('input', { bubbles: true }));\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-mentions': NileRteMentions;\n }\n}\n"]}
|
@@ -19,7 +19,7 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
19
19
|
left: 'align-left',
|
20
20
|
center: 'align-center',
|
21
21
|
right: 'align-right',
|
22
|
-
justify: '
|
22
|
+
justify: 'nile-justify'
|
23
23
|
};
|
24
24
|
return map[v] || 'align-left';
|
25
25
|
}
|
@@ -65,7 +65,7 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
65
65
|
display: flex;
|
66
66
|
}
|
67
67
|
nile-menu.rte-align-menu,nile-menu.rte-default-menu{
|
68
|
-
|
68
|
+
margin-top: 0px;
|
69
69
|
}
|
70
70
|
|
71
71
|
nile-button.rte-align-trigger::part(base),nile-button.rte-default-trigger::part(base){
|
@@ -103,14 +103,37 @@ let NileRteSelect = class NileRteSelect extends LitElement {
|
|
103
103
|
`)}
|
104
104
|
</nile-menu>
|
105
105
|
</nile-dropdown>
|
106
|
+
|
107
|
+
|
106
108
|
`;
|
109
|
+
if (this.type === 'font') {
|
110
|
+
const triggerText = current?.label || this.label || 'Font';
|
111
|
+
return html `
|
112
|
+
<nile-dropdown class="rte-default-dd">
|
113
|
+
<nile-button slot="trigger" variant="tertiary" class="rte-default-trigger"
|
114
|
+
style="font-family: ${current?.value || 'inherit'}">
|
115
|
+
${triggerText} <nile-icon name="arrowdown"></nile-icon>
|
116
|
+
</nile-button>
|
117
|
+
<nile-menu class="rte-default-menu">
|
118
|
+
${opts.map(o => html `
|
119
|
+
<nile-menu-item
|
120
|
+
style="font-family: ${o.value}"
|
121
|
+
?active=${o.value === this.selectedValue}
|
122
|
+
@click=${() => this.onSelect(o.value)}>
|
123
|
+
${o.label}
|
124
|
+
</nile-menu-item>
|
125
|
+
`)}
|
126
|
+
</nile-menu>
|
127
|
+
</nile-dropdown>
|
128
|
+
`;
|
129
|
+
}
|
107
130
|
}
|
108
131
|
// ► Everything else: default (text) dropdown
|
109
132
|
const triggerText = current?.label || this.label || 'Select';
|
110
133
|
return html `
|
111
134
|
<nile-dropdown class="rte-default-dd">
|
112
135
|
<nile-button slot="trigger" variant="tertiary" class="rte-default-trigger">
|
113
|
-
${triggerText}
|
136
|
+
${triggerText} <nile-icon name="arrowdown"></nile-icon>
|
114
137
|
</nile-button>
|
115
138
|
<nile-menu class="rte-default-menu">
|
116
139
|
${opts.map(o => html `
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nile-rte-select.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-select.ts"],"names":[],"mappings":";AAAA,qBAAqB;AACrB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI5D,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAAtC;;QAGL,mCAAmC;QACP,SAAI,GAAG,EAAE,CAAC;QACtC,4CAA4C;QAChB,YAAO,GAAG,IAAI,CAAC;QAC3C,iDAAiD;QACrB,UAAK,GAAG,EAAE,CAAC;QAEtB,kBAAa,GAAG,EAAE,CAAC;
|
1
|
+
{"version":3,"file":"nile-rte-select.js","sourceRoot":"","sources":["../../../src/nile-rich-text-editor/nile-rte-select.ts"],"names":[],"mappings":"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","sourcesContent":["// nile-rte-select.ts\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n\n@customElement('nile-rte-select')\nexport class NileRteSelect extends LitElement {\n protected createRenderRoot() { return this; }\n\n /** 'heading' | 'font' | 'align' */\n @property({ type: String }) type = '';\n /** JSON: [{ value, label?, icon? }, ...] */\n @property({ type: String }) options = '[]';\n /** Fallback label for trigger (e.g., \"Align\") */\n @property({ type: String }) label = '';\n\n @state() private selectedValue = '';\n\n private mapAlignIcon(v: string) {\n const map: Record<string,string> = {\n left: 'align-left',\n center: 'align-center',\n right: 'align-right',\n justify: 'nile-justify'\n };\n return map[v] || 'align-left';\n }\n\n private get parsedOptions(): Array<{ value: string; label: string; icon?: string }> {\n try {\n const raw = JSON.parse(this.options);\n return raw.map((o: any) => {\n const value = o.value ?? o;\n const label = o.label ?? o.value ?? o;\n const icon = o.icon ?? (this.type === 'align' ? this.mapAlignIcon(String(value)) : undefined);\n return { value, label, icon };\n });\n } catch {\n return [];\n }\n }\n\n private ensureDefault() {\n if (!this.selectedValue) {\n const first = this.parsedOptions[0];\n if (first) this.selectedValue = first.value;\n }\n }\n\n private onSelect(value: string) {\n this.selectedValue = value;\n this.dispatchEvent(new CustomEvent('change', {\n detail: value, bubbles: true, composed: true\n }));\n }\n\n \n\n connectedCallback(): void {\n super.connectedCallback();\n this.injectLocalStyles(); \n }\n\n private injectLocalStyles() {\n \n if (this.querySelector('style[data-rte-select-style]')) return;\n\n const style = document.createElement('style');\n style.setAttribute('data-rte-select-style', 'true');\n style.textContent = `\n\n nile-menu.rte-align-menu::part(menu__items-wrapper) {\n display: flex;\n }\n nile-menu.rte-align-menu,nile-menu.rte-default-menu{\n margin-top: 0px;\n }\n\n nile-button.rte-align-trigger::part(base),nile-button.rte-default-trigger::part(base){\n min-width: 32px;\n height: 32px;\n padding: 0px 6px;\n box-shadow: none;\n }\n \n `;\n \n this.insertBefore(style, this.firstChild);\n }\n\n\n render() {\n const opts = this.parsedOptions;\n this.ensureDefault();\n const current = opts.find(o => o.value === this.selectedValue);\n\n if (this.type === 'align') {\n // ► Align: separate dropdown instance + icon-only items + icon trigger\n const trigger = current?.icon\n ? html`<nile-icon name=\"${current.icon}\"></nile-icon>`\n : (this.label || 'Align');\n return html`\n <nile-dropdown class=\"rte-align-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-align-trigger\">\n ${trigger}\n </nile-button>\n <nile-menu class=\"rte-align-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n class=\"rte-align-item\"\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n <nile-icon name=\"${o.icon}\"></nile-icon>\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n\n \n `;\n if (this.type === 'font') {\n const triggerText = current?.label || this.label || 'Font';\n return html`\n <nile-dropdown class=\"rte-default-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-default-trigger\"\n style=\"font-family: ${current?.value || 'inherit'}\">\n ${triggerText} <nile-icon name=\"arrowdown\"></nile-icon>\n </nile-button>\n <nile-menu class=\"rte-default-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n style=\"font-family: ${o.value}\"\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n ${o.label}\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n }\n\n // ► Everything else: default (text) dropdown\n const triggerText = current?.label || this.label || 'Select';\n return html`\n <nile-dropdown class=\"rte-default-dd\">\n <nile-button slot=\"trigger\" variant=\"tertiary\" class=\"rte-default-trigger\">\n ${triggerText} <nile-icon name=\"arrowdown\"></nile-icon>\n </nile-button>\n <nile-menu class=\"rte-default-menu\">\n ${opts.map(o => html`\n <nile-menu-item\n ?active=${o.value === this.selectedValue}\n @click=${() => this.onSelect(o.value)}>\n ${o.label}\n </nile-menu-item>\n `)}\n </nile-menu>\n </nile-dropdown>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-select': NileRteSelect;\n }\n}\n"]}
|