luxen-ui 0.24.0 → 0.26.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 (249) hide show
  1. package/README.md +1 -0
  2. package/bin/cli.mjs +16 -1
  3. package/cdn/custom-elements.json +295 -169
  4. package/cdn/elements/alert-dialog/alert-dialog.d.ts +3 -2
  5. package/cdn/elements/alert-dialog/alert-dialog.d.ts.map +1 -1
  6. package/cdn/elements/alert-dialog/alert-dialog.js.map +1 -1
  7. package/cdn/elements/avatar/avatar.js +1 -1
  8. package/cdn/elements/avatar/avatar.js.map +1 -1
  9. package/cdn/elements/carousel/carousel.js +1 -1
  10. package/cdn/elements/carousel/carousel.js.map +1 -1
  11. package/cdn/elements/combobox/combobox.d.ts.map +1 -1
  12. package/cdn/elements/combobox/combobox.js +2 -1
  13. package/cdn/elements/combobox/combobox.js.map +1 -1
  14. package/cdn/elements/dialog/dialog.d.ts +2 -1
  15. package/cdn/elements/dialog/dialog.d.ts.map +1 -1
  16. package/cdn/elements/dialog/dialog.js.map +1 -1
  17. package/cdn/elements/dialog/dialog.styles.js +1 -1
  18. package/cdn/elements/dialog/dialog.styles.js.map +1 -1
  19. package/cdn/elements/drawer/drawer.d.ts +7 -7
  20. package/cdn/elements/drawer/drawer.js +1 -1
  21. package/cdn/elements/drawer/drawer.js.map +1 -1
  22. package/cdn/elements/dropdown-item/dropdown-item.js +1 -1
  23. package/cdn/elements/dropdown-item/dropdown-item.js.map +1 -1
  24. package/cdn/elements/input-otp/input-otp.d.ts +2 -2
  25. package/cdn/elements/input-otp/input-otp.js.map +1 -1
  26. package/cdn/elements/prose-editor/prose-editor.js +1 -1
  27. package/cdn/elements/prose-editor/prose-editor.js.map +1 -1
  28. package/cdn/elements/rating/rating.js +1 -1
  29. package/cdn/elements/rating/rating.js.map +1 -1
  30. package/cdn/elements/select/select.d.ts.map +1 -1
  31. package/cdn/elements/select/select.js +2 -1
  32. package/cdn/elements/select/select.js.map +1 -1
  33. package/cdn/elements/slider/slider.js +1 -1
  34. package/cdn/elements/slider/slider.js.map +1 -1
  35. package/cdn/elements/stories-viewer/stories-viewer.js +1 -1
  36. package/cdn/elements/stories-viewer/stories-viewer.js.map +1 -1
  37. package/cdn/elements/table/table.meta.d.ts +55 -0
  38. package/cdn/elements/table/table.meta.d.ts.map +1 -0
  39. package/cdn/elements/table/table.meta.js +0 -0
  40. package/cdn/elements/tag/tag.js +1 -1
  41. package/cdn/elements/tag/tag.js.map +1 -1
  42. package/cdn/elements/tree/tree.js +1 -1
  43. package/cdn/elements/tree/tree.js.map +1 -1
  44. package/cdn/elements/tree-item/tree-item.js +1 -1
  45. package/cdn/elements/tree-item/tree-item.js.map +1 -1
  46. package/cdn/shared/controllers/listbox-nav.d.ts +7 -0
  47. package/cdn/shared/controllers/listbox-nav.d.ts.map +1 -1
  48. package/cdn/shared/controllers/listbox-nav.js +1 -1
  49. package/cdn/shared/controllers/listbox-nav.js.map +1 -1
  50. package/cdn/shared/styles/button-core.styles.js +1 -1
  51. package/cdn/shared/styles/button-core.styles.js.map +1 -1
  52. package/cdn/shared/styles/checkbox-appearance.styles.js +1 -1
  53. package/cdn/shared/styles/checkbox-appearance.styles.js.map +1 -1
  54. package/cdn/shared/styles/picker-core.styles.js +1 -1
  55. package/cdn/shared/styles/picker-core.styles.js.map +1 -1
  56. package/cdn/standalone.css +392 -86
  57. package/cdn/standalone.js +38 -28
  58. package/cdn/standalone.js.map +1 -1
  59. package/cdn/styles/base.css +11 -0
  60. package/cdn/styles/elements/breadcrumb.css +2 -2
  61. package/cdn/styles/elements/button.css +2 -2
  62. package/cdn/styles/elements/checkbox.css +2 -2
  63. package/cdn/styles/elements/close-button/circle.css +2 -2
  64. package/cdn/styles/elements/close-button/ring.css +2 -2
  65. package/cdn/styles/elements/close-button/square.css +2 -2
  66. package/cdn/styles/elements/disclosure.css +2 -2
  67. package/cdn/styles/elements/input-otp.css +20 -4
  68. package/cdn/styles/elements/input-stepper/default.css +2 -2
  69. package/cdn/styles/elements/input-stepper/pill.css +2 -2
  70. package/cdn/styles/elements/input-stepper/rounded.css +2 -2
  71. package/cdn/styles/elements/input.css +50 -17
  72. package/cdn/styles/elements/prose-editor.css +26 -11
  73. package/cdn/styles/elements/radio-group.css +2 -2
  74. package/cdn/styles/elements/radio.css +2 -2
  75. package/cdn/styles/elements/segmented-control.css +2 -2
  76. package/cdn/styles/elements/select.css +26 -5
  77. package/cdn/styles/elements/story.css +2 -2
  78. package/cdn/styles/elements/switch.css +2 -2
  79. package/cdn/styles/elements/table.css +186 -0
  80. package/cdn/styles/elements/tabs/enclosed.css +4 -4
  81. package/cdn/styles/elements/tabs/line.css +4 -4
  82. package/cdn/styles/elements/textarea.css +23 -9
  83. package/cdn/styles/preset.css +21 -2
  84. package/cdn/styles/tokens/aliases.css +6 -2
  85. package/cdn/styles/tokens/forms.css +4 -0
  86. package/cdn/styles/tokens.css +10 -2
  87. package/dist/css/base.css +11 -0
  88. package/dist/css/elements/breadcrumb.css +2 -2
  89. package/dist/css/elements/button.css +2 -2
  90. package/dist/css/elements/checkbox.css +2 -2
  91. package/dist/css/elements/close-button/circle.css +2 -2
  92. package/dist/css/elements/close-button/ring.css +2 -2
  93. package/dist/css/elements/close-button/square.css +2 -2
  94. package/dist/css/elements/disclosure.css +2 -2
  95. package/dist/css/elements/input-otp.css +20 -4
  96. package/dist/css/elements/input-stepper/default.css +2 -2
  97. package/dist/css/elements/input-stepper/pill.css +2 -2
  98. package/dist/css/elements/input-stepper/rounded.css +2 -2
  99. package/dist/css/elements/input.css +50 -17
  100. package/dist/css/elements/prose-editor.css +26 -11
  101. package/dist/css/elements/radio-group.css +2 -2
  102. package/dist/css/elements/radio.css +2 -2
  103. package/dist/css/elements/segmented-control.css +2 -2
  104. package/dist/css/elements/select.css +26 -5
  105. package/dist/css/elements/story.css +2 -2
  106. package/dist/css/elements/switch.css +2 -2
  107. package/dist/css/elements/table.css +186 -0
  108. package/dist/css/elements/tabs/enclosed.css +4 -4
  109. package/dist/css/elements/tabs/line.css +4 -4
  110. package/dist/css/elements/textarea.css +23 -9
  111. package/dist/css/preset.css +21 -2
  112. package/dist/css/tokens/aliases.css +6 -2
  113. package/dist/css/tokens/forms.css +4 -0
  114. package/dist/css/tokens.css +10 -2
  115. package/dist/custom-elements.json +295 -169
  116. package/dist/elements/alert-dialog/alert-dialog.d.ts +3 -2
  117. package/dist/elements/alert-dialog/alert-dialog.d.ts.map +1 -1
  118. package/dist/elements/alert-dialog/alert-dialog.js +3 -2
  119. package/dist/elements/avatar/avatar.css +2 -2
  120. package/dist/elements/carousel/carousel.css +18 -0
  121. package/dist/elements/combobox/combobox.css +9 -0
  122. package/dist/elements/combobox/combobox.d.ts.map +1 -1
  123. package/dist/elements/combobox/combobox.js +1 -0
  124. package/dist/elements/dialog/dialog.css +12 -0
  125. package/dist/elements/dialog/dialog.d.ts +2 -1
  126. package/dist/elements/dialog/dialog.d.ts.map +1 -1
  127. package/dist/elements/dialog/dialog.js +2 -1
  128. package/dist/elements/drawer/drawer.css +11 -1
  129. package/dist/elements/drawer/drawer.d.ts +7 -7
  130. package/dist/elements/drawer/drawer.js +7 -7
  131. package/dist/elements/dropdown-item/dropdown-item.css +5 -4
  132. package/dist/elements/input-otp/input-otp.d.ts +2 -2
  133. package/dist/elements/input-otp/input-otp.js +2 -2
  134. package/dist/elements/prose-editor/prose-editor.css +5 -3
  135. package/dist/elements/rating/rating.css +9 -10
  136. package/dist/elements/select/select.css +10 -9
  137. package/dist/elements/select/select.d.ts.map +1 -1
  138. package/dist/elements/select/select.js +1 -0
  139. package/dist/elements/slider/slider.css +5 -1
  140. package/dist/elements/stories-viewer/stories-viewer.css +10 -2
  141. package/dist/elements/table/table.meta.d.ts +55 -0
  142. package/dist/elements/table/table.meta.d.ts.map +1 -0
  143. package/dist/elements/table/table.meta.js +65 -0
  144. package/dist/elements/tag/tag.css +4 -4
  145. package/dist/elements/tree/tree.css +3 -3
  146. package/dist/elements/tree-item/tree-item.css +5 -3
  147. package/dist/metadata/alert-dialog.json +90 -85
  148. package/dist/metadata/alert.json +22 -22
  149. package/dist/metadata/avatar.json +26 -26
  150. package/dist/metadata/badge.json +13 -13
  151. package/dist/metadata/breadcrumb.json +9 -9
  152. package/dist/metadata/button.json +40 -40
  153. package/dist/metadata/carousel.json +133 -133
  154. package/dist/metadata/checkbox.json +13 -13
  155. package/dist/metadata/close-button.json +15 -15
  156. package/dist/metadata/color-scheme-icon.json +13 -13
  157. package/dist/metadata/combobox.json +77 -94
  158. package/dist/metadata/dialog.json +49 -44
  159. package/dist/metadata/disclosure.json +17 -17
  160. package/dist/metadata/divider.json +12 -12
  161. package/dist/metadata/drawer.json +61 -61
  162. package/dist/metadata/dropdown-item.json +50 -50
  163. package/dist/metadata/dropdown.json +32 -32
  164. package/dist/metadata/form-field.json +15 -15
  165. package/dist/metadata/icon.json +8 -8
  166. package/dist/metadata/index.json +1761 -1765
  167. package/dist/metadata/input-group.json +5 -5
  168. package/dist/metadata/input-otp.json +17 -17
  169. package/dist/metadata/input-stepper.json +24 -24
  170. package/dist/metadata/input.json +31 -31
  171. package/dist/metadata/popover.json +49 -49
  172. package/dist/metadata/progress.json +15 -15
  173. package/dist/metadata/prose-editor.json +110 -116
  174. package/dist/metadata/radio.json +15 -15
  175. package/dist/metadata/rating.json +25 -47
  176. package/dist/metadata/segmented-control.json +24 -46
  177. package/dist/metadata/select.json +81 -98
  178. package/dist/metadata/skeleton.json +12 -12
  179. package/dist/metadata/slider.json +60 -78
  180. package/dist/metadata/spinner.json +5 -5
  181. package/dist/metadata/sticky-bar.json +13 -13
  182. package/dist/metadata/stories-viewer.json +105 -105
  183. package/dist/metadata/stories.json +17 -17
  184. package/dist/metadata/story.json +41 -41
  185. package/dist/metadata/switch.json +9 -9
  186. package/dist/metadata/table.json +88 -0
  187. package/dist/metadata/tabs.json +26 -26
  188. package/dist/metadata/tag.json +50 -50
  189. package/dist/metadata/textarea.json +28 -28
  190. package/dist/metadata/toast.json +16 -16
  191. package/dist/metadata/tooltip.json +49 -49
  192. package/dist/metadata/tree-item.json +73 -73
  193. package/dist/metadata/tree.json +39 -39
  194. package/dist/shared/controllers/listbox-nav.d.ts +7 -0
  195. package/dist/shared/controllers/listbox-nav.d.ts.map +1 -1
  196. package/dist/shared/controllers/listbox-nav.js +12 -0
  197. package/dist/shared/styles/button-core.css +2 -2
  198. package/dist/shared/styles/checkbox-appearance.css +2 -2
  199. package/dist/shared/styles/picker-core.css +31 -7
  200. package/dist/templates/elements/alert-dialog.md +19 -18
  201. package/dist/templates/elements/alert.md +4 -4
  202. package/dist/templates/elements/avatar.md +9 -9
  203. package/dist/templates/elements/badge.md +4 -4
  204. package/dist/templates/elements/breadcrumb.md +4 -4
  205. package/dist/templates/elements/button.md +8 -8
  206. package/dist/templates/elements/carousel.md +32 -32
  207. package/dist/templates/elements/checkbox.md +4 -4
  208. package/dist/templates/elements/close-button.md +2 -2
  209. package/dist/templates/elements/color-scheme-icon.md +13 -13
  210. package/dist/templates/elements/combobox.md +19 -19
  211. package/dist/templates/elements/dialog.md +11 -10
  212. package/dist/templates/elements/disclosure.md +3 -3
  213. package/dist/templates/elements/divider.md +2 -2
  214. package/dist/templates/elements/drawer.md +15 -15
  215. package/dist/templates/elements/dropdown.md +15 -15
  216. package/dist/templates/elements/form-field.md +3 -3
  217. package/dist/templates/elements/icon.md +1 -1
  218. package/dist/templates/elements/input-otp.md +5 -5
  219. package/dist/templates/elements/input-stepper.md +4 -4
  220. package/dist/templates/elements/input.md +15 -8
  221. package/dist/templates/elements/popover.md +8 -8
  222. package/dist/templates/elements/progress.md +3 -3
  223. package/dist/templates/elements/prose-editor.md +38 -39
  224. package/dist/templates/elements/radio.md +6 -6
  225. package/dist/templates/elements/rating.md +5 -13
  226. package/dist/templates/elements/segmented-control.md +4 -4
  227. package/dist/templates/elements/select.md +23 -23
  228. package/dist/templates/elements/skeleton.md +2 -2
  229. package/dist/templates/elements/slider.md +13 -13
  230. package/dist/templates/elements/spinner.md +1 -1
  231. package/dist/templates/elements/sticky-bar.md +2 -2
  232. package/dist/templates/elements/stories-viewer.md +29 -29
  233. package/dist/templates/elements/stories.md +4 -4
  234. package/dist/templates/elements/story.md +11 -11
  235. package/dist/templates/elements/switch.md +5 -5
  236. package/dist/templates/elements/table.md +210 -0
  237. package/dist/templates/elements/tabs.md +4 -4
  238. package/dist/templates/elements/tag.md +14 -14
  239. package/dist/templates/elements/textarea.md +8 -8
  240. package/dist/templates/elements/toast.md +4 -4
  241. package/dist/templates/elements/tooltip.md +9 -9
  242. package/dist/templates/elements/tree-item.md +18 -18
  243. package/dist/templates/elements/tree.md +13 -13
  244. package/dist/templates/foundations/focus.md +303 -0
  245. package/elements.json +9 -0
  246. package/package.json +1 -1
  247. package/postcss-plugin-prefix.js +2 -2
  248. package/templates/SKILL.md.tpl +1 -0
  249. package/templates/choosing-elements.md.tpl +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-item.js","names":["unsafeCSS","rawStyles","hostStyles","menuPanelStyles","nothing","_decorate","property","state","r","__decorate","A","host_styles_default","menu_panel_styles_default","styles","DropdownItem","LuxenElement","_args","PopoverController","#_value_accessor_storage","#_disabled_accessor_storage","#_type_accessor_storage","#_variant_accessor_storage","#_checked_accessor_storage","#_submenuOpen_accessor_storage","#_checkPlacement_accessor_storage","#__hasSubmenu_accessor_storage","slot","el","tagName","value","node","child","changed","panel","posOpts","isCheckbox","leadingCheck","n","r$1"],"sources":["../../../src/html/elements/dropdown-item/dropdown-item.css?inline","../../../src/html/elements/dropdown-item/dropdown-item.ts"],"sourcesContent":[":host {\n display: block;\n}\n\n:host([disabled]) {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--l-menu-item-gap);\n min-block-size: var(--l-menu-item-min-height);\n padding: var(--l-menu-item-padding-block) var(--l-menu-item-padding-inline);\n cursor: pointer;\n outline: none;\n border-radius: var(--l-menu-item-border-radius);\n font-size: var(--l-popover-font-size);\n line-height: var(--l-popover-line-height);\n color: var(--l-color-text-primary);\n white-space: nowrap;\n text-align: start;\n}\n\n.item:focus-visible {\n /* A ring distinct from the hover tint (which is the same low-contrast fill).\n Negative offset keeps the 2px ring inside the row so it never collides with\n the panel edge or a neighboring item. */\n background: var(--l-color-bg-state-hover);\n outline: 2px solid var(--l-focus-ring);\n outline-offset: -2px;\n}\n\n@media (hover: hover) {\n .item:hover {\n background: var(--l-color-bg-state-hover);\n }\n}\n\n/* Parent item stays highlighted while its submenu is open. */\n:host([submenu-open]) .item {\n background: var(--l-color-bg-state-hover);\n}\n\n/* Destructive variant — a delete-style action. Red label at rest, danger-tinted\n fill and focus ring on hover/focus so the highlight reads as \"danger\" rather\n than the neutral hover tint. */\n:host([variant='destructive']) .item {\n color: var(--l-color-text-danger);\n}\n\n:host([variant='destructive']) .item:focus-visible {\n background: var(--l-color-bg-fill-danger-soft);\n outline-color: var(--l-color-text-danger);\n}\n\n@media (hover: hover) {\n :host([variant='destructive']) .item:hover {\n background: var(--l-color-bg-fill-danger-soft);\n }\n}\n\n.check {\n display: flex;\n width: 16px;\n flex-shrink: 0;\n}\n\n/* Inline-end chevron marking an item that opens a submenu. */\n.submenu-indicator {\n inline-size: 16px;\n block-size: 16px;\n flex-shrink: 0;\n background-color: currentColor;\n mask: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6 4l4 4-4 4' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")\n no-repeat center / contain;\n}\n\n:host(:dir(rtl)) .submenu-indicator {\n scale: -1 1;\n}\n\n/* The submenu panel and its <hr> separators: shared/styles/menu-panel.css. */\n\n:host(:not([checked])) .check svg {\n visibility: hidden;\n}\n\n::slotted([slot='prefix']),\n::slotted([slot='suffix']) {\n display: flex;\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n}\n","import { html, nothing, unsafeCSS, type PropertyValues } from 'lit';\nimport { LuxenElement } from '../../shared/luxen-element.js';\nimport { property, state } from 'lit/decorators.js';\nimport type { Placement } from '@floating-ui/dom';\nimport { PopoverController } from '../../shared/controllers/popover.js';\nimport { tagName } from '../../registry.js';\nimport hostStyles from '../../shared/styles/host.styles.js';\nimport menuPanelStyles from '../../shared/styles/menu-panel.styles.js';\nimport rawStyles from './dropdown-item.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * A menu item for use inside `<l-dropdown>`.\n *\n * @slot - Label text.\n * @slot prefix - Leading content (e.g. icon). A `type=\"checkbox\"` item ignores it unless `check-placement=\"end\"` frees the leading column.\n * @slot suffix - Trailing content.\n * @slot submenu - Nested `l-dropdown-item` elements rendered in a submenu panel anchored to this item. Drop an `<hr>` between them for a separator.\n *\n * @csspart submenu - The floating submenu panel.\n *\n * @cssproperty --color - Text color.\n *\n * @attribute variant - destructive — Renders the item as a destructive action (red), for delete-style entries.\n *\n * @customElement l-dropdown-item\n */\nexport class DropdownItem extends LuxenElement {\n static override styles = [hostStyles, menuPanelStyles, styles];\n\n private _submenuFloating = new PopoverController(this, {\n getTriggerElement: () => this,\n getFloatingElement: () => this._submenuEl,\n getArrowElement: () => null,\n });\n\n /** The value associated with this item. */\n @property()\n accessor value = '';\n\n /** Disables the item. */\n @property({ type: Boolean, reflect: true })\n accessor disabled = false;\n\n /** The type of item: `normal` or `checkbox`. */\n @property()\n accessor type: 'normal' | 'checkbox' = 'normal';\n\n /** Visual variant. `destructive` marks a delete-style action in red. */\n @property({ reflect: true })\n accessor variant: 'destructive' | undefined = undefined;\n\n /** Whether the checkbox item is checked. */\n @property({ type: Boolean, reflect: true })\n accessor checked = false;\n\n /** Whether this item's submenu is open. Managed by the parent `l-dropdown`. */\n @property({ type: Boolean, reflect: true, attribute: 'submenu-open' })\n accessor submenuOpen = false;\n\n /**\n * Which side of a `type=\"checkbox\"` item carries the check mark. `start` (the\n * default) puts it in the leading column, where it takes the place of any\n * `prefix`. `end` moves it to the trailing edge, freeing that column so the\n * item can show its own icon alongside the state.\n */\n @property({ reflect: true, attribute: 'check-placement' })\n accessor checkPlacement: 'start' | 'end' = 'start';\n\n @state()\n private accessor _hasSubmenu = false;\n\n /** Whether this item has nested `slot=\"submenu\"` items. */\n get hasSubmenu(): boolean {\n return this._hasSubmenu;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n // The host is a generic wrapper between the `role=\"menu\"` panel and the\n // `role=\"menuitem\"` row in its shadow root; `none` removes it from the\n // accessibility tree so the menu owns its menuitems directly (ARIA\n // required-owned-elements). The inner row keeps its menuitem role.\n // Guard preserves a consumer-set role.\n if (!this.hasAttribute('role')) this.setAttribute('role', 'none');\n }\n\n private get _submenuEl(): HTMLElement | null {\n return this.shadowRoot!.querySelector<HTMLElement>('.submenu');\n }\n\n /** Returns the text label of this item (excludes nested submenu items). */\n getTextLabel(): string {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (!slot) return (this.textContent ?? '').trim();\n return slot\n .assignedNodes({ flatten: true })\n .map((node) => node.textContent ?? '')\n .join('')\n .trim();\n }\n\n /** Returns the enabled `l-dropdown-item` elements slotted into this item's submenu. */\n getSubmenuItems(): DropdownItem[] {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"submenu\"]');\n if (!slot) return [];\n return (slot.assignedElements() as DropdownItem[]).filter(\n (el) => el.tagName === tagName('dropdown-item').toUpperCase() && !el.disabled,\n );\n }\n\n /** Opens this item's submenu panel. No-op without submenu items. */\n openSubmenu() {\n if (!this._hasSubmenu || this.disabled || this.submenuOpen) return;\n this.submenuOpen = true;\n }\n\n /** Closes this item's submenu panel, including any open nested submenus. */\n closeSubmenu() {\n for (const child of this.getSubmenuItems()) child.closeSubmenu();\n if (this.submenuOpen) this.submenuOpen = false;\n }\n\n override updated(changed: PropertyValues<this>) {\n if (changed.has('submenuOpen')) {\n void this._handleSubmenuOpenChange();\n }\n }\n\n private async _handleSubmenuOpenChange() {\n const panel = this._submenuEl;\n if (!panel) return;\n\n const isRTL = getComputedStyle(this).direction === 'rtl';\n const posOpts = {\n placement: (isRTL ? 'left-start' : 'right-start') as Placement,\n distance: 0,\n // Pull the panel up by its own padding so its first item lines up with this item.\n skidding: -parseFloat(getComputedStyle(panel).paddingTop || '0'),\n };\n\n if (this.submenuOpen) {\n if (!this.isConnected) return;\n panel.showPopover();\n await this._submenuFloating.updatePosition(posOpts);\n if (!this.submenuOpen) return;\n await this._submenuFloating.animateShow(panel);\n this._submenuFloating.startPositioning(posOpts);\n } else {\n if (!panel.matches(':popover-open')) return;\n this._submenuFloating.stopPositioning();\n await this._submenuFloating.animateHide(panel);\n if (panel.matches(':popover-open')) panel.hidePopover();\n }\n }\n\n private _renderCheck() {\n return html`\n <span\n class=\"check\"\n aria-hidden=\"true\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n `;\n }\n\n private _onSubmenuSlotChange = (e: Event) => {\n const slot = e.target as HTMLSlotElement;\n this._hasSubmenu = slot\n .assignedElements()\n .some((el) => el.tagName === tagName('dropdown-item').toUpperCase());\n };\n\n override render() {\n const isCheckbox = this.type === 'checkbox';\n const leadingCheck = isCheckbox && this.checkPlacement === 'start';\n\n return html`\n <div\n class=\"item\"\n role=${isCheckbox ? 'menuitemcheckbox' : 'menuitem'}\n aria-checked=${isCheckbox ? String(this.checked) : nothing}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-haspopup=${this._hasSubmenu ? 'menu' : nothing}\n aria-expanded=${this._hasSubmenu ? String(this.submenuOpen) : nothing}\n aria-controls=${this._hasSubmenu ? 'submenu' : nothing}\n tabindex=\"-1\"\n >\n <!-- The check owns the leading column by default, which is why a\n checkbox item has no room for a prefix there. Moving it to the\n trailing edge frees that column, so an item can carry its own icon\n and still show whether it is on — a theme row with a sun/moon, a\n Show-grid row with a grid glyph. The aria-checked above is what\n assistive tech reads, and it is unaffected by where the mark sits.\n (No backticks in this comment: it lives inside a template literal.) -->\n ${leadingCheck ? this._renderCheck() : nothing}\n ${leadingCheck ? nothing : html`<slot name=\"prefix\"></slot>`}\n <span\n class=\"label\"\n id=\"label\"\n ><slot></slot\n ></span>\n <slot name=\"suffix\"></slot>\n ${isCheckbox && this.checkPlacement === 'end' ? this._renderCheck() : nothing}\n ${\n this._hasSubmenu\n ? html`<span\n class=\"submenu-indicator\"\n aria-hidden=\"true\"\n ></span>`\n : nothing\n }\n </div>\n <div\n class=\"submenu\"\n part=\"submenu\"\n id=\"submenu\"\n popover=\"manual\"\n role=\"menu\"\n aria-labelledby=\"label\"\n >\n <slot\n name=\"submenu\"\n @slotchange=${this._onSubmenuSlotChange}\n ></slot>\n </div>\n `;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dropdown-item.js","names":["unsafeCSS","rawStyles","hostStyles","menuPanelStyles","nothing","_decorate","property","state","r","__decorate","A","host_styles_default","menu_panel_styles_default","styles","DropdownItem","LuxenElement","_args","PopoverController","#_value_accessor_storage","#_disabled_accessor_storage","#_type_accessor_storage","#_variant_accessor_storage","#_checked_accessor_storage","#_submenuOpen_accessor_storage","#_checkPlacement_accessor_storage","#__hasSubmenu_accessor_storage","slot","el","tagName","value","node","child","changed","panel","posOpts","isCheckbox","leadingCheck","n","r$1"],"sources":["../../../src/html/elements/dropdown-item/dropdown-item.css?inline","../../../src/html/elements/dropdown-item/dropdown-item.ts"],"sourcesContent":[":host {\n display: block;\n}\n\n:host([disabled]) {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--l-menu-item-gap);\n min-block-size: var(--l-menu-item-min-height);\n padding: var(--l-menu-item-padding-block) var(--l-menu-item-padding-inline);\n cursor: pointer;\n outline: none;\n border-radius: var(--l-menu-item-border-radius);\n font-size: var(--l-popover-font-size);\n line-height: var(--l-popover-line-height);\n color: var(--l-color-text-primary);\n white-space: nowrap;\n text-align: start;\n}\n\n.item:focus-visible {\n /* A ring distinct from the hover tint (which is the same low-contrast fill).\n A negative offset equal to the ring width keeps the ring inside the row, at\n any --l-focus-ring-width, so it never collides with the panel edge or a\n neighboring item. */\n background: var(--l-color-bg-state-hover);\n outline: var(--l-focus-ring-width) solid var(--l-focus-ring-color);\n outline-offset: calc(var(--l-focus-ring-width) * -1);\n}\n\n@media (hover: hover) {\n .item:hover {\n background: var(--l-color-bg-state-hover);\n }\n}\n\n/* Parent item stays highlighted while its submenu is open. */\n:host([submenu-open]) .item {\n background: var(--l-color-bg-state-hover);\n}\n\n/* Destructive variant — a delete-style action. Red label at rest, danger-tinted\n fill and focus ring on hover/focus so the highlight reads as \"danger\" rather\n than the neutral hover tint. */\n:host([variant='destructive']) .item {\n color: var(--l-color-text-danger);\n}\n\n:host([variant='destructive']) .item:focus-visible {\n background: var(--l-color-bg-fill-danger-soft);\n outline-color: var(--l-color-text-danger);\n}\n\n@media (hover: hover) {\n :host([variant='destructive']) .item:hover {\n background: var(--l-color-bg-fill-danger-soft);\n }\n}\n\n.check {\n display: flex;\n width: 16px;\n flex-shrink: 0;\n}\n\n/* Inline-end chevron marking an item that opens a submenu. */\n.submenu-indicator {\n inline-size: 16px;\n block-size: 16px;\n flex-shrink: 0;\n background-color: currentColor;\n mask: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6 4l4 4-4 4' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")\n no-repeat center / contain;\n}\n\n:host(:dir(rtl)) .submenu-indicator {\n scale: -1 1;\n}\n\n/* The submenu panel and its <hr> separators: shared/styles/menu-panel.css. */\n\n:host(:not([checked])) .check svg {\n visibility: hidden;\n}\n\n::slotted([slot='prefix']),\n::slotted([slot='suffix']) {\n display: flex;\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n}\n","import { html, nothing, unsafeCSS, type PropertyValues } from 'lit';\nimport { LuxenElement } from '../../shared/luxen-element.js';\nimport { property, state } from 'lit/decorators.js';\nimport type { Placement } from '@floating-ui/dom';\nimport { PopoverController } from '../../shared/controllers/popover.js';\nimport { tagName } from '../../registry.js';\nimport hostStyles from '../../shared/styles/host.styles.js';\nimport menuPanelStyles from '../../shared/styles/menu-panel.styles.js';\nimport rawStyles from './dropdown-item.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * A menu item for use inside `<l-dropdown>`.\n *\n * @slot - Label text.\n * @slot prefix - Leading content (e.g. icon). A `type=\"checkbox\"` item ignores it unless `check-placement=\"end\"` frees the leading column.\n * @slot suffix - Trailing content.\n * @slot submenu - Nested `l-dropdown-item` elements rendered in a submenu panel anchored to this item. Drop an `<hr>` between them for a separator.\n *\n * @csspart submenu - The floating submenu panel.\n *\n * @cssproperty --color - Text color.\n *\n * @attribute variant - destructive — Renders the item as a destructive action (red), for delete-style entries.\n *\n * @customElement l-dropdown-item\n */\nexport class DropdownItem extends LuxenElement {\n static override styles = [hostStyles, menuPanelStyles, styles];\n\n private _submenuFloating = new PopoverController(this, {\n getTriggerElement: () => this,\n getFloatingElement: () => this._submenuEl,\n getArrowElement: () => null,\n });\n\n /** The value associated with this item. */\n @property()\n accessor value = '';\n\n /** Disables the item. */\n @property({ type: Boolean, reflect: true })\n accessor disabled = false;\n\n /** The type of item: `normal` or `checkbox`. */\n @property()\n accessor type: 'normal' | 'checkbox' = 'normal';\n\n /** Visual variant. `destructive` marks a delete-style action in red. */\n @property({ reflect: true })\n accessor variant: 'destructive' | undefined = undefined;\n\n /** Whether the checkbox item is checked. */\n @property({ type: Boolean, reflect: true })\n accessor checked = false;\n\n /** Whether this item's submenu is open. Managed by the parent `l-dropdown`. */\n @property({ type: Boolean, reflect: true, attribute: 'submenu-open' })\n accessor submenuOpen = false;\n\n /**\n * Which side of a `type=\"checkbox\"` item carries the check mark. `start` (the\n * default) puts it in the leading column, where it takes the place of any\n * `prefix`. `end` moves it to the trailing edge, freeing that column so the\n * item can show its own icon alongside the state.\n */\n @property({ reflect: true, attribute: 'check-placement' })\n accessor checkPlacement: 'start' | 'end' = 'start';\n\n @state()\n private accessor _hasSubmenu = false;\n\n /** Whether this item has nested `slot=\"submenu\"` items. */\n get hasSubmenu(): boolean {\n return this._hasSubmenu;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n // The host is a generic wrapper between the `role=\"menu\"` panel and the\n // `role=\"menuitem\"` row in its shadow root; `none` removes it from the\n // accessibility tree so the menu owns its menuitems directly (ARIA\n // required-owned-elements). The inner row keeps its menuitem role.\n // Guard preserves a consumer-set role.\n if (!this.hasAttribute('role')) this.setAttribute('role', 'none');\n }\n\n private get _submenuEl(): HTMLElement | null {\n return this.shadowRoot!.querySelector<HTMLElement>('.submenu');\n }\n\n /** Returns the text label of this item (excludes nested submenu items). */\n getTextLabel(): string {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (!slot) return (this.textContent ?? '').trim();\n return slot\n .assignedNodes({ flatten: true })\n .map((node) => node.textContent ?? '')\n .join('')\n .trim();\n }\n\n /** Returns the enabled `l-dropdown-item` elements slotted into this item's submenu. */\n getSubmenuItems(): DropdownItem[] {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"submenu\"]');\n if (!slot) return [];\n return (slot.assignedElements() as DropdownItem[]).filter(\n (el) => el.tagName === tagName('dropdown-item').toUpperCase() && !el.disabled,\n );\n }\n\n /** Opens this item's submenu panel. No-op without submenu items. */\n openSubmenu() {\n if (!this._hasSubmenu || this.disabled || this.submenuOpen) return;\n this.submenuOpen = true;\n }\n\n /** Closes this item's submenu panel, including any open nested submenus. */\n closeSubmenu() {\n for (const child of this.getSubmenuItems()) child.closeSubmenu();\n if (this.submenuOpen) this.submenuOpen = false;\n }\n\n override updated(changed: PropertyValues<this>) {\n if (changed.has('submenuOpen')) {\n void this._handleSubmenuOpenChange();\n }\n }\n\n private async _handleSubmenuOpenChange() {\n const panel = this._submenuEl;\n if (!panel) return;\n\n const isRTL = getComputedStyle(this).direction === 'rtl';\n const posOpts = {\n placement: (isRTL ? 'left-start' : 'right-start') as Placement,\n distance: 0,\n // Pull the panel up by its own padding so its first item lines up with this item.\n skidding: -parseFloat(getComputedStyle(panel).paddingTop || '0'),\n };\n\n if (this.submenuOpen) {\n if (!this.isConnected) return;\n panel.showPopover();\n await this._submenuFloating.updatePosition(posOpts);\n if (!this.submenuOpen) return;\n await this._submenuFloating.animateShow(panel);\n this._submenuFloating.startPositioning(posOpts);\n } else {\n if (!panel.matches(':popover-open')) return;\n this._submenuFloating.stopPositioning();\n await this._submenuFloating.animateHide(panel);\n if (panel.matches(':popover-open')) panel.hidePopover();\n }\n }\n\n private _renderCheck() {\n return html`\n <span\n class=\"check\"\n aria-hidden=\"true\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n `;\n }\n\n private _onSubmenuSlotChange = (e: Event) => {\n const slot = e.target as HTMLSlotElement;\n this._hasSubmenu = slot\n .assignedElements()\n .some((el) => el.tagName === tagName('dropdown-item').toUpperCase());\n };\n\n override render() {\n const isCheckbox = this.type === 'checkbox';\n const leadingCheck = isCheckbox && this.checkPlacement === 'start';\n\n return html`\n <div\n class=\"item\"\n role=${isCheckbox ? 'menuitemcheckbox' : 'menuitem'}\n aria-checked=${isCheckbox ? String(this.checked) : nothing}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-haspopup=${this._hasSubmenu ? 'menu' : nothing}\n aria-expanded=${this._hasSubmenu ? String(this.submenuOpen) : nothing}\n aria-controls=${this._hasSubmenu ? 'submenu' : nothing}\n tabindex=\"-1\"\n >\n <!-- The check owns the leading column by default, which is why a\n checkbox item has no room for a prefix there. Moving it to the\n trailing edge frees that column, so an item can carry its own icon\n and still show whether it is on — a theme row with a sun/moon, a\n Show-grid row with a grid glyph. The aria-checked above is what\n assistive tech reads, and it is unaffected by where the mark sits.\n (No backticks in this comment: it lives inside a template literal.) -->\n ${leadingCheck ? this._renderCheck() : nothing}\n ${leadingCheck ? nothing : html`<slot name=\"prefix\"></slot>`}\n <span\n class=\"label\"\n id=\"label\"\n ><slot></slot\n ></span>\n <slot name=\"suffix\"></slot>\n ${isCheckbox && this.checkPlacement === 'end' ? this._renderCheck() : nothing}\n ${\n this._hasSubmenu\n ? html`<span\n class=\"submenu-indicator\"\n aria-hidden=\"true\"\n ></span>`\n : nothing\n }\n </div>\n <div\n class=\"submenu\"\n part=\"submenu\"\n id=\"submenu\"\n popover=\"manual\"\n role=\"menu\"\n aria-labelledby=\"label\"\n >\n <slot\n name=\"submenu\"\n @slotchange=${this._onSubmenuSlotChange}\n ></slot>\n </div>\n `;\n }\n}\n"],"mappings":"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"}
@@ -16,8 +16,8 @@ import { LuxenElement } from '../../shared/luxen-element.js';
16
16
  * @cssproperty --cell-bg-color - Cell background color (default: a faint ink tint over `--l-form-control-background-color`).
17
17
  * @cssproperty --cell-border-color - Cell border color (default: `var(--l-form-control-border-color)`).
18
18
  * @cssproperty --cell-border-radius - Cell border-radius (default: `var(--l-form-control-border-radius)`, like the other text fields).
19
- * @cssproperty --cell-focus-color - Border + ring color of the active (focused) cell.
20
- * @cssproperty --cell-focus-ring - `box-shadow` of the active cell ring (defaults to a 1px solid ring; set to `none` to disable).
19
+ * @cssproperty --cell-focus-color - Border, stroke and halo color of the active (focused) cell. Defaults to `--l-focus-ring-color`.
20
+ * @cssproperty --cell-focus-ring - `box-shadow` of the active cell (defaults to the text-field focus halo, `--l-form-control-focus-halo-width` wide; set to `none` to disable).
21
21
  */
22
22
  export declare class InputOtp extends LuxenElement {
23
23
  createRenderRoot(): this;
@@ -1 +1 @@
1
- {"version":3,"file":"input-otp.js","names":["_decorate","property","n","InputOtp","LuxenElement","_args","value","maxLen","pos","isFocused","i","cell","span","char","input","digits","defaults","attr","cls","__decorate"],"sources":["../../../src/html/elements/input-otp/input-otp.ts"],"sourcesContent":["import { property } from 'lit/decorators.js';\nimport { LuxenElement } from '../../shared/luxen-element.js';\nimport { cls } from '../../registry.js';\n\n/**\n * Enhances a child `<input>` with visual digit cells (Stripe-style OTP input).\n *\n * A single hidden `<input>` handles keyboard, paste, and autocomplete.\n * Visual cells are rendered as real DOM elements with individual borders and focus ring.\n *\n * @summary Stripe-style OTP input with visual digit cells over a hidden native input.\n * @customElement l-input-otp\n *\n * @attribute size - sm | lg — Cell size. Default is md.\n *\n * @cssproperty --digits - Number of digit boxes (default: 6). Must match input's maxlength.\n * @cssproperty --cell-size - Cell width and height (default: 2.75rem). Font size scales automatically.\n * @cssproperty --cell-gap - Space between cells (default: 0.5rem).\n * @cssproperty --cell-bg-color - Cell background color (default: a faint ink tint over `--l-form-control-background-color`).\n * @cssproperty --cell-border-color - Cell border color (default: `var(--l-form-control-border-color)`).\n * @cssproperty --cell-border-radius - Cell border-radius (default: `var(--l-form-control-border-radius)`, like the other text fields).\n * @cssproperty --cell-focus-color - Border + ring color of the active (focused) cell.\n * @cssproperty --cell-focus-ring - `box-shadow` of the active cell ring (defaults to a 1px solid ring; set to `none` to disable).\n */\nexport class InputOtp extends LuxenElement {\n override createRenderRoot() {\n return this;\n }\n\n /** Position after which to insert a visual separator (e.g., 3 for a 3-3 grouping). */\n @property({ type: Number, reflect: true, attribute: 'separator-after' })\n separatorAfter?: number;\n\n private _input!: HTMLInputElement;\n private _container!: HTMLDivElement;\n private _cells: HTMLDivElement[] = [];\n private _separatorEl: HTMLSpanElement | null = null;\n private _initialized = false;\n private _setupTimer = 0;\n\n override connectedCallback() {\n super.connectedCallback();\n // Children may not be parsed yet when the element upgrades mid-parse: try\n // synchronously, then retry once on a macrotask. setTimeout, not rAF — rAF\n // is suspended in hidden documents, so the element would stay inert there.\n if (!this._trySetup()) {\n this._setupTimer = window.setTimeout(() => this._trySetup(), 0);\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n clearTimeout(this._setupTimer);\n this._teardown();\n }\n\n /** @returns true when setup ran or was already done; false to schedule a retry. */\n private _trySetup(): boolean {\n if (this._initialized || !this.isConnected) return true;\n if (!this.querySelector('input')) return false;\n this._setup();\n return true;\n }\n\n // --- Setup / Teardown ---\n\n private _setup() {\n const input = this.querySelector<HTMLInputElement>('input');\n if (!input) return;\n\n this._input = input;\n\n // Derive digit count from --digits CSS custom property (default 6)\n const digits = Number(getComputedStyle(this).getPropertyValue('--digits').trim()) || 6;\n\n // Set sensible defaults — author can still override via HTML attributes\n const defaults: Record<string, string> = {\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'one-time-code',\n maxlength: String(digits),\n pattern: String.raw`\\d{${digits}}`,\n };\n for (const [attr, value] of Object.entries(defaults)) {\n if (!this._input.hasAttribute(attr)) {\n this._input.setAttribute(attr, value);\n }\n }\n\n // Build visual cells container. The real <input> is moved INTO this\n // container (below), so the container itself must stay exposed to AT —\n // aria-hidden goes on each decorative cell/separator, never on the wrapper\n // (a focusable element inside an aria-hidden subtree violates WCAG 4.1.2).\n this._container = document.createElement('div');\n this._container.className = cls('input-otp-cells');\n\n for (let i = 0; i < digits; i++) {\n const cell = document.createElement('div');\n cell.className = cls('input-otp-cell');\n cell.setAttribute('aria-hidden', 'true');\n cell.appendChild(document.createElement('span'));\n this._cells.push(cell);\n this._container.appendChild(cell);\n\n // Insert separator after the specified position\n if (this.separatorAfter && i === this.separatorAfter - 1 && i < digits - 1) {\n this._separatorEl = document.createElement('span');\n this._separatorEl.className = cls('input-otp-separator');\n this._separatorEl.setAttribute('aria-hidden', 'true');\n this._container.appendChild(this._separatorEl);\n }\n }\n\n // Wrap: insert container before input, then move input inside\n this._input.replaceWith(this._container);\n this._container.appendChild(this._input);\n this._initialized = true;\n\n // Populate cells if input already has a value (e.g. disabled with prefilled value)\n this._updateCells();\n\n // Events — focus is deferred so it runs after the click that triggered it\n // (otherwise selectionStart is stale and the active cell flickers).\n this._input.addEventListener('input', this._updateCells);\n this._input.addEventListener('click', this._updateCells);\n this._input.addEventListener('keyup', this._updateCells);\n this._input.addEventListener('focus', this._scheduleUpdateCells);\n this._input.addEventListener('blur', this._clearCells);\n }\n\n private _teardown() {\n if (!this._initialized) return;\n\n this._input.removeEventListener('input', this._updateCells);\n this._input.removeEventListener('click', this._updateCells);\n this._input.removeEventListener('keyup', this._updateCells);\n this._input.removeEventListener('focus', this._scheduleUpdateCells);\n this._input.removeEventListener('blur', this._clearCells);\n\n // Restore input to direct child\n this._container.replaceWith(this._input);\n this._separatorEl?.remove();\n\n this._cells = [];\n this._separatorEl = null;\n this._initialized = false;\n }\n\n // --- Cell updates ---\n\n private _updateCells = (): void => {\n const value = this._input.value;\n const maxLen = this._input.maxLength || 6;\n const pos = Math.min(this._input.selectionStart ?? 0, maxLen - 1);\n const isFocused = document.activeElement === this._input;\n\n for (let i = 0; i < this._cells.length; i++) {\n const cell = this._cells[i];\n const span = cell.firstElementChild as HTMLSpanElement;\n const char = value[i] ?? '';\n\n span.textContent = char;\n\n if (char) {\n cell.setAttribute('data-filled', '');\n } else {\n cell.removeAttribute('data-filled');\n }\n\n if (isFocused && i === pos) {\n cell.setAttribute('data-active', '');\n } else {\n cell.removeAttribute('data-active');\n }\n }\n };\n\n private _clearCells = (): void => {\n for (const cell of this._cells) {\n cell.removeAttribute('data-active');\n }\n };\n\n private _scheduleUpdateCells = (): void => {\n requestAnimationFrame(this._updateCells);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"input-otp.js","names":["_decorate","property","n","InputOtp","LuxenElement","_args","value","maxLen","pos","isFocused","i","cell","span","char","input","digits","defaults","attr","cls","__decorate"],"sources":["../../../src/html/elements/input-otp/input-otp.ts"],"sourcesContent":["import { property } from 'lit/decorators.js';\nimport { LuxenElement } from '../../shared/luxen-element.js';\nimport { cls } from '../../registry.js';\n\n/**\n * Enhances a child `<input>` with visual digit cells (Stripe-style OTP input).\n *\n * A single hidden `<input>` handles keyboard, paste, and autocomplete.\n * Visual cells are rendered as real DOM elements with individual borders and focus ring.\n *\n * @summary Stripe-style OTP input with visual digit cells over a hidden native input.\n * @customElement l-input-otp\n *\n * @attribute size - sm | lg — Cell size. Default is md.\n *\n * @cssproperty --digits - Number of digit boxes (default: 6). Must match input's maxlength.\n * @cssproperty --cell-size - Cell width and height (default: 2.75rem). Font size scales automatically.\n * @cssproperty --cell-gap - Space between cells (default: 0.5rem).\n * @cssproperty --cell-bg-color - Cell background color (default: a faint ink tint over `--l-form-control-background-color`).\n * @cssproperty --cell-border-color - Cell border color (default: `var(--l-form-control-border-color)`).\n * @cssproperty --cell-border-radius - Cell border-radius (default: `var(--l-form-control-border-radius)`, like the other text fields).\n * @cssproperty --cell-focus-color - Border, stroke and halo color of the active (focused) cell. Defaults to `--l-focus-ring-color`.\n * @cssproperty --cell-focus-ring - `box-shadow` of the active cell (defaults to the text-field focus halo, `--l-form-control-focus-halo-width` wide; set to `none` to disable).\n */\nexport class InputOtp extends LuxenElement {\n override createRenderRoot() {\n return this;\n }\n\n /** Position after which to insert a visual separator (e.g., 3 for a 3-3 grouping). */\n @property({ type: Number, reflect: true, attribute: 'separator-after' })\n separatorAfter?: number;\n\n private _input!: HTMLInputElement;\n private _container!: HTMLDivElement;\n private _cells: HTMLDivElement[] = [];\n private _separatorEl: HTMLSpanElement | null = null;\n private _initialized = false;\n private _setupTimer = 0;\n\n override connectedCallback() {\n super.connectedCallback();\n // Children may not be parsed yet when the element upgrades mid-parse: try\n // synchronously, then retry once on a macrotask. setTimeout, not rAF — rAF\n // is suspended in hidden documents, so the element would stay inert there.\n if (!this._trySetup()) {\n this._setupTimer = window.setTimeout(() => this._trySetup(), 0);\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n clearTimeout(this._setupTimer);\n this._teardown();\n }\n\n /** @returns true when setup ran or was already done; false to schedule a retry. */\n private _trySetup(): boolean {\n if (this._initialized || !this.isConnected) return true;\n if (!this.querySelector('input')) return false;\n this._setup();\n return true;\n }\n\n // --- Setup / Teardown ---\n\n private _setup() {\n const input = this.querySelector<HTMLInputElement>('input');\n if (!input) return;\n\n this._input = input;\n\n // Derive digit count from --digits CSS custom property (default 6)\n const digits = Number(getComputedStyle(this).getPropertyValue('--digits').trim()) || 6;\n\n // Set sensible defaults — author can still override via HTML attributes\n const defaults: Record<string, string> = {\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'one-time-code',\n maxlength: String(digits),\n pattern: String.raw`\\d{${digits}}`,\n };\n for (const [attr, value] of Object.entries(defaults)) {\n if (!this._input.hasAttribute(attr)) {\n this._input.setAttribute(attr, value);\n }\n }\n\n // Build visual cells container. The real <input> is moved INTO this\n // container (below), so the container itself must stay exposed to AT —\n // aria-hidden goes on each decorative cell/separator, never on the wrapper\n // (a focusable element inside an aria-hidden subtree violates WCAG 4.1.2).\n this._container = document.createElement('div');\n this._container.className = cls('input-otp-cells');\n\n for (let i = 0; i < digits; i++) {\n const cell = document.createElement('div');\n cell.className = cls('input-otp-cell');\n cell.setAttribute('aria-hidden', 'true');\n cell.appendChild(document.createElement('span'));\n this._cells.push(cell);\n this._container.appendChild(cell);\n\n // Insert separator after the specified position\n if (this.separatorAfter && i === this.separatorAfter - 1 && i < digits - 1) {\n this._separatorEl = document.createElement('span');\n this._separatorEl.className = cls('input-otp-separator');\n this._separatorEl.setAttribute('aria-hidden', 'true');\n this._container.appendChild(this._separatorEl);\n }\n }\n\n // Wrap: insert container before input, then move input inside\n this._input.replaceWith(this._container);\n this._container.appendChild(this._input);\n this._initialized = true;\n\n // Populate cells if input already has a value (e.g. disabled with prefilled value)\n this._updateCells();\n\n // Events — focus is deferred so it runs after the click that triggered it\n // (otherwise selectionStart is stale and the active cell flickers).\n this._input.addEventListener('input', this._updateCells);\n this._input.addEventListener('click', this._updateCells);\n this._input.addEventListener('keyup', this._updateCells);\n this._input.addEventListener('focus', this._scheduleUpdateCells);\n this._input.addEventListener('blur', this._clearCells);\n }\n\n private _teardown() {\n if (!this._initialized) return;\n\n this._input.removeEventListener('input', this._updateCells);\n this._input.removeEventListener('click', this._updateCells);\n this._input.removeEventListener('keyup', this._updateCells);\n this._input.removeEventListener('focus', this._scheduleUpdateCells);\n this._input.removeEventListener('blur', this._clearCells);\n\n // Restore input to direct child\n this._container.replaceWith(this._input);\n this._separatorEl?.remove();\n\n this._cells = [];\n this._separatorEl = null;\n this._initialized = false;\n }\n\n // --- Cell updates ---\n\n private _updateCells = (): void => {\n const value = this._input.value;\n const maxLen = this._input.maxLength || 6;\n const pos = Math.min(this._input.selectionStart ?? 0, maxLen - 1);\n const isFocused = document.activeElement === this._input;\n\n for (let i = 0; i < this._cells.length; i++) {\n const cell = this._cells[i];\n const span = cell.firstElementChild as HTMLSpanElement;\n const char = value[i] ?? '';\n\n span.textContent = char;\n\n if (char) {\n cell.setAttribute('data-filled', '');\n } else {\n cell.removeAttribute('data-filled');\n }\n\n if (isFocused && i === pos) {\n cell.setAttribute('data-active', '');\n } else {\n cell.removeAttribute('data-active');\n }\n }\n };\n\n private _clearCells = (): void => {\n for (const cell of this._cells) {\n cell.removeAttribute('data-active');\n }\n };\n\n private _scheduleUpdateCells = (): void => {\n requestAnimationFrame(this._updateCells);\n };\n}\n"],"mappings":"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"}
@@ -132,7 +132,7 @@ img.ProseMirror-separator {
132
132
  `),n=t===-1?e:e.slice(0,t);if(!__.test(n))return[[],0,[]];let r=k_,i=A_(e,r),a=w_(i);for(;a[1]===i.length&&i.length===r;)r*=2,i=A_(e,r),a=w_(i);return[a[0],a[1],i]}var M_=`listItem`,N_=`textStyle`,P_=/^(\d+)\.\s$/;function F_(e){let t=e.match(/list-style-type\s*:\s*([^;]+)/i);if(!t)return null;switch(t[1].trim().toLowerCase()){case`upper-roman`:return`I`;case`lower-roman`:return`i`;case`upper-alpha`:case`upper-latin`:return`A`;case`lower-alpha`:case`lower-latin`:return`a`;default:return null}}var I_=Ep.create({name:`orderedList`,addOptions(){return{itemTypeName:`listItem`,HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:`block list`,content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:e=>e.hasAttribute(`start`)?parseInt(e.getAttribute(`start`)||``,10):1},type:{default:null,parseHTML:e=>{let t=e.getAttribute(`type`);if(t)return t;let n=e.getAttribute(`style`);if(n){let e=F_(n);if(e)return e}let r=e.querySelector(`li`);if(r){let e=r.getAttribute(`style`);if(e){let t=F_(e);if(t)return t}}return null}}}},parseHTML(){return[{tag:`ol`}]},renderHTML({HTMLAttributes:e}){let{start:t,type:n,...r}=e,i=J(this.options.HTMLAttributes,r);return t!==1&&(i.start=t),n&&n!==`1`&&(i.type=n),[`ol`,i,0]},markdownTokenName:`list`,parseMarkdown:(e,t)=>{if(e.type!==`list`||!e.ordered)return[];let n=e.start||1,r=e.typeMarker,i=e.items?O_(e.items,t):[],a={};return n!==1&&(a.start=n),r&&(a.type=r),Object.keys(a).length>0?{type:`orderedList`,attrs:a,content:i}:{type:`orderedList`,content:i}},renderMarkdown:(e,t)=>e.content?t.renderChildren(e.content,`
133
133
  `):``,markdownTokenizer:{name:`orderedList`,level:`block`,start:()=>-1,tokenize:(e,t,n)=>{let[r,i,a]=j_(e);if(r.length===0)return;let o=D_(r,r[0].indent,n);if(o.length!==0)return{type:`list`,ordered:!0,start:r[0]?.number||1,typeMarker:r[0]?.type,items:o,raw:a.slice(0,i).join(`
134
134
  `)}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleOrderedList:()=>({commands:e,chain:t})=>this.options.keepAttributes?t().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(M_,this.editor.getAttributes(N_)).run():e.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addProseMirrorPlugins(){return[new j({props:{handlePaste:(e,t)=>{if((t.clipboardData?.getData(`text/html`))?.trim())return!1;let n=t.clipboardData?.getData(`text/plain`);if(!n)return!1;let r=E_(n);if(!r)return!1;try{let t=e.state.schema.nodeFromJSON(r),n=e.state.tr.replaceSelectionWith(t);return e.dispatch(n),!0}catch{return!1}}}})]},addInputRules(){let e=(e,t)=>(!t.attrs.type||t.attrs.type===`1`)&&t.childCount+t.attrs.start===+e[1],t=Tp({find:P_,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:e});return(this.options.keepMarks||this.options.keepAttributes)&&(t=Tp({find:P_,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(N_)}),joinPredicate:e,editor:this.editor})),[t]}}),L_=/^\s*(\[([( |x])?\])\s$/,R_=`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,z_=(e,t,n)=>{var r;return(n==null||(r=n.checkboxLabel)==null?void 0:r.call(n,e,t))||`Task item checkbox for ${e.textContent||`empty task item`}`},B_=Ep.create({name:`taskItem`,addOptions(){return{nested:!1,HTMLAttributes:{},taskListTypeName:`taskList`,a11y:void 0}},content(){return this.options.nested?`paragraph block*`:`paragraph+`},defining:!0,addAttributes(){return{checked:{default:!1,keepOnSplit:!1,parseHTML:e=>{let t=e.getAttribute(`data-checked`);return t===``||t===`true`},renderHTML:e=>({"data-checked":e.checked})}}},parseHTML(){return[{tag:`li[data-type="${this.name}"]`,priority:51,contentElement:e=>e.querySelector(`div`)??e}]},renderHTML({node:e,HTMLAttributes:t}){return[`li`,J(this.options.HTMLAttributes,t,{"data-type":this.name}),[`label`,[`input`,{type:`checkbox`,checked:e.attrs.checked?`checked`:null}],[`span`]],[`div`,0]]},parseMarkdown:(e,t)=>{let n=[];if(e.tokens&&e.tokens.length>0?n.push(t.createNode(`paragraph`,{},t.parseInline(e.tokens))):e.text?n.push(t.createNode(`paragraph`,{},[t.createNode(`text`,{text:e.text})])):n.push(t.createNode(`paragraph`,{},[])),e.nestedTokens&&e.nestedTokens.length>0){let r=t.parseChildren(e.nestedTokens);n.push(...r)}return t.createNode(`taskItem`,{checked:e.checked||!1},n)},renderMarkdown:(e,t)=>Vf(e,t,`- [${e.attrs?.checked?`x`:` `}] `,void 0,{indentMainContent:!0}),addExtensions(){return this.options.nested?[Lg(this.name,[this.options.taskListTypeName])]:[]},addKeyboardShortcuts(){let e={Enter:()=>this.editor.commands.splitListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)};return this.options.nested?{...e,Tab:()=>this.editor.commands.sinkListItem(this.name)}:e},addNodeView(){return({node:e,HTMLAttributes:t,getPos:n,editor:r})=>{let i=document.createElement(`li`),a=document.createElement(`label`),o=document.createElement(`span`),s=document.createElement(`input`),c=document.createElement(`div`);o.style.cssText=R_;let l=e=>{let t=z_(e,e.attrs.checked,this.options.a11y);s.setAttribute(`aria-label`,t),o.textContent=t};l(e),a.contentEditable=`false`,s.type=`checkbox`,s.addEventListener(`mousedown`,e=>e.preventDefault()),s.addEventListener(`change`,t=>{if(!r.isEditable&&!this.options.onReadOnlyChecked){s.checked=!s.checked;return}let{checked:i}=t.target;r.isEditable&&typeof n==`function`&&r.chain().focus(void 0,{scrollIntoView:!1}).command(({tr:e})=>{let t=n();if(typeof t!=`number`)return!1;let r=e.doc.nodeAt(t);return e.setNodeMarkup(t,void 0,{...r?.attrs,checked:i}),!0}).run(),!r.isEditable&&this.options.onReadOnlyChecked&&(this.options.onReadOnlyChecked(e,i)||(s.checked=!s.checked))}),Object.entries(this.options.HTMLAttributes).forEach(([e,t])=>{i.setAttribute(e,t)}),i.dataset.checked=e.attrs.checked,s.checked=e.attrs.checked,a.append(s,o),i.append(a,c),Object.entries(t).forEach(([e,t])=>{i.setAttribute(e,t)});let u=new Set(Object.keys(t));return{dom:i,contentDOM:c,update:e=>{if(e.type!==this.type)return!1;i.dataset.checked=e.attrs.checked,s.checked=e.attrs.checked,l(e);let t=r.extensionManager.attributes,n=Ru(e,t),a=new Set(Object.keys(n)),o=this.options.HTMLAttributes;return u.forEach(e=>{a.has(e)||(e in o?i.setAttribute(e,o[e]):i.removeAttribute(e))}),Object.entries(n).forEach(([e,t])=>{t==null?e in o?i.setAttribute(e,o[e]):i.removeAttribute(e):i.setAttribute(e,t)}),u=a,!0}}}},addInputRules(){return[Tp({find:L_,type:this.type,getAttributes:e=>({checked:e[e.length-1]===`x`})})]}}),V_=Ep.create({name:`taskList`,addOptions(){return{itemTypeName:`taskItem`,HTMLAttributes:{}}},group:`block list`,content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:`ul[data-type="${this.name}"]`,priority:51}]},renderHTML({HTMLAttributes:e}){return[`ul`,J(this.options.HTMLAttributes,e,{"data-type":this.name}),0]},parseMarkdown:(e,t)=>t.createNode(`taskList`,{},t.parseChildren(e.items||[])),renderMarkdown:(e,t)=>e.content?t.renderChildren(e.content,`
135
- `):``,markdownTokenizer:{name:`taskList`,level:`block`,start(e){let t=e.match(/^\s*[-+*]\s+\[([ xX])\]\s+/)?.index;return t===void 0?-1:t},tokenize(e,t,n){let r=e=>{let t=Rf(e,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:e=>({indentLevel:e[1].length,mainContent:e[4],checked:e[3].toLowerCase()===`x`}),createToken:(e,t)=>({type:`taskItem`,raw:``,mainContent:e.mainContent,indentLevel:e.indentLevel,checked:e.checked,text:e.mainContent,tokens:n.inlineTokens(e.mainContent),nestedTokens:t}),customNestedParser:r},n);if(t){let r={type:`taskList`,raw:t.raw,items:t.items},i=e.slice(t.raw.length);return i.trim()?[r,...n.blockTokens(i)]:[r]}return n.blockTokens(e)},i=Rf(e,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:e=>({indentLevel:e[1].length,mainContent:e[4],checked:e[3].toLowerCase()===`x`}),createToken:(e,t)=>({type:`taskItem`,raw:``,mainContent:e.mainContent,indentLevel:e.indentLevel,checked:e.checked,text:e.mainContent,tokens:n.inlineTokens(e.mainContent),nestedTokens:t}),customNestedParser:r},n);if(i)return{type:`taskList`,raw:i.raw,items:i.items}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleTaskList:()=>({commands:e})=>e.toggleList(this.name,this.options.itemTypeName)}},addKeyboardShortcuts(){return{"Mod-Shift-9":()=>this.editor.commands.toggleTaskList()}}});Y.create({name:`listKit`,addExtensions(){let e=[];return this.options.bulletList!==!1&&e.push(Ng.configure(this.options.bulletList)),this.options.listItem!==!1&&e.push(s_.configure(this.options.listItem)),this.options.listKeymap!==!1&&e.push(g_.configure(this.options.listKeymap)),this.options.orderedList!==!1&&e.push(I_.configure(this.options.orderedList)),this.options.taskItem!==!1&&e.push(B_.configure(this.options.taskItem)),this.options.taskList!==!1&&e.push(V_.configure(this.options.taskList)),e}});var H_=`&nbsp;`,U_=`\xA0`,W_=Ep.create({name:`paragraph`,priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:`block`,content:`inline*`,parseHTML(){return[{tag:`p`}]},renderHTML({HTMLAttributes:e}){return[`p`,J(this.options.HTMLAttributes,e),0]},parseMarkdown:(e,t)=>{let n=e.tokens||[];if(n.length===1&&n[0].type===`image`)return t.parseChildren([n[0]]);let r=t.parseInline(n);return n.length===1&&n[0].type===`text`&&(n[0].raw===H_||n[0].text===H_||n[0].raw===U_||n[0].text===U_)&&r.length===1&&r[0].type===`text`&&(r[0].text===H_||r[0].text===U_)?t.createNode(`paragraph`,void 0,[]):t.createNode(`paragraph`,void 0,r)},renderMarkdown:(e,t,n)=>{if(!e)return``;let r=Array.isArray(e.content)?e.content:[];if(r.length===0){var i,a;let e=Array.isArray(n==null||(i=n.previousNode)==null?void 0:i.content)?n.previousNode.content:[];return(n==null||(a=n.previousNode)==null?void 0:a.type)===`paragraph`&&e.length===0?H_:``}return t.renderChildren(r)},addCommands(){return{setParagraph:()=>({commands:e})=>e.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}}),G_=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,K_=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,q_=Qf.create({name:`strike`,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:`s`},{tag:`del`},{tag:`strike`},{style:`text-decoration`,consuming:!1,getAttrs:e=>e.includes(`line-through`)?{}:!1}]},renderHTML({HTMLAttributes:e}){return[`s`,J(this.options.HTMLAttributes,e),0]},markdownTokenName:`del`,parseMarkdown:(e,t)=>t.applyMark(`strike`,t.parseInline(e.tokens||[])),renderMarkdown:(e,t)=>`~~${t.renderChildren(e)}~~`,addCommands(){return{setStrike:()=>({commands:e})=>e.setMark(this.name),toggleStrike:()=>({commands:e})=>e.toggleMark(this.name),unsetStrike:()=>({commands:e})=>e.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Sp({find:G_,type:this.type})]},addPasteRules(){return[Dp({find:K_,type:this.type})]}}),J_=Ep.create({name:`text`,group:`inline`,parseMarkdown:e=>({type:`text`,text:e.text||``}),renderMarkdown:e=>e.text||``}),Y_=Qf.create({name:`underline`,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:`u`},{style:`text-decoration`,consuming:!1,getAttrs:e=>e.includes(`underline`)?{}:!1}]},renderHTML({HTMLAttributes:e}){return[`u`,J(this.options.HTMLAttributes,e),0]},parseMarkdown(e,t){return t.applyMark(this.name||`underline`,t.parseInline(e.tokens||[]))},renderMarkdown(e,t){return`<u>${t.renderChildren(e)}</u>`},markdownTokenizer:{name:`underline`,level:`inline`,start(e){return e.toLowerCase().indexOf(`<u>`)},tokenize(e,t,n){if(!/^<u>/i.test(e))return;let r=/\\[\s\S]|`+|<\/u>/gi;r.lastIndex=3;let i=r.exec(e);for(;i;){if(i[0].startsWith("`")){let t=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/.exec(e.slice(i.index));t&&(r.lastIndex=i.index+t[0].length)}else if(!i[0].startsWith(`\\`)){let t=e.slice(3,i.index);return t?{type:`underline`,raw:e.slice(0,r.lastIndex),text:t,tokens:n.inlineTokens(t)}:void 0}i=r.exec(e)}}},addCommands(){return{setUnderline:()=>({commands:e})=>e.setMark(this.name),toggleUnderline:()=>({commands:e})=>e.toggleMark(this.name),unsetUnderline:()=>({commands:e})=>e.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});function X_(e={}){return new j({view(t){return new Z_(t,e)}})}var Z_=class{constructor(e,t){this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.lastDragEvent=null,this.width=t.width??1,this.color=t.color===!1?void 0:t.color||`black`,this.class=t.class,this.handlers=[`dragover`,`dragend`,`drop`,`dragleave`].map(t=>{let n=e=>{this[t](e)};return e.dom.addEventListener(t,n),{name:t,handler:n}})}destroy(){this.setCursor(null),this.handlers.forEach(({name:e,handler:t})=>this.editorView.dom.removeEventListener(e,t))}update(e,t){if(this.cursorPos!=null&&t.doc!=e.state.doc){if(this.lastDragEvent){let e=this.computeTarget(this.lastDragEvent);e==this.cursorPos?this.updateOverlay():this.setCursor(e)}else this.updateOverlay()}}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),t=!e.parent.inlineContent,n,r=this.editorView.dom,i=r.getBoundingClientRect(),a=i.width/r.offsetWidth,o=i.height/r.offsetHeight;if(t){let t=e.nodeBefore,r=e.nodeAfter;if(t||r){let e=this.editorView.nodeDOM(this.cursorPos-(t?t.nodeSize:0));if(e){let i=e.getBoundingClientRect(),a=t?i.bottom:i.top;t&&r&&(a=(a+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let s=this.width/2*o;n={left:i.left,right:i.right,top:a-s,bottom:a+s}}}}if(!n){let e=this.editorView.coordsAtPos(this.cursorPos),t=this.width/2*a;n={left:e.left-t,right:e.left+t,top:e.top,bottom:e.bottom}}let s=this.editorView.dom.offsetParent;this.element||(this.element=s.appendChild(document.createElement(`div`)),this.class&&(this.element.className=this.class),this.element.style.cssText=`position: absolute; z-index: 50; pointer-events: none;`,this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle(`prosemirror-dropcursor-block`,t),this.element.classList.toggle(`prosemirror-dropcursor-inline`,!t);let c,l;if(!s||s==document.body&&getComputedStyle(s).position==`static`)c=-pageXOffset,l=-pageYOffset;else{let e=s.getBoundingClientRect(),t=e.width/s.offsetWidth,n=e.height/s.offsetHeight;c=e.left-s.scrollLeft*t,l=e.top-s.scrollTop*n}this.element.style.left=(n.left-c)/a+`px`,this.element.style.top=(n.top-l)/o+`px`,this.element.style.width=(n.right-n.left)/a+`px`,this.element.style.height=(n.bottom-n.top)/o+`px`}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}computeTarget(e){let t=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),n=t&&t.inside>=0&&this.editorView.state.doc.nodeAt(t.inside),r=n&&n.type.spec.disableDropCursor,i=typeof r==`function`?r(this.editorView,t,e):r;if(!t||i)return null;let a=t.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let e=hn(this.editorView.state.doc,a,this.editorView.dragging.slice);e!=null&&(a=e)}return a}dragover(e){if(!this.editorView.editable)return;this.lastDragEvent=e;let t=this.computeTarget(e);t!=null&&(this.setCursor(t),this.scheduleRemoval(5e3))}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}},Q_=class e extends O{constructor(e){super(e,e)}map(t,n){let r=t.resolve(n.map(this.head));return e.valid(r)?new e(r):O.near(r)}content(){return w.empty}eq(t){return t instanceof e&&t.head==this.head}toJSON(){return{type:`gapcursor`,pos:this.head}}static fromJSON(t,n){if(typeof n.pos!=`number`)throw RangeError(`Invalid input for GapCursor.fromJSON`);return new e(t.resolve(n.pos))}getBookmark(){return new $_(this.anchor)}static valid(e){let t=e.parent;if(t.inlineContent||!tv(e)||!nv(e))return!1;let n=t.type.spec.allowGapCursor;if(n!=null)return n;let r=t.contentMatchAt(e.index()).defaultType;return r&&r.isTextblock}static findGapCursorFrom(t,n,r=!1){search:for(;;){if(!r&&e.valid(t))return t;let i=t.pos,a=null;for(let r=t.depth;;r--){let o=t.node(r);if(n>0?t.indexAfter(r)<o.childCount:t.index(r)>0){a=o.child(n>0?t.indexAfter(r):t.index(r)-1);break}if(r==0)return null;i+=n;let s=t.doc.resolve(i);if(e.valid(s))return s}for(;;){let o=n>0?a.firstChild:a.lastChild;if(!o){if(a.isAtom&&!a.isText&&!A.isSelectable(a)){t=t.doc.resolve(i+a.nodeSize*n),r=!1;continue search}break}a=o,i+=n;let s=t.doc.resolve(i);if(e.valid(s))return s}return null}}};Q_.prototype.visible=!1,Q_.findFrom=Q_.findGapCursorFrom,O.jsonID(`gapcursor`,Q_);var $_=class e{constructor(e){this.pos=e}map(t){return new e(t.map(this.pos))}resolve(e){let t=e.resolve(this.pos);return Q_.valid(t)?new Q_(t):O.near(t)}};function ev(e){return e.isAtom||e.spec.isolating||e.spec.createGapCursor}function tv(e){for(let t=e.depth;t>=0;t--){let n=e.index(t),r=e.node(t);if(n==0){if(r.type.spec.isolating)return!0}else for(let e=r.child(n-1);;e=e.lastChild){if(e.childCount==0&&!e.inlineContent||ev(e.type))return!0;if(e.inlineContent)return!1}}return!0}function nv(e){for(let t=e.depth;t>=0;t--){let n=e.indexAfter(t),r=e.node(t);if(n==r.childCount){if(r.type.spec.isolating)return!0}else for(let e=r.child(n);;e=e.firstChild){if(e.childCount==0&&!e.inlineContent||ev(e.type))return!0;if(e.inlineContent)return!1}}return!0}function rv(){return new j({props:{decorations:cv,createSelectionBetween(e,t,n){return t.pos==n.pos&&Q_.valid(n)?new Q_(n):null},handleClick:ov,handleKeyDown:iv,handleDOMEvents:{beforeinput:sv}}})}var iv=Dc({ArrowLeft:av(`horiz`,-1),ArrowRight:av(`horiz`,1),ArrowUp:av(`vert`,-1),ArrowDown:av(`vert`,1)});function av(e,t){let n=e==`vert`?t>0?`down`:`up`:t>0?`right`:`left`;return function(e,r,i){let a=e.selection,o=t>0?a.$to:a.$from,s=a.empty;if(a instanceof k){if(!i.endOfTextblock(n)||o.depth==0)return!1;s=!1,o=e.doc.resolve(t>0?o.after():o.before())}let c=Q_.findGapCursorFrom(o,t,s);return c?(r&&r(e.tr.setSelection(new Q_(c))),!0):!1}}function ov(e,t,n){if(!e||!e.editable)return!1;let r=e.state.doc.resolve(t);if(!Q_.valid(r))return!1;let i=e.posAtCoords({left:n.clientX,top:n.clientY});return i&&i.inside>-1&&A.isSelectable(e.state.doc.nodeAt(i.inside))?!1:(e.dispatch(e.state.tr.setSelection(new Q_(r))),!0)}function sv(e,t){if(t.inputType!=`insertCompositionText`||!(e.state.selection instanceof Q_))return!1;let{$from:n}=e.state.selection,r=n.parent.contentMatchAt(n.index()).findWrapping(e.state.schema.nodes.text);if(!r)return!1;let i=x.empty;for(let e=r.length-1;e>=0;e--)i=x.from(r[e].createAndFill(null,i));let a=e.state.tr.replace(n.pos,n.pos,new w(i,0,0));return a.setSelection(k.near(a.doc.resolve(n.pos+1))),e.dispatch(a),!1}function cv(e){if(!(e.selection instanceof Q_))return null;let t=document.createElement(`div`);return t.className=`ProseMirror-gapcursor`,V.create(e.doc,[Es.widget(e.selection.head,t,{key:`gapcursor`})])}Y.create({name:`characterCount`,addOptions(){return{limit:null,autoTrim:!0,mode:`textSize`,textCounter:e=>e.length,wordCounter:e=>e.split(` `).filter(e=>e!==``).length}},addStorage(){return{characters:()=>0,words:()=>0}},onBeforeCreate(){this.storage.characters=e=>{let t=e?.node||this.editor.state.doc;if((e?.mode||this.options.mode)===`textSize`){let e=t.textBetween(0,t.content.size,void 0,` `);return this.options.textCounter(e)}return t.nodeSize},this.storage.words=e=>{let t=e?.node||this.editor.state.doc,n=t.textBetween(0,t.content.size,` `,` `);return this.options.wordCounter(n)}},addProseMirrorPlugins(){let e=!1;return[new j({key:new M(`characterCount`),appendTransaction:(t,n,r)=>{if(e)return;let i=this.options.limit,a=this.options.autoTrim;if(i==null||i===0||a===!1){e=!0;return}let o=this.storage.characters({node:r.doc});if(o>i){let t=o-i;console.warn(`[CharacterCount] Initial content exceeded limit of ${i} characters. Content was automatically trimmed.`);let n=r.tr.deleteRange(0,t);return e=!0,n}e=!0},filterTransaction:(e,t)=>{let n=this.options.limit;if(!e.docChanged||n===0||n==null)return!0;let r=this.storage.characters({node:t.doc}),i=this.storage.characters({node:e.doc});if(i<=n||r>n&&i>n&&i<=r)return!0;if(r>n&&i>n&&i>r||!e.getMeta(`paste`))return!1;let a=e.selection.$head.pos,o=a-(i-n),s=a;return e.deleteRange(o,s),!(this.storage.characters({node:e.doc})>n)}})]}});var lv=Y.create({name:`dropCursor`,addOptions(){return{color:`currentColor`,width:1,class:void 0}},addProseMirrorPlugins(){return[X_(this.options)]}});Y.create({name:`focus`,addOptions(){return{className:`has-focus`,mode:`all`}},addProseMirrorPlugins(){return[new j({key:new M(`focus`),props:{decorations:({doc:e,selection:t})=>{let{isEditable:n,isFocused:r}=this.editor,{anchor:i}=t,a=[];if(!n||!r)return V.create(e,[]);let o=0;this.options.mode===`deepest`&&e.descendants((e,t)=>{if(!e.isText){if(!(i>=t&&i<=t+e.nodeSize-1))return!1;o+=1}});let s=0;return e.descendants((e,t)=>{if(e.isText||!(i>=t&&i<=t+e.nodeSize-1))return!1;if(s+=1,this.options.mode===`deepest`&&o-s>0||this.options.mode===`shallowest`&&s>1)return this.options.mode===`deepest`;a.push(Es.node(t,t+e.nodeSize,{class:this.options.className}))}),V.create(e,a)}}})]}});var uv=Y.create({name:`gapCursor`,addProseMirrorPlugins(){return[rv()]},extendNodeSchema(e){return{allowGapCursor:q(K(e,`allowGapCursor`,{name:e.name,options:e.options,storage:e.storage}))??null}}}),dv=`placeholder`,fv=new M(`tiptap__placeholder`);function pv(e){let{editor:t,placeholder:n,dataAttribute:r,pos:i,node:a,isEmptyDoc:o,hasAnchor:s,classes:{emptyNode:c,emptyEditor:l}}=e,u=[c];return o&&u.push(l),Es.node(i,i+a.nodeSize,{class:u.join(` `),[r]:typeof n==`function`?n({editor:t,node:a,pos:i,hasAnchor:s}):n})}function mv(e,t){return typeof e==`function`?e(t):e}function hv({editor:e,options:t,dataAttribute:n,doc:r,selection:i,from:a,to:o}){let{anchor:s}=i,c=[],l=e.isEmpty;return r.nodesBetween(a,o,(r,i)=>{let a=s>=i&&s<=i+r.nodeSize,o=!r.isLeaf&&pd(r);return r.type.isTextblock&&(a||!t.showOnlyCurrent)&&o&&c.push(pv({editor:e,isEmptyDoc:l,dataAttribute:n,hasAnchor:a,placeholder:t.placeholder,classes:{emptyEditor:t.emptyEditorClass,emptyNode:mv(t.emptyNodeClass,{editor:e,node:r,pos:i,hasAnchor:a})},node:r,pos:i})),t.includeChildren}),c}function gv({editor:e,options:t,dataAttribute:n,doc:r,selection:i}){if(!e.isEditable&&t.showOnlyWhenEditable)return null;let{anchor:a}=i,o=[],s=e.isEmpty;if(t.showOnlyCurrent&&!t.includeChildren){let i=r.resolve(a),c=i.depth>0?i.node(1):i.nodeAfter,l=i.depth>0?i.before(1):a;if(c&&c.type.isTextblock&&pd(c)){let r=a>=l&&a<=l+c.nodeSize;o.push(pv({editor:e,isEmptyDoc:s,dataAttribute:n,hasAnchor:r,placeholder:t.placeholder,classes:{emptyEditor:t.emptyEditorClass,emptyNode:mv(t.emptyNodeClass,{editor:e,node:c,pos:l,hasAnchor:r})},node:c,pos:l}))}}else o.push(...hv({editor:e,options:t,dataAttribute:n,doc:r,selection:i,from:0,to:r.content.size}));return V.create(r,o)}function _v(e,t){let n=e.resolve(t);if(n.depth===0){let e=n.nodeAfter??n.nodeBefore;if(!e)return{from:t,to:t};let r=n.nodeAfter?t:t-e.nodeSize;return{from:r,to:r+e.nodeSize}}let r=n.before(1);return{from:r,to:r+n.node(1).nodeSize}}function vv(e,t){return{from:Math.max(0,t.from),to:Math.min(e.content.size,t.to)}}function yv(e,t,n){let r=[];return e.forEach((e,i)=>{let a=i,o=a+e.nodeSize,s=a+1,c=o+1;s<n&&c>t&&r.push({from:a,to:o})}),r}function bv(e){if(e.length===0)return[];let t=[...e].sort((e,t)=>e.from-t.from),n=[{...t[0]}];for(let e=1;e<t.length;e+=1){let r=n[n.length-1],i=t[e];i.from<=r.to?r.to=Math.max(r.to,i.to):n.push({...i})}return n}function xv(e,t){let n=yv(e,t.from,t.to);return n.push(vv(e,_v(e,t.from))),t.to>t.from?n.push(vv(e,_v(e,Math.min(t.to,e.content.size+1)-1))):t.from<e.content.size+1&&n.push(vv(e,_v(e,Math.min(t.from+1,e.content.size)))),n}function Sv(e,t,n){let r=[];if(e.docChanged){let t=ed(e);for(let e of t)r.push(...xv(n.doc,e.newRange))}return e.selectionSet&&(r.push(vv(n.doc,_v(n.doc,e.mapping.map(t.selection.anchor)))),r.push(vv(n.doc,_v(n.doc,n.selection.anchor)))),bv(r)}function Cv(e,t,n){let r=Math.max(0,Math.min(e,n.content.size));return{from:r,to:Math.max(r,Math.min(t,n.content.size))}}function wv({decorations:e,ranges:t,editor:n,options:r,dataAttribute:i,doc:a,selection:o}){let s=e;for(let e of t){let{from:t,to:c}=Cv(e.from,e.to,a),l=s.find(t,c).filter(e=>e.from>=t&&e.to<=c);l.length&&(s=s.remove(l));let u=hv({editor:n,options:r,dataAttribute:i,doc:a,selection:o,from:t,to:c});u.length&&(s=s.add(a,u))}return s}function Tv({editor:e,options:t,dataAttribute:n}){return{init(r,i){return gv({editor:e,options:t,dataAttribute:n,doc:i.doc,selection:i.selection})??V.empty},apply(r,i,a,o){return!r.docChanged&&!r.selectionSet?i:wv({decorations:i.map(r.mapping,r.doc),ranges:Sv(r,a,o),editor:e,options:t,dataAttribute:n,doc:o.doc,selection:o.selection})}}}function Ev(e){return e.replace(/\s+/g,`-`).replace(/[^a-zA-Z0-9-]/g,``).replace(/^[0-9-]+/,``).replace(/^-+/,``).toLowerCase()}function Dv({editor:e,options:t}){let n=t.dataAttribute?`data-${Ev(t.dataAttribute)}`:`data-${dv}`,r=t.showOnlyCurrent&&!t.includeChildren;return new j({key:fv,...r?{}:{state:Tv({editor:e,options:t,dataAttribute:n})},props:{decorations:r?({doc:r,selection:i})=>gv({editor:e,options:t,dataAttribute:n,doc:r,selection:i}):n=>t.showOnlyWhenEditable&&!e.isEditable?V.empty:fv.getState(n)??V.empty}})}var Ov=Y.create({name:`placeholder`,addOptions(){return{emptyEditorClass:`is-editor-empty`,emptyNodeClass:`is-empty`,dataAttribute:dv,placeholder:`Write something …`,showOnlyWhenEditable:!0,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[Dv({editor:this.editor,options:this.options})]}});function kv(e,t){return!e.selection.empty&&!md(e.selection)&&t.isEditable}function Av(e,t){return kv(e,t)&&!t.isFocused&&!t.view.dragging}function jv(){var e;(e=window.getSelection())==null||e.removeAllRanges()}function Mv(e){e.focus()}Y.create({name:`selection`,addOptions(){return{className:`selection`}},addProseMirrorPlugins(){let{editor:e,options:t}=this;return[new j({key:new M(`selection`),props:{decorations(n){return Av(n,e)?V.create(n.doc,[Es.inline(n.selection.from,n.selection.to,{class:t.className})]):null},handleDOMEvents:{blur(t){return kv(t.state,e)&&jv(),!1},focus(t){return kv(t.state,e)&&requestAnimationFrame(()=>{!e.isDestroyed&&t.hasFocus()&&Mv(t)}),!1}}}})]}});function Nv({types:e,node:t}){return t&&Array.isArray(e)&&e.includes(t.type)||t?.type===e}var Pv=Y.create({name:`trailingNode`,addOptions(){return{node:void 0,notAfter:[]}},addProseMirrorPlugins(){let e=new M(this.name),t=this.options.node||this.editor.schema.topNodeType.contentMatch.defaultType?.name||`paragraph`,n=Object.entries(this.editor.schema.nodes).map(([,e])=>e).filter(e=>(this.options.notAfter||[]).concat(t).includes(e.name));return[new j({key:e,appendTransaction:(n,r,i)=>{let{doc:a,tr:o,schema:s}=i,c=e.getState(i),l=a.content.size,u=s.nodes[t];if(!n.some(e=>e.getMeta(`skipTrailingNode`))&&c)return o.insert(l,u.create())},state:{init:(e,t)=>{let r=t.tr.doc.lastChild;return!Nv({node:r,types:n})},apply:(e,t)=>{if(!e.docChanged||e.getMeta(`__uniqueIDTransaction`))return t;let r=e.doc.lastChild;return!Nv({node:r,types:n})}}})]}}),Fv=Y.create({name:`undoRedo`,addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:e,dispatch:t})=>Xc(e,t),redo:()=>({state:e,dispatch:t})=>Zc(e,t)}},addProseMirrorPlugins(){return[Jc(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-я":()=>this.editor.commands.undo(),"Shift-Mod-я":()=>this.editor.commands.redo()}}}),Iv=Y.create({name:`starterKit`,addExtensions(){let e=[];return this.options.bold!==!1&&e.push(Hp.configure(this.options.bold)),this.options.blockquote!==!1&&e.push(Lp.configure(this.options.blockquote)),this.options.bulletList!==!1&&e.push(Ng.configure(this.options.bulletList)),this.options.code!==!1&&e.push(Kp.configure(this.options.code)),this.options.codeBlock!==!1&&e.push(Xp.configure(this.options.codeBlock)),this.options.document!==!1&&e.push(Zp.configure(this.options.document)),this.options.dropcursor!==!1&&e.push(lv.configure(this.options.dropcursor)),this.options.gapcursor!==!1&&e.push(uv.configure(this.options.gapcursor)),this.options.hardBreak!==!1&&e.push(Qp.configure(this.options.hardBreak)),this.options.heading!==!1&&e.push($p.configure(this.options.heading)),this.options.undoRedo!==!1&&e.push(Fv.configure(this.options.undoRedo)),this.options.horizontalRule!==!1&&e.push(em.configure(this.options.horizontalRule)),this.options.italic!==!1&&e.push(am.configure(this.options.italic)),this.options.listItem!==!1&&e.push(s_.configure(this.options.listItem)),this.options.listKeymap!==!1&&e.push(g_.configure(this.options?.listKeymap)),this.options.link!==!1&&e.push(kg.configure(this.options?.link)),this.options.orderedList!==!1&&e.push(I_.configure(this.options.orderedList)),this.options.paragraph!==!1&&e.push(W_.configure(this.options.paragraph)),this.options.strike!==!1&&e.push(q_.configure(this.options.strike)),this.options.text!==!1&&e.push(J_.configure(this.options.text)),this.options.underline!==!1&&e.push(Y_.configure(this.options?.underline)),this.options.trailingNode!==!1&&e.push(Pv.configure(this.options?.trailingNode)),e}}),Lv=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))$/,Rv=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))/g,zv=Qf.create({name:`highlight`,addOptions(){return{multicolor:!1,HTMLAttributes:{}}},addAttributes(){return this.options.multicolor?{color:{default:null,parseHTML:e=>e.getAttribute(`data-color`)||Af(e,`background-color`)||e.style.backgroundColor,renderHTML:e=>Pf(e.color)?{"data-color":e.color,style:`background-color: ${e.color}; color: inherit`}:{}}}:{}},parseHTML(){return[{tag:`mark`}]},renderHTML({HTMLAttributes:e}){return[`mark`,J(this.options.HTMLAttributes,e),0]},renderMarkdown:(e,t)=>`==${t.renderChildren(e)}==`,parseMarkdown:(e,t)=>t.applyMark(`highlight`,t.parseInline(e.tokens||[])),markdownTokenizer:{name:`highlight`,level:`inline`,start:e=>e.indexOf(`==`),tokenize(e,t,n){let r=/^(==)(?!\s)([^=]*[^=\s])(==)/.exec(e);if(r){let e=r[2].trim(),t=n.inlineTokens(e);return{type:`highlight`,raw:r[0],text:e,tokens:t}}}},addCommands(){return{setHighlight:e=>({commands:t})=>t.setMark(this.name,e),toggleHighlight:e=>({commands:t})=>t.toggleMark(this.name,e),unsetHighlight:()=>({commands:e})=>e.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-h":()=>this.editor.commands.toggleHighlight()}},addInputRules(){return[Sp({find:Lv,type:this.type})]},addPasteRules(){return[Dp({find:Rv,type:this.type})]}}),Bv=`:host{--border-color:var(--l-color-border);--border-color-focus:var(--l-focus-ring);--border-width:1px;--border-radius:var(--l-radius-md);--background:var(--l-color-surface);--color:var(--l-color-text-primary);--toolbar-background:var(--l-color-surface);--toolbar-padding:.5rem;--toolbar-gap:.25rem;--toolbar-divider-color:var(--l-color-divider);--toolbar-button-size:2rem;--toolbar-button-radius:var(--l-radius-sm);--toolbar-button-color:var(--l-color-text-secondary);--toolbar-button-color-active:var(--l-color-text-primary);--toolbar-button-background-hover:var(--l-color-bg-state-hover);--toolbar-button-background-active:var(--l-color-bg-fill-neutral-subtle);--content-padding:.75rem 1rem;--content-min-height:8rem;--placeholder-color:var(--l-color-text-tertiary);box-sizing:border-box;inline-size:100%;display:block}:host([disabled]){opacity:.5;pointer-events:none}.wrapper,.toolbar,.editor{transition-property:border-color,box-shadow;transition-duration:.15s}@media (prefers-reduced-motion:reduce){.wrapper,.toolbar,.editor{transition-duration:0s}}.wrapper{border-radius:var(--border-radius);background-color:var(--background);color:var(--color);flex-direction:column;display:flex}.toolbar{align-items:center;gap:var(--toolbar-gap);padding:var(--toolbar-padding);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);background-color:var(--toolbar-background);flex-wrap:wrap;flex:none;display:flex}.editor{border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius)}:host(:not([toolbar-placement])) .toolbar,:host([toolbar-placement=top]) .toolbar{border-bottom:0;border-end-end-radius:0;border-end-start-radius:0}:host(:not([toolbar-placement])) .editor,:host([toolbar-placement=top]) .editor{border-top:0;border-start-start-radius:0;border-start-end-radius:0}:host([toolbar-placement=bottom]) .toolbar{border-top:0;border-start-start-radius:0;border-start-end-radius:0;order:1}:host([toolbar-placement=bottom]) .editor{border-bottom:0;border-end-end-radius:0;border-end-start-radius:0}.toolbar-button{width:var(--toolbar-button-size);height:var(--toolbar-button-size);border-radius:var(--toolbar-button-radius);color:var(--toolbar-button-color);font-size:calc(var(--toolbar-button-size) * .625);cursor:pointer;background-color:#0000;border:0;place-items:center;padding:0;line-height:1;display:grid}@media (hover:hover){.toolbar-button:hover{background-color:var(--toolbar-button-background-hover);color:var(--toolbar-button-color-active)}}.toolbar-button:focus-visible{outline:2px solid var(--l-focus-ring);outline-offset:1px}.toolbar-button.is-active{background-color:var(--toolbar-button-background-active);color:var(--toolbar-button-color-active);box-shadow:inset 0 0 0 1px var(--border-color)}@media (prefers-reduced-motion:no-preference){.toolbar-button{transition:background-color .15s,color .15s}}.divider{width:1px;height:calc(var(--toolbar-button-size) * .5);margin-inline:var(--toolbar-gap);background-color:var(--toolbar-divider-color)}`,Vv=`modulepreload`,Hv=function(e){return`/`+e},Uv={},Wv=function(e){return e.pathname.endsWith(`.css`)},Gv=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},Kv=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=Hv(t,n);let r=s(t),i=Wv(r);return Gv(Uv,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:Vv,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},qv=e(Bv),Jv=class extends Event{constructor(e,t){super(`change`,{bubbles:!0,composed:!1,cancelable:!1}),this.html=e,this.json=t}},Yv=class extends Event{constructor(){super(`add-file`,{bubbles:!1,composed:!1,cancelable:!1})}},Xv={"heading-1":`heading1`,"heading-2":`heading2`,"heading-3":`heading3`,bold:`bold`,italic:`italic`,underline:`underline`,strike:`strikethrough`,highlight:`highlight`,bulletlist:`bulletList`,orderedlist:`orderedList`,blockquote:`blockquote`,"code-block":`codeBlock`,"horizontal-rule":`horizontalRule`,link:`link`,emoji:`emoji`,attachment:`attachFile`,undo:`undo`,redo:`redo`},Zv={minimal:[`bold`,`italic`,`underline`],default:[`heading-1`,`heading-2`,`heading-3`,`divider`,`bold`,`italic`,`underline`,`highlight`,`bulletlist`,`orderedlist`,`blockquote`,`divider`,`code-block`,`horizontal-rule`,`link`,`emoji`,`divider`,`undo`,`redo`]},Qv=class extends h{constructor(...e){super(...e),this._localize=new g(this),this.#e=``,this.#t=``,this.#n=`prose`,this.#r=[],this.#i=`default`,this.#a=`top`,this.#o=!1,this.#s=``,this.#c=``,this._emojiOpenAtPointerDown=!1,this._emojiFocusInsideAtPointerDown=!1,this._emojiReturnFocus=null,this._emojiFocusGuards=[],this._rovingIndex=0,this._rovingFocusActive=!1,this._onFocus=()=>{this._rovingFocusActive||(this.shadowRoot?.activeElement)?.part?.contains(`toolbar-button`)||!this.disabled&&document.activeElement!==this.editor?.view.dom&&this.focus()},this._onToolbarClick=e=>{let t=this._generatedButtons(),n=this._generatedButtonIn(e,t);n&&(this._rovingIndex=t.indexOf(n),this.requestUpdate())},this._onToolbarKeyDown=e=>{let t=this._generatedButtons();if(t.length===0)return;let n=this.shadowRoot?.activeElement,r=t.indexOf(n);if(r===-1)return;let i=-1;switch(e.key){case`ArrowRight`:i=(r+1)%t.length;break;case`ArrowLeft`:i=(r-1+t.length)%t.length;break;case`Home`:i=0;break;case`End`:i=t.length-1;break;default:return}e.preventDefault(),this._rovingIndex=i,this._rovingFocusActive=!0,t[i]?.focus(),queueMicrotask(()=>{this._rovingFocusActive=!1}),this.requestUpdate()},this._onToolbarMouseDown=e=>{this._generatedButtonIn(e)&&e.preventDefault()},this._onKeyDown=e=>{let t=this._emojiPicker;e.key===`Escape`&&!e.isComposing&&t?.matches(`:popover-open`)&&(this._closeEmojiPicker(t.matches(`:focus-within`)),e.preventDefault(),e.stopPropagation())},this._onDocumentPointerDown=e=>{let t=this._emojiPicker;if(!t?.matches(`:popover-open`))return;let n=e.composedPath();n.includes(t)||this._emojiButton&&n.includes(this._emojiButton)||t.hidePopover()},this._onEmojiButtonPointerDown=()=>{this._emojiOpenAtPointerDown=!!this._emojiPicker?.matches(`:popover-open`),this._emojiFocusInsideAtPointerDown=!!this._emojiPicker?.matches(`:focus-within`)}}static{this.styles=[_,qv]}#e;get initialHtml(){return this.#e}set initialHtml(e){this.#e=e}#t;get initialJson(){return this.#t}set initialJson(e){this.#t=e}#n;get editorClass(){return this.#n}set editorClass(e){this.#n=e}#r;get toolbar(){return this.#r}set toolbar(e){this.#r=e}#i;get toolbarPreset(){return this.#i}set toolbarPreset(e){this.#i=e}#a;get toolbarPlacement(){return this.#a}set toolbarPlacement(e){this.#a=e}#o;get autofocus(){return this.#o}set autofocus(e){this.#o=e}#s;get placeholder(){return this.#s}set placeholder(e){this.#s=e}#c;get emojiDataSource(){return this.#c}set emojiDataSource(e){this.#c=e}get validationTarget(){return this._editorRoot}get _toolbar(){return this.toolbar.length>0?this.toolbar:Zv[this.toolbarPreset]}firstUpdated(){queueMicrotask(()=>this._initEditor())}_initEditor(){this.isConnected&&(this.editor=new xp({element:this._createEditorRoot(),editorProps:{attributes:{class:this.editorClass,"aria-label":this.getAttribute(`aria-label`)??this._localize.term(`richTextEditor`)}},extensions:[Iv.configure({link:{openOnClick:!1}}),zv,Ov.configure({placeholder:this.placeholder})],content:this._initialContent(),editable:!this.disabled,autofocus:this.autofocus&&!this.disabled,onUpdate:()=>{this.requestUpdate(),this._emitChange()},onTransaction:()=>this.requestUpdate(),onSelectionUpdate:()=>this.requestUpdate()}),this.addEventListener(`focus`,this._onFocus),document.addEventListener(`keydown`,this._onKeyDown,!0),document.addEventListener(`pointerdown`,this._onDocumentPointerDown,!0),this._syncValue(),this.requestUpdate())}updated(e){if(e.has(`disabled`)&&this.editor&&this.editor.setEditable(!this.disabled),this.editor&&!this.editor.isDestroyed&&!this.hasAttribute(`aria-label`)){let e=this._localize.term(`richTextEditor`),t=this.editor.view.dom;t.getAttribute(`aria-label`)!==e&&t.setAttribute(`aria-label`,e)}}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`focus`,this._onFocus),document.removeEventListener(`keydown`,this._onKeyDown,!0),document.removeEventListener(`pointerdown`,this._onDocumentPointerDown,!0),this._stopEmojiAutoUpdate(),this.editor?.destroy(),this._editorRoot?.remove(),this._emojiPicker?.remove();for(let e of this._emojiFocusGuards)e.remove();this._emojiFocusGuards=[],this._emojiPicker=void 0,this._emojiPickerPromise=void 0}getHTML(){if(!this.editor)return``;let e=this.editor.getHTML();return e===`<p></p>`?``:e}getJSON(){return this.editor?.getJSON()??{}}clear(){this.editor.commands.clearContent(!0)}focus(){this.editor.commands.focus()}blur(){this.editor.commands.blur()}toggleBold(){this.editor.chain().focus().toggleBold().run()}toggleItalic(){this.editor.chain().focus().toggleItalic().run()}toggleUnderline(){this.editor.chain().focus().toggleUnderline().run()}toggleStrike(){this.editor.chain().focus().toggleStrike().run()}toggleHighlight(){this.editor.chain().focus().toggleHighlight().run()}toggleHeading(e){this.editor.chain().focus().toggleHeading({level:e}).run()}toggleBulletList(){this.editor.chain().focus().toggleBulletList().run()}toggleOrderedList(){this.editor.chain().focus().toggleOrderedList().run()}toggleBlockquote(){this.editor.chain().focus().toggleBlockquote().run()}toggleCodeBlock(){this.editor.chain().focus().toggleCodeBlock().run()}setHorizontalRule(){this.editor.chain().focus().setHorizontalRule().run()}undo(){this.editor.chain().focus().undo().run()}redo(){this.editor.chain().focus().redo().run()}toggleLink(){if(this.editor.isActive(`link`)){this.editor.chain().focus().unsetLink().run();return}let e=window.prompt(`URL`);if(!e)return;let t=/^https?:\/\//.test(e)?e:`https://${e}`;this.editor.chain().focus().setLink({href:t}).run()}formResetCallback(){super.formResetCallback(),this.editor?.commands.setContent(this._initialContent())}_syncValue(){if(!this.editor)return;let e=this.getHTML();return this._syncFormValue(e),this.required&&this.setValidity(e?{}:{valueMissing:!0},e?``:`Please fill out this field.`),e}_emitChange(){let e=this._syncValue();e!==void 0&&this.dispatchEvent(new Jv(e,this.getJSON()))}_initialContent(){return this.initialHtml?this.initialHtml:this.initialJson?JSON.parse(this.initialJson):``}_createEditorRoot(){let e=document.createElement(`div`);return e.slot=`editor`,this.append(e),this._editorRoot=e,e}_generatedButtons(){return Array.from(this.shadowRoot?.querySelectorAll(`[part="toolbar-button"]`)??[])}_generatedButtonIn(e,t=this._generatedButtons()){return e.composedPath().find(e=>t.includes(e))}async _onEmojiButtonClick(e){let t=await this._ensureEmojiPicker();t&&((e.detail===0?t.matches(`:popover-open`):this._emojiOpenAtPointerDown)?this._closeEmojiPicker(e.detail!==0&&this._emojiFocusInsideAtPointerDown):t.matches(`:popover-open`)||this._openEmojiPicker(t))}_openEmojiPicker(e){this._emojiReturnFocus=this._focusedElementWithin(),e.showPopover();let t=e.shadowRoot;(t?.querySelector(`#search`)??t?.querySelector(`input, button, [tabindex]:not([tabindex="-1"])`))?.focus({preventScroll:!0})}_focusedElementWithin(){let e=document.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return!(e instanceof HTMLElement)||e===this?null:this.contains(e)||this.shadowRoot?.contains(e)?e:null}_closeEmojiPicker(e){let t=this._emojiPicker;if(t?.matches(`:popover-open`)&&t.hidePopover(),!e)return;let n=this._emojiReturnFocus;n&&this._editorRoot?.contains(n)?this._focusEditor():n?.isConnected?n.focus():this._emojiButton?.focus()}_focusEditor(){this.editor&&!this.editor.isDestroyed&&!this.disabled?this.editor.view.focus():this._emojiButton?.focus()}_ensureEmojiPicker(){return this._emojiPicker?Promise.resolve(this._emojiPicker):this._emojiPickerPromise??=(async()=>{let{default:e}=await Kv(async()=>{let{default:e}=await import(`../../chunks/picker.js`);return{default:e}},[]);if(!this.isConnected)return this._emojiPickerPromise=void 0,null;let t=new e(this.emojiDataSource?{dataSource:this.emojiDataSource}:void 0);t.addEventListener(`emoji-click`,e=>{let n=e.detail.unicode;n&&(this.editor.chain().focus().insertContent(n).run(),this.editor.view.focus(),t.hidePopover())});let n=e=>{let t=document.createElement(`span`);return t.tabIndex=0,Object.assign(t.style,{position:`fixed`,width:`1px`,height:`1px`,opacity:`0`,pointerEvents:`none`,display:`none`}),t.addEventListener(`focus`,()=>{this._closeEmojiPicker(!1),e()}),t};this._emojiFocusGuards=[n(()=>this._emojiButton?.focus()),n(()=>this._focusEditor())];let[r,i]=this._emojiFocusGuards;return this._topLayerContainer().append(r,t,i),t.setAttribute(`popover`,`auto`),Object.assign(t.style,{position:`fixed`,inset:`auto`,margin:`0`,padding:`0`,border:`0`,background:`transparent`,display:`none`}),t.style.setProperty(`--border-radius`,`0.5rem`),t.addEventListener(`beforetoggle`,e=>{let n=e.newState===`open`;t.style.display=n?`flex`:`none`;for(let e of this._emojiFocusGuards)e.style.display=n?`block`:`none`}),t.addEventListener(`toggle`,e=>{e.newState===`open`?this._startEmojiAutoUpdate():this._stopEmojiAutoUpdate()}),this._emojiPicker=t,t})()}_topLayerContainer(){let e=this;for(;e;){if(e instanceof HTMLDialogElement&&e.open)return e;e=e instanceof Element&&e.assignedSlot?e.assignedSlot:e instanceof ShadowRoot?e.host:e.parentNode}return document.body}get _emojiButton(){return this.shadowRoot?.querySelector(`[data-command="emoji"]`)??null}_startEmojiAutoUpdate(){let e=this._emojiButton,t=this._emojiPicker;e&&t&&(this._stopEmojiAutoUpdate(),this._emojiAutoUpdateCleanup=f(e,t,()=>void this._positionEmojiPicker()))}_stopEmojiAutoUpdate(){this._emojiAutoUpdateCleanup?.(),this._emojiAutoUpdateCleanup=void 0}async _positionEmojiPicker(){let e=this._emojiButton,t=this._emojiPicker;if(!e||!t||!t.matches(`:popover-open`))return;let{x:n,y:r}=await m(e,t,{strategy:`fixed`,placement:`bottom`,middleware:[u(4),d(),p({padding:8})]});Object.assign(t.style,{left:`${n}px`,top:`${r}px`})}_renderButton(e,r,i,a=!1,o,s=-1){let c=n(`icon`),l=this._localize.term(Xv[e]);return t`
135
+ `):``,markdownTokenizer:{name:`taskList`,level:`block`,start(e){let t=e.match(/^\s*[-+*]\s+\[([ xX])\]\s+/)?.index;return t===void 0?-1:t},tokenize(e,t,n){let r=e=>{let t=Rf(e,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:e=>({indentLevel:e[1].length,mainContent:e[4],checked:e[3].toLowerCase()===`x`}),createToken:(e,t)=>({type:`taskItem`,raw:``,mainContent:e.mainContent,indentLevel:e.indentLevel,checked:e.checked,text:e.mainContent,tokens:n.inlineTokens(e.mainContent),nestedTokens:t}),customNestedParser:r},n);if(t){let r={type:`taskList`,raw:t.raw,items:t.items},i=e.slice(t.raw.length);return i.trim()?[r,...n.blockTokens(i)]:[r]}return n.blockTokens(e)},i=Rf(e,{itemPattern:/^(\s*)([-+*])\s+\[([ xX])\]\s+(.*)$/,extractItemData:e=>({indentLevel:e[1].length,mainContent:e[4],checked:e[3].toLowerCase()===`x`}),createToken:(e,t)=>({type:`taskItem`,raw:``,mainContent:e.mainContent,indentLevel:e.indentLevel,checked:e.checked,text:e.mainContent,tokens:n.inlineTokens(e.mainContent),nestedTokens:t}),customNestedParser:r},n);if(i)return{type:`taskList`,raw:i.raw,items:i.items}}},markdownOptions:{indentsContent:!0},addCommands(){return{toggleTaskList:()=>({commands:e})=>e.toggleList(this.name,this.options.itemTypeName)}},addKeyboardShortcuts(){return{"Mod-Shift-9":()=>this.editor.commands.toggleTaskList()}}});Y.create({name:`listKit`,addExtensions(){let e=[];return this.options.bulletList!==!1&&e.push(Ng.configure(this.options.bulletList)),this.options.listItem!==!1&&e.push(s_.configure(this.options.listItem)),this.options.listKeymap!==!1&&e.push(g_.configure(this.options.listKeymap)),this.options.orderedList!==!1&&e.push(I_.configure(this.options.orderedList)),this.options.taskItem!==!1&&e.push(B_.configure(this.options.taskItem)),this.options.taskList!==!1&&e.push(V_.configure(this.options.taskList)),e}});var H_=`&nbsp;`,U_=`\xA0`,W_=Ep.create({name:`paragraph`,priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:`block`,content:`inline*`,parseHTML(){return[{tag:`p`}]},renderHTML({HTMLAttributes:e}){return[`p`,J(this.options.HTMLAttributes,e),0]},parseMarkdown:(e,t)=>{let n=e.tokens||[];if(n.length===1&&n[0].type===`image`)return t.parseChildren([n[0]]);let r=t.parseInline(n);return n.length===1&&n[0].type===`text`&&(n[0].raw===H_||n[0].text===H_||n[0].raw===U_||n[0].text===U_)&&r.length===1&&r[0].type===`text`&&(r[0].text===H_||r[0].text===U_)?t.createNode(`paragraph`,void 0,[]):t.createNode(`paragraph`,void 0,r)},renderMarkdown:(e,t,n)=>{if(!e)return``;let r=Array.isArray(e.content)?e.content:[];if(r.length===0){var i,a;let e=Array.isArray(n==null||(i=n.previousNode)==null?void 0:i.content)?n.previousNode.content:[];return(n==null||(a=n.previousNode)==null?void 0:a.type)===`paragraph`&&e.length===0?H_:``}return t.renderChildren(r)},addCommands(){return{setParagraph:()=>({commands:e})=>e.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}}),G_=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,K_=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,q_=Qf.create({name:`strike`,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:`s`},{tag:`del`},{tag:`strike`},{style:`text-decoration`,consuming:!1,getAttrs:e=>e.includes(`line-through`)?{}:!1}]},renderHTML({HTMLAttributes:e}){return[`s`,J(this.options.HTMLAttributes,e),0]},markdownTokenName:`del`,parseMarkdown:(e,t)=>t.applyMark(`strike`,t.parseInline(e.tokens||[])),renderMarkdown:(e,t)=>`~~${t.renderChildren(e)}~~`,addCommands(){return{setStrike:()=>({commands:e})=>e.setMark(this.name),toggleStrike:()=>({commands:e})=>e.toggleMark(this.name),unsetStrike:()=>({commands:e})=>e.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-s":()=>this.editor.commands.toggleStrike()}},addInputRules(){return[Sp({find:G_,type:this.type})]},addPasteRules(){return[Dp({find:K_,type:this.type})]}}),J_=Ep.create({name:`text`,group:`inline`,parseMarkdown:e=>({type:`text`,text:e.text||``}),renderMarkdown:e=>e.text||``}),Y_=Qf.create({name:`underline`,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:`u`},{style:`text-decoration`,consuming:!1,getAttrs:e=>e.includes(`underline`)?{}:!1}]},renderHTML({HTMLAttributes:e}){return[`u`,J(this.options.HTMLAttributes,e),0]},parseMarkdown(e,t){return t.applyMark(this.name||`underline`,t.parseInline(e.tokens||[]))},renderMarkdown(e,t){return`<u>${t.renderChildren(e)}</u>`},markdownTokenizer:{name:`underline`,level:`inline`,start(e){return e.toLowerCase().indexOf(`<u>`)},tokenize(e,t,n){if(!/^<u>/i.test(e))return;let r=/\\[\s\S]|`+|<\/u>/gi;r.lastIndex=3;let i=r.exec(e);for(;i;){if(i[0].startsWith("`")){let t=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/.exec(e.slice(i.index));t&&(r.lastIndex=i.index+t[0].length)}else if(!i[0].startsWith(`\\`)){let t=e.slice(3,i.index);return t?{type:`underline`,raw:e.slice(0,r.lastIndex),text:t,tokens:n.inlineTokens(t)}:void 0}i=r.exec(e)}}},addCommands(){return{setUnderline:()=>({commands:e})=>e.setMark(this.name),toggleUnderline:()=>({commands:e})=>e.toggleMark(this.name),unsetUnderline:()=>({commands:e})=>e.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});function X_(e={}){return new j({view(t){return new Z_(t,e)}})}var Z_=class{constructor(e,t){this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.lastDragEvent=null,this.width=t.width??1,this.color=t.color===!1?void 0:t.color||`black`,this.class=t.class,this.handlers=[`dragover`,`dragend`,`drop`,`dragleave`].map(t=>{let n=e=>{this[t](e)};return e.dom.addEventListener(t,n),{name:t,handler:n}})}destroy(){this.setCursor(null),this.handlers.forEach(({name:e,handler:t})=>this.editorView.dom.removeEventListener(e,t))}update(e,t){if(this.cursorPos!=null&&t.doc!=e.state.doc){if(this.lastDragEvent){let e=this.computeTarget(this.lastDragEvent);e==this.cursorPos?this.updateOverlay():this.setCursor(e)}else this.updateOverlay()}}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),t=!e.parent.inlineContent,n,r=this.editorView.dom,i=r.getBoundingClientRect(),a=i.width/r.offsetWidth,o=i.height/r.offsetHeight;if(t){let t=e.nodeBefore,r=e.nodeAfter;if(t||r){let e=this.editorView.nodeDOM(this.cursorPos-(t?t.nodeSize:0));if(e){let i=e.getBoundingClientRect(),a=t?i.bottom:i.top;t&&r&&(a=(a+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2);let s=this.width/2*o;n={left:i.left,right:i.right,top:a-s,bottom:a+s}}}}if(!n){let e=this.editorView.coordsAtPos(this.cursorPos),t=this.width/2*a;n={left:e.left-t,right:e.left+t,top:e.top,bottom:e.bottom}}let s=this.editorView.dom.offsetParent;this.element||(this.element=s.appendChild(document.createElement(`div`)),this.class&&(this.element.className=this.class),this.element.style.cssText=`position: absolute; z-index: 50; pointer-events: none;`,this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle(`prosemirror-dropcursor-block`,t),this.element.classList.toggle(`prosemirror-dropcursor-inline`,!t);let c,l;if(!s||s==document.body&&getComputedStyle(s).position==`static`)c=-pageXOffset,l=-pageYOffset;else{let e=s.getBoundingClientRect(),t=e.width/s.offsetWidth,n=e.height/s.offsetHeight;c=e.left-s.scrollLeft*t,l=e.top-s.scrollTop*n}this.element.style.left=(n.left-c)/a+`px`,this.element.style.top=(n.top-l)/o+`px`,this.element.style.width=(n.right-n.left)/a+`px`,this.element.style.height=(n.bottom-n.top)/o+`px`}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}computeTarget(e){let t=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),n=t&&t.inside>=0&&this.editorView.state.doc.nodeAt(t.inside),r=n&&n.type.spec.disableDropCursor,i=typeof r==`function`?r(this.editorView,t,e):r;if(!t||i)return null;let a=t.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let e=hn(this.editorView.state.doc,a,this.editorView.dragging.slice);e!=null&&(a=e)}return a}dragover(e){if(!this.editorView.editable)return;this.lastDragEvent=e;let t=this.computeTarget(e);t!=null&&(this.setCursor(t),this.scheduleRemoval(5e3))}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){this.editorView.dom.contains(e.relatedTarget)||this.setCursor(null)}},Q_=class e extends O{constructor(e){super(e,e)}map(t,n){let r=t.resolve(n.map(this.head));return e.valid(r)?new e(r):O.near(r)}content(){return w.empty}eq(t){return t instanceof e&&t.head==this.head}toJSON(){return{type:`gapcursor`,pos:this.head}}static fromJSON(t,n){if(typeof n.pos!=`number`)throw RangeError(`Invalid input for GapCursor.fromJSON`);return new e(t.resolve(n.pos))}getBookmark(){return new $_(this.anchor)}static valid(e){let t=e.parent;if(t.inlineContent||!tv(e)||!nv(e))return!1;let n=t.type.spec.allowGapCursor;if(n!=null)return n;let r=t.contentMatchAt(e.index()).defaultType;return r&&r.isTextblock}static findGapCursorFrom(t,n,r=!1){search:for(;;){if(!r&&e.valid(t))return t;let i=t.pos,a=null;for(let r=t.depth;;r--){let o=t.node(r);if(n>0?t.indexAfter(r)<o.childCount:t.index(r)>0){a=o.child(n>0?t.indexAfter(r):t.index(r)-1);break}if(r==0)return null;i+=n;let s=t.doc.resolve(i);if(e.valid(s))return s}for(;;){let o=n>0?a.firstChild:a.lastChild;if(!o){if(a.isAtom&&!a.isText&&!A.isSelectable(a)){t=t.doc.resolve(i+a.nodeSize*n),r=!1;continue search}break}a=o,i+=n;let s=t.doc.resolve(i);if(e.valid(s))return s}return null}}};Q_.prototype.visible=!1,Q_.findFrom=Q_.findGapCursorFrom,O.jsonID(`gapcursor`,Q_);var $_=class e{constructor(e){this.pos=e}map(t){return new e(t.map(this.pos))}resolve(e){let t=e.resolve(this.pos);return Q_.valid(t)?new Q_(t):O.near(t)}};function ev(e){return e.isAtom||e.spec.isolating||e.spec.createGapCursor}function tv(e){for(let t=e.depth;t>=0;t--){let n=e.index(t),r=e.node(t);if(n==0){if(r.type.spec.isolating)return!0}else for(let e=r.child(n-1);;e=e.lastChild){if(e.childCount==0&&!e.inlineContent||ev(e.type))return!0;if(e.inlineContent)return!1}}return!0}function nv(e){for(let t=e.depth;t>=0;t--){let n=e.indexAfter(t),r=e.node(t);if(n==r.childCount){if(r.type.spec.isolating)return!0}else for(let e=r.child(n);;e=e.firstChild){if(e.childCount==0&&!e.inlineContent||ev(e.type))return!0;if(e.inlineContent)return!1}}return!0}function rv(){return new j({props:{decorations:cv,createSelectionBetween(e,t,n){return t.pos==n.pos&&Q_.valid(n)?new Q_(n):null},handleClick:ov,handleKeyDown:iv,handleDOMEvents:{beforeinput:sv}}})}var iv=Dc({ArrowLeft:av(`horiz`,-1),ArrowRight:av(`horiz`,1),ArrowUp:av(`vert`,-1),ArrowDown:av(`vert`,1)});function av(e,t){let n=e==`vert`?t>0?`down`:`up`:t>0?`right`:`left`;return function(e,r,i){let a=e.selection,o=t>0?a.$to:a.$from,s=a.empty;if(a instanceof k){if(!i.endOfTextblock(n)||o.depth==0)return!1;s=!1,o=e.doc.resolve(t>0?o.after():o.before())}let c=Q_.findGapCursorFrom(o,t,s);return c?(r&&r(e.tr.setSelection(new Q_(c))),!0):!1}}function ov(e,t,n){if(!e||!e.editable)return!1;let r=e.state.doc.resolve(t);if(!Q_.valid(r))return!1;let i=e.posAtCoords({left:n.clientX,top:n.clientY});return i&&i.inside>-1&&A.isSelectable(e.state.doc.nodeAt(i.inside))?!1:(e.dispatch(e.state.tr.setSelection(new Q_(r))),!0)}function sv(e,t){if(t.inputType!=`insertCompositionText`||!(e.state.selection instanceof Q_))return!1;let{$from:n}=e.state.selection,r=n.parent.contentMatchAt(n.index()).findWrapping(e.state.schema.nodes.text);if(!r)return!1;let i=x.empty;for(let e=r.length-1;e>=0;e--)i=x.from(r[e].createAndFill(null,i));let a=e.state.tr.replace(n.pos,n.pos,new w(i,0,0));return a.setSelection(k.near(a.doc.resolve(n.pos+1))),e.dispatch(a),!1}function cv(e){if(!(e.selection instanceof Q_))return null;let t=document.createElement(`div`);return t.className=`ProseMirror-gapcursor`,V.create(e.doc,[Es.widget(e.selection.head,t,{key:`gapcursor`})])}Y.create({name:`characterCount`,addOptions(){return{limit:null,autoTrim:!0,mode:`textSize`,textCounter:e=>e.length,wordCounter:e=>e.split(` `).filter(e=>e!==``).length}},addStorage(){return{characters:()=>0,words:()=>0}},onBeforeCreate(){this.storage.characters=e=>{let t=e?.node||this.editor.state.doc;if((e?.mode||this.options.mode)===`textSize`){let e=t.textBetween(0,t.content.size,void 0,` `);return this.options.textCounter(e)}return t.nodeSize},this.storage.words=e=>{let t=e?.node||this.editor.state.doc,n=t.textBetween(0,t.content.size,` `,` `);return this.options.wordCounter(n)}},addProseMirrorPlugins(){let e=!1;return[new j({key:new M(`characterCount`),appendTransaction:(t,n,r)=>{if(e)return;let i=this.options.limit,a=this.options.autoTrim;if(i==null||i===0||a===!1){e=!0;return}let o=this.storage.characters({node:r.doc});if(o>i){let t=o-i;console.warn(`[CharacterCount] Initial content exceeded limit of ${i} characters. Content was automatically trimmed.`);let n=r.tr.deleteRange(0,t);return e=!0,n}e=!0},filterTransaction:(e,t)=>{let n=this.options.limit;if(!e.docChanged||n===0||n==null)return!0;let r=this.storage.characters({node:t.doc}),i=this.storage.characters({node:e.doc});if(i<=n||r>n&&i>n&&i<=r)return!0;if(r>n&&i>n&&i>r||!e.getMeta(`paste`))return!1;let a=e.selection.$head.pos,o=a-(i-n),s=a;return e.deleteRange(o,s),!(this.storage.characters({node:e.doc})>n)}})]}});var lv=Y.create({name:`dropCursor`,addOptions(){return{color:`currentColor`,width:1,class:void 0}},addProseMirrorPlugins(){return[X_(this.options)]}});Y.create({name:`focus`,addOptions(){return{className:`has-focus`,mode:`all`}},addProseMirrorPlugins(){return[new j({key:new M(`focus`),props:{decorations:({doc:e,selection:t})=>{let{isEditable:n,isFocused:r}=this.editor,{anchor:i}=t,a=[];if(!n||!r)return V.create(e,[]);let o=0;this.options.mode===`deepest`&&e.descendants((e,t)=>{if(!e.isText){if(!(i>=t&&i<=t+e.nodeSize-1))return!1;o+=1}});let s=0;return e.descendants((e,t)=>{if(e.isText||!(i>=t&&i<=t+e.nodeSize-1))return!1;if(s+=1,this.options.mode===`deepest`&&o-s>0||this.options.mode===`shallowest`&&s>1)return this.options.mode===`deepest`;a.push(Es.node(t,t+e.nodeSize,{class:this.options.className}))}),V.create(e,a)}}})]}});var uv=Y.create({name:`gapCursor`,addProseMirrorPlugins(){return[rv()]},extendNodeSchema(e){return{allowGapCursor:q(K(e,`allowGapCursor`,{name:e.name,options:e.options,storage:e.storage}))??null}}}),dv=`placeholder`,fv=new M(`tiptap__placeholder`);function pv(e){let{editor:t,placeholder:n,dataAttribute:r,pos:i,node:a,isEmptyDoc:o,hasAnchor:s,classes:{emptyNode:c,emptyEditor:l}}=e,u=[c];return o&&u.push(l),Es.node(i,i+a.nodeSize,{class:u.join(` `),[r]:typeof n==`function`?n({editor:t,node:a,pos:i,hasAnchor:s}):n})}function mv(e,t){return typeof e==`function`?e(t):e}function hv({editor:e,options:t,dataAttribute:n,doc:r,selection:i,from:a,to:o}){let{anchor:s}=i,c=[],l=e.isEmpty;return r.nodesBetween(a,o,(r,i)=>{let a=s>=i&&s<=i+r.nodeSize,o=!r.isLeaf&&pd(r);return r.type.isTextblock&&(a||!t.showOnlyCurrent)&&o&&c.push(pv({editor:e,isEmptyDoc:l,dataAttribute:n,hasAnchor:a,placeholder:t.placeholder,classes:{emptyEditor:t.emptyEditorClass,emptyNode:mv(t.emptyNodeClass,{editor:e,node:r,pos:i,hasAnchor:a})},node:r,pos:i})),t.includeChildren}),c}function gv({editor:e,options:t,dataAttribute:n,doc:r,selection:i}){if(!e.isEditable&&t.showOnlyWhenEditable)return null;let{anchor:a}=i,o=[],s=e.isEmpty;if(t.showOnlyCurrent&&!t.includeChildren){let i=r.resolve(a),c=i.depth>0?i.node(1):i.nodeAfter,l=i.depth>0?i.before(1):a;if(c&&c.type.isTextblock&&pd(c)){let r=a>=l&&a<=l+c.nodeSize;o.push(pv({editor:e,isEmptyDoc:s,dataAttribute:n,hasAnchor:r,placeholder:t.placeholder,classes:{emptyEditor:t.emptyEditorClass,emptyNode:mv(t.emptyNodeClass,{editor:e,node:c,pos:l,hasAnchor:r})},node:c,pos:l}))}}else o.push(...hv({editor:e,options:t,dataAttribute:n,doc:r,selection:i,from:0,to:r.content.size}));return V.create(r,o)}function _v(e,t){let n=e.resolve(t);if(n.depth===0){let e=n.nodeAfter??n.nodeBefore;if(!e)return{from:t,to:t};let r=n.nodeAfter?t:t-e.nodeSize;return{from:r,to:r+e.nodeSize}}let r=n.before(1);return{from:r,to:r+n.node(1).nodeSize}}function vv(e,t){return{from:Math.max(0,t.from),to:Math.min(e.content.size,t.to)}}function yv(e,t,n){let r=[];return e.forEach((e,i)=>{let a=i,o=a+e.nodeSize,s=a+1,c=o+1;s<n&&c>t&&r.push({from:a,to:o})}),r}function bv(e){if(e.length===0)return[];let t=[...e].sort((e,t)=>e.from-t.from),n=[{...t[0]}];for(let e=1;e<t.length;e+=1){let r=n[n.length-1],i=t[e];i.from<=r.to?r.to=Math.max(r.to,i.to):n.push({...i})}return n}function xv(e,t){let n=yv(e,t.from,t.to);return n.push(vv(e,_v(e,t.from))),t.to>t.from?n.push(vv(e,_v(e,Math.min(t.to,e.content.size+1)-1))):t.from<e.content.size+1&&n.push(vv(e,_v(e,Math.min(t.from+1,e.content.size)))),n}function Sv(e,t,n){let r=[];if(e.docChanged){let t=ed(e);for(let e of t)r.push(...xv(n.doc,e.newRange))}return e.selectionSet&&(r.push(vv(n.doc,_v(n.doc,e.mapping.map(t.selection.anchor)))),r.push(vv(n.doc,_v(n.doc,n.selection.anchor)))),bv(r)}function Cv(e,t,n){let r=Math.max(0,Math.min(e,n.content.size));return{from:r,to:Math.max(r,Math.min(t,n.content.size))}}function wv({decorations:e,ranges:t,editor:n,options:r,dataAttribute:i,doc:a,selection:o}){let s=e;for(let e of t){let{from:t,to:c}=Cv(e.from,e.to,a),l=s.find(t,c).filter(e=>e.from>=t&&e.to<=c);l.length&&(s=s.remove(l));let u=hv({editor:n,options:r,dataAttribute:i,doc:a,selection:o,from:t,to:c});u.length&&(s=s.add(a,u))}return s}function Tv({editor:e,options:t,dataAttribute:n}){return{init(r,i){return gv({editor:e,options:t,dataAttribute:n,doc:i.doc,selection:i.selection})??V.empty},apply(r,i,a,o){return!r.docChanged&&!r.selectionSet?i:wv({decorations:i.map(r.mapping,r.doc),ranges:Sv(r,a,o),editor:e,options:t,dataAttribute:n,doc:o.doc,selection:o.selection})}}}function Ev(e){return e.replace(/\s+/g,`-`).replace(/[^a-zA-Z0-9-]/g,``).replace(/^[0-9-]+/,``).replace(/^-+/,``).toLowerCase()}function Dv({editor:e,options:t}){let n=t.dataAttribute?`data-${Ev(t.dataAttribute)}`:`data-${dv}`,r=t.showOnlyCurrent&&!t.includeChildren;return new j({key:fv,...r?{}:{state:Tv({editor:e,options:t,dataAttribute:n})},props:{decorations:r?({doc:r,selection:i})=>gv({editor:e,options:t,dataAttribute:n,doc:r,selection:i}):n=>t.showOnlyWhenEditable&&!e.isEditable?V.empty:fv.getState(n)??V.empty}})}var Ov=Y.create({name:`placeholder`,addOptions(){return{emptyEditorClass:`is-editor-empty`,emptyNodeClass:`is-empty`,dataAttribute:dv,placeholder:`Write something …`,showOnlyWhenEditable:!0,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[Dv({editor:this.editor,options:this.options})]}});function kv(e,t){return!e.selection.empty&&!md(e.selection)&&t.isEditable}function Av(e,t){return kv(e,t)&&!t.isFocused&&!t.view.dragging}function jv(){var e;(e=window.getSelection())==null||e.removeAllRanges()}function Mv(e){e.focus()}Y.create({name:`selection`,addOptions(){return{className:`selection`}},addProseMirrorPlugins(){let{editor:e,options:t}=this;return[new j({key:new M(`selection`),props:{decorations(n){return Av(n,e)?V.create(n.doc,[Es.inline(n.selection.from,n.selection.to,{class:t.className})]):null},handleDOMEvents:{blur(t){return kv(t.state,e)&&jv(),!1},focus(t){return kv(t.state,e)&&requestAnimationFrame(()=>{!e.isDestroyed&&t.hasFocus()&&Mv(t)}),!1}}}})]}});function Nv({types:e,node:t}){return t&&Array.isArray(e)&&e.includes(t.type)||t?.type===e}var Pv=Y.create({name:`trailingNode`,addOptions(){return{node:void 0,notAfter:[]}},addProseMirrorPlugins(){let e=new M(this.name),t=this.options.node||this.editor.schema.topNodeType.contentMatch.defaultType?.name||`paragraph`,n=Object.entries(this.editor.schema.nodes).map(([,e])=>e).filter(e=>(this.options.notAfter||[]).concat(t).includes(e.name));return[new j({key:e,appendTransaction:(n,r,i)=>{let{doc:a,tr:o,schema:s}=i,c=e.getState(i),l=a.content.size,u=s.nodes[t];if(!n.some(e=>e.getMeta(`skipTrailingNode`))&&c)return o.insert(l,u.create())},state:{init:(e,t)=>{let r=t.tr.doc.lastChild;return!Nv({node:r,types:n})},apply:(e,t)=>{if(!e.docChanged||e.getMeta(`__uniqueIDTransaction`))return t;let r=e.doc.lastChild;return!Nv({node:r,types:n})}}})]}}),Fv=Y.create({name:`undoRedo`,addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:e,dispatch:t})=>Xc(e,t),redo:()=>({state:e,dispatch:t})=>Zc(e,t)}},addProseMirrorPlugins(){return[Jc(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-я":()=>this.editor.commands.undo(),"Shift-Mod-я":()=>this.editor.commands.redo()}}}),Iv=Y.create({name:`starterKit`,addExtensions(){let e=[];return this.options.bold!==!1&&e.push(Hp.configure(this.options.bold)),this.options.blockquote!==!1&&e.push(Lp.configure(this.options.blockquote)),this.options.bulletList!==!1&&e.push(Ng.configure(this.options.bulletList)),this.options.code!==!1&&e.push(Kp.configure(this.options.code)),this.options.codeBlock!==!1&&e.push(Xp.configure(this.options.codeBlock)),this.options.document!==!1&&e.push(Zp.configure(this.options.document)),this.options.dropcursor!==!1&&e.push(lv.configure(this.options.dropcursor)),this.options.gapcursor!==!1&&e.push(uv.configure(this.options.gapcursor)),this.options.hardBreak!==!1&&e.push(Qp.configure(this.options.hardBreak)),this.options.heading!==!1&&e.push($p.configure(this.options.heading)),this.options.undoRedo!==!1&&e.push(Fv.configure(this.options.undoRedo)),this.options.horizontalRule!==!1&&e.push(em.configure(this.options.horizontalRule)),this.options.italic!==!1&&e.push(am.configure(this.options.italic)),this.options.listItem!==!1&&e.push(s_.configure(this.options.listItem)),this.options.listKeymap!==!1&&e.push(g_.configure(this.options?.listKeymap)),this.options.link!==!1&&e.push(kg.configure(this.options?.link)),this.options.orderedList!==!1&&e.push(I_.configure(this.options.orderedList)),this.options.paragraph!==!1&&e.push(W_.configure(this.options.paragraph)),this.options.strike!==!1&&e.push(q_.configure(this.options.strike)),this.options.text!==!1&&e.push(J_.configure(this.options.text)),this.options.underline!==!1&&e.push(Y_.configure(this.options?.underline)),this.options.trailingNode!==!1&&e.push(Pv.configure(this.options?.trailingNode)),e}}),Lv=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))$/,Rv=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))/g,zv=Qf.create({name:`highlight`,addOptions(){return{multicolor:!1,HTMLAttributes:{}}},addAttributes(){return this.options.multicolor?{color:{default:null,parseHTML:e=>e.getAttribute(`data-color`)||Af(e,`background-color`)||e.style.backgroundColor,renderHTML:e=>Pf(e.color)?{"data-color":e.color,style:`background-color: ${e.color}; color: inherit`}:{}}}:{}},parseHTML(){return[{tag:`mark`}]},renderHTML({HTMLAttributes:e}){return[`mark`,J(this.options.HTMLAttributes,e),0]},renderMarkdown:(e,t)=>`==${t.renderChildren(e)}==`,parseMarkdown:(e,t)=>t.applyMark(`highlight`,t.parseInline(e.tokens||[])),markdownTokenizer:{name:`highlight`,level:`inline`,start:e=>e.indexOf(`==`),tokenize(e,t,n){let r=/^(==)(?!\s)([^=]*[^=\s])(==)/.exec(e);if(r){let e=r[2].trim(),t=n.inlineTokens(e);return{type:`highlight`,raw:r[0],text:e,tokens:t}}}},addCommands(){return{setHighlight:e=>({commands:t})=>t.setMark(this.name,e),toggleHighlight:e=>({commands:t})=>t.toggleMark(this.name,e),unsetHighlight:()=>({commands:e})=>e.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-h":()=>this.editor.commands.toggleHighlight()}},addInputRules(){return[Sp({find:Lv,type:this.type})]},addPasteRules(){return[Dp({find:Rv,type:this.type})]}}),Bv=`:host{--border-color:var(--l-color-border);--border-color-focus:var(--l-focus-ring-color);--border-width:1px;--border-radius:var(--l-radius-md);--background:var(--l-color-surface);--color:var(--l-color-text-primary);--toolbar-background:var(--l-color-surface);--toolbar-padding:.5rem;--toolbar-gap:.25rem;--toolbar-divider-color:var(--l-color-divider);--toolbar-button-size:2rem;--toolbar-button-radius:var(--l-radius-sm);--toolbar-button-color:var(--l-color-text-secondary);--toolbar-button-color-active:var(--l-color-text-primary);--toolbar-button-background-hover:var(--l-color-bg-state-hover);--toolbar-button-background-active:var(--l-color-bg-fill-neutral-subtle);--content-padding:.75rem 1rem;--content-min-height:8rem;--placeholder-color:var(--l-color-text-tertiary);box-sizing:border-box;inline-size:100%;display:block}:host([disabled]){opacity:.5;pointer-events:none}.wrapper,.toolbar,.editor{transition-property:border-color,box-shadow;transition-duration:.15s}@media (prefers-reduced-motion:reduce){.wrapper,.toolbar,.editor{transition-duration:0s}}.wrapper{border-radius:var(--border-radius);background-color:var(--background);color:var(--color);flex-direction:column;display:flex}.toolbar{align-items:center;gap:var(--toolbar-gap);padding:var(--toolbar-padding);border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius);background-color:var(--toolbar-background);flex-wrap:wrap;flex:none;display:flex}.editor{border:var(--border-width) solid var(--border-color);border-radius:var(--border-radius)}:host(:not([toolbar-placement])) .toolbar,:host([toolbar-placement=top]) .toolbar{border-bottom:0;border-end-end-radius:0;border-end-start-radius:0}:host(:not([toolbar-placement])) .editor,:host([toolbar-placement=top]) .editor{border-top:0;border-start-start-radius:0;border-start-end-radius:0}:host([toolbar-placement=bottom]) .toolbar{border-top:0;border-start-start-radius:0;border-start-end-radius:0;order:1}:host([toolbar-placement=bottom]) .editor{border-bottom:0;border-end-end-radius:0;border-end-start-radius:0}.toolbar-button{width:var(--toolbar-button-size);height:var(--toolbar-button-size);border-radius:var(--toolbar-button-radius);color:var(--toolbar-button-color);font-size:calc(var(--toolbar-button-size) * .625);cursor:pointer;background-color:#0000;border:0;place-items:center;padding:0;line-height:1;display:grid}@media (hover:hover){.toolbar-button:hover{background-color:var(--toolbar-button-background-hover);color:var(--toolbar-button-color-active)}}.toolbar-button:focus-visible{outline:var(--l-focus-ring-width) solid var(--l-focus-ring-color);outline-offset:calc(var(--l-focus-ring-offset) / 2)}.toolbar-button.is-active{background-color:var(--toolbar-button-background-active);color:var(--toolbar-button-color-active);box-shadow:inset 0 0 0 1px var(--border-color)}@media (prefers-reduced-motion:no-preference){.toolbar-button{transition:background-color .15s,color .15s}}.divider{width:1px;height:calc(var(--toolbar-button-size) * .5);margin-inline:var(--toolbar-gap);background-color:var(--toolbar-divider-color)}`,Vv=`modulepreload`,Hv=function(e){return`/`+e},Uv={},Wv=function(e){return e.pathname.endsWith(`.css`)},Gv=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},Kv=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=Hv(t,n);let r=s(t),i=Wv(r);return Gv(Uv,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:Vv,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},qv=e(Bv),Jv=class extends Event{constructor(e,t){super(`change`,{bubbles:!0,composed:!1,cancelable:!1}),this.html=e,this.json=t}},Yv=class extends Event{constructor(){super(`add-file`,{bubbles:!1,composed:!1,cancelable:!1})}},Xv={"heading-1":`heading1`,"heading-2":`heading2`,"heading-3":`heading3`,bold:`bold`,italic:`italic`,underline:`underline`,strike:`strikethrough`,highlight:`highlight`,bulletlist:`bulletList`,orderedlist:`orderedList`,blockquote:`blockquote`,"code-block":`codeBlock`,"horizontal-rule":`horizontalRule`,link:`link`,emoji:`emoji`,attachment:`attachFile`,undo:`undo`,redo:`redo`},Zv={minimal:[`bold`,`italic`,`underline`],default:[`heading-1`,`heading-2`,`heading-3`,`divider`,`bold`,`italic`,`underline`,`highlight`,`bulletlist`,`orderedlist`,`blockquote`,`divider`,`code-block`,`horizontal-rule`,`link`,`emoji`,`divider`,`undo`,`redo`]},Qv=class extends h{constructor(...e){super(...e),this._localize=new g(this),this.#e=``,this.#t=``,this.#n=`prose`,this.#r=[],this.#i=`default`,this.#a=`top`,this.#o=!1,this.#s=``,this.#c=``,this._emojiOpenAtPointerDown=!1,this._emojiFocusInsideAtPointerDown=!1,this._emojiReturnFocus=null,this._emojiFocusGuards=[],this._rovingIndex=0,this._rovingFocusActive=!1,this._onFocus=()=>{this._rovingFocusActive||(this.shadowRoot?.activeElement)?.part?.contains(`toolbar-button`)||!this.disabled&&document.activeElement!==this.editor?.view.dom&&this.focus()},this._onToolbarClick=e=>{let t=this._generatedButtons(),n=this._generatedButtonIn(e,t);n&&(this._rovingIndex=t.indexOf(n),this.requestUpdate())},this._onToolbarKeyDown=e=>{let t=this._generatedButtons();if(t.length===0)return;let n=this.shadowRoot?.activeElement,r=t.indexOf(n);if(r===-1)return;let i=-1;switch(e.key){case`ArrowRight`:i=(r+1)%t.length;break;case`ArrowLeft`:i=(r-1+t.length)%t.length;break;case`Home`:i=0;break;case`End`:i=t.length-1;break;default:return}e.preventDefault(),this._rovingIndex=i,this._rovingFocusActive=!0,t[i]?.focus(),queueMicrotask(()=>{this._rovingFocusActive=!1}),this.requestUpdate()},this._onToolbarMouseDown=e=>{this._generatedButtonIn(e)&&e.preventDefault()},this._onKeyDown=e=>{let t=this._emojiPicker;e.key===`Escape`&&!e.isComposing&&t?.matches(`:popover-open`)&&(this._closeEmojiPicker(t.matches(`:focus-within`)),e.preventDefault(),e.stopPropagation())},this._onDocumentPointerDown=e=>{let t=this._emojiPicker;if(!t?.matches(`:popover-open`))return;let n=e.composedPath();n.includes(t)||this._emojiButton&&n.includes(this._emojiButton)||t.hidePopover()},this._onEmojiButtonPointerDown=()=>{this._emojiOpenAtPointerDown=!!this._emojiPicker?.matches(`:popover-open`),this._emojiFocusInsideAtPointerDown=!!this._emojiPicker?.matches(`:focus-within`)}}static{this.styles=[_,qv]}#e;get initialHtml(){return this.#e}set initialHtml(e){this.#e=e}#t;get initialJson(){return this.#t}set initialJson(e){this.#t=e}#n;get editorClass(){return this.#n}set editorClass(e){this.#n=e}#r;get toolbar(){return this.#r}set toolbar(e){this.#r=e}#i;get toolbarPreset(){return this.#i}set toolbarPreset(e){this.#i=e}#a;get toolbarPlacement(){return this.#a}set toolbarPlacement(e){this.#a=e}#o;get autofocus(){return this.#o}set autofocus(e){this.#o=e}#s;get placeholder(){return this.#s}set placeholder(e){this.#s=e}#c;get emojiDataSource(){return this.#c}set emojiDataSource(e){this.#c=e}get validationTarget(){return this._editorRoot}get _toolbar(){return this.toolbar.length>0?this.toolbar:Zv[this.toolbarPreset]}firstUpdated(){queueMicrotask(()=>this._initEditor())}_initEditor(){this.isConnected&&(this.editor=new xp({element:this._createEditorRoot(),editorProps:{attributes:{class:this.editorClass,"aria-label":this.getAttribute(`aria-label`)??this._localize.term(`richTextEditor`)}},extensions:[Iv.configure({link:{openOnClick:!1}}),zv,Ov.configure({placeholder:this.placeholder})],content:this._initialContent(),editable:!this.disabled,autofocus:this.autofocus&&!this.disabled,onUpdate:()=>{this.requestUpdate(),this._emitChange()},onTransaction:()=>this.requestUpdate(),onSelectionUpdate:()=>this.requestUpdate()}),this.addEventListener(`focus`,this._onFocus),document.addEventListener(`keydown`,this._onKeyDown,!0),document.addEventListener(`pointerdown`,this._onDocumentPointerDown,!0),this._syncValue(),this.requestUpdate())}updated(e){if(e.has(`disabled`)&&this.editor&&this.editor.setEditable(!this.disabled),this.editor&&!this.editor.isDestroyed&&!this.hasAttribute(`aria-label`)){let e=this._localize.term(`richTextEditor`),t=this.editor.view.dom;t.getAttribute(`aria-label`)!==e&&t.setAttribute(`aria-label`,e)}}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`focus`,this._onFocus),document.removeEventListener(`keydown`,this._onKeyDown,!0),document.removeEventListener(`pointerdown`,this._onDocumentPointerDown,!0),this._stopEmojiAutoUpdate(),this.editor?.destroy(),this._editorRoot?.remove(),this._emojiPicker?.remove();for(let e of this._emojiFocusGuards)e.remove();this._emojiFocusGuards=[],this._emojiPicker=void 0,this._emojiPickerPromise=void 0}getHTML(){if(!this.editor)return``;let e=this.editor.getHTML();return e===`<p></p>`?``:e}getJSON(){return this.editor?.getJSON()??{}}clear(){this.editor.commands.clearContent(!0)}focus(){this.editor.commands.focus()}blur(){this.editor.commands.blur()}toggleBold(){this.editor.chain().focus().toggleBold().run()}toggleItalic(){this.editor.chain().focus().toggleItalic().run()}toggleUnderline(){this.editor.chain().focus().toggleUnderline().run()}toggleStrike(){this.editor.chain().focus().toggleStrike().run()}toggleHighlight(){this.editor.chain().focus().toggleHighlight().run()}toggleHeading(e){this.editor.chain().focus().toggleHeading({level:e}).run()}toggleBulletList(){this.editor.chain().focus().toggleBulletList().run()}toggleOrderedList(){this.editor.chain().focus().toggleOrderedList().run()}toggleBlockquote(){this.editor.chain().focus().toggleBlockquote().run()}toggleCodeBlock(){this.editor.chain().focus().toggleCodeBlock().run()}setHorizontalRule(){this.editor.chain().focus().setHorizontalRule().run()}undo(){this.editor.chain().focus().undo().run()}redo(){this.editor.chain().focus().redo().run()}toggleLink(){if(this.editor.isActive(`link`)){this.editor.chain().focus().unsetLink().run();return}let e=window.prompt(`URL`);if(!e)return;let t=/^https?:\/\//.test(e)?e:`https://${e}`;this.editor.chain().focus().setLink({href:t}).run()}formResetCallback(){super.formResetCallback(),this.editor?.commands.setContent(this._initialContent())}_syncValue(){if(!this.editor)return;let e=this.getHTML();return this._syncFormValue(e),this.required&&this.setValidity(e?{}:{valueMissing:!0},e?``:`Please fill out this field.`),e}_emitChange(){let e=this._syncValue();e!==void 0&&this.dispatchEvent(new Jv(e,this.getJSON()))}_initialContent(){return this.initialHtml?this.initialHtml:this.initialJson?JSON.parse(this.initialJson):``}_createEditorRoot(){let e=document.createElement(`div`);return e.slot=`editor`,this.append(e),this._editorRoot=e,e}_generatedButtons(){return Array.from(this.shadowRoot?.querySelectorAll(`[part="toolbar-button"]`)??[])}_generatedButtonIn(e,t=this._generatedButtons()){return e.composedPath().find(e=>t.includes(e))}async _onEmojiButtonClick(e){let t=await this._ensureEmojiPicker();t&&((e.detail===0?t.matches(`:popover-open`):this._emojiOpenAtPointerDown)?this._closeEmojiPicker(e.detail!==0&&this._emojiFocusInsideAtPointerDown):t.matches(`:popover-open`)||this._openEmojiPicker(t))}_openEmojiPicker(e){this._emojiReturnFocus=this._focusedElementWithin(),e.showPopover();let t=e.shadowRoot;(t?.querySelector(`#search`)??t?.querySelector(`input, button, [tabindex]:not([tabindex="-1"])`))?.focus({preventScroll:!0})}_focusedElementWithin(){let e=document.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return!(e instanceof HTMLElement)||e===this?null:this.contains(e)||this.shadowRoot?.contains(e)?e:null}_closeEmojiPicker(e){let t=this._emojiPicker;if(t?.matches(`:popover-open`)&&t.hidePopover(),!e)return;let n=this._emojiReturnFocus;n&&this._editorRoot?.contains(n)?this._focusEditor():n?.isConnected?n.focus():this._emojiButton?.focus()}_focusEditor(){this.editor&&!this.editor.isDestroyed&&!this.disabled?this.editor.view.focus():this._emojiButton?.focus()}_ensureEmojiPicker(){return this._emojiPicker?Promise.resolve(this._emojiPicker):this._emojiPickerPromise??=(async()=>{let{default:e}=await Kv(async()=>{let{default:e}=await import(`../../chunks/picker.js`);return{default:e}},[]);if(!this.isConnected)return this._emojiPickerPromise=void 0,null;let t=new e(this.emojiDataSource?{dataSource:this.emojiDataSource}:void 0);t.addEventListener(`emoji-click`,e=>{let n=e.detail.unicode;n&&(this.editor.chain().focus().insertContent(n).run(),this.editor.view.focus(),t.hidePopover())});let n=e=>{let t=document.createElement(`span`);return t.tabIndex=0,Object.assign(t.style,{position:`fixed`,width:`1px`,height:`1px`,opacity:`0`,pointerEvents:`none`,display:`none`}),t.addEventListener(`focus`,()=>{this._closeEmojiPicker(!1),e()}),t};this._emojiFocusGuards=[n(()=>this._emojiButton?.focus()),n(()=>this._focusEditor())];let[r,i]=this._emojiFocusGuards;return this._topLayerContainer().append(r,t,i),t.setAttribute(`popover`,`auto`),Object.assign(t.style,{position:`fixed`,inset:`auto`,margin:`0`,padding:`0`,border:`0`,background:`transparent`,display:`none`}),t.style.setProperty(`--border-radius`,`0.5rem`),t.addEventListener(`beforetoggle`,e=>{let n=e.newState===`open`;t.style.display=n?`flex`:`none`;for(let e of this._emojiFocusGuards)e.style.display=n?`block`:`none`}),t.addEventListener(`toggle`,e=>{e.newState===`open`?this._startEmojiAutoUpdate():this._stopEmojiAutoUpdate()}),this._emojiPicker=t,t})()}_topLayerContainer(){let e=this;for(;e;){if(e instanceof HTMLDialogElement&&e.open)return e;e=e instanceof Element&&e.assignedSlot?e.assignedSlot:e instanceof ShadowRoot?e.host:e.parentNode}return document.body}get _emojiButton(){return this.shadowRoot?.querySelector(`[data-command="emoji"]`)??null}_startEmojiAutoUpdate(){let e=this._emojiButton,t=this._emojiPicker;e&&t&&(this._stopEmojiAutoUpdate(),this._emojiAutoUpdateCleanup=f(e,t,()=>void this._positionEmojiPicker()))}_stopEmojiAutoUpdate(){this._emojiAutoUpdateCleanup?.(),this._emojiAutoUpdateCleanup=void 0}async _positionEmojiPicker(){let e=this._emojiButton,t=this._emojiPicker;if(!e||!t||!t.matches(`:popover-open`))return;let{x:n,y:r}=await m(e,t,{strategy:`fixed`,placement:`bottom`,middleware:[u(4),d(),p({padding:8})]});Object.assign(t.style,{left:`${n}px`,top:`${r}px`})}_renderButton(e,r,i,a=!1,o,s=-1){let c=n(`icon`),l=this._localize.term(Xv[e]);return t`
136
136
  <button
137
137
  type="button"
138
138
  part="toolbar-button"