@ryuzaki13/react-foundation-ui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/dist/advanced-search/index.d.ts +3 -0
  2. package/dist/advanced-search/index.d.ts.map +1 -0
  3. package/dist/advanced-search/index.js +361 -0
  4. package/dist/advanced-search/index.js.map +1 -0
  5. package/dist/advanced-search/lib/index.d.ts +2 -0
  6. package/dist/advanced-search/lib/index.d.ts.map +1 -0
  7. package/dist/advanced-search/lib/searchParts.d.ts +3 -0
  8. package/dist/advanced-search/lib/searchParts.d.ts.map +1 -0
  9. package/dist/advanced-search/model/index.d.ts +5 -0
  10. package/dist/advanced-search/model/index.d.ts.map +1 -0
  11. package/dist/advanced-search/model/types.d.ts +55 -0
  12. package/dist/advanced-search/model/types.d.ts.map +1 -0
  13. package/dist/advanced-search/model/useAdvancedSearch.d.ts +11 -0
  14. package/dist/advanced-search/model/useAdvancedSearch.d.ts.map +1 -0
  15. package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts +6 -0
  16. package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts.map +1 -0
  17. package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts +13 -0
  18. package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts.map +1 -0
  19. package/dist/advanced-search/ui/AdvancedSearchModal.d.ts +13 -0
  20. package/dist/advanced-search/ui/AdvancedSearchModal.d.ts.map +1 -0
  21. package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts +8 -0
  22. package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts.map +1 -0
  23. package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts +9 -0
  24. package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts.map +1 -0
  25. package/dist/advanced-search/ui/index.d.ts +2 -0
  26. package/dist/advanced-search/ui/index.d.ts.map +1 -0
  27. package/dist/badge/Badge.d.ts.map +1 -1
  28. package/dist/badge/index.js +1 -1
  29. package/dist/badge/stories/Badge.stories.js +22 -22
  30. package/dist/base-table/index.js +2 -2
  31. package/dist/base-table/lib/columnPinning.d.ts.map +1 -1
  32. package/dist/base-table/model/useTableColumnOrder.d.ts +1 -1
  33. package/dist/base-table/model/useTableColumnOrder.d.ts.map +1 -1
  34. package/dist/base-table/model/useTableColumnSizing.d.ts +1 -1
  35. package/dist/base-table/model/useTableColumnSizing.d.ts.map +1 -1
  36. package/dist/base-table/ui/BaseTable.d.ts +2 -2
  37. package/dist/base-table/ui/BaseTable.d.ts.map +1 -1
  38. package/dist/base-table/ui/BaseTableHeaderCell.d.ts.map +1 -1
  39. package/dist/base-table/ui/FormattedTableCell.d.ts.map +1 -1
  40. package/dist/button/index.js +7 -7
  41. package/dist/button/stories/Button.stories.js +1 -1
  42. package/dist/check-box/CheckBox.d.ts.map +1 -1
  43. package/dist/check-box/index.js +1 -1
  44. package/dist/check-box/stories/CheckBox.stories.js +25 -25
  45. package/dist/chunks/{BadgeList-DHW_Ktr3.js → BadgeList-DYgun2rf.js} +16 -16
  46. package/dist/chunks/BadgeList-DYgun2rf.js.map +1 -0
  47. package/dist/chunks/{Button-BZ_b-Kin.js → Button-CCWuggdA.js} +16 -16
  48. package/dist/chunks/{Button-BZ_b-Kin.js.map → Button-CCWuggdA.js.map} +1 -1
  49. package/dist/chunks/{CalendarView-B75faWIU.js → CalendarView-DjeTJkTT.js} +149 -149
  50. package/dist/chunks/{CalendarView-B75faWIU.js.map → CalendarView-DjeTJkTT.js.map} +1 -1
  51. package/dist/chunks/{CheckBox-Cck5w1Ud.js → CheckBox-BowNqqd3.js} +13 -13
  52. package/dist/chunks/CheckBox-BowNqqd3.js.map +1 -0
  53. package/dist/chunks/{DateInput-CINDYueM.js → DateInput--tfofQ2x.js} +68 -68
  54. package/dist/chunks/DateInput--tfofQ2x.js.map +1 -0
  55. package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js → DateRangePresetSelect-UgsfaOeM.js} +22 -22
  56. package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js.map → DateRangePresetSelect-UgsfaOeM.js.map} +1 -1
  57. package/dist/chunks/Detail-DHDMsg8q.js +80 -0
  58. package/dist/chunks/{Detail-DKolHye4.js.map → Detail-DHDMsg8q.js.map} +1 -1
  59. package/dist/chunks/{Dialog-BPS4BeWZ.js → Dialog-CFIvGxER.js} +8 -8
  60. package/dist/chunks/Dialog-CFIvGxER.js.map +1 -0
  61. package/dist/chunks/{DisclosureGroup-0BtaXO54.js → DisclosureGroup-CfRTkl6Z.js} +11 -11
  62. package/dist/chunks/DisclosureGroup-CfRTkl6Z.js.map +1 -0
  63. package/dist/chunks/{DropZone-hf7Em__0.js → DropZone-kJfbZU5g.js} +22 -22
  64. package/dist/chunks/DropZone-kJfbZU5g.js.map +1 -0
  65. package/dist/chunks/{DropdownMenu-Ds-trH4M.js → DropdownMenu-DQeR3y7M.js} +138 -138
  66. package/dist/chunks/DropdownMenu-DQeR3y7M.js.map +1 -0
  67. package/dist/chunks/{Flex-DbBdq336.js → Flex-DUYSL5TE.js} +16 -16
  68. package/dist/chunks/{Flex-DbBdq336.js.map → Flex-DUYSL5TE.js.map} +1 -1
  69. package/dist/chunks/Grid-ByIIytjh.js.map +1 -1
  70. package/dist/chunks/{Input-Ce2HXBUc.js → Input-BmjlpA09.js} +76 -76
  71. package/dist/chunks/Input-BmjlpA09.js.map +1 -0
  72. package/dist/chunks/{InputDateTime-DPtY_4Od.js → InputDateTime-CxfAFe2L.js} +56 -56
  73. package/dist/chunks/{InputDateTime-DPtY_4Od.js.map → InputDateTime-CxfAFe2L.js.map} +1 -1
  74. package/dist/chunks/{InputFile-ga5yJmdZ.js → InputFile-CyZu__B_.js} +17 -17
  75. package/dist/chunks/InputFile-CyZu__B_.js.map +1 -0
  76. package/dist/chunks/{InputFiles-Or2Nvfgk.js → InputFiles-CrTJV27R.js} +36 -36
  77. package/dist/chunks/InputFiles-CrTJV27R.js.map +1 -0
  78. package/dist/chunks/{InputImage-BeA5WJz1.js → InputImage-Cw8rPYQu.js} +18 -18
  79. package/dist/chunks/{InputImage-BeA5WJz1.js.map → InputImage-Cw8rPYQu.js.map} +1 -1
  80. package/dist/chunks/{LabeledExpandableActionPanel-Bx-DWmYz.js → LabeledExpandableActionPanel-D3kUvmFH.js} +25 -25
  81. package/dist/chunks/LabeledExpandableActionPanel-D3kUvmFH.js.map +1 -0
  82. package/dist/chunks/Listbox-BZlp5qHz.js +81 -0
  83. package/dist/chunks/Listbox-BZlp5qHz.js.map +1 -0
  84. package/dist/chunks/{MultiSelect-CBqTylqO.js → MultiSelect-D1XYuwH1.js} +113 -113
  85. package/dist/chunks/{MultiSelect-CBqTylqO.js.map → MultiSelect-D1XYuwH1.js.map} +1 -1
  86. package/dist/chunks/{NotificationsHost-BQc-zOr2.js → NotificationsHost-_icJx4xR.js} +34 -34
  87. package/dist/chunks/NotificationsHost-_icJx4xR.js.map +1 -0
  88. package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js → PresetRangeDateInput-CapirptQ.js} +11 -11
  89. package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js.map → PresetRangeDateInput-CapirptQ.js.map} +1 -1
  90. package/dist/chunks/{RadioButton-DJp31HFR.js → RadioButton-D0uA0rX_.js} +13 -13
  91. package/dist/chunks/RadioButton-D0uA0rX_.js.map +1 -0
  92. package/dist/chunks/RadioGroup-B9XjkcOy.js +121 -0
  93. package/dist/chunks/{RadioGroup-BAhN1d1X.js.map → RadioGroup-B9XjkcOy.js.map} +1 -1
  94. package/dist/chunks/{Select-B7k_8_Lf.js → Select-CXeVjVKA.js} +11 -11
  95. package/dist/chunks/Select-CXeVjVKA.js.map +1 -0
  96. package/dist/chunks/{SerializableSelect-53uNCqdE.js → SerializableSelect-DkYeJtAO.js} +2 -2
  97. package/dist/chunks/{SerializableSelect-53uNCqdE.js.map → SerializableSelect-DkYeJtAO.js.map} +1 -1
  98. package/dist/chunks/{SingleDateTimeInput-CwvIbwje.js → SingleDateTimeInput-BmeuVGQT.js} +86 -86
  99. package/dist/chunks/SingleDateTimeInput-BmeuVGQT.js.map +1 -0
  100. package/dist/chunks/{Splitter-NjNFuEq4.js → Splitter-BFkVGVRb.js} +32 -32
  101. package/dist/chunks/{Splitter-NjNFuEq4.js.map → Splitter-BFkVGVRb.js.map} +1 -1
  102. package/dist/chunks/StateSelect-1jH3uLz9.js +78 -0
  103. package/dist/chunks/{StateSelect-D0wuUdT9.js.map → StateSelect-1jH3uLz9.js.map} +1 -1
  104. package/dist/chunks/{Switch-B476FBUD.js → Switch-B57Qmy1z.js} +19 -19
  105. package/dist/chunks/Switch-B57Qmy1z.js.map +1 -0
  106. package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js → TextEditorLexicalClient-DRhAswpP.js} +204 -204
  107. package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js.map → TextEditorLexicalClient-DRhAswpP.js.map} +1 -1
  108. package/dist/chunks/{Textarea-DeJJjjkI.js → Textarea-C9UdUueF.js} +2 -2
  109. package/dist/chunks/{Textarea-DeJJjjkI.js.map → Textarea-C9UdUueF.js.map} +1 -1
  110. package/dist/chunks/{TimePanel-_kF2RtHk.js → TimePanel-b4saqoUY.js} +27 -27
  111. package/dist/chunks/TimePanel-b4saqoUY.js.map +1 -0
  112. package/dist/chunks/{Toggle-C_fE-bkM.js → Toggle-DVqOQXmt.js} +18 -18
  113. package/dist/chunks/{Toggle-C_fE-bkM.js.map → Toggle-DVqOQXmt.js.map} +1 -1
  114. package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js → TreeMultiSelect-CfQhlfnC.js} +6 -6
  115. package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js.map → TreeMultiSelect-CfQhlfnC.js.map} +1 -1
  116. package/dist/chunks/{TreePickerBase-DYzTsSBQ.js → TreePickerBase-BBUOWsSu.js} +154 -154
  117. package/dist/chunks/TreePickerBase-BBUOWsSu.js.map +1 -0
  118. package/dist/chunks/{TreeSelect-DGLDu6qc.js → TreeSelect-2wUXs90E.js} +6 -6
  119. package/dist/chunks/{TreeSelect-DGLDu6qc.js.map → TreeSelect-2wUXs90E.js.map} +1 -1
  120. package/dist/chunks/base-table-CoQlKABk.js +514 -0
  121. package/dist/chunks/base-table-CoQlKABk.js.map +1 -0
  122. package/dist/chunks/{floating-arrow-CdRV69sg.js → floating-arrow-BE-z4QkE.js} +7 -7
  123. package/dist/chunks/{floating-arrow-CdRV69sg.js.map → floating-arrow-BE-z4QkE.js.map} +1 -1
  124. package/dist/chunks/input-search-Dw4rnJBq.js +30 -0
  125. package/dist/chunks/input-search-Dw4rnJBq.js.map +1 -0
  126. package/dist/chunks/{layout-picker-BA9vA8JI.js → layout-picker-MWaImn3L.js} +34 -34
  127. package/dist/chunks/layout-picker-MWaImn3L.js.map +1 -0
  128. package/dist/chunks/{misc-DrmMj8GO.js → misc-DoqZBMof.js} +100 -100
  129. package/dist/chunks/misc-DoqZBMof.js.map +1 -0
  130. package/dist/chunks/{modal-DqVcZws_.js → modal-B3HY3laL.js} +40 -40
  131. package/dist/chunks/modal-B3HY3laL.js.map +1 -0
  132. package/dist/chunks/multi-select-BzYIviCU.js +1305 -0
  133. package/dist/chunks/multi-select-BzYIviCU.js.map +1 -0
  134. package/dist/chunks/{picker-Cj4RnJh6.js → picker-Dg55Ss-B.js} +73 -73
  135. package/dist/chunks/picker-Dg55Ss-B.js.map +1 -0
  136. package/dist/chunks/{popover-C79P5bm2.js → popover-xJJqy1v6.js} +52 -52
  137. package/dist/chunks/popover-xJJqy1v6.js.map +1 -0
  138. package/dist/chunks/{separator-CIqnk2z9.js → separator-B72Aq-6a.js} +2 -2
  139. package/dist/chunks/{separator-CIqnk2z9.js.map → separator-B72Aq-6a.js.map} +1 -1
  140. package/dist/chunks/{slider-34wxzKkG.js → slider-CFKsfxFp.js} +83 -83
  141. package/dist/chunks/slider-CFKsfxFp.js.map +1 -0
  142. package/dist/chunks/sortable-DcTIAbjD.js +185 -0
  143. package/dist/chunks/sortable-DcTIAbjD.js.map +1 -0
  144. package/dist/chunks/{table-BYA0hCj7.js → table-Dc3AqMzP.js} +21 -21
  145. package/dist/chunks/table-Dc3AqMzP.js.map +1 -0
  146. package/dist/chunks/{table-column-interactions-DPyJDD7P.js → table-column-interactions-6RGjmiI5.js} +24 -24
  147. package/dist/chunks/{table-column-interactions-DPyJDD7P.js.map → table-column-interactions-6RGjmiI5.js.map} +1 -1
  148. package/dist/chunks/{tabs-CjU2KCgs.js → tabs-DlnVVMJl.js} +96 -96
  149. package/dist/chunks/{tabs-CjU2KCgs.js.map → tabs-DlnVVMJl.js.map} +1 -1
  150. package/dist/chunks/{toolbar-C-Ziw_Uh.js → toolbar-BCZNdRXM.js} +2 -2
  151. package/dist/chunks/{toolbar-C-Ziw_Uh.js.map → toolbar-BCZNdRXM.js.map} +1 -1
  152. package/dist/chunks/{wheel-picker-DUHGy7wE.js → wheel-picker-FS58cRsQ.js} +23 -23
  153. package/dist/chunks/{wheel-picker-DUHGy7wE.js.map → wheel-picker-FS58cRsQ.js.map} +1 -1
  154. package/dist/context-menu/components/MenuContent.d.ts.map +1 -1
  155. package/dist/context-menu/components/MenuContext.d.ts.map +1 -1
  156. package/dist/context-menu/components/MenuRoot.d.ts.map +1 -1
  157. package/dist/context-menu/components/RadialMenuContent.d.ts.map +1 -1
  158. package/dist/context-menu/index.js +1 -1
  159. package/dist/context-menu/stories/ContextMenu.stories.js +45 -45
  160. package/dist/date-input/index.js +2 -2
  161. package/dist/date-input/lib/types.d.ts.map +1 -1
  162. package/dist/date-input/stories/DateInput.stories.js +2 -2
  163. package/dist/date-input/ui/CalendarView.d.ts.map +1 -1
  164. package/dist/date-input/ui/DateInput.d.ts.map +1 -1
  165. package/dist/date-range-preset-select/index.js +1 -1
  166. package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +8 -8
  167. package/dist/date-time-input/index.js +1 -1
  168. package/dist/date-time-input/lib/dateTimeValue.d.ts.map +1 -1
  169. package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +38 -38
  170. package/dist/date-time-input/stories/TimePanel.stories.js +9 -9
  171. package/dist/date-time-input/ui/SingleDateTimeInput.d.ts.map +1 -1
  172. package/dist/detail/index.js +1 -1
  173. package/dist/detail/stories/Detail.stories.js +1 -1
  174. package/dist/dialog/Dialog.d.ts.map +1 -1
  175. package/dist/dialog/index.js +1 -1
  176. package/dist/dialog/stories/Dialog.stories.js +16 -16
  177. package/dist/disclosure/Disclosure.d.ts.map +1 -1
  178. package/dist/disclosure/index.js +1 -1
  179. package/dist/disclosure/stories/Disclosure.stories.js +1 -1
  180. package/dist/drop-zone/DropZone.d.ts.map +1 -1
  181. package/dist/drop-zone/index.js +1 -1
  182. package/dist/drop-zone/stories/DropZone.stories.d.ts.map +1 -1
  183. package/dist/drop-zone/stories/DropZone.stories.js +14 -14
  184. package/dist/drop-zone/stories/DropZone.stories.js.map +1 -1
  185. package/dist/errors/ErrorDisplay.d.ts.map +1 -1
  186. package/dist/errors/index.js +47 -47
  187. package/dist/errors/index.js.map +1 -1
  188. package/dist/expandable-action-panel/ExpandableActionPanel.d.ts.map +1 -1
  189. package/dist/expandable-action-panel/index.js +1 -1
  190. package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +28 -28
  191. package/dist/flex/index.js +2 -2
  192. package/dist/flex/stories/Flex.stories.js +2 -2
  193. package/dist/floating-arrow/index.js +1 -1
  194. package/dist/fullscreen-portal/index.js +6 -6
  195. package/dist/grid/stories/Grid.stories.js +1 -1
  196. package/dist/image/index.js +123 -123
  197. package/dist/image/index.js.map +1 -1
  198. package/dist/image/ui/ImageSelection.d.ts.map +1 -1
  199. package/dist/input/Input.d.ts.map +1 -1
  200. package/dist/input/index.js +1 -1
  201. package/dist/input/stories/Input.stories.js +11 -11
  202. package/dist/input-date-time/index.js +1 -1
  203. package/dist/input-date-time/stories/InputDateTime.stories.js +11 -11
  204. package/dist/input-file/InputFile.d.ts.map +1 -1
  205. package/dist/input-file/index.js +1 -1
  206. package/dist/input-file/stories/InputFile.stories.d.ts.map +1 -1
  207. package/dist/input-file/stories/InputFile.stories.js +9 -9
  208. package/dist/input-file/stories/InputFile.stories.js.map +1 -1
  209. package/dist/input-files/InputFilesList.d.ts.map +1 -1
  210. package/dist/input-files/index.js +1 -1
  211. package/dist/input-files/stories/InputFiles.stories.d.ts +1 -1
  212. package/dist/input-files/stories/InputFiles.stories.d.ts.map +1 -1
  213. package/dist/input-files/stories/InputFiles.stories.js +9 -9
  214. package/dist/input-files/stories/InputFiles.stories.js.map +1 -1
  215. package/dist/input-image/index.js +1 -1
  216. package/dist/input-image/stories/InputImage.stories.d.ts.map +1 -1
  217. package/dist/input-image/stories/InputImage.stories.js +15 -15
  218. package/dist/input-image/stories/InputImage.stories.js.map +1 -1
  219. package/dist/input-search/index.js +2 -30
  220. package/dist/layout-picker/index.js +1 -1
  221. package/dist/layout-picker/stories/LayoutPicker.stories.js +52 -52
  222. package/dist/layout-picker/ui/LayoutPicker.d.ts.map +1 -1
  223. package/dist/list/List.d.ts.map +1 -1
  224. package/dist/list/index.js +30 -30
  225. package/dist/list/index.js.map +1 -1
  226. package/dist/listbox/Listbox.d.ts.map +1 -1
  227. package/dist/listbox/index.js +1 -1
  228. package/dist/listbox/stories/Listbox.stories.js +19 -19
  229. package/dist/misc/CopyTextWrapper.d.ts.map +1 -1
  230. package/dist/misc/OneStepScroller.d.ts.map +1 -1
  231. package/dist/misc/StateIcon.d.ts.map +1 -1
  232. package/dist/misc/index.js +1 -1
  233. package/dist/modal/Modal.d.ts +5 -1
  234. package/dist/modal/Modal.d.ts.map +1 -1
  235. package/dist/modal/index.js +1 -1
  236. package/dist/modal/stories/Modal.stories.js +55 -55
  237. package/dist/multi-select/index.js +3 -35
  238. package/dist/multi-select/model/useODataMultiSelect.d.ts +23 -0
  239. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -0
  240. package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
  241. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  242. package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts +20 -0
  243. package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts.map +1 -0
  244. package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts +21 -0
  245. package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts.map +1 -0
  246. package/dist/multi-select/ui/ODataMultiSelect.d.ts +7 -0
  247. package/dist/multi-select/ui/ODataMultiSelect.d.ts.map +1 -0
  248. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  249. package/dist/multi-select/ui/index.d.ts +3 -0
  250. package/dist/multi-select/ui/index.d.ts.map +1 -1
  251. package/dist/multi-select/ui/stories/MultiSelect.stories.js +17 -17
  252. package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts +44 -0
  253. package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts.map +1 -0
  254. package/dist/notifications/index.js +1 -1
  255. package/dist/notifications/model/NotificationsProvider.d.ts.map +1 -1
  256. package/dist/notifications/ui/NotificationsHost.d.ts.map +1 -1
  257. package/dist/notifications/ui/stories/NotificationsHost.stories.js +59 -59
  258. package/dist/period-select/PeriodSelect.d.ts +1 -1
  259. package/dist/period-select/PeriodSelect.d.ts.map +1 -1
  260. package/dist/period-select/index.js +20 -20
  261. package/dist/period-select/index.js.map +1 -1
  262. package/dist/period-select/lib/periodSelect.d.ts.map +1 -1
  263. package/dist/period-select/stories/PeriodSelect.stories.d.ts.map +1 -1
  264. package/dist/period-select/stories/PeriodSelect.stories.js +17 -17
  265. package/dist/period-select/stories/PeriodSelect.stories.js.map +1 -1
  266. package/dist/picker/PickerPopup.d.ts.map +1 -1
  267. package/dist/picker/PickerTriggerActions.d.ts.map +1 -1
  268. package/dist/picker/index.js +1 -1
  269. package/dist/picker/model/usePickerFloatingListbox.d.ts.map +1 -1
  270. package/dist/popover/FloatingPopover.d.ts.map +1 -1
  271. package/dist/popover/components/PopoverContent.d.ts.map +1 -1
  272. package/dist/popover/components/PopoverContext.d.ts.map +1 -1
  273. package/dist/popover/index.js +1 -1
  274. package/dist/popover/stories/Popover.stories.js +16 -16
  275. package/dist/preset-range-date-input/index.js +1 -1
  276. package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +9 -9
  277. package/dist/preset-select/index.js +1 -1
  278. package/dist/radio-button/RadioButton.d.ts.map +1 -1
  279. package/dist/radio-button/index.js +1 -1
  280. package/dist/radio-button/stories/RadioButton.stories.js +11 -11
  281. package/dist/radio-group/index.js +1 -1
  282. package/dist/radio-group/stories/RadioGroup.stories.js +21 -21
  283. package/dist/select/ODataSelect.d.ts +9 -0
  284. package/dist/select/ODataSelect.d.ts.map +1 -0
  285. package/dist/select/Select.d.ts.map +1 -1
  286. package/dist/select/index.js +2 -2
  287. package/dist/select/model/useODataSelect.d.ts +25 -0
  288. package/dist/select/model/useODataSelect.d.ts.map +1 -0
  289. package/dist/select/model/useODataSelectBase.d.ts +24 -0
  290. package/dist/select/model/useODataSelectBase.d.ts.map +1 -0
  291. package/dist/select/stories/ODataSelect.stories.d.ts +46 -0
  292. package/dist/select/stories/ODataSelect.stories.d.ts.map +1 -0
  293. package/dist/select/stories/Select.stories.js +23 -23
  294. package/dist/select/stories/SerializableSelect.stories.js +22 -22
  295. package/dist/select/stories/odataStoryFixtures.d.ts +35 -0
  296. package/dist/select/stories/odataStoryFixtures.d.ts.map +1 -0
  297. package/dist/separator/index.js +1 -1
  298. package/dist/simple-table/index.js +5 -5
  299. package/dist/simple-table/index.js.map +1 -1
  300. package/dist/slider/Slider.d.ts.map +1 -1
  301. package/dist/slider/index.js +1 -1
  302. package/dist/slider/stories/Slider.stories.js +32 -32
  303. package/dist/slider/stories/SliderInput.stories.js +39 -39
  304. package/dist/sortable/Sortable.d.ts.map +1 -1
  305. package/dist/sortable/SortableDragHandle.d.ts.map +1 -1
  306. package/dist/sortable/index.js +1 -1
  307. package/dist/sortable/stories/Sortable.stories.js +23 -23
  308. package/dist/splitter/index.js +1 -1
  309. package/dist/splitter/stories/Splitter.stories.js +1 -1
  310. package/dist/state-select/index.js +1 -1
  311. package/dist/state-select/stories/StateSelect.stories.d.ts.map +1 -1
  312. package/dist/state-select/stories/StateSelect.stories.js +23 -23
  313. package/dist/state-select/stories/StateSelect.stories.js.map +1 -1
  314. package/dist/styles.css +1 -1
  315. package/dist/switch/Switch.d.ts.map +1 -1
  316. package/dist/switch/index.js +1 -1
  317. package/dist/switch/stories/Switch.stories.js +11 -11
  318. package/dist/table/Table.d.ts +1 -1
  319. package/dist/table/Table.d.ts.map +1 -1
  320. package/dist/table/index.js +1 -1
  321. package/dist/table/stories/Table.stories.d.ts +155 -0
  322. package/dist/table/stories/Table.stories.d.ts.map +1 -0
  323. package/dist/table-column-interactions/TableHeaderInteractionCell.d.ts.map +1 -1
  324. package/dist/table-column-interactions/index.js +1 -1
  325. package/dist/table-sorting/index.js +1 -1
  326. package/dist/tabs/index.js +1 -1
  327. package/dist/tabs/stories/Tabs.stories.d.ts.map +1 -1
  328. package/dist/tabs/stories/Tabs.stories.js +39 -39
  329. package/dist/tabs/stories/Tabs.stories.js.map +1 -1
  330. package/dist/text/TextOverflow.d.ts.map +1 -1
  331. package/dist/text/index.js +20 -20
  332. package/dist/text/index.js.map +1 -1
  333. package/dist/text-editor/TextEditorLexicalClient.d.ts.map +1 -1
  334. package/dist/text-editor/index.js +3 -3
  335. package/dist/text-editor/toolbar/index.js +1 -1
  336. package/dist/textarea/index.js +1 -1
  337. package/dist/textarea/stories/Textarea.stories.js +8 -8
  338. package/dist/three-scene/index.js +7 -7
  339. package/dist/toggle/index.js +1 -1
  340. package/dist/toggle/stories/Toggle.stories.js +7 -7
  341. package/dist/toolbar/index.js +16 -16
  342. package/dist/tree/index.js +24 -24
  343. package/dist/tree-select/ODataTreeMultiSelect.d.ts +12 -0
  344. package/dist/tree-select/ODataTreeMultiSelect.d.ts.map +1 -0
  345. package/dist/tree-select/ODataTreeSelect.d.ts +13 -0
  346. package/dist/tree-select/ODataTreeSelect.d.ts.map +1 -0
  347. package/dist/tree-select/TreeNodeContent.d.ts.map +1 -1
  348. package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
  349. package/dist/tree-select/index.js +2 -2
  350. package/dist/tree-select/model/buildODataTreeNodes.d.ts +12 -0
  351. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -0
  352. package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts +4 -0
  353. package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts.map +1 -0
  354. package/dist/tree-select/model/useODataTreeData.d.ts +11 -0
  355. package/dist/tree-select/model/useODataTreeData.d.ts.map +1 -0
  356. package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts +55 -0
  357. package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts.map +1 -0
  358. package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts +54 -0
  359. package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts.map +1 -0
  360. package/dist/tree-select/stories/TreeMultiSelect.stories.js +9 -9
  361. package/dist/tree-select/stories/TreeSelect.stories.js +9 -9
  362. package/dist/tree-table/TreeTable.d.ts +1 -1
  363. package/dist/tree-table/TreeTable.d.ts.map +1 -1
  364. package/dist/tree-table/index.js +32 -32
  365. package/dist/tree-table/index.js.map +1 -1
  366. package/dist/tree-table/stories/TreeTable.stories.d.ts +158 -0
  367. package/dist/tree-table/stories/TreeTable.stories.d.ts.map +1 -0
  368. package/dist/wheel-picker/index.js +1 -1
  369. package/package.json +15 -4
  370. package/dist/chunks/BadgeList-DHW_Ktr3.js.map +0 -1
  371. package/dist/chunks/CheckBox-Cck5w1Ud.js.map +0 -1
  372. package/dist/chunks/DateInput-CINDYueM.js.map +0 -1
  373. package/dist/chunks/Detail-DKolHye4.js +0 -80
  374. package/dist/chunks/Dialog-BPS4BeWZ.js.map +0 -1
  375. package/dist/chunks/DisclosureGroup-0BtaXO54.js.map +0 -1
  376. package/dist/chunks/DropZone-hf7Em__0.js.map +0 -1
  377. package/dist/chunks/DropdownMenu-Ds-trH4M.js.map +0 -1
  378. package/dist/chunks/Input-Ce2HXBUc.js.map +0 -1
  379. package/dist/chunks/InputFile-ga5yJmdZ.js.map +0 -1
  380. package/dist/chunks/InputFiles-Or2Nvfgk.js.map +0 -1
  381. package/dist/chunks/LabeledExpandableActionPanel-Bx-DWmYz.js.map +0 -1
  382. package/dist/chunks/Listbox-CY1wQOCP.js +0 -81
  383. package/dist/chunks/Listbox-CY1wQOCP.js.map +0 -1
  384. package/dist/chunks/NotificationsHost-BQc-zOr2.js.map +0 -1
  385. package/dist/chunks/RadioButton-DJp31HFR.js.map +0 -1
  386. package/dist/chunks/RadioGroup-BAhN1d1X.js +0 -121
  387. package/dist/chunks/Select-B7k_8_Lf.js.map +0 -1
  388. package/dist/chunks/SingleDateTimeInput-CwvIbwje.js.map +0 -1
  389. package/dist/chunks/StateSelect-D0wuUdT9.js +0 -78
  390. package/dist/chunks/Switch-B476FBUD.js.map +0 -1
  391. package/dist/chunks/TimePanel-_kF2RtHk.js.map +0 -1
  392. package/dist/chunks/TreePickerBase-DYzTsSBQ.js.map +0 -1
  393. package/dist/chunks/base-table-DVje02Zi.js +0 -514
  394. package/dist/chunks/base-table-DVje02Zi.js.map +0 -1
  395. package/dist/chunks/layout-picker-BA9vA8JI.js.map +0 -1
  396. package/dist/chunks/misc-DrmMj8GO.js.map +0 -1
  397. package/dist/chunks/modal-DqVcZws_.js.map +0 -1
  398. package/dist/chunks/picker-Cj4RnJh6.js.map +0 -1
  399. package/dist/chunks/popover-C79P5bm2.js.map +0 -1
  400. package/dist/chunks/slider-34wxzKkG.js.map +0 -1
  401. package/dist/chunks/sortable-CwDHC3CA.js +0 -185
  402. package/dist/chunks/sortable-CwDHC3CA.js.map +0 -1
  403. package/dist/chunks/table-BYA0hCj7.js.map +0 -1
  404. package/dist/input-search/index.js.map +0 -1
  405. package/dist/multi-select/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TextEditorLexicalClient-DcixYuo4.js","names":[],"sources":["../../src/text-editor/lib/serialization/createLexicalRaw.ts","../../src/text-editor/lib/semantic/getSemanticTagDepth.ts","../../src/text-editor/nodes/AccessibleLinkNode.ts","../../src/text-editor/nodes/SemanticTagNode.ts","../../src/text-editor/model/hooks/useTextEditorLexicalActions.ts","../../src/text-editor/TextEditor.module.scss","../../src/text-editor/EmailDialog.tsx","../../src/text-editor/LinkDialog.tsx","../../src/text-editor/PhoneDialog.tsx","../../src/text-editor/SemanticDialog.tsx","../../src/text-editor/semanticTagConfigs.tsx","../../src/text-editor/TimeDialog.tsx","../../src/text-editor/TextEditorDialogs.tsx","../../src/text-editor/TextEditorLexicalClient.tsx"],"sourcesContent":["import { EditorState as LexicalEditorState } from \"lexical\";\n\nimport type { TextEditorLexicalRaw } from \"../../editorModel\";\n\nexport const createLexicalRaw = (editorState: LexicalEditorState): TextEditorLexicalRaw => {\n\treturn {\n\t\tformat: \"lexical\",\n\t\tversion: 1,\n\t\teditorState: editorState.toJSON() as unknown as Record<string, unknown>\n\t};\n};\n","import type { LexicalNode } from \"lexical\";\n\nexport const getSemanticTagDepth = (node: LexicalNode): number => {\n\tlet depth = 0;\n\tlet current: LexicalNode | null = node;\n\n\twhile (current) {\n\t\tdepth += 1;\n\t\tcurrent = current.getParent();\n\t}\n\n\treturn depth;\n};\n","import { LinkAttributes, LinkNode, SerializedLinkNode } from \"@lexical/link\";\nimport {\n\t$applyNodeReplacement,\n\tDOMConversionMap,\n\tDOMConversionOutput,\n\tEditorConfig,\n\tElementNode,\n\tLexicalNode,\n\tLexicalUpdateJSON,\n\tNodeKey,\n\tRangeSelection,\n\tSpread\n} from \"lexical\";\n\nexport type AccessibleLinkAttributes = LinkAttributes & {\n\tariaLabel?: null | string;\n\tqrCode?: boolean;\n\tadd?: null | string;\n\ttext?: null | string;\n};\n\nexport type SerializedAccessibleLinkNode = Spread<\n\t{\n\t\tariaLabel: null | string;\n\t\tqrCode: boolean;\n\t\tadd: null | string;\n\t\ttext: null | string;\n\t},\n\tSerializedLinkNode\n>;\n\nconst convertAccessibleLinkElement = (domNode: Node): DOMConversionOutput => {\n\tif (!(domNode instanceof HTMLAnchorElement)) {\n\t\treturn { node: null };\n\t}\n\n\tconst textContent = domNode.textContent;\n\tif ((textContent === null || textContent === \"\") && domNode.children.length === 0) {\n\t\treturn { node: null };\n\t}\n\n\treturn {\n\t\tnode: $createAccessibleLinkNode(domNode.getAttribute(\"href\") || \"\", {\n\t\t\trel: domNode.getAttribute(\"rel\"),\n\t\t\ttarget: domNode.getAttribute(\"target\"),\n\t\t\ttitle: domNode.getAttribute(\"title\"),\n\t\t\tariaLabel: domNode.getAttribute(\"aria-label\"),\n\t\t\tqrCode: domNode.getAttribute(\"data-qr-code\") === \"true\",\n\t\t\tadd: null,\n\t\t\ttext: textContent\n\t\t})\n\t};\n};\n\nexport class AccessibleLinkNode extends LinkNode {\n\t__ariaLabel: null | string;\n\t__qrCode: boolean;\n\t__add: null | string;\n\t__text: null | string;\n\n\tstatic getType(): string {\n\t\treturn \"accessible-link\";\n\t}\n\n\tstatic clone(node: AccessibleLinkNode): AccessibleLinkNode {\n\t\treturn new AccessibleLinkNode(\n\t\t\tnode.__url,\n\t\t\t{\n\t\t\t\trel: node.__rel,\n\t\t\t\ttarget: node.__target,\n\t\t\t\ttitle: node.__title,\n\t\t\t\tariaLabel: node.__ariaLabel,\n\t\t\t\tqrCode: node.__qrCode,\n\t\t\t\tadd: node.__add,\n\t\t\t\ttext: node.__text\n\t\t\t},\n\t\t\tnode.__key\n\t\t);\n\t}\n\n\tconstructor(url = \"\", attributes: AccessibleLinkAttributes = {}, key?: NodeKey) {\n\t\tsuper(url, attributes, key);\n\n\t\tconst { ariaLabel = null, qrCode = false, add = null, text = null } = attributes;\n\t\tthis.__ariaLabel = ariaLabel;\n\t\tthis.__qrCode = qrCode;\n\t\tthis.__add = add;\n\t\tthis.__text = text;\n\t}\n\n\tstatic importDOM(): DOMConversionMap | null {\n\t\treturn {\n\t\t\ta: () => ({\n\t\t\t\tconversion: convertAccessibleLinkElement,\n\t\t\t\tpriority: 2\n\t\t\t})\n\t\t};\n\t}\n\n\tstatic importJSON(serializedNode: SerializedAccessibleLinkNode): AccessibleLinkNode {\n\t\treturn $createAccessibleLinkNode().updateFromJSON(serializedNode);\n\t}\n\n\tupdateFromJSON(serializedNode: LexicalUpdateJSON<SerializedAccessibleLinkNode>): this {\n\t\treturn super\n\t\t\t.updateFromJSON(serializedNode)\n\t\t\t.setAriaLabel(serializedNode.ariaLabel || null)\n\t\t\t.setQrCode(!!serializedNode.qrCode)\n\t\t\t.setAdd(serializedNode.add || null)\n\t\t\t.setText(serializedNode.text || null);\n\t}\n\n\texportJSON(): SerializedAccessibleLinkNode {\n\t\treturn {\n\t\t\t...super.exportJSON(),\n\t\t\ttype: \"accessible-link\",\n\t\t\tversion: 1,\n\t\t\tariaLabel: this.getAriaLabel(),\n\t\t\tqrCode: this.getQrCode(),\n\t\t\tadd: this.getAdd(),\n\t\t\ttext: this.getText()\n\t\t} as SerializedAccessibleLinkNode;\n\t}\n\n\tcreateDOM(config: EditorConfig): HTMLElement {\n\t\tconst dom = super.createDOM(config) as HTMLElement;\n\t\tthis.applyAccessibleAttributes(null, dom);\n\t\treturn dom;\n\t}\n\n\tupdateDOM(prevNode: this, anchor: HTMLElement, config: EditorConfig): boolean {\n\t\tconst isUpdated = super.updateDOM(prevNode, anchor as never, config);\n\t\tthis.applyAccessibleAttributes(prevNode, anchor);\n\t\treturn isUpdated;\n\t}\n\n\tapplyAccessibleAttributes(prevNode: this | null, anchor: HTMLElement): void {\n\t\tif (!(anchor instanceof HTMLAnchorElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!prevNode || prevNode.__ariaLabel !== this.__ariaLabel) {\n\t\t\tif (this.__ariaLabel) {\n\t\t\t\tanchor.setAttribute(\"aria-label\", this.__ariaLabel);\n\t\t\t} else {\n\t\t\t\tanchor.removeAttribute(\"aria-label\");\n\t\t\t}\n\t\t}\n\n\t\tif (!prevNode || prevNode.__qrCode !== this.__qrCode) {\n\t\t\tanchor.setAttribute(\"data-qr-code\", this.__qrCode ? \"true\" : \"false\");\n\t\t}\n\t}\n\n\tinsertNewAfter(_selection: RangeSelection, restoreSelection = true): null | ElementNode {\n\t\tconst linkNode = $createAccessibleLinkNode(this.__url, {\n\t\t\trel: this.__rel,\n\t\t\ttarget: this.__target,\n\t\t\ttitle: this.__title,\n\t\t\tariaLabel: this.__ariaLabel,\n\t\t\tqrCode: this.__qrCode,\n\t\t\tadd: this.__add,\n\t\t\ttext: this.__text\n\t\t});\n\t\tthis.insertAfter(linkNode, restoreSelection);\n\t\treturn linkNode;\n\t}\n\n\tgetAriaLabel(): null | string {\n\t\treturn this.getLatest().__ariaLabel;\n\t}\n\n\tsetAriaLabel(ariaLabel: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__ariaLabel = ariaLabel;\n\t\treturn this;\n\t}\n\n\tgetQrCode(): boolean {\n\t\treturn this.getLatest().__qrCode;\n\t}\n\n\tsetQrCode(qrCode: boolean): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__qrCode = qrCode;\n\t\treturn this;\n\t}\n\n\tgetAdd(): null | string {\n\t\treturn this.getLatest().__add;\n\t}\n\n\tsetAdd(add: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__add = add;\n\t\treturn this;\n\t}\n\n\tgetText(): null | string {\n\t\treturn this.getLatest().__text;\n\t}\n\n\tsetText(text: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__text = text;\n\t\treturn this;\n\t}\n}\n\nexport const $createAccessibleLinkNode = (url = \"\", attributes?: AccessibleLinkAttributes): AccessibleLinkNode => {\n\treturn $applyNodeReplacement(new AccessibleLinkNode(url, attributes));\n};\n\nexport const $isAccessibleLinkNode = (node: LexicalNode | null | undefined): node is AccessibleLinkNode => {\n\treturn node instanceof AccessibleLinkNode;\n};\n","import {\n\t$applyNodeReplacement,\n\tDOMConversionMap,\n\tDOMConversionOutput,\n\tEditorConfig,\n\tElementNode,\n\tLexicalNode,\n\tLexicalUpdateJSON,\n\tNodeKey,\n\tRangeSelection,\n\tSerializedElementNode,\n\tSpread\n} from \"lexical\";\n\nexport type SemanticTagAttributes = Record<string, string>;\n\nexport type SerializedSemanticTagNode = Spread<\n\t{\n\t\ttag: string;\n\t\tattributes: SemanticTagAttributes;\n\t\ttext: null | string;\n\t},\n\tSerializedElementNode\n>;\n\nconst getAttributesFromElement = (element: HTMLElement): SemanticTagAttributes => {\n\tconst attributes: SemanticTagAttributes = {};\n\tArray.from(element.attributes).forEach((attr) => {\n\t\tif (attr.name === \"class\") return;\n\t\tattributes[attr.name] = attr.value;\n\t});\n\treturn attributes;\n};\n\nconst convertSemanticTagElement = (domNode: Node): DOMConversionOutput => {\n\tif (!(domNode instanceof HTMLElement)) {\n\t\treturn { node: null };\n\t}\n\n\tconst tag = domNode.tagName.toLowerCase();\n\tif (![\"abbr\", \"span\", \"time\", \"cite\", \"del\", \"ins\"].includes(tag)) {\n\t\treturn { node: null };\n\t}\n\n\tconst text = domNode.textContent;\n\tif ((text === null || text === \"\") && domNode.children.length === 0) {\n\t\treturn { node: null };\n\t}\n\n\treturn {\n\t\tnode: $createSemanticTagNode(tag, getAttributesFromElement(domNode), text)\n\t};\n};\n\nexport class SemanticTagNode extends ElementNode {\n\t__tag: string;\n\t__attributes: SemanticTagAttributes;\n\t__text: null | string;\n\n\tstatic getType(): string {\n\t\treturn \"semantic-tag\";\n\t}\n\n\tstatic clone(node: SemanticTagNode): SemanticTagNode {\n\t\treturn new SemanticTagNode(node.__tag, node.__attributes, node.__text, node.__key);\n\t}\n\n\tconstructor(tag = \"span\", attributes: SemanticTagAttributes = {}, text: null | string = null, key?: NodeKey) {\n\t\tsuper(key);\n\t\tthis.__tag = tag;\n\t\tthis.__attributes = attributes;\n\t\tthis.__text = text;\n\t}\n\n\tstatic importDOM(): DOMConversionMap | null {\n\t\treturn {\n\t\t\tabbr: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tspan: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\ttime: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tcite: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tdel: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tins: () => ({ conversion: convertSemanticTagElement, priority: 2 })\n\t\t};\n\t}\n\n\tstatic importJSON(serializedNode: SerializedSemanticTagNode): SemanticTagNode {\n\t\treturn $createSemanticTagNode(serializedNode.tag, serializedNode.attributes, serializedNode.text).updateFromJSON(serializedNode);\n\t}\n\n\tupdateFromJSON(serializedNode: LexicalUpdateJSON<SerializedSemanticTagNode>): this {\n\t\treturn super\n\t\t\t.updateFromJSON(serializedNode)\n\t\t\t.setTag(serializedNode.tag)\n\t\t\t.setAttributes(serializedNode.attributes || {})\n\t\t\t.setText(serializedNode.text || null);\n\t}\n\n\texportJSON(): SerializedSemanticTagNode {\n\t\treturn {\n\t\t\t...super.exportJSON(),\n\t\t\ttype: \"semantic-tag\",\n\t\t\tversion: 1,\n\t\t\ttag: this.getTag(),\n\t\t\tattributes: this.getAttributes(),\n\t\t\ttext: this.getText()\n\t\t};\n\t}\n\n\tcreateDOM(config: EditorConfig): HTMLElement {\n\t\tvoid config;\n\t\tconst element = document.createElement(this.__tag);\n\t\tthis.applyEditorAttributes(element);\n\t\treturn element;\n\t}\n\n\tupdateDOM(prevNode: this, dom: HTMLElement): boolean {\n\t\tif (prevNode.__tag !== this.__tag) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.applyEditorAttributes(dom);\n\t\treturn false;\n\t}\n\n\texportDOM(): { element: HTMLElement } {\n\t\tconst element = document.createElement(this.__tag);\n\t\tObject.entries(this.__attributes).forEach(([key, value]) => {\n\t\t\telement.setAttribute(key, value);\n\t\t});\n\t\treturn { element };\n\t}\n\n\tapplyEditorAttributes(dom: HTMLElement): void {\n\t\tdom.classList.add(\"custom-tag-highlight\");\n\t\tArray.from(dom.attributes).forEach((attr) => {\n\t\t\tif (attr.name === \"class\") return;\n\t\t\tdom.removeAttribute(attr.name);\n\t\t});\n\t\tObject.entries(this.__attributes).forEach(([key, value]) => {\n\t\t\tdom.setAttribute(key, value);\n\t\t});\n\t}\n\n\tinsertNewAfter(_selection: RangeSelection, restoreSelection = true): null | ElementNode {\n\t\tconst node = $createSemanticTagNode(this.__tag, this.__attributes, this.__text);\n\t\tthis.insertAfter(node, restoreSelection);\n\t\treturn node;\n\t}\n\n\tcanInsertTextBefore(): boolean {\n\t\treturn false;\n\t}\n\n\tcanInsertTextAfter(): boolean {\n\t\treturn false;\n\t}\n\n\tcanBeEmpty(): boolean {\n\t\treturn false;\n\t}\n\n\tisInline(): boolean {\n\t\treturn true;\n\t}\n\n\tgetTag(): string {\n\t\treturn this.getLatest().__tag;\n\t}\n\n\tsetTag(tag: string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__tag = tag;\n\t\treturn this;\n\t}\n\n\tgetAttributes(): SemanticTagAttributes {\n\t\treturn this.getLatest().__attributes;\n\t}\n\n\tsetAttributes(attributes: SemanticTagAttributes): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__attributes = attributes;\n\t\treturn this;\n\t}\n\n\tgetText(): null | string {\n\t\treturn this.getLatest().__text;\n\t}\n\n\tsetText(text: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__text = text;\n\t\treturn this;\n\t}\n}\n\nexport const $createSemanticTagNode = (\n\ttag: string,\n\tattributes: SemanticTagAttributes = {},\n\ttext: null | string = null\n): SemanticTagNode => {\n\treturn $applyNodeReplacement(new SemanticTagNode(tag, attributes, text));\n};\n\nexport const $isSemanticTagNode = (node: LexicalNode | null | undefined): node is SemanticTagNode => {\n\treturn node instanceof SemanticTagNode;\n};\n","import { useCallback } from \"react\";\n\nimport { $isLinkNode } from \"@lexical/link\";\nimport { INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND } from \"@lexical/list\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport {\n\t$createParagraphNode,\n\t$createTextNode,\n\t$getSelection,\n\t$isRangeSelection,\n\tElementFormatType,\n\tFORMAT_ELEMENT_COMMAND,\n\tFORMAT_TEXT_COMMAND,\n\ttype LexicalEditor,\n\ttype LexicalNode,\n\tREDO_COMMAND,\n\tUNDO_COMMAND\n} from \"lexical\";\n\nimport { getSemanticTagDepth } from \"../../lib/semantic/getSemanticTagDepth\";\nimport { getHeadingTagByStyle, getLexicalInlineStyle } from \"../../lib/toolbar/styleMappers\";\nimport { $createAccessibleLinkNode, $isAccessibleLinkNode } from \"../../nodes/AccessibleLinkNode\";\nimport { $createSemanticTagNode, $isSemanticTagNode, type SemanticTagNode } from \"../../nodes/SemanticTagNode\";\nimport { LinkTypes, TagTypes } from \"../../toolbar\";\nimport { type LexicalToolbarState, type LinkType, type TextAlignment } from \"../textEditorTypes\";\n\ninterface InsertLinkPayload {\n\turl: string;\n\ttext: string;\n\tadd: string;\n\tariaLabel: string;\n\tqrCode: boolean;\n}\n\ninterface UseTextEditorLexicalActionsParams {\n\teditor: LexicalEditor | null;\n\ttoolbarState: LexicalToolbarState;\n\thasLocalLinkDialog: boolean;\n\tonOpenLinkDialog: (type: LinkTypes) => void;\n\tonOpenTagDialog: (type: TagTypes) => void;\n}\n\nexport function useTextEditorLexicalActions({\n\teditor,\n\ttoolbarState,\n\thasLocalLinkDialog,\n\tonOpenLinkDialog,\n\tonOpenTagDialog\n}: UseTextEditorLexicalActionsParams) {\n\tconst handleBlockStyleToggle = useCallback(\n\t\t(style: string) => {\n\t\t\tif (!editor) return;\n\n\t\t\tif (style === \"unordered-list-item\") {\n\t\t\t\tif (toolbarState.blockType === \"unordered-list-item\") {\n\t\t\t\t\teditor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (style === \"ordered-list-item\") {\n\t\t\t\tif (toolbarState.blockType === \"ordered-list-item\") {\n\t\t\t\t\teditor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tif (style === \"unstyled\" || style === \"paragraph\") {\n\t\t\t\t\t$setBlocksType(selection, () => $createParagraphNode());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (style === \"blockquote\") {\n\t\t\t\t\t$setBlocksType(selection, () => $createQuoteNode());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst headingTag = getHeadingTagByStyle(style);\n\t\t\t\tif (headingTag) {\n\t\t\t\t\t$setBlocksType(selection, () => $createHeadingNode(headingTag));\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t[editor, toolbarState.blockType]\n\t);\n\n\tconst handleInlineStyleToggle = useCallback(\n\t\t(style: string) => {\n\t\t\tif (!editor) return;\n\n\t\t\tconst lexicalStyle = getLexicalInlineStyle(style);\n\t\t\tif (!lexicalStyle) return;\n\n\t\t\teditor.dispatchCommand(FORMAT_TEXT_COMMAND, lexicalStyle as never);\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleAlignmentChange = useCallback(\n\t\t(alignment: TextAlignment) => {\n\t\t\tif (!editor) return;\n\t\t\teditor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment as ElementFormatType);\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleUndo = useCallback(() => {\n\t\tif (!editor) return;\n\t\teditor.dispatchCommand(UNDO_COMMAND, undefined);\n\t}, [editor]);\n\n\tconst handleRedo = useCallback(() => {\n\t\tif (!editor) return;\n\t\teditor.dispatchCommand(REDO_COMMAND, undefined);\n\t}, [editor]);\n\n\tconst getCurrentSelectionText = useCallback((): string => {\n\t\tif (!editor) return \"\";\n\n\t\tlet text = \"\";\n\t\teditor.getEditorState().read(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection)) return;\n\t\t\ttext = selection.getTextContent();\n\t\t});\n\n\t\treturn text;\n\t}, [editor]);\n\n\tconst insertLinkAtSelection = useCallback(\n\t\t(payload: InsertLinkPayload) => {\n\t\t\tif (!editor) return;\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tconst selectionText = selection.getTextContent();\n\t\t\t\tconst finalText = payload.text.length > 0 ? payload.text : selectionText;\n\t\t\t\tif (!finalText.trim()) return;\n\n\t\t\t\tconst linkNode = $createAccessibleLinkNode(payload.url, {\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener noreferrer\",\n\t\t\t\t\tariaLabel: payload.ariaLabel || selectionText || finalText,\n\t\t\t\t\tqrCode: payload.qrCode,\n\t\t\t\t\tadd: payload.add || null,\n\t\t\t\t\ttext: finalText\n\t\t\t\t});\n\n\t\t\t\tconst textNode = $createTextNode(finalText);\n\t\t\t\tlinkNode.append(textNode);\n\t\t\t\tselection.insertNodes([linkNode]);\n\t\t\t});\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\teditor.focus();\n\t\t\t});\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleAddLink = useCallback(\n\t\t(url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => {\n\t\t\tinsertLinkAtSelection({\n\t\t\t\turl,\n\t\t\t\ttext,\n\t\t\t\tadd,\n\t\t\t\tariaLabel,\n\t\t\t\tqrCode: showQrCode\n\t\t\t});\n\t\t},\n\t\t[insertLinkAtSelection]\n\t);\n\n\tconst handleAddLocalLink = useCallback(\n\t\t(url: string, caption: string) => {\n\t\t\tinsertLinkAtSelection({\n\t\t\t\turl,\n\t\t\t\ttext: caption,\n\t\t\t\tadd: \"\",\n\t\t\t\tariaLabel: \"Внутренняя ссылка на статью: \" + caption,\n\t\t\t\tqrCode: false\n\t\t\t});\n\t\t},\n\t\t[insertLinkAtSelection]\n\t);\n\n\tconst getSelectedLinkState = useCallback((): LinkType => {\n\t\tif (!editor) return \"\";\n\n\t\tlet state: LinkType = \"\";\n\t\teditor.getEditorState().read(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection)) {\n\t\t\t\tstate = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectionText = selection.getTextContent();\n\t\t\tconst anchorNode = selection.anchor.getNode();\n\t\t\tconst linkNode = $findMatchingParent(anchorNode, (node) => $isAccessibleLinkNode(node) || $isLinkNode(node));\n\n\t\t\tif ($isAccessibleLinkNode(linkNode)) {\n\t\t\t\tstate = {\n\t\t\t\t\turl: linkNode.getURL(),\n\t\t\t\t\tariaLabel: linkNode.getAriaLabel() || \"\",\n\t\t\t\t\ttext: linkNode.getText() || selectionText,\n\t\t\t\t\tadd: linkNode.getAdd() || \"\",\n\t\t\t\t\tqrCode: linkNode.getQrCode()\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ($isLinkNode(linkNode)) {\n\t\t\t\tstate = {\n\t\t\t\t\turl: linkNode.getURL(),\n\t\t\t\t\tariaLabel: \"\",\n\t\t\t\t\ttext: selectionText,\n\t\t\t\t\tadd: \"\",\n\t\t\t\t\tqrCode: false\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate = selectionText;\n\t\t});\n\n\t\treturn state;\n\t}, [editor]);\n\n\tconst handleLinkClick = useCallback(\n\t\t(type: LinkTypes) => {\n\t\t\tif (type === LinkTypes.LOCAL_LINK && !hasLocalLinkDialog) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonOpenLinkDialog(type);\n\t\t},\n\t\t[hasLocalLinkDialog, onOpenLinkDialog]\n\t);\n\n\tconst insertSemanticTagAtSelection = useCallback(\n\t\t(tag: string, text: string, attributes: Record<string, string>) => {\n\t\t\tif (!editor) return;\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tconst selectionText = selection.getTextContent().trim();\n\t\t\t\tconst finalText =\n\t\t\t\t\ttext || selectionText || attributes[\"title\"] || attributes[\"aria-label\"] || Object.values(attributes).join(\" \") || tag;\n\n\t\t\t\tif (!finalText.trim()) return;\n\n\t\t\t\tconst node = $createSemanticTagNode(tag, attributes, finalText);\n\t\t\t\tnode.append($createTextNode(finalText));\n\t\t\t\tselection.insertNodes([node]);\n\t\t\t});\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\teditor.focus();\n\t\t\t});\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleCleanSemanticTag = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\teditor.update(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection) || selection.isCollapsed()) return;\n\n\t\t\tconst selectedNodes = selection.getNodes();\n\t\t\tconst semanticNodes = new Set<SemanticTagNode>();\n\n\t\t\tselectedNodes.forEach((node) => {\n\t\t\t\tlet current: LexicalNode | null = node;\n\t\t\t\twhile (current) {\n\t\t\t\t\tif ($isSemanticTagNode(current)) {\n\t\t\t\t\t\tsemanticNodes.add(current);\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = current.getParent();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst sortedNodes = Array.from(semanticNodes).sort((a, b) => getSemanticTagDepth(b) - getSemanticTagDepth(a));\n\t\t\tsortedNodes.forEach((node) => {\n\t\t\t\tif (!node.isAttached()) return;\n\t\t\t\tconst children = node.getChildren();\n\t\t\t\tchildren.forEach((child) => node.insertBefore(child));\n\t\t\t\tnode.remove();\n\t\t\t});\n\t\t});\n\t}, [editor]);\n\n\tconst handleTagClick = useCallback(\n\t\t(type: TagTypes) => {\n\t\t\tonOpenTagDialog(type);\n\t\t},\n\t\t[onOpenTagDialog]\n\t);\n\n\treturn {\n\t\thandleAddLink,\n\t\thandleAddLocalLink,\n\t\thandleAlignmentChange,\n\t\thandleBlockStyleToggle,\n\t\thandleCleanSemanticTag,\n\t\thandleInlineStyleToggle,\n\t\thandleLinkClick,\n\t\thandleRedo,\n\t\thandleTagClick,\n\t\thandleUndo,\n\t\tgetCurrentSelectionText,\n\t\tgetSelectedLinkState,\n\t\tinsertSemanticTagAtSelection\n\t};\n}\n","@use \"@/styles/mixins/mixin\" as *;\n\n.textEditor {\n\tfont-size: inherit;\n}\n\n.textEditorContent {\n\tposition: relative;\n\tpadding: var(--space-md);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--surface-secondary);\n\tborder: var(--border);\n\n\t&.focused {\n\t\tborder-color: var(--brand-primary);\n\t}\n}\n\n.wrapper {\n\tfont-size: inherit;\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { isSafe } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface EmailDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования email-ссылки в текстовом редакторе.\n */\nexport function EmailDialog({ isOpen, onClose, onConfirm, initialState }: EmailDialogProps) {\n\tconst [email, setEmail] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState) && typeof initialState === \"string\") {\n\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t}\n\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetEmail(state.url ?? \"\");\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst validateEmail = (email: string): boolean => {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\tif (!emailRegex.test(email)) {\n\t\t\tsetError(\"Некорректный email адрес\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validateEmail(email)) return;\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"Добавьте описание для email\");\n\t\t\treturn;\n\t\t}\n\n\t\tonConfirm(`mailto:${email}`, \"\", \"\", ariaLabel, false);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetEmail(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на email\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<div className={cn(\"flexColumn\", \"gapMd\")}>\n\t\t\t\t\t<Input label=\"Email адрес\" value={email} onChange={setEmail} placeholder=\"some_email@mail.ru\" />\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Электронная почта руководителя городской думмы\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"outline\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"outline\" tone=\"success\" onClick={handleConfirm} disabled={!email || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { isSafe, validateUrl } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { CheckBox } from \"../check-box\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface LinkDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования ссылки в текстовом редакторе.\n */\nexport function LinkDialog({ isOpen, onClose, onConfirm, initialState }: LinkDialogProps) {\n\tconst [url, setUrl] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [showQrCode, setShowQrCode] = useState(false);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState)) {\n\t\t\tif (typeof initialState === \"string\") {\n\t\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t\t}\n\t\t}\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetUrl(state.url ?? \"\");\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst handleUrlChange = (value: string) => {\n\t\tsetUrl(value);\n\n\t\t// Очищаем ошибку при изменении URL\n\t\tif (error) {\n\t\t\tsetError(null);\n\t\t}\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tconst validation = validateUrl(url);\n\t\tif (!validation.isValid) {\n\t\t\tsetError(validation.error);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"добавьте описание для ссылки\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Добавляем протокол, если его нет\n\t\tconst finalUrl = url.startsWith(\"http\") ? url : `https://${url}`;\n\t\tonConfirm(finalUrl, \"\", \"\", ariaLabel, showQrCode);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetUrl(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на внешний url\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<Input label=\"Полный URL адрес\" value={url} onChange={handleUrlChange} placeholder=\"https://somesite.ru\" />\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Ссылка на официальный сайт городской думмы\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<CheckBox title=\"Показать кнопку для генерации QR кода ссылки\" value={showQrCode} onChange={setShowQrCode} />\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"outline\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"outline\" tone=\"success\" onClick={handleConfirm} disabled={!url || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { formatPhone } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { isSafe } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface PhoneDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования телефонной ссылки в текстовом редакторе.\n */\nexport function PhoneDialog({ isOpen, onClose, onConfirm, initialState }: PhoneDialogProps) {\n\tconst [phone, setPhone] = useState(\"\");\n\tconst [phoneAdd, setPhoneAdd] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState) && typeof initialState === \"string\") {\n\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t}\n\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetPhone((state.url ?? \"\").replace(/\\D/g, \"\").slice(0, 11).replace(/^7/, \"\"));\n\n\t\t\t\tif (!state.add) {\n\t\t\t\t\tsetPhoneAdd((state.url ?? \"\").replace(/\\D/g, \"\").slice(11));\n\t\t\t\t} else {\n\t\t\t\t\tsetPhoneAdd((state.add ?? \"\").replace(/\\D/g, \"\"));\n\t\t\t\t}\n\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst handlePhoneChange = (value: string) => {\n\t\tvalue = value.replace(/\\D/g, \"\");\n\t\tif (value.length <= 10) {\n\t\t\tsetPhone(value);\n\t\t\tsetError(null);\n\t\t} else {\n\t\t\tsetError(\"нельзя ввести более 10 цифр\");\n\t\t}\n\t};\n\n\tconst validatePhone = (phone: string): boolean => {\n\t\tif (phone.length !== 10) {\n\t\t\tsetError(\"номер телефона должен содержать 10 цифр\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validatePhone(phone)) return;\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"добавьте описание для телефона\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst formattedPhone = formatPhone(phone);\n\t\tconst fullPhone = `+7${phone}`;\n\t\tonConfirm(`tel:${fullPhone}`, phoneAdd ? `${formattedPhone} доб. ${phoneAdd}` : formattedPhone, phoneAdd, ariaLabel, false);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetPhone(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на телефон\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<div className={cn(\"flex\", \"alignItemsEnd\", \"gapSm\")}>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"Номер телефона без 7-ки\"\n\t\t\t\t\t\t\tdescription=\"Вводится только номер (10) цифр без каких-либо дополнительных символов. Ссылка будет привязана к текущему выделенному фрагменту текста. Поэтому текст самой ссылки можно оформить грамотно, например: +7 (3522) 12-34-56 доб. 100\"\n\t\t\t\t\t\t\tvalue={phone}\n\t\t\t\t\t\t\tonChange={handlePhoneChange}\n\t\t\t\t\t\t\tplaceholder=\"3522123456\"\n\t\t\t\t\t\t\tclassName=\"flex1\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input label=\"Добавочный номер\" value={phoneAdd} onChange={setPhoneAdd} placeholder=\"100\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tdescription=\"Обязательное поле для организации доступности ссылки для лиц с ОВЗ, использующих скринридеры\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Контактный телефон директора\"\n\t\t\t\t\t/>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm} disabled={!phone || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nexport interface AttributeField {\n\tname: string;\n\tlabel: string;\n\tdescription?: string;\n\tplaceholder?: string;\n\trequired?: boolean;\n\tvalidate?: (value: string) => string | null;\n}\n\nexport interface SemanticTagConfig {\n\ttagName: string;\n\ttitle: string;\n\tdescription: string;\n\texample: ReactNode;\n\tfields: AttributeField[];\n}\n\ninterface SemanticDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tconfig: SemanticTagConfig;\n\tinitialState?: Record<string, string>;\n\tinitialText?: string;\n}\n\n/**\n * Диалог настройки семантического тега и его атрибутов в текстовом редакторе.\n */\nexport function SemanticDialog({ isOpen, onClose, onConfirm, config, initialText = \"\", initialState = {} }: SemanticDialogProps) {\n\tconst [text, setText] = useState(initialText);\n\tconst [values, setValues] = useState<Record<string, string>>({});\n\tconst [errors, setErrors] = useState<Record<string, string | null>>({});\n\tconst [initialized, setInitialized] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (isOpen && !initialized) {\n\t\t\tconst initial = config.fields.reduce(\n\t\t\t\t(acc, field) => {\n\t\t\t\t\tacc[field.name] = initialState[field.name] ?? \"\";\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string>\n\t\t\t);\n\t\t\tsetValues(initial);\n\t\t\tsetErrors({});\n\t\t\tsetInitialized(true);\n\t\t} else if (!isOpen && initialized) {\n\t\t\tsetInitialized(false); // сбрасываем при закрытии\n\t\t}\n\t}, [isOpen, config.fields, initialState, initialized]);\n\n\tconst handleChange = (name: string, value: string) => {\n\t\tsetValues((prev) => ({ ...prev, [name]: value }));\n\t\tsetErrors((prev) => ({ ...prev, [name]: null }));\n\t};\n\n\tconst validate = (): boolean => {\n\t\tconst newErrors: Record<string, string | null> = {};\n\t\tlet isValid = true;\n\n\t\tif (!text.trim()) {\n\t\t\tnewErrors[\"text\"] = \"Обязательное поле\";\n\t\t\tisValid = false;\n\t\t}\n\n\t\tfor (const field of config.fields) {\n\t\t\tconst value = values[field.name]?.trim();\n\t\t\tif (field.required && !value) {\n\t\t\t\tnewErrors[field.name] = \"Обязательное поле\";\n\t\t\t\tisValid = false;\n\t\t\t} else if (field.validate) {\n\t\t\t\tconst err = field.validate(value);\n\t\t\t\tif (err) {\n\t\t\t\t\tnewErrors[field.name] = err;\n\t\t\t\t\tisValid = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn isValid;\n\t};\n\n\tconst handleConfirm = () => {\n\t\tif (!validate()) return;\n\t\tonConfirm(config.tagName, text.trim(), values);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title={`Вставка <${config.tagName}>`} size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{config.description}.<br />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<strong>Пример:</strong> {config.example}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel={config.title}\n\t\t\t\t\t\tdescription={`Данный текст будет вставлен в редактор и обёрнуть в специальный семантический тег ${config.tagName}`}\n\t\t\t\t\t\tvalue={text}\n\t\t\t\t\t\tonChange={setText}\n\t\t\t\t\t\terror={errors[\"text\"] ?? undefined}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t\t{config.fields.map((field) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tkey={field.name}\n\t\t\t\t\t\t\t\tlabel={field.label}\n\t\t\t\t\t\t\t\tdescription={field.description}\n\t\t\t\t\t\t\t\tplaceholder={field.placeholder}\n\t\t\t\t\t\t\t\tvalue={values[field.name] ?? \"\"}\n\t\t\t\t\t\t\t\tonChange={(value) => handleChange(field.name, value)}\n\t\t\t\t\t\t\t\terror={errors[field.name] ?? undefined}\n\t\t\t\t\t\t\t\trequired={field.required}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={onClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { TagTypes } from \"./toolbar\";\n\nimport type { SemanticTagConfig } from \"./SemanticDialog\";\n\nexport const SemanticTagConfigs: Record<TagTypes, SemanticTagConfig> = {\n\t[TagTypes.abbr]: {\n\t\ttagName: \"abbr\",\n\t\ttitle: \"Аббревиатура\",\n\t\tdescription: \"Обозначает аббревиатуры и сокращения, при наведении покажет расшифровку\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\t<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"title\",\n\t\t\t\tlabel: \"Расшифровка\",\n\t\t\t\tdescription: \"Появится как подсказка и будет прочитана скринридером\",\n\t\t\t\tplaceholder: \"например: HyperText Markup Language\",\n\t\t\t\trequired: true\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.lang]: {\n\t\ttagName: \"span\",\n\t\ttitle: \"Текст на другом языке\",\n\t\tdescription:\n\t\t\t\"Указывает язык фрагмента текста, если он отличается от основного языка страницы, скринридер прочитает это слово с французским произношением\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\t<span lang=\"fr\">Bonjour!</span> — сказал турист.\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`<span lang=\"fr\">Bonjour!</span> — сказал турист.`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"lang\",\n\t\t\t\tlabel: \"Код языка\",\n\t\t\t\tplaceholder: \"en, fr, ru\",\n\t\t\t\trequired: true,\n\t\t\t\tvalidate: (val) => (!/^[a-z]{2,3}(-[A-Z]{2})?$/.test(val) ? \"Неверный код языка (например, en или en-US)\" : null)\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.time]: {\n\t\ttagName: \"time\",\n\t\ttitle: \"Дата/время\",\n\t\tdescription: \"\",\n\t\texample: \"\",\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Дата/время (machine-readable)\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18, 14:30, 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: true\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.cite]: {\n\t\ttagName: \"cite\",\n\t\ttitle: \"Цитата источника\",\n\t\tdescription: \"Обозначает название книги, статьи, фильма или другого произведения, на которое вы ссылаетесь\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПо словам Эйнштейна: <cite>«Воображение важнее знания»</cite>.\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`По словам Эйнштейна: <cite>«Воображение важнее знания»</cite>.`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"title\",\n\t\t\t\tlabel: \"Название источника\",\n\t\t\t\tdescription: \"Будет отображаться как подсказка\",\n\t\t\t\tplaceholder: \"например: Википедия\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t},\n\t// [TagTypes.address]: {\n\t// \ttagName: \"address\",\n\t// \ttitle: \"Указывает контакты автора статьи/страницы (не для почтовых адресов компаний!)\",\n\t// \tdescription: \"\",\n\t// \texample: ``,\n\t// \tfields: [\n\t// \t\t{\n\t// \t\t\tname: \"aria-label\",\n\t// \t\t\tlabel: \"Описание (для доступности)\",\n\t// \t\t\tdescription: \"Содержимое будет прочитано скринридером, если адрес не очевиден\",\n\t// \t\t\tplaceholder: \"например: Контактный адрес компании\",\n\t// \t\t\trequired: false\n\t// \t\t}\n\t// \t]\n\t// },\n\t[TagTypes.del]: {\n\t\ttagName: \"del\",\n\t\ttitle: \"Изменения в тексте\",\n\t\tdescription: \"Удаленный фрагмент\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПроект сдачи: <del>1 июня</del> <ins>15 июня</ins>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Когда был удалён\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cite\",\n\t\t\t\tlabel: \"Источник/обоснование\",\n\t\t\t\tdescription: \"Ссылка на объяснение причины\",\n\t\t\t\tplaceholder: \"например: https://example.com/edit-log\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.ins]: {\n\t\ttagName: \"ins\",\n\t\ttitle: \"Изменения в тексте\",\n\t\tdescription: \"Новый добавленный текст\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПроект сдачи: <del>1 июня</del> <ins>15 июня</ins>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Когда был добавлен\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cite\",\n\t\t\t\tlabel: \"Источник/обоснование\",\n\t\t\t\tdescription: \"Ссылка на объяснение причины\",\n\t\t\t\tplaceholder: \"например: https://example.com/edit-log\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t}\n};\n","import { useEffect, useEffectEvent, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\nimport { RadioGroup } from \"../radio-group\";\n\ntype TimeDialogInitialState = {\n\tmode?: TimeMode;\n\tfrom?: string;\n\tto?: string;\n};\n\ninterface TimeDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tinitialState?: TimeDialogInitialState;\n}\n\ntype TimeMode = \"date\" | \"datetime\" | \"time\" | \"range-time\" | \"range-date\" | \"range-datetime\";\n\n/**\n * Диалог настройки временного атрибута или значения в текстовом редакторе.\n */\nexport function TimeDialog({ isOpen, onClose, onConfirm, initialState }: TimeDialogProps) {\n\tconst [mode, setMode] = useState<TimeMode | undefined>(\"date\");\n\tconst [from, setFrom] = useState(\"\");\n\tconst [to, setTo] = useState(\"\");\n\tconst [errors, setErrors] = useState<{ from?: string; to?: string }>({});\n\n\tconst syncInitialState = useEffectEvent((initialState?: TimeDialogInitialState) => {\n\t\tsetMode(initialState?.mode ?? \"date\");\n\t\tsetFrom(initialState?.from ?? \"\");\n\t\tsetTo(initialState?.to ?? \"\");\n\t\tsetErrors({});\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tsyncInitialState(initialState);\n\t\t}\n\t}, [isOpen, initialState]);\n\n\tconst validate = () => {\n\t\tconst newErrors: typeof errors = {};\n\t\t// const isValid = true;\n\n\t\tconst isDate = (v: string) => /^\\d{4}-\\d{2}-\\d{2}$/.test(v);\n\t\tconst isTime = (v: string) => /^\\d{2}:\\d{2}$/.test(v);\n\t\tconst isDateTime = (v: string) => /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(v);\n\n\t\tconst check = (label: string, value: string, type: \"date\" | \"time\" | \"datetime\") => {\n\t\t\tif (!value) return `${label} обязательно`;\n\t\t\tif (type === \"date\" && !isDate(value)) return \"Неверный формат даты (ГГГГ-ММ-ДД)\";\n\t\t\tif (type === \"time\" && !isTime(value)) return \"Неверный формат времени (ЧЧ:ММ)\";\n\t\t\tif (type === \"datetime\" && !isDateTime(value)) return \"Неверный формат даты и времени (ГГГГ-ММ-ДДTЧЧ:ММ)\";\n\t\t\treturn undefined;\n\t\t};\n\n\t\tswitch (mode) {\n\t\t\tcase \"date\":\n\t\t\t\tnewErrors.from = check(\"Дата\", from, \"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"time\":\n\t\t\t\tnewErrors.from = check(\"Время\", from, \"time\");\n\t\t\t\tbreak;\n\t\t\tcase \"datetime\":\n\t\t\t\tnewErrors.from = check(\"Дата и время\", from, \"datetime\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-time\":\n\t\t\t\tnewErrors.from = check(\"Время начала\", from, \"time\");\n\t\t\t\tnewErrors.to = check(\"Время окончания\", to, \"time\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-date\":\n\t\t\t\tnewErrors.from = check(\"Дата начала\", from, \"date\");\n\t\t\t\tnewErrors.to = check(\"Дата окончания\", to, \"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-datetime\":\n\t\t\t\tnewErrors.from = check(\"Начало\", from, \"datetime\");\n\t\t\t\tnewErrors.to = check(\"Окончание\", to, \"datetime\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn Object.values(newErrors).every((e) => !e);\n\t};\n\n\tconst handleConfirm = () => {\n\t\tif (!validate()) return;\n\n\t\tconst datetime = to ? `${from}/${to}` : from;\n\t\tonConfirm(\"time\", datetime, { datetime });\n\t\tonClose();\n\t};\n\n\tconst renderInputs = () => {\n\t\tswitch (mode) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime\":\n\t\t\tcase \"time\":\n\t\t\t\treturn (\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Значение\"\n\t\t\t\t\t\tplaceholder={mode === \"time\" ? \"09:00\" : mode === \"date\" ? \"2025-05-18\" : \"2025-05-18T09:00\"}\n\t\t\t\t\t\tvalue={from}\n\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\terror={errors.from}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"range-time\":\n\t\t\tcase \"range-date\":\n\t\t\tcase \"range-datetime\":\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"С\"\n\t\t\t\t\t\t\tplaceholder={mode.includes(\"time\") ? \"09:00\" : mode.includes(\"date\") ? \"2025-05-18\" : \"2025-05-18T09:00\"}\n\t\t\t\t\t\t\tvalue={from}\n\t\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\t\terror={errors.from}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"По\"\n\t\t\t\t\t\t\tplaceholder={mode.includes(\"time\") ? \"17:00\" : mode.includes(\"date\") ? \"2025-05-22\" : \"2025-05-22T17:00\"}\n\t\t\t\t\t\t\tvalue={to}\n\t\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\t\terror={errors.to}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title=\"Вставка <time>\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<RadioGroup label=\"Тип значения\" value={mode} onChange={setMode}>\n\t\t\t\t\t\t<RadioGroup.Option label=\"Дата\" value=\"date\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Дата и время\" value=\"datetime\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Время\" value=\"time\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон дат\" value=\"range-date\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон времени\" value=\"range-time\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон даты и времени\" value=\"range-datetime\" />\n\t\t\t\t\t</RadioGroup>\n\n\t\t\t\t\t<GridContainer gap=\"md\">{renderInputs()}</GridContainer>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={onClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import type { ComponentType } from \"react\";\n\nimport { EmailDialog } from \"./EmailDialog\";\nimport { LinkDialog } from \"./LinkDialog\";\nimport { PhoneDialog } from \"./PhoneDialog\";\nimport { SemanticDialog } from \"./SemanticDialog\";\nimport { SemanticTagConfigs } from \"./semanticTagConfigs\";\nimport { TimeDialog } from \"./TimeDialog\";\nimport { LinkTypes, TagTypes } from \"./toolbar\";\n\nimport type { LocalLinkDialogAdapterProps } from \"./editorModel\";\nimport type { LinkType } from \"./model/textEditorTypes\";\n\ninterface TextEditorDialogsProps {\n\tlinkTypeDialog: LinkTypes | null;\n\ttagTypeDialog: TagTypes | null;\n\tlocalLinkDialogComponent?: ComponentType<LocalLinkDialogAdapterProps>;\n\tonCloseLinkDialog: () => void;\n\tonCloseTagDialog: () => void;\n\tonAddLink: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tonAddLocalLink: (url: string, caption: string) => void;\n\tonInsertSemanticTag: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tgetCurrentSelectionText: () => string;\n\tgetSelectedLinkState: () => LinkType;\n}\n\n/**\n * Контейнер набора диалогов, которые используются редактором для вставки ссылок и семантических сущностей.\n */\nexport function TextEditorDialogs({\n\tlinkTypeDialog,\n\ttagTypeDialog,\n\tlocalLinkDialogComponent,\n\tonCloseLinkDialog,\n\tonCloseTagDialog,\n\tonAddLink,\n\tonAddLocalLink,\n\tonInsertSemanticTag,\n\tgetCurrentSelectionText,\n\tgetSelectedLinkState\n}: TextEditorDialogsProps) {\n\tconst LocalLinkDialogComponent = localLinkDialogComponent;\n\n\treturn (\n\t\t<>\n\t\t\t{linkTypeDialog && (\n\t\t\t\t<>\n\t\t\t\t\t{LocalLinkDialogComponent && (\n\t\t\t\t\t\t<LocalLinkDialogComponent\n\t\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.LOCAL_LINK}\n\t\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\t\tonConfirm={onAddLocalLink}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<LinkDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.LINK}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<PhoneDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.PHONE}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<EmailDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.EMAIL}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{tagTypeDialog &&\n\t\t\t\t(tagTypeDialog !== TagTypes.time ? (\n\t\t\t\t\t<SemanticDialog\n\t\t\t\t\t\tisOpen={true}\n\t\t\t\t\t\tonClose={onCloseTagDialog}\n\t\t\t\t\t\tonConfirm={onInsertSemanticTag}\n\t\t\t\t\t\tconfig={SemanticTagConfigs[tagTypeDialog]}\n\t\t\t\t\t\tinitialText={getCurrentSelectionText()}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<TimeDialog isOpen={true} onClose={onCloseTagDialog} onConfirm={onInsertSemanticTag} />\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { $generateHtmlFromNodes } from \"@lexical/html\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { type LexicalEditor, type EditorState as LexicalEditorState } from \"lexical\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TextEditorCoreProps, isLexicalTextRaw } from \"./editorModel\";\nimport { InitialHtmlPlugin, SelectionStatePlugin } from \"./lexical/plugins\";\nimport { createLexicalRaw } from \"./lib/serialization/createLexicalRaw\";\nimport { useTextEditorLexicalActions } from \"./model/hooks/useTextEditorLexicalActions\";\nimport { DEFAULT_TOOLBAR_STATE, type LexicalToolbarState } from \"./model/textEditorTypes\";\nimport { AccessibleLinkNode } from \"./nodes/AccessibleLinkNode\";\nimport { SemanticTagNode } from \"./nodes/SemanticTagNode\";\nimport TextEditorStyle from \"./TextEditor.module.scss\";\nimport \"./TextEditor.scss\";\nimport { TextEditorDialogs } from \"./TextEditorDialogs\";\nimport { type LinkTypes, type TagTypes, TextEditorToolbarLexical } from \"./toolbar\";\n\ntype TextEditorProps = TextEditorCoreProps;\n\n/**\n * Редактор форматированного текста на базе Lexical. Поддерживает тулбар, бизнес-адаптеры и сериализацию контента в единый формат данных.\n */\nexport function TextEditorLexicalClient({ initialData, onChange, toolbarComponents, businessAdapters }: TextEditorProps) {\n\tconst LocalLinkDialogComponent = businessAdapters?.LocalLinkDialogComponent;\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [toolbarState, setToolbarState] = useState<LexicalToolbarState>(DEFAULT_TOOLBAR_STATE);\n\tconst [editor, setEditor] = useState<LexicalEditor | null>(null);\n\tconst [linkTypeDialog, setLinkTypeDialog] = useState<LinkTypes | null>(null);\n\tconst [tagTypeDialog, setTagTypeDialog] = useState<TagTypes | null>(null);\n\n\tconst lexicalRaw = isLexicalTextRaw(initialData?.raw) ? initialData.raw : null;\n\tconst hasLexicalRaw = !!lexicalRaw;\n\n\tconst initialEditorState = useMemo(() => {\n\t\tif (!lexicalRaw) return undefined;\n\t\treturn JSON.stringify(lexicalRaw.editorState);\n\t}, [lexicalRaw]);\n\n\tconst handleError = useCallback((error: Error) => {\n\t\tconsole.error(\"Ошибка редактора Lexical\", error);\n\t}, []);\n\n\tconst handleChange = useCallback(\n\t\t(editorState: LexicalEditorState, lexicalEditor: LexicalEditor) => {\n\t\t\tlet html = \"\";\n\t\t\teditorState.read(() => {\n\t\t\t\thtml = $generateHtmlFromNodes(lexicalEditor, null);\n\t\t\t});\n\n\t\t\tconst raw = createLexicalRaw(editorState);\n\t\t\tonChange({ raw, html });\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst openLinkDialog = useCallback((type: LinkTypes) => {\n\t\tsetLinkTypeDialog(type);\n\t}, []);\n\n\tconst openTagDialog = useCallback((type: TagTypes) => {\n\t\tsetTagTypeDialog(type);\n\t}, []);\n\n\tconst actions = useTextEditorLexicalActions({\n\t\teditor,\n\t\ttoolbarState,\n\t\thasLocalLinkDialog: !!LocalLinkDialogComponent,\n\t\tonOpenLinkDialog: openLinkDialog,\n\t\tonOpenTagDialog: openTagDialog\n\t});\n\n\tconst initialConfig = useMemo(\n\t\t() => ({\n\t\t\tnamespace: \"KtkTextEditorLexical\",\n\t\t\tonError: handleError,\n\t\t\ttheme: {\n\t\t\t\tparagraph: \"paragraph\",\n\t\t\t\ttext: {\n\t\t\t\t\tcode: \"lexicalTextCode\",\n\t\t\t\t\thighlight: \"lexicalTextHighlight\",\n\t\t\t\t\tunderline: \"lexicalTextUnderline\",\n\t\t\t\t\tstrikethrough: \"lexicalTextStrikethrough\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tnodes: [HeadingNode, QuoteNode, ListNode, ListItemNode, AccessibleLinkNode, SemanticTagNode],\n\t\t\teditorState: initialEditorState\n\t\t}),\n\t\t[handleError, initialEditorState]\n\t);\n\n\treturn (\n\t\t<div className={TextEditorStyle.textEditor}>\n\t\t\t<div\n\t\t\t\tclassName={cn(TextEditorStyle.textEditorContent, {\n\t\t\t\t\t[TextEditorStyle.focused]: isFocused\n\t\t\t\t})}>\n\t\t\t\t<LexicalComposer initialConfig={initialConfig}>\n\t\t\t\t\t<TextEditorToolbarLexical\n\t\t\t\t\t\ttoolbarComponents={toolbarComponents}\n\t\t\t\t\t\tstate={toolbarState}\n\t\t\t\t\t\tonBlockStyleToggle={actions.handleBlockStyleToggle}\n\t\t\t\t\t\tonInlineStyleToggle={actions.handleInlineStyleToggle}\n\t\t\t\t\t\tonAlignmentChange={actions.handleAlignmentChange}\n\t\t\t\t\t\tonLinkClick={actions.handleLinkClick}\n\t\t\t\t\t\tonTagClick={actions.handleTagClick}\n\t\t\t\t\t\tonUndo={actions.handleUndo}\n\t\t\t\t\t\tonRedo={actions.handleRedo}\n\t\t\t\t\t\tonCleanTag={actions.handleCleanSemanticTag}\n\t\t\t\t\t/>\n\t\t\t\t\t<RichTextPlugin\n\t\t\t\t\t\tcontentEditable={\n\t\t\t\t\t\t\t<ContentEditable\n\t\t\t\t\t\t\t\tclassName=\"lexicalEditorContentEditable\"\n\t\t\t\t\t\t\t\tonFocus={() => setIsFocused(true)}\n\t\t\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tplaceholder={<div className=\"lexicalEditorPlaceholder\">Введите текст...</div>}\n\t\t\t\t\t\tErrorBoundary={LexicalErrorBoundary}\n\t\t\t\t\t/>\n\t\t\t\t\t<HistoryPlugin />\n\t\t\t\t\t<ListPlugin />\n\t\t\t\t\t<SelectionStatePlugin onEditorReady={setEditor} onStateChange={setToolbarState} />\n\t\t\t\t\t<InitialHtmlPlugin initialHTML={initialData?.html} shouldSkip={hasLexicalRaw} />\n\t\t\t\t\t<OnChangePlugin onChange={handleChange} ignoreSelectionChange />\n\t\t\t\t</LexicalComposer>\n\t\t\t</div>\n\n\t\t\t<TextEditorDialogs\n\t\t\t\tlinkTypeDialog={linkTypeDialog}\n\t\t\t\ttagTypeDialog={tagTypeDialog}\n\t\t\t\tlocalLinkDialogComponent={LocalLinkDialogComponent}\n\t\t\t\tonCloseLinkDialog={() => setLinkTypeDialog(null)}\n\t\t\t\tonCloseTagDialog={() => setTagTypeDialog(null)}\n\t\t\t\tonAddLink={actions.handleAddLink}\n\t\t\t\tonAddLocalLink={actions.handleAddLocalLink}\n\t\t\t\tonInsertSemanticTag={actions.insertSemanticTagAtSelection}\n\t\t\t\tgetCurrentSelectionText={actions.getCurrentSelectionText}\n\t\t\t\tgetSelectedLinkState={actions.getSelectedLinkState}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,MAAoB,OACzB;CACN,QAAQ;CACR,SAAS;CACT,aAAa,EAAY,OAAO;AACjC,ICPY,KAAuB,MAA8B;CACjE,IAAI,IAAQ,GACR,IAA8B;CAElC,OAAO,IAEN,AADA,KAAS,GACT,IAAU,EAAQ,UAAU;CAG7B,OAAO;AACR,GCmBM,MAAgC,MAAuC;CAC5E,IAAI,EAAE,aAAmB,oBACxB,OAAO,EAAE,MAAM,KAAK;CAGrB,IAAM,IAAc,EAAQ;CAK5B,QAJK,MAAgB,QAAQ,MAAgB,OAAO,EAAQ,SAAS,WAAW,IACxE,EAAE,MAAM,KAAK,IAGd,EACN,MAAM,EAA0B,EAAQ,aAAa,MAAM,KAAK,IAAI;EACnE,KAAK,EAAQ,aAAa,KAAK;EAC/B,QAAQ,EAAQ,aAAa,QAAQ;EACrC,OAAO,EAAQ,aAAa,OAAO;EACnC,WAAW,EAAQ,aAAa,YAAY;EAC5C,QAAQ,EAAQ,aAAa,cAAc,MAAM;EACjD,KAAK;EACL,MAAM;CACP,CAAC,EACF;AACD,GAEa,IAAb,MAAa,UAA2B,GAAS;CAChD;CACA;CACA;CACA;CAEA,OAAO,UAAkB;EACxB,OAAO;CACR;CAEA,OAAO,MAAM,GAA8C;EAC1D,OAAO,IAAI,EACV,EAAK,OACL;GACC,KAAK,EAAK;GACV,QAAQ,EAAK;GACb,OAAO,EAAK;GACZ,WAAW,EAAK;GAChB,QAAQ,EAAK;GACb,KAAK,EAAK;GACV,MAAM,EAAK;EACZ,GACA,EAAK,KACN;CACD;CAEA,YAAY,IAAM,IAAI,IAAuC,CAAC,GAAG,GAAe;EAC/E,MAAM,GAAK,GAAY,CAAG;EAE1B,IAAM,EAAE,eAAY,MAAM,YAAS,IAAO,SAAM,MAAM,UAAO,SAAS;EAItE,AAHA,KAAK,cAAc,GACnB,KAAK,WAAW,GAChB,KAAK,QAAQ,GACb,KAAK,SAAS;CACf;CAEA,OAAO,YAAqC;EAC3C,OAAO,EACN,UAAU;GACT,YAAY;GACZ,UAAU;EACX,GACD;CACD;CAEA,OAAO,WAAW,GAAkE;EACnF,OAAO,EAA0B,CAAC,CAAC,eAAe,CAAc;CACjE;CAEA,eAAe,GAAuE;EACrF,OAAO,MACL,eAAe,CAAc,CAAC,CAC9B,aAAa,EAAe,aAAa,IAAI,CAAC,CAC9C,UAAU,CAAC,CAAC,EAAe,MAAM,CAAC,CAClC,OAAO,EAAe,OAAO,IAAI,CAAC,CAClC,QAAQ,EAAe,QAAQ,IAAI;CACtC;CAEA,aAA2C;EAC1C,OAAO;GACN,GAAG,MAAM,WAAW;GACpB,MAAM;GACN,SAAS;GACT,WAAW,KAAK,aAAa;GAC7B,QAAQ,KAAK,UAAU;GACvB,KAAK,KAAK,OAAO;GACjB,MAAM,KAAK,QAAQ;EACpB;CACD;CAEA,UAAU,GAAmC;EAC5C,IAAM,IAAM,MAAM,UAAU,CAAM;EAElC,OADA,KAAK,0BAA0B,MAAM,CAAG,GACjC;CACR;CAEA,UAAU,GAAgB,GAAqB,GAA+B;EAC7E,IAAM,IAAY,MAAM,UAAU,GAAU,GAAiB,CAAM;EAEnE,OADA,KAAK,0BAA0B,GAAU,CAAM,GACxC;CACR;CAEA,0BAA0B,GAAuB,GAA2B;EACrE,aAAkB,uBAIpB,CAAC,KAAY,EAAS,gBAAgB,KAAK,iBAC1C,KAAK,cACR,EAAO,aAAa,cAAc,KAAK,WAAW,IAElD,EAAO,gBAAgB,YAAY,KAIjC,CAAC,KAAY,EAAS,aAAa,KAAK,aAC3C,EAAO,aAAa,gBAAgB,KAAK,WAAW,SAAS,OAAO;CAEtE;CAEA,eAAe,GAA4B,IAAmB,IAA0B;EACvF,IAAM,IAAW,EAA0B,KAAK,OAAO;GACtD,KAAK,KAAK;GACV,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,MAAM,KAAK;EACZ,CAAC;EAED,OADA,KAAK,YAAY,GAAU,CAAgB,GACpC;CACR;CAEA,eAA8B;EAC7B,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,aAAa,GAAgC;EAC5C,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,cAAc,GAChB;CACR;CAEA,YAAqB;EACpB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,UAAU,GAAuB;EAChC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,WAAW,GACb;CACR;CAEA,SAAwB;EACvB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,OAAO,GAA0B;EAChC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,QAAQ,GACV;CACR;CAEA,UAAyB;EACxB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,QAAQ,GAA2B;EAClC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,SAAS,GACX;CACR;AACD,GAEa,KAA6B,IAAM,IAAI,MAC5C,EAAsB,IAAI,EAAmB,GAAK,CAAU,CAAC,GAGxD,KAAyB,MAC9B,aAAgB,GC7LlB,MAA4B,MAAgD;CACjF,IAAM,IAAoC,CAAC;CAK3C,OAJA,MAAM,KAAK,EAAQ,UAAU,CAAC,CAAC,SAAS,MAAS;EAC5C,EAAK,SAAS,YAClB,EAAW,EAAK,QAAQ,EAAK;CAC9B,CAAC,GACM;AACR,GAEM,KAA6B,MAAuC;CACzE,IAAI,EAAE,aAAmB,cACxB,OAAO,EAAE,MAAM,KAAK;CAGrB,IAAM,IAAM,EAAQ,QAAQ,YAAY;CACxC,IAAI,CAAC;EAAC;EAAQ;EAAQ;EAAQ;EAAQ;EAAO;CAAK,CAAC,CAAC,SAAS,CAAG,GAC/D,OAAO,EAAE,MAAM,KAAK;CAGrB,IAAM,IAAO,EAAQ;CAKrB,QAJK,MAAS,QAAQ,MAAS,OAAO,EAAQ,SAAS,WAAW,IAC1D,EAAE,MAAM,KAAK,IAGd,EACN,MAAM,EAAuB,GAAK,GAAyB,CAAO,GAAG,CAAI,EAC1E;AACD,GAEa,IAAb,MAAa,UAAwB,EAAY;CAChD;CACA;CACA;CAEA,OAAO,UAAkB;EACxB,OAAO;CACR;CAEA,OAAO,MAAM,GAAwC;EACpD,OAAO,IAAI,EAAgB,EAAK,OAAO,EAAK,cAAc,EAAK,QAAQ,EAAK,KAAK;CAClF;CAEA,YAAY,IAAM,QAAQ,IAAoC,CAAC,GAAG,IAAsB,MAAM,GAAe;EAI5G,AAHA,MAAM,CAAG,GACT,KAAK,QAAQ,GACb,KAAK,eAAe,GACpB,KAAK,SAAS;CACf;CAEA,OAAO,YAAqC;EAC3C,OAAO;GACN,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,YAAY;IAAE,YAAY;IAA2B,UAAU;GAAE;GACjE,YAAY;IAAE,YAAY;IAA2B,UAAU;GAAE;EAClE;CACD;CAEA,OAAO,WAAW,GAA4D;EAC7E,OAAO,EAAuB,EAAe,KAAK,EAAe,YAAY,EAAe,IAAI,CAAC,CAAC,eAAe,CAAc;CAChI;CAEA,eAAe,GAAoE;EAClF,OAAO,MACL,eAAe,CAAc,CAAC,CAC9B,OAAO,EAAe,GAAG,CAAC,CAC1B,cAAc,EAAe,cAAc,CAAC,CAAC,CAAC,CAC9C,QAAQ,EAAe,QAAQ,IAAI;CACtC;CAEA,aAAwC;EACvC,OAAO;GACN,GAAG,MAAM,WAAW;GACpB,MAAM;GACN,SAAS;GACT,KAAK,KAAK,OAAO;GACjB,YAAY,KAAK,cAAc;GAC/B,MAAM,KAAK,QAAQ;EACpB;CACD;CAEA,UAAU,GAAmC;EAE5C,IAAM,IAAU,SAAS,cAAc,KAAK,KAAK;EAEjD,OADA,KAAK,sBAAsB,CAAO,GAC3B;CACR;CAEA,UAAU,GAAgB,GAA2B;EAMpD,OALI,EAAS,UAAU,KAAK,SAI5B,KAAK,sBAAsB,CAAG,GACvB,MAJC;CAKT;CAEA,YAAsC;EACrC,IAAM,IAAU,SAAS,cAAc,KAAK,KAAK;EAIjD,OAHA,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,GAAK,OAAW;GAC3D,EAAQ,aAAa,GAAK,CAAK;EAChC,CAAC,GACM,EAAE,WAAQ;CAClB;CAEA,sBAAsB,GAAwB;EAM7C,AALA,EAAI,UAAU,IAAI,sBAAsB,GACxC,MAAM,KAAK,EAAI,UAAU,CAAC,CAAC,SAAS,MAAS;GACxC,EAAK,SAAS,WAClB,EAAI,gBAAgB,EAAK,IAAI;EAC9B,CAAC,GACD,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,GAAK,OAAW;GAC3D,EAAI,aAAa,GAAK,CAAK;EAC5B,CAAC;CACF;CAEA,eAAe,GAA4B,IAAmB,IAA0B;EACvF,IAAM,IAAO,EAAuB,KAAK,OAAO,KAAK,cAAc,KAAK,MAAM;EAE9E,OADA,KAAK,YAAY,GAAM,CAAgB,GAChC;CACR;CAEA,sBAA+B;EAC9B,OAAO;CACR;CAEA,qBAA8B;EAC7B,OAAO;CACR;CAEA,aAAsB;EACrB,OAAO;CACR;CAEA,WAAoB;EACnB,OAAO;CACR;CAEA,SAAiB;EAChB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,OAAO,GAAmB;EACzB,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,QAAQ,GACV;CACR;CAEA,gBAAuC;EACtC,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,cAAc,GAAyC;EACtD,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,eAAe,GACjB;CACR;CAEA,UAAyB;EACxB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,QAAQ,GAA2B;EAClC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,SAAS,GACX;CACR;AACD,GAEa,KACZ,GACA,IAAoC,CAAC,GACrC,IAAsB,SAEf,EAAsB,IAAI,EAAgB,GAAK,GAAY,CAAI,CAAC,GAG3D,MAAsB,MAC3B,aAAgB;;;ACjKxB,SAAgB,GAA4B,EAC3C,WACA,iBACA,uBACA,qBACA,sBACqC;CACrC,IAAM,IAAyB,GAC7B,MAAkB;EACb,OAEL;OAAI,MAAU,uBAAuB;IACpC,IAAI,EAAa,cAAc,uBAAuB;KACrD,EAAO,gBAAgB,GAAqB,KAAA,CAAS;KACrD;IACD;IACA,EAAO,gBAAgB,IAA+B,KAAA,CAAS;IAC/D;GACD;GAEA,IAAI,MAAU,qBAAqB;IAClC,IAAI,EAAa,cAAc,qBAAqB;KACnD,EAAO,gBAAgB,GAAqB,KAAA,CAAS;KACrD;IACD;IACA,EAAO,gBAAgB,IAA6B,KAAA,CAAS;IAC7D;GACD;GAEA,EAAO,aAAa;IACnB,IAAM,IAAY,EAAc;IAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;IAEnC,IAAI,MAAU,cAAc,MAAU,aAAa;KAClD,EAAe,SAAiB,EAAqB,CAAC;KACtD;IACD;IAEA,IAAI,MAAU,cAAc;KAC3B,EAAe,SAAiB,GAAiB,CAAC;KAClD;IACD;IAEA,IAAM,IAAa,EAAqB,CAAK;IAC7C,AAAI,KACH,EAAe,SAAiB,GAAmB,CAAU,CAAC;GAEhE,CAAC;EA7BD;CA8BD,GACA,CAAC,GAAQ,EAAa,SAAS,CAChC,GAEM,IAA0B,GAC9B,MAAkB;EAClB,IAAI,CAAC,GAAQ;EAEb,IAAM,IAAe,EAAsB,CAAK;EAC3C,KAEL,EAAO,gBAAgB,IAAqB,CAAqB;CAClE,GACA,CAAC,CAAM,CACR,GAEM,IAAwB,GAC5B,MAA6B;EACxB,KACL,EAAO,gBAAgB,IAAwB,CAA8B;CAC9E,GACA,CAAC,CAAM,CACR,GAEM,IAAa,QAAkB;EAC/B,KACL,EAAO,gBAAgB,IAAc,KAAA,CAAS;CAC/C,GAAG,CAAC,CAAM,CAAC,GAEL,IAAa,QAAkB;EAC/B,KACL,EAAO,gBAAgB,IAAc,KAAA,CAAS;CAC/C,GAAG,CAAC,CAAM,CAAC,GAEL,IAA0B,QAA0B;EACzD,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAI,IAAO;EAOX,OANA,EAAO,eAAe,CAAC,CAAC,WAAW;GAClC,IAAM,IAAY,EAAc;GAC3B,EAAkB,CAAS,MAChC,IAAO,EAAU,eAAe;EACjC,CAAC,GAEM;CACR,GAAG,CAAC,CAAM,CAAC,GAEL,IAAwB,GAC5B,MAA+B;EAC1B,MAEL,EAAO,aAAa;GACnB,IAAM,IAAY,EAAc;GAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;GAEnC,IAAM,IAAgB,EAAU,eAAe,GACzC,IAAY,EAAQ,KAAK,SAAS,IAAI,EAAQ,OAAO;GAC3D,IAAI,CAAC,EAAU,KAAK,GAAG;GAEvB,IAAM,IAAW,EAA0B,EAAQ,KAAK;IACvD,QAAQ;IACR,KAAK;IACL,WAAW,EAAQ,aAAa,KAAiB;IACjD,QAAQ,EAAQ;IAChB,KAAK,EAAQ,OAAO;IACpB,MAAM;GACP,CAAC,GAEK,IAAW,EAAgB,CAAS;GAE1C,AADA,EAAS,OAAO,CAAQ,GACxB,EAAU,YAAY,CAAC,CAAQ,CAAC;EACjC,CAAC,GAED,4BAA4B;GAC3B,EAAO,MAAM;EACd,CAAC;CACF,GACA,CAAC,CAAM,CACR,GAEM,IAAgB,GACpB,GAAa,GAAc,GAAa,GAAmB,MAAwB;EACnF,EAAsB;GACrB;GACA;GACA;GACA;GACA,QAAQ;EACT,CAAC;CACF,GACA,CAAC,CAAqB,CACvB,GAEM,IAAqB,GACzB,GAAa,MAAoB;EACjC,EAAsB;GACrB;GACA,MAAM;GACN,KAAK;GACL,WAAW,kCAAkC;GAC7C,QAAQ;EACT,CAAC;CACF,GACA,CAAC,CAAqB,CACvB,GAEM,IAAuB,QAA4B;EACxD,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAI,IAAkB;EAqCtB,OApCA,EAAO,eAAe,CAAC,CAAC,WAAW;GAClC,IAAM,IAAY,EAAc;GAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;IAClC,IAAQ;IACR;GACD;GAEA,IAAM,IAAgB,EAAU,eAAe,GAEzC,IAAW,GADE,EAAU,OAAO,QACC,IAAa,MAAS,EAAsB,CAAI,KAAK,EAAY,CAAI,CAAC;GAE3G,IAAI,EAAsB,CAAQ,GAAG;IACpC,IAAQ;KACP,KAAK,EAAS,OAAO;KACrB,WAAW,EAAS,aAAa,KAAK;KACtC,MAAM,EAAS,QAAQ,KAAK;KAC5B,KAAK,EAAS,OAAO,KAAK;KAC1B,QAAQ,EAAS,UAAU;IAC5B;IACA;GACD;GAEA,IAAI,EAAY,CAAQ,GAAG;IAC1B,IAAQ;KACP,KAAK,EAAS,OAAO;KACrB,WAAW;KACX,MAAM;KACN,KAAK;KACL,QAAQ;IACT;IACA;GACD;GAEA,IAAQ;EACT,CAAC,GAEM;CACR,GAAG,CAAC,CAAM,CAAC,GAEL,IAAkB,GACtB,MAAoB;EAChB,MAAS,EAAU,cAAc,CAAC,KAItC,EAAiB,CAAI;CACtB,GACA,CAAC,GAAoB,CAAgB,CACtC,GAEM,IAA+B,GACnC,GAAa,GAAc,MAAuC;EAC7D,MAEL,EAAO,aAAa;GACnB,IAAM,IAAY,EAAc;GAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;GAEnC,IAAM,IAAgB,EAAU,eAAe,CAAC,CAAC,KAAK,GAChD,IACL,KAAQ,KAAiB,EAAW,SAAY,EAAW,iBAAiB,OAAO,OAAO,CAAU,CAAC,CAAC,KAAK,GAAG,KAAK;GAEpH,IAAI,CAAC,EAAU,KAAK,GAAG;GAEvB,IAAM,IAAO,EAAuB,GAAK,GAAY,CAAS;GAE9D,AADA,EAAK,OAAO,EAAgB,CAAS,CAAC,GACtC,EAAU,YAAY,CAAC,CAAI,CAAC;EAC7B,CAAC,GAED,4BAA4B;GAC3B,EAAO,MAAM;EACd,CAAC;CACF,GACA,CAAC,CAAM,CACR;CAuCA,OAAO;EACN;EACA;EACA;EACA;EACA,wBA1C8B,QAAkB;GAC3C,KAEL,EAAO,aAAa;IACnB,IAAM,IAAY,EAAc;IAChC,IAAI,CAAC,EAAkB,CAAS,KAAK,EAAU,YAAY,GAAG;IAE9D,IAAM,IAAgB,EAAU,SAAS,GACnC,oBAAgB,IAAI,IAAqB;IAa/C,AAXA,EAAc,SAAS,MAAS;KAC/B,IAAI,IAA8B;KAClC,OAAO,IAIN,AAHI,GAAmB,CAAO,KAC7B,EAAc,IAAI,CAAO,GAE1B,IAAU,EAAQ,UAAU;IAE9B,CAAC,GAGD,MAD0B,KAAK,CAAa,CAAC,CAAC,MAAM,GAAG,MAAM,EAAoB,CAAC,IAAI,EAAoB,CAAC,CAC3G,CAAA,CAAY,SAAS,MAAS;KACxB,EAAK,WAAW,MAErB,EADsB,YACtB,CAAA,CAAS,SAAS,MAAU,EAAK,aAAa,CAAK,CAAC,GACpD,EAAK,OAAO;IACb,CAAC;GACF,CAAC;EACF,GAAG,CAAC,CAAM,CAcT;EACA;EACA;EACA;EACA,gBAhBsB,GACrB,MAAmB;GACnB,EAAgB,CAAI;EACrB,GACA,CAAC,CAAe,CAYhB;EACA;EACA;EACA;EACA;CACD;AACD;;;;;;;;;AErTA,SAAgB,GAAY,EAAE,WAAQ,YAAS,cAAW,mBAAkC;CAC3F,IAAM,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,KAAS,QACX,EAAO,CAAY,KAAK,OAAO,KAAiB,WAC5C;EAAE,MAAM;EAAI,KAAK;EAAI,WAAW;EAAI,KAAK;CAAa,IAGvD,CACP;CAED,QAAgB;EACf,AAAI,KACC,EAAO,CAAK,MACf,EAAS,EAAM,OAAO,EAAE,GACxB,EAAa,EAAM,aAAa,EAAE;CAGrC,GAAG,CAAC,GAAQ,CAAK,CAAC;CAElB,IAAM,KAAiB,MAEjB,6BAAW,KAAK,CAAK,IAInB,MAHN,EAAS,0BAA0B,GAC5B,KAKH,KAAiB,MAAkB;EACxC,MAAE,eAAe,GAEZ,EAAc,CAAK,GACxB;OAAI,CAAC,GAAW;IACf,EAAS,6BAA6B;IACtC;GACD;GAGA,AADA,EAAU,UAAU,KAAS,IAAI,IAAI,GAAW,EAAK,GACrD,EAAY;EAHZ;CAID,GAEM,UAAoB;EAIzB,AAHA,EAAS,EAAE,GACX,EAAa,EAAE,GACf,EAAS,IAAI,GACb,EAAQ;CACT;CAEA,OACC,kBAAC,GAAD;EAAe;EAAQ,SAAS;EAAa,OAAM;EAAkB,MAAK;YAA1E,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,OAAD;GAAK,WAAW,EAAG,cAAc,OAAO;aAAxC;IACC,kBAAC,GAAD;KAAO,OAAM;KAAc,OAAO;KAAO,UAAU;KAAU,aAAY;IAAsB,CAAA;IAE9F,KACA,kBAAC,OAAD;KAAK,WAAU;eAAf;MACC,kBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA;MAAC;MAAC,kBAAC,QAAD;OAAM,WAAU;iBAAc;MAAY,CAAA;KACrE;;IAGN,kBAAC,GAAD;KACC,OAAM;KACN,OAAO;KACP,UAAU;KACV,aAAY;IACZ,CAAA;GACG;KACQ,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAQ,SAAS;aAAa;EAExD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAU,SAAS;GAAe,UAAU,CAAC,KAAS,CAAC;aAAW;EAE5F,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AC/EA,SAAgB,EAAW,EAAE,WAAQ,YAAS,cAAW,mBAAiC;CACzF,IAAM,CAAC,GAAK,KAAU,EAAS,EAAE,GAC3B,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,CAAC,KAAS,QACX,EAAO,CAAY,KAClB,OAAO,KAAiB,WACpB;EAAE,MAAM;EAAI,KAAK;EAAI,WAAW;EAAI,KAAK;CAAa,IAGxD,CACP;CAED,QAAgB;EACf,AAAI,KACC,EAAO,CAAK,MACf,EAAO,EAAM,OAAO,EAAE,GACtB,EAAa,EAAM,aAAa,EAAE;CAGrC,GAAG,CAAC,GAAQ,CAAK,CAAC;CAElB,IAAM,KAAmB,MAAkB;EAI1C,AAHA,EAAO,CAAK,GAGR,KACH,EAAS,IAAI;CAEf,GAEM,KAAiB,MAAkB;EACxC,EAAE,eAAe;EAEjB,IAAM,IAAa,EAAY,CAAG;EAClC,IAAI,CAAC,EAAW,SAAS;GACxB,EAAS,EAAW,KAAK;GACzB;EACD;EAEA,IAAI,CAAC,GAAW;GACf,EAAS,8BAA8B;GACvC;EACD;EAKA,AADA,EADiB,EAAI,WAAW,MAAM,IAAI,IAAM,WAAW,KACvC,IAAI,IAAI,GAAW,CAAU,GACjD,EAAY;CACb,GAEM,UAAoB;EAIzB,AAHA,EAAO,EAAE,GACT,EAAa,EAAE,GACf,EAAS,IAAI,GACb,EAAQ;CACT;CAEA,OACC,kBAAC,GAAD;EAAe;EAAQ,SAAS;EAAa,OAAM;EAAwB,MAAK;YAAhF,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB;IACC,kBAAC,GAAD;KAAO,OAAM;KAAmB,OAAO;KAAK,UAAU;KAAiB,aAAY;IAAuB,CAAA;IAEzG,KACA,kBAAC,OAAD;KAAK,WAAU;eAAf;MACC,kBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA;MAAC;MAAC,kBAAC,QAAD;OAAM,WAAU;iBAAc;MAAY,CAAA;KACrE;;IAGN,kBAAC,GAAD;KACC,OAAM;KACN,OAAO;KACP,UAAU;KACV,aAAY;IACZ,CAAA;IAED,kBAAC,GAAD;KAAU,OAAM;KAA+C,OAAO;KAAY,UAAU;IAAgB,CAAA;GAC9F;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAQ,SAAS;aAAa;EAExD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAU,SAAS;GAAe,UAAU,CAAC,KAAO,CAAC;aAAW;EAE1F,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AC1FA,SAAgB,GAAY,EAAE,WAAQ,YAAS,cAAW,mBAAkC;CAC3F,IAAM,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAU,KAAe,EAAS,EAAE,GACrC,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,KAAS,QACX,EAAO,CAAY,KAAK,OAAO,KAAiB,WAC5C;EAAE,MAAM;EAAI,KAAK;EAAI,WAAW;EAAI,KAAK;CAAa,IAGvD,CACP;CAED,QAAgB;EACf,AAAI,KACC,EAAO,CAAK,MACf,GAAU,EAAM,OAAO,GAAA,CAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,GAEvE,EAAM,MAGV,GAAa,EAAM,OAAO,GAAA,CAAI,QAAQ,OAAO,EAAE,CAAC,IAFhD,GAAa,EAAM,OAAO,GAAA,CAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAK3D,EAAa,EAAM,aAAa,EAAE;CAGrC,GAAG,CAAC,GAAQ,CAAK,CAAC;CAElB,IAAM,KAAqB,MAAkB;EAE5C,AADA,IAAQ,EAAM,QAAQ,OAAO,EAAE,GAC3B,EAAM,UAAU,MACnB,EAAS,CAAK,GACd,EAAS,IAAI,KAEb,EAAS,6BAA6B;CAExC,GAEM,KAAiB,MAClB,EAAM,WAAW,KAId,MAHN,EAAS,yCAAyC,GAC3C,KAKH,KAAiB,MAAkB;EAGxC,IAFA,EAAE,eAAe,GAEb,CAAC,EAAc,CAAK,GAAG;EAC3B,IAAI,CAAC,GAAW;GACf,EAAS,gCAAgC;GACzC;EACD;EAEA,IAAM,IAAiB,EAAY,CAAK;EAGxC,AADA,EAAU,OAAO,KADM,OACO,IAAW,GAAG,EAAe,QAAQ,MAAa,GAAgB,GAAU,GAAW,EAAK,GAC1H,EAAY;CACb,GAEM,UAAoB;EAIzB,AAHA,EAAS,EAAE,GACX,EAAa,EAAE,GACf,EAAS,IAAI,GACb,EAAQ;CACT;CAEA,OACC,kBAAC,GAAD;EAAe;EAAQ,SAAS;EAAa,OAAM;EAAoB,MAAK;YAA5E,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB;IACC,kBAAC,OAAD;KAAK,WAAW,EAAG,QAAQ,iBAAiB,OAAO;eAAnD,CACC,kBAAC,GAAD;MACC,OAAM;MACN,aAAY;MACZ,OAAO;MACP,UAAU;MACV,aAAY;MACZ,WAAU;KACV,CAAA,GACD,kBAAC,GAAD;MAAO,OAAM;MAAmB,OAAO;MAAU,UAAU;MAAa,aAAY;KAAO,CAAA,CACvF;;IACJ,KACA,kBAAC,OAAD;KAAK,WAAU;eAAf;MACC,kBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA;MAAC;MAAC,kBAAC,QAAD;OAAM,WAAU;iBAAc;MAAY,CAAA;KACrE;;IAGN,kBAAC,GAAD;KACC,OAAM;KACN,aAAY;KACZ,OAAO;KACP,UAAU;KACV,aAAY;IACZ,CAAA;GACa;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAQ,SAAS;aAAa;EAEtD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAU,SAAS;GAAe,UAAU,CAAC,KAAS,CAAC;aAAW;EAE1F,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AChGA,SAAgB,GAAe,EAAE,WAAQ,YAAS,cAAW,WAAQ,iBAAc,IAAI,kBAAe,CAAC,KAA0B;CAChI,IAAM,CAAC,GAAM,KAAW,EAAS,CAAW,GACtC,CAAC,GAAQ,KAAa,EAAiC,CAAC,CAAC,GACzD,CAAC,GAAQ,KAAa,EAAwC,CAAC,CAAC,GAChE,CAAC,GAAa,KAAkB,EAAS,EAAK;CAEpD,QAAgB;EACf,IAAI,KAAU,CAAC,GAAa;GAC3B,IAAM,IAAU,EAAO,OAAO,QAC5B,GAAK,OACL,EAAI,EAAM,QAAQ,EAAa,EAAM,SAAS,IACvC,IAER,CAAC,CACF;GAGA,AAFA,EAAU,CAAO,GACjB,EAAU,CAAC,CAAC,GACZ,EAAe,EAAI;EACpB,OAAO,AAAI,CAAC,KAAU,KACrB,EAAe,EAAK;CAEtB,GAAG;EAAC;EAAQ,EAAO;EAAQ;EAAc;CAAW,CAAC;CAErD,IAAM,KAAgB,GAAc,MAAkB;EAErD,AADA,GAAW,OAAU;GAAE,GAAG;IAAO,IAAO;EAAM,EAAE,GAChD,GAAW,OAAU;GAAE,GAAG;IAAO,IAAO;EAAK,EAAE;CAChD,GAEM,UAA0B;EAC/B,IAAM,IAA2C,CAAC,GAC9C,IAAU;EAEd,AAAK,EAAK,KAAK,MACd,EAAU,OAAU,qBACpB,IAAU;EAGX,KAAK,IAAM,KAAS,EAAO,QAAQ;GAClC,IAAM,IAAQ,EAAO,EAAM,KAAK,EAAE,KAAK;GACvC,IAAI,EAAM,YAAY,CAAC,GAEtB,AADA,EAAU,EAAM,QAAQ,qBACxB,IAAU;QACJ,IAAI,EAAM,UAAU;IAC1B,IAAM,IAAM,EAAM,SAAS,CAAK;IAChC,AAAI,MACH,EAAU,EAAM,QAAQ,GACxB,IAAU;GAEZ;EACD;EAGA,OADA,EAAU,CAAS,GACZ;CACR;CAQA,OACC,kBAAC,GAAD;EAAe;EAAiB;EAAS,OAAO,YAAY,EAAO,QAAQ;EAAI,MAAK;YAApF,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB;IACC,kBAAC,OAAD,EAAA,UAAA;KACE,EAAO;KAAY;KAAC,kBAAC,MAAD,CAAK,CAAA;IACtB,EAAA,CAAA;IAEL,kBAAC,OAAD,EAAA,UAAA;KACC,kBAAC,UAAD,EAAA,UAAQ,UAAe,CAAA;KAAC;KAAE,EAAO;IAC7B,EAAA,CAAA;IAEL,kBAAC,GAAD;KACC,OAAO,EAAO;KACd,aAAa,qFAAqF,EAAO;KACzG,OAAO;KACP,UAAU;KACV,OAAO,EAAO,QAAW,KAAA;KACzB,UAAA;IACA,CAAA;IACA,EAAO,OAAO,KAAK,MAElB,kBAAC,GAAD;KAEC,OAAO,EAAM;KACb,aAAa,EAAM;KACnB,aAAa,EAAM;KACnB,OAAO,EAAO,EAAM,SAAS;KAC7B,WAAW,MAAU,EAAa,EAAM,MAAM,CAAK;KACnD,OAAO,EAAO,EAAM,SAAS,KAAA;KAC7B,UAAU,EAAM;IAChB,GARK,EAAM,IAQX,CAEF;GACa;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAQ,SAAS;aAAS;EAElD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAU,eA9CjB;IACtB,EAAS,MACd,EAAU,EAAO,SAAS,EAAK,KAAK,GAAG,CAAM,GAC7C,EAAQ;GACT;aA0CqE;EAE1D,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AC3IA,IAAa,KAA0D;EACrE,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,QAAD;GAAM,OAAM;aAAkF;EAAU,CAAA,GACxG,kBAAC,OAAD;GAAK,WAAU;aACd,kBAAC,QAAD,EAAA,UAAO,8GAAkH,CAAA;EACrH,CAAA,CACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EACC,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aACC;EACD,SACC,kBAAA,GAAA,EAAA,UAAA;GACC,kBAAC,QAAD;IAAM,MAAK;cAAK;GAAc,CAAA;GAAC;GAC/B,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,qDAAyD,CAAA;GAC5D,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,UAAU;GACV,WAAW,MAAU,2BAA2B,KAAK,CAAG,IAAoD,OAAhD;EAC7D,CACD;CACD;EACC,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aAAa;EACb,SAAS;EACT,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EACC,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA;GAAE;GACoB,kBAAC,QAAD,EAAA,UAAM,8BAAiC,CAAA;GAAC;GAC7D,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,iEAAuE,CAAA;GAC1E,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EAgBC,EAAS,MAAM;EACf,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA;GAAE;GACa,kBAAC,OAAD,EAAA,UAAK,SAAW,CAAA;GAAC;GAAC,kBAAC,OAAD,EAAA,UAAK,UAAY,CAAA;GACjD,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,qDAA2D,CAAA;GAC9D,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,GACA;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EACC,EAAS,MAAM;EACf,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA;GAAE;GACa,kBAAC,OAAD,EAAA,UAAK,SAAW,CAAA;GAAC;GAAC,kBAAC,OAAD,EAAA,UAAK,UAAY,CAAA;GACjD,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,qDAA2D,CAAA;GAC9D,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,GACA;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;AACD;;;ACtIA,SAAgB,GAAW,EAAE,WAAQ,YAAS,cAAW,mBAAiC;CACzF,IAAM,CAAC,GAAM,KAAW,EAA+B,MAAM,GACvD,CAAC,GAAM,KAAW,EAAS,EAAE,GAC7B,CAAC,GAAI,KAAS,EAAS,EAAE,GACzB,CAAC,GAAQ,KAAa,EAAyC,CAAC,CAAC,GAEjE,IAAmB,GAAgB,MAA0C;EAIlF,AAHA,EAAQ,GAAc,QAAQ,MAAM,GACpC,EAAQ,GAAc,QAAQ,EAAE,GAChC,EAAM,GAAc,MAAM,EAAE,GAC5B,EAAU,CAAC,CAAC;CACb,CAAC;CAED,QAAgB;EACf,AAAI,KACH,EAAiB,CAAY;CAE/B,GAAG,CAAC,GAAQ,CAAY,CAAC;CAEzB,IAAM,UAAiB;EACtB,IAAM,IAA2B,CAAC,GAG5B,KAAU,MAAc,sBAAsB,KAAK,CAAC,GACpD,KAAU,MAAc,gBAAgB,KAAK,CAAC,GAC9C,KAAc,MAAc,kCAAkC,KAAK,CAAC,GAEpE,KAAS,GAAe,GAAe,MAAuC;GACnF,IAAI,CAAC,GAAO,OAAO,GAAG,EAAM;GAC5B,IAAI,MAAS,UAAU,CAAC,EAAO,CAAK,GAAG,OAAO;GAC9C,IAAI,MAAS,UAAU,CAAC,EAAO,CAAK,GAAG,OAAO;GAC9C,IAAI,MAAS,cAAc,CAAC,EAAW,CAAK,GAAG,OAAO;EAEvD;EAEA,QAAQ,GAAR;GACC,KAAK;IACJ,EAAU,OAAO,EAAM,QAAQ,GAAM,MAAM;IAC3C;GACD,KAAK;IACJ,EAAU,OAAO,EAAM,SAAS,GAAM,MAAM;IAC5C;GACD,KAAK;IACJ,EAAU,OAAO,EAAM,gBAAgB,GAAM,UAAU;IACvD;GACD,KAAK;IAEJ,AADA,EAAU,OAAO,EAAM,gBAAgB,GAAM,MAAM,GACnD,EAAU,KAAK,EAAM,mBAAmB,GAAI,MAAM;IAClD;GACD,KAAK;IAEJ,AADA,EAAU,OAAO,EAAM,eAAe,GAAM,MAAM,GAClD,EAAU,KAAK,EAAM,kBAAkB,GAAI,MAAM;IACjD;GACD,KAAK;IAEJ,AADA,EAAU,OAAO,EAAM,UAAU,GAAM,UAAU,GACjD,EAAU,KAAK,EAAM,aAAa,GAAI,UAAU;IAChD;EACF;EAGA,OADA,EAAU,CAAS,GACZ,OAAO,OAAO,CAAS,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;CAChD;CAgDA,OACC,kBAAC,GAAD;EAAe;EAAiB;EAAS,OAAM;EAAiB,MAAK;YAArE,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB,CACC,kBAAC,GAAD;IAAY,OAAM;IAAe,OAAO;IAAM,UAAU;cAAxD;KACC,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAO,OAAM;KAAQ,CAAA;KAC9C,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAe,OAAM;KAAY,CAAA;KAC1D,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAQ,OAAM;KAAQ,CAAA;KAC/C,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAe,OAAM;KAAc,CAAA;KAC5D,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAmB,OAAM;KAAc,CAAA;KAChE,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAA0B,OAAM;KAAkB,CAAA;IAChE;OAEZ,kBAAC,GAAD;IAAe,KAAI;qBAnDI;KAC1B,QAAQ,GAAR;MACC,KAAK;MACL,KAAK;MACL,KAAK,QACJ,OACC,kBAAC,GAAD;OACC,OAAM;OACN,aAAa,MAAS,SAAS,UAAU,MAAS,SAAS,eAAe;OAC1E,OAAO;OACP,UAAU;OACV,OAAO,EAAO;MACd,CAAA;MAEH,KAAK;MACL,KAAK;MACL,KAAK,kBACJ,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;OACC,OAAM;OACN,aAAa,EAAK,SAAS,MAAM,IAAI,UAAU,EAAK,SAAS,MAAM,IAAI,eAAe;OACtF,OAAO;OACP,UAAU;OACV,OAAO,EAAO;MACd,CAAA,GACD,kBAAC,GAAD;OACC,OAAM;OACN,aAAa,EAAK,SAAS,MAAM,IAAI,UAAU,EAAK,SAAS,MAAM,IAAI,eAAe;OACtF,OAAO;OACP,UAAU;OACV,OAAO,EAAO;MACd,CAAA,CACA,EAAA,CAAA;KAEL;IACD,EAe6B,CAAa;GAAiB,CAAA,CACzC;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAQ,SAAS;aAAS;EAElD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAU,eAlEjB;IAC3B,IAAI,CAAC,EAAS,GAAG;IAEjB,IAAM,IAAW,IAAK,GAAG,EAAK,GAAG,MAAO;IAExC,AADA,EAAU,QAAQ,GAAU,EAAE,YAAS,CAAC,GACxC,EAAQ;GACT;aA4DqE;EAE1D,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;ACpIA,SAAgB,GAAkB,EACjC,mBACA,kBACA,6BACA,sBACA,qBACA,cACA,mBACA,wBACA,4BACA,2BAC0B;CAC1B,IAAM,IAA2B;CAEjC,OACC,kBAAA,GAAA,EAAA,UAAA,CACE,KACA,kBAAA,GAAA,EAAA,UAAA;EACE,KACA,kBAAC,GAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,SAAS;GACT,WAAW;EACX,CAAA;EAGF,kBAAC,GAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,cAAc,EAAqB;GACnC,SAAS;GACT,WAAW;EACX,CAAA;EAED,kBAAC,IAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,cAAc,EAAqB;GACnC,SAAS;GACT,WAAW;EACX,CAAA;EAED,kBAAC,IAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,cAAc,EAAqB;GACnC,SAAS;GACT,WAAW;EACX,CAAA;CACA,EAAA,CAAA,GAGF,MACC,MAAkB,EAAS,OAS3B,kBAAC,IAAD;EAAY,QAAQ;EAAM,SAAS;EAAkB,WAAW;CAAsB,CAAA,IARtF,kBAAC,IAAD;EACC,QAAQ;EACR,SAAS;EACT,WAAW;EACX,QAAQ,GAAmB;EAC3B,aAAa,EAAwB;CACrC,CAAA,EAIF,EAAA,CAAA;AAEJ;;;AC3DA,SAAgB,GAAwB,EAAE,gBAAa,aAAU,sBAAmB,uBAAqC;CACxH,IAAM,IAA2B,GAAkB,0BAC7C,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAc,KAAmB,EAA8B,CAAqB,GACrF,CAAC,GAAQ,KAAa,EAA+B,IAAI,GACzD,CAAC,GAAgB,KAAqB,EAA2B,IAAI,GACrE,CAAC,GAAe,KAAoB,EAA0B,IAAI,GAElE,IAAa,EAAiB,GAAa,GAAG,IAAI,EAAY,MAAM,MACpE,IAAgB,CAAC,CAAC,GAElB,IAAqB,QAAc;EACnC,OACL,OAAO,KAAK,UAAU,EAAW,WAAW;CAC7C,GAAG,CAAC,CAAU,CAAC,GAET,IAAc,GAAa,MAAiB;EACjD,QAAQ,MAAM,4BAA4B,CAAK;CAChD,GAAG,CAAC,CAAC,GAEC,IAAe,GACnB,GAAiC,MAAiC;EAClE,IAAI,IAAO;EAMX,AALA,EAAY,WAAW;GACtB,IAAO,EAAuB,GAAe,IAAI;EAClD,CAAC,GAGD,EAAS;GAAE,KADC,GAAiB,CAClB;GAAK;EAAK,CAAC;CACvB,GACA,CAAC,CAAQ,CACV,GAEM,IAAiB,GAAa,MAAoB;EACvD,EAAkB,CAAI;CACvB,GAAG,CAAC,CAAC,GAEC,IAAgB,GAAa,MAAmB;EACrD,EAAiB,CAAI;CACtB,GAAG,CAAC,CAAC,GAEC,IAAU,GAA4B;EAC3C;EACA;EACA,oBAAoB,CAAC,CAAC;EACtB,kBAAkB;EAClB,iBAAiB;CAClB,CAAC,GAEK,IAAgB,SACd;EACN,WAAW;EACX,SAAS;EACT,OAAO;GACN,WAAW;GACX,MAAM;IACL,MAAM;IACN,WAAW;IACX,WAAW;IACX,eAAe;GAChB;EACD;EACA,OAAO;GAAC;GAAa;GAAW;GAAU;GAAc;GAAoB;EAAe;EAC3F,aAAa;CACd,IACA,CAAC,GAAa,CAAkB,CACjC;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW,EAAgB;YAAhC,CACC,kBAAC,OAAD;GACC,WAAW,EAAG,EAAgB,mBAAmB,GAC/C,EAAgB,UAAU,EAC5B,CAAC;aACD,kBAAC,GAAD;IAAgC;cAAhC;KACC,kBAAC,GAAD;MACoB;MACnB,OAAO;MACP,oBAAoB,EAAQ;MAC5B,qBAAqB,EAAQ;MAC7B,mBAAmB,EAAQ;MAC3B,aAAa,EAAQ;MACrB,YAAY,EAAQ;MACpB,QAAQ,EAAQ;MAChB,QAAQ,EAAQ;MAChB,YAAY,EAAQ;KACpB,CAAA;KACD,kBAAC,IAAD;MACC,iBACC,kBAAC,GAAD;OACC,WAAU;OACV,eAAe,EAAa,EAAI;OAChC,cAAc,EAAa,EAAK;MAChC,CAAA;MAEF,aAAa,kBAAC,OAAD;OAAK,WAAU;iBAA2B;MAAqB,CAAA;MAC5E,eAAe;KACf,CAAA;KACD,kBAAC,GAAD,CAAgB,CAAA;KAChB,kBAAC,GAAD,CAAa,CAAA;KACb,kBAAC,GAAD;MAAsB,eAAe;MAAW,eAAe;KAAkB,CAAA;KACjF,kBAAC,GAAD;MAAmB,aAAa,GAAa;MAAM,YAAY;KAAgB,CAAA;KAC/E,kBAAC,GAAD;MAAgB,UAAU;MAAc,uBAAA;KAAuB,CAAA;IAC/C;;EACb,CAAA,GAEL,kBAAC,IAAD;GACiB;GACD;GACf,0BAA0B;GAC1B,yBAAyB,EAAkB,IAAI;GAC/C,wBAAwB,EAAiB,IAAI;GAC7C,WAAW,EAAQ;GACnB,gBAAgB,EAAQ;GACxB,qBAAqB,EAAQ;GAC7B,yBAAyB,EAAQ;GACjC,sBAAsB,EAAQ;EAC9B,CAAA,CACG;;AAEP"}
1
+ {"version":3,"file":"TextEditorLexicalClient-DRhAswpP.js","names":[],"sources":["../../src/text-editor/lib/serialization/createLexicalRaw.ts","../../src/text-editor/lib/semantic/getSemanticTagDepth.ts","../../src/text-editor/nodes/AccessibleLinkNode.ts","../../src/text-editor/nodes/SemanticTagNode.ts","../../src/text-editor/model/hooks/useTextEditorLexicalActions.ts","../../src/text-editor/TextEditor.module.scss","../../src/text-editor/EmailDialog.tsx","../../src/text-editor/LinkDialog.tsx","../../src/text-editor/PhoneDialog.tsx","../../src/text-editor/SemanticDialog.tsx","../../src/text-editor/semanticTagConfigs.tsx","../../src/text-editor/TimeDialog.tsx","../../src/text-editor/TextEditorDialogs.tsx","../../src/text-editor/TextEditorLexicalClient.tsx"],"sourcesContent":["import { EditorState as LexicalEditorState } from \"lexical\";\n\nimport type { TextEditorLexicalRaw } from \"../../editorModel\";\n\nexport const createLexicalRaw = (editorState: LexicalEditorState): TextEditorLexicalRaw => {\n\treturn {\n\t\tformat: \"lexical\",\n\t\tversion: 1,\n\t\teditorState: editorState.toJSON() as unknown as Record<string, unknown>\n\t};\n};\n","import type { LexicalNode } from \"lexical\";\n\nexport const getSemanticTagDepth = (node: LexicalNode): number => {\n\tlet depth = 0;\n\tlet current: LexicalNode | null = node;\n\n\twhile (current) {\n\t\tdepth += 1;\n\t\tcurrent = current.getParent();\n\t}\n\n\treturn depth;\n};\n","import { LinkAttributes, LinkNode, SerializedLinkNode } from \"@lexical/link\";\nimport {\n\t$applyNodeReplacement,\n\tDOMConversionMap,\n\tDOMConversionOutput,\n\tEditorConfig,\n\tElementNode,\n\tLexicalNode,\n\tLexicalUpdateJSON,\n\tNodeKey,\n\tRangeSelection,\n\tSpread\n} from \"lexical\";\n\nexport type AccessibleLinkAttributes = LinkAttributes & {\n\tariaLabel?: null | string;\n\tqrCode?: boolean;\n\tadd?: null | string;\n\ttext?: null | string;\n};\n\nexport type SerializedAccessibleLinkNode = Spread<\n\t{\n\t\tariaLabel: null | string;\n\t\tqrCode: boolean;\n\t\tadd: null | string;\n\t\ttext: null | string;\n\t},\n\tSerializedLinkNode\n>;\n\nconst convertAccessibleLinkElement = (domNode: Node): DOMConversionOutput => {\n\tif (!(domNode instanceof HTMLAnchorElement)) {\n\t\treturn { node: null };\n\t}\n\n\tconst textContent = domNode.textContent;\n\tif ((textContent === null || textContent === \"\") && domNode.children.length === 0) {\n\t\treturn { node: null };\n\t}\n\n\treturn {\n\t\tnode: $createAccessibleLinkNode(domNode.getAttribute(\"href\") || \"\", {\n\t\t\trel: domNode.getAttribute(\"rel\"),\n\t\t\ttarget: domNode.getAttribute(\"target\"),\n\t\t\ttitle: domNode.getAttribute(\"title\"),\n\t\t\tariaLabel: domNode.getAttribute(\"aria-label\"),\n\t\t\tqrCode: domNode.getAttribute(\"data-qr-code\") === \"true\",\n\t\t\tadd: null,\n\t\t\ttext: textContent\n\t\t})\n\t};\n};\n\nexport class AccessibleLinkNode extends LinkNode {\n\t__ariaLabel: null | string;\n\t__qrCode: boolean;\n\t__add: null | string;\n\t__text: null | string;\n\n\tstatic getType(): string {\n\t\treturn \"accessible-link\";\n\t}\n\n\tstatic clone(node: AccessibleLinkNode): AccessibleLinkNode {\n\t\treturn new AccessibleLinkNode(\n\t\t\tnode.__url,\n\t\t\t{\n\t\t\t\trel: node.__rel,\n\t\t\t\ttarget: node.__target,\n\t\t\t\ttitle: node.__title,\n\t\t\t\tariaLabel: node.__ariaLabel,\n\t\t\t\tqrCode: node.__qrCode,\n\t\t\t\tadd: node.__add,\n\t\t\t\ttext: node.__text\n\t\t\t},\n\t\t\tnode.__key\n\t\t);\n\t}\n\n\tconstructor(url = \"\", attributes: AccessibleLinkAttributes = {}, key?: NodeKey) {\n\t\tsuper(url, attributes, key);\n\n\t\tconst { ariaLabel = null, qrCode = false, add = null, text = null } = attributes;\n\t\tthis.__ariaLabel = ariaLabel;\n\t\tthis.__qrCode = qrCode;\n\t\tthis.__add = add;\n\t\tthis.__text = text;\n\t}\n\n\tstatic importDOM(): DOMConversionMap | null {\n\t\treturn {\n\t\t\ta: () => ({\n\t\t\t\tconversion: convertAccessibleLinkElement,\n\t\t\t\tpriority: 2\n\t\t\t})\n\t\t};\n\t}\n\n\tstatic importJSON(serializedNode: SerializedAccessibleLinkNode): AccessibleLinkNode {\n\t\treturn $createAccessibleLinkNode().updateFromJSON(serializedNode);\n\t}\n\n\tupdateFromJSON(serializedNode: LexicalUpdateJSON<SerializedAccessibleLinkNode>): this {\n\t\treturn super\n\t\t\t.updateFromJSON(serializedNode)\n\t\t\t.setAriaLabel(serializedNode.ariaLabel || null)\n\t\t\t.setQrCode(!!serializedNode.qrCode)\n\t\t\t.setAdd(serializedNode.add || null)\n\t\t\t.setText(serializedNode.text || null);\n\t}\n\n\texportJSON(): SerializedAccessibleLinkNode {\n\t\treturn {\n\t\t\t...super.exportJSON(),\n\t\t\ttype: \"accessible-link\",\n\t\t\tversion: 1,\n\t\t\tariaLabel: this.getAriaLabel(),\n\t\t\tqrCode: this.getQrCode(),\n\t\t\tadd: this.getAdd(),\n\t\t\ttext: this.getText()\n\t\t} as SerializedAccessibleLinkNode;\n\t}\n\n\tcreateDOM(config: EditorConfig): HTMLElement {\n\t\tconst dom = super.createDOM(config) as HTMLElement;\n\t\tthis.applyAccessibleAttributes(null, dom);\n\t\treturn dom;\n\t}\n\n\tupdateDOM(prevNode: this, anchor: HTMLElement, config: EditorConfig): boolean {\n\t\tconst isUpdated = super.updateDOM(prevNode, anchor as never, config);\n\t\tthis.applyAccessibleAttributes(prevNode, anchor);\n\t\treturn isUpdated;\n\t}\n\n\tapplyAccessibleAttributes(prevNode: this | null, anchor: HTMLElement): void {\n\t\tif (!(anchor instanceof HTMLAnchorElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!prevNode || prevNode.__ariaLabel !== this.__ariaLabel) {\n\t\t\tif (this.__ariaLabel) {\n\t\t\t\tanchor.setAttribute(\"aria-label\", this.__ariaLabel);\n\t\t\t} else {\n\t\t\t\tanchor.removeAttribute(\"aria-label\");\n\t\t\t}\n\t\t}\n\n\t\tif (!prevNode || prevNode.__qrCode !== this.__qrCode) {\n\t\t\tanchor.setAttribute(\"data-qr-code\", this.__qrCode ? \"true\" : \"false\");\n\t\t}\n\t}\n\n\tinsertNewAfter(_selection: RangeSelection, restoreSelection = true): null | ElementNode {\n\t\tconst linkNode = $createAccessibleLinkNode(this.__url, {\n\t\t\trel: this.__rel,\n\t\t\ttarget: this.__target,\n\t\t\ttitle: this.__title,\n\t\t\tariaLabel: this.__ariaLabel,\n\t\t\tqrCode: this.__qrCode,\n\t\t\tadd: this.__add,\n\t\t\ttext: this.__text\n\t\t});\n\t\tthis.insertAfter(linkNode, restoreSelection);\n\t\treturn linkNode;\n\t}\n\n\tgetAriaLabel(): null | string {\n\t\treturn this.getLatest().__ariaLabel;\n\t}\n\n\tsetAriaLabel(ariaLabel: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__ariaLabel = ariaLabel;\n\t\treturn this;\n\t}\n\n\tgetQrCode(): boolean {\n\t\treturn this.getLatest().__qrCode;\n\t}\n\n\tsetQrCode(qrCode: boolean): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__qrCode = qrCode;\n\t\treturn this;\n\t}\n\n\tgetAdd(): null | string {\n\t\treturn this.getLatest().__add;\n\t}\n\n\tsetAdd(add: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__add = add;\n\t\treturn this;\n\t}\n\n\tgetText(): null | string {\n\t\treturn this.getLatest().__text;\n\t}\n\n\tsetText(text: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__text = text;\n\t\treturn this;\n\t}\n}\n\nexport const $createAccessibleLinkNode = (url = \"\", attributes?: AccessibleLinkAttributes): AccessibleLinkNode => {\n\treturn $applyNodeReplacement(new AccessibleLinkNode(url, attributes));\n};\n\nexport const $isAccessibleLinkNode = (node: LexicalNode | null | undefined): node is AccessibleLinkNode => {\n\treturn node instanceof AccessibleLinkNode;\n};\n","import {\n\t$applyNodeReplacement,\n\tDOMConversionMap,\n\tDOMConversionOutput,\n\tEditorConfig,\n\tElementNode,\n\tLexicalNode,\n\tLexicalUpdateJSON,\n\tNodeKey,\n\tRangeSelection,\n\tSerializedElementNode,\n\tSpread\n} from \"lexical\";\n\nexport type SemanticTagAttributes = Record<string, string>;\n\nexport type SerializedSemanticTagNode = Spread<\n\t{\n\t\ttag: string;\n\t\tattributes: SemanticTagAttributes;\n\t\ttext: null | string;\n\t},\n\tSerializedElementNode\n>;\n\nconst getAttributesFromElement = (element: HTMLElement): SemanticTagAttributes => {\n\tconst attributes: SemanticTagAttributes = {};\n\tArray.from(element.attributes).forEach((attr) => {\n\t\tif (attr.name === \"class\") return;\n\t\tattributes[attr.name] = attr.value;\n\t});\n\treturn attributes;\n};\n\nconst convertSemanticTagElement = (domNode: Node): DOMConversionOutput => {\n\tif (!(domNode instanceof HTMLElement)) {\n\t\treturn { node: null };\n\t}\n\n\tconst tag = domNode.tagName.toLowerCase();\n\tif (![\"abbr\", \"span\", \"time\", \"cite\", \"del\", \"ins\"].includes(tag)) {\n\t\treturn { node: null };\n\t}\n\n\tconst text = domNode.textContent;\n\tif ((text === null || text === \"\") && domNode.children.length === 0) {\n\t\treturn { node: null };\n\t}\n\n\treturn {\n\t\tnode: $createSemanticTagNode(tag, getAttributesFromElement(domNode), text)\n\t};\n};\n\nexport class SemanticTagNode extends ElementNode {\n\t__tag: string;\n\t__attributes: SemanticTagAttributes;\n\t__text: null | string;\n\n\tstatic getType(): string {\n\t\treturn \"semantic-tag\";\n\t}\n\n\tstatic clone(node: SemanticTagNode): SemanticTagNode {\n\t\treturn new SemanticTagNode(node.__tag, node.__attributes, node.__text, node.__key);\n\t}\n\n\tconstructor(tag = \"span\", attributes: SemanticTagAttributes = {}, text: null | string = null, key?: NodeKey) {\n\t\tsuper(key);\n\t\tthis.__tag = tag;\n\t\tthis.__attributes = attributes;\n\t\tthis.__text = text;\n\t}\n\n\tstatic importDOM(): DOMConversionMap | null {\n\t\treturn {\n\t\t\tabbr: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tspan: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\ttime: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tcite: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tdel: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tins: () => ({ conversion: convertSemanticTagElement, priority: 2 })\n\t\t};\n\t}\n\n\tstatic importJSON(serializedNode: SerializedSemanticTagNode): SemanticTagNode {\n\t\treturn $createSemanticTagNode(serializedNode.tag, serializedNode.attributes, serializedNode.text).updateFromJSON(serializedNode);\n\t}\n\n\tupdateFromJSON(serializedNode: LexicalUpdateJSON<SerializedSemanticTagNode>): this {\n\t\treturn super\n\t\t\t.updateFromJSON(serializedNode)\n\t\t\t.setTag(serializedNode.tag)\n\t\t\t.setAttributes(serializedNode.attributes || {})\n\t\t\t.setText(serializedNode.text || null);\n\t}\n\n\texportJSON(): SerializedSemanticTagNode {\n\t\treturn {\n\t\t\t...super.exportJSON(),\n\t\t\ttype: \"semantic-tag\",\n\t\t\tversion: 1,\n\t\t\ttag: this.getTag(),\n\t\t\tattributes: this.getAttributes(),\n\t\t\ttext: this.getText()\n\t\t};\n\t}\n\n\tcreateDOM(config: EditorConfig): HTMLElement {\n\t\tvoid config;\n\t\tconst element = document.createElement(this.__tag);\n\t\tthis.applyEditorAttributes(element);\n\t\treturn element;\n\t}\n\n\tupdateDOM(prevNode: this, dom: HTMLElement): boolean {\n\t\tif (prevNode.__tag !== this.__tag) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.applyEditorAttributes(dom);\n\t\treturn false;\n\t}\n\n\texportDOM(): { element: HTMLElement } {\n\t\tconst element = document.createElement(this.__tag);\n\t\tObject.entries(this.__attributes).forEach(([key, value]) => {\n\t\t\telement.setAttribute(key, value);\n\t\t});\n\t\treturn { element };\n\t}\n\n\tapplyEditorAttributes(dom: HTMLElement): void {\n\t\tdom.classList.add(\"custom-tag-highlight\");\n\t\tArray.from(dom.attributes).forEach((attr) => {\n\t\t\tif (attr.name === \"class\") return;\n\t\t\tdom.removeAttribute(attr.name);\n\t\t});\n\t\tObject.entries(this.__attributes).forEach(([key, value]) => {\n\t\t\tdom.setAttribute(key, value);\n\t\t});\n\t}\n\n\tinsertNewAfter(_selection: RangeSelection, restoreSelection = true): null | ElementNode {\n\t\tconst node = $createSemanticTagNode(this.__tag, this.__attributes, this.__text);\n\t\tthis.insertAfter(node, restoreSelection);\n\t\treturn node;\n\t}\n\n\tcanInsertTextBefore(): boolean {\n\t\treturn false;\n\t}\n\n\tcanInsertTextAfter(): boolean {\n\t\treturn false;\n\t}\n\n\tcanBeEmpty(): boolean {\n\t\treturn false;\n\t}\n\n\tisInline(): boolean {\n\t\treturn true;\n\t}\n\n\tgetTag(): string {\n\t\treturn this.getLatest().__tag;\n\t}\n\n\tsetTag(tag: string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__tag = tag;\n\t\treturn this;\n\t}\n\n\tgetAttributes(): SemanticTagAttributes {\n\t\treturn this.getLatest().__attributes;\n\t}\n\n\tsetAttributes(attributes: SemanticTagAttributes): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__attributes = attributes;\n\t\treturn this;\n\t}\n\n\tgetText(): null | string {\n\t\treturn this.getLatest().__text;\n\t}\n\n\tsetText(text: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__text = text;\n\t\treturn this;\n\t}\n}\n\nexport const $createSemanticTagNode = (\n\ttag: string,\n\tattributes: SemanticTagAttributes = {},\n\ttext: null | string = null\n): SemanticTagNode => {\n\treturn $applyNodeReplacement(new SemanticTagNode(tag, attributes, text));\n};\n\nexport const $isSemanticTagNode = (node: LexicalNode | null | undefined): node is SemanticTagNode => {\n\treturn node instanceof SemanticTagNode;\n};\n","import { useCallback } from \"react\";\n\nimport { $isLinkNode } from \"@lexical/link\";\nimport { INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND } from \"@lexical/list\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport {\n\t$createParagraphNode,\n\t$createTextNode,\n\t$getSelection,\n\t$isRangeSelection,\n\tElementFormatType,\n\tFORMAT_ELEMENT_COMMAND,\n\tFORMAT_TEXT_COMMAND,\n\ttype LexicalEditor,\n\ttype LexicalNode,\n\tREDO_COMMAND,\n\tUNDO_COMMAND\n} from \"lexical\";\n\nimport { getSemanticTagDepth } from \"../../lib/semantic/getSemanticTagDepth\";\nimport { getHeadingTagByStyle, getLexicalInlineStyle } from \"../../lib/toolbar/styleMappers\";\nimport { $createAccessibleLinkNode, $isAccessibleLinkNode } from \"../../nodes/AccessibleLinkNode\";\nimport { $createSemanticTagNode, $isSemanticTagNode, type SemanticTagNode } from \"../../nodes/SemanticTagNode\";\nimport { LinkTypes, TagTypes } from \"../../toolbar\";\nimport { type LexicalToolbarState, type LinkType, type TextAlignment } from \"../textEditorTypes\";\n\ninterface InsertLinkPayload {\n\turl: string;\n\ttext: string;\n\tadd: string;\n\tariaLabel: string;\n\tqrCode: boolean;\n}\n\ninterface UseTextEditorLexicalActionsParams {\n\teditor: LexicalEditor | null;\n\ttoolbarState: LexicalToolbarState;\n\thasLocalLinkDialog: boolean;\n\tonOpenLinkDialog: (type: LinkTypes) => void;\n\tonOpenTagDialog: (type: TagTypes) => void;\n}\n\nexport function useTextEditorLexicalActions({\n\teditor,\n\ttoolbarState,\n\thasLocalLinkDialog,\n\tonOpenLinkDialog,\n\tonOpenTagDialog\n}: UseTextEditorLexicalActionsParams) {\n\tconst handleBlockStyleToggle = useCallback(\n\t\t(style: string) => {\n\t\t\tif (!editor) return;\n\n\t\t\tif (style === \"unordered-list-item\") {\n\t\t\t\tif (toolbarState.blockType === \"unordered-list-item\") {\n\t\t\t\t\teditor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (style === \"ordered-list-item\") {\n\t\t\t\tif (toolbarState.blockType === \"ordered-list-item\") {\n\t\t\t\t\teditor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tif (style === \"unstyled\" || style === \"paragraph\") {\n\t\t\t\t\t$setBlocksType(selection, () => $createParagraphNode());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (style === \"blockquote\") {\n\t\t\t\t\t$setBlocksType(selection, () => $createQuoteNode());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst headingTag = getHeadingTagByStyle(style);\n\t\t\t\tif (headingTag) {\n\t\t\t\t\t$setBlocksType(selection, () => $createHeadingNode(headingTag));\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t[editor, toolbarState.blockType]\n\t);\n\n\tconst handleInlineStyleToggle = useCallback(\n\t\t(style: string) => {\n\t\t\tif (!editor) return;\n\n\t\t\tconst lexicalStyle = getLexicalInlineStyle(style);\n\t\t\tif (!lexicalStyle) return;\n\n\t\t\teditor.dispatchCommand(FORMAT_TEXT_COMMAND, lexicalStyle as never);\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleAlignmentChange = useCallback(\n\t\t(alignment: TextAlignment) => {\n\t\t\tif (!editor) return;\n\t\t\teditor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment as ElementFormatType);\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleUndo = useCallback(() => {\n\t\tif (!editor) return;\n\t\teditor.dispatchCommand(UNDO_COMMAND, undefined);\n\t}, [editor]);\n\n\tconst handleRedo = useCallback(() => {\n\t\tif (!editor) return;\n\t\teditor.dispatchCommand(REDO_COMMAND, undefined);\n\t}, [editor]);\n\n\tconst getCurrentSelectionText = useCallback((): string => {\n\t\tif (!editor) return \"\";\n\n\t\tlet text = \"\";\n\t\teditor.getEditorState().read(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection)) return;\n\t\t\ttext = selection.getTextContent();\n\t\t});\n\n\t\treturn text;\n\t}, [editor]);\n\n\tconst insertLinkAtSelection = useCallback(\n\t\t(payload: InsertLinkPayload) => {\n\t\t\tif (!editor) return;\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tconst selectionText = selection.getTextContent();\n\t\t\t\tconst finalText = payload.text.length > 0 ? payload.text : selectionText;\n\t\t\t\tif (!finalText.trim()) return;\n\n\t\t\t\tconst linkNode = $createAccessibleLinkNode(payload.url, {\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener noreferrer\",\n\t\t\t\t\tariaLabel: payload.ariaLabel || selectionText || finalText,\n\t\t\t\t\tqrCode: payload.qrCode,\n\t\t\t\t\tadd: payload.add || null,\n\t\t\t\t\ttext: finalText\n\t\t\t\t});\n\n\t\t\t\tconst textNode = $createTextNode(finalText);\n\t\t\t\tlinkNode.append(textNode);\n\t\t\t\tselection.insertNodes([linkNode]);\n\t\t\t});\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\teditor.focus();\n\t\t\t});\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleAddLink = useCallback(\n\t\t(url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => {\n\t\t\tinsertLinkAtSelection({\n\t\t\t\turl,\n\t\t\t\ttext,\n\t\t\t\tadd,\n\t\t\t\tariaLabel,\n\t\t\t\tqrCode: showQrCode\n\t\t\t});\n\t\t},\n\t\t[insertLinkAtSelection]\n\t);\n\n\tconst handleAddLocalLink = useCallback(\n\t\t(url: string, caption: string) => {\n\t\t\tinsertLinkAtSelection({\n\t\t\t\turl,\n\t\t\t\ttext: caption,\n\t\t\t\tadd: \"\",\n\t\t\t\tariaLabel: \"Внутренняя ссылка на статью: \" + caption,\n\t\t\t\tqrCode: false\n\t\t\t});\n\t\t},\n\t\t[insertLinkAtSelection]\n\t);\n\n\tconst getSelectedLinkState = useCallback((): LinkType => {\n\t\tif (!editor) return \"\";\n\n\t\tlet state: LinkType = \"\";\n\t\teditor.getEditorState().read(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection)) {\n\t\t\t\tstate = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectionText = selection.getTextContent();\n\t\t\tconst anchorNode = selection.anchor.getNode();\n\t\t\tconst linkNode = $findMatchingParent(anchorNode, (node) => $isAccessibleLinkNode(node) || $isLinkNode(node));\n\n\t\t\tif ($isAccessibleLinkNode(linkNode)) {\n\t\t\t\tstate = {\n\t\t\t\t\turl: linkNode.getURL(),\n\t\t\t\t\tariaLabel: linkNode.getAriaLabel() || \"\",\n\t\t\t\t\ttext: linkNode.getText() || selectionText,\n\t\t\t\t\tadd: linkNode.getAdd() || \"\",\n\t\t\t\t\tqrCode: linkNode.getQrCode()\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ($isLinkNode(linkNode)) {\n\t\t\t\tstate = {\n\t\t\t\t\turl: linkNode.getURL(),\n\t\t\t\t\tariaLabel: \"\",\n\t\t\t\t\ttext: selectionText,\n\t\t\t\t\tadd: \"\",\n\t\t\t\t\tqrCode: false\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate = selectionText;\n\t\t});\n\n\t\treturn state;\n\t}, [editor]);\n\n\tconst handleLinkClick = useCallback(\n\t\t(type: LinkTypes) => {\n\t\t\tif (type === LinkTypes.LOCAL_LINK && !hasLocalLinkDialog) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonOpenLinkDialog(type);\n\t\t},\n\t\t[hasLocalLinkDialog, onOpenLinkDialog]\n\t);\n\n\tconst insertSemanticTagAtSelection = useCallback(\n\t\t(tag: string, text: string, attributes: Record<string, string>) => {\n\t\t\tif (!editor) return;\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tconst selectionText = selection.getTextContent().trim();\n\t\t\t\tconst finalText =\n\t\t\t\t\ttext || selectionText || attributes[\"title\"] || attributes[\"aria-label\"] || Object.values(attributes).join(\" \") || tag;\n\n\t\t\t\tif (!finalText.trim()) return;\n\n\t\t\t\tconst node = $createSemanticTagNode(tag, attributes, finalText);\n\t\t\t\tnode.append($createTextNode(finalText));\n\t\t\t\tselection.insertNodes([node]);\n\t\t\t});\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\teditor.focus();\n\t\t\t});\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleCleanSemanticTag = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\teditor.update(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection) || selection.isCollapsed()) return;\n\n\t\t\tconst selectedNodes = selection.getNodes();\n\t\t\tconst semanticNodes = new Set<SemanticTagNode>();\n\n\t\t\tselectedNodes.forEach((node) => {\n\t\t\t\tlet current: LexicalNode | null = node;\n\t\t\t\twhile (current) {\n\t\t\t\t\tif ($isSemanticTagNode(current)) {\n\t\t\t\t\t\tsemanticNodes.add(current);\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = current.getParent();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst sortedNodes = Array.from(semanticNodes).sort((a, b) => getSemanticTagDepth(b) - getSemanticTagDepth(a));\n\t\t\tsortedNodes.forEach((node) => {\n\t\t\t\tif (!node.isAttached()) return;\n\t\t\t\tconst children = node.getChildren();\n\t\t\t\tchildren.forEach((child) => node.insertBefore(child));\n\t\t\t\tnode.remove();\n\t\t\t});\n\t\t});\n\t}, [editor]);\n\n\tconst handleTagClick = useCallback(\n\t\t(type: TagTypes) => {\n\t\t\tonOpenTagDialog(type);\n\t\t},\n\t\t[onOpenTagDialog]\n\t);\n\n\treturn {\n\t\thandleAddLink,\n\t\thandleAddLocalLink,\n\t\thandleAlignmentChange,\n\t\thandleBlockStyleToggle,\n\t\thandleCleanSemanticTag,\n\t\thandleInlineStyleToggle,\n\t\thandleLinkClick,\n\t\thandleRedo,\n\t\thandleTagClick,\n\t\thandleUndo,\n\t\tgetCurrentSelectionText,\n\t\tgetSelectedLinkState,\n\t\tinsertSemanticTagAtSelection\n\t};\n}\n","@use \"@/styles/mixins/mixin\" as *;\n\n.textEditor {\n\tfont-size: inherit;\n}\n\n.textEditorContent {\n\tposition: relative;\n\tpadding: var(--space-md);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--surface-secondary);\n\tborder: var(--border);\n\n\t&.focused {\n\t\tborder-color: var(--brand-primary);\n\t}\n}\n\n.wrapper {\n\tfont-size: inherit;\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { isSafe } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface EmailDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования email-ссылки в текстовом редакторе.\n */\nexport function EmailDialog({ isOpen, onClose, onConfirm, initialState }: EmailDialogProps) {\n\tconst [email, setEmail] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState) && typeof initialState === \"string\") {\n\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t}\n\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetEmail(state.url ?? \"\");\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst validateEmail = (email: string): boolean => {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\tif (!emailRegex.test(email)) {\n\t\t\tsetError(\"Некорректный email адрес\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validateEmail(email)) return;\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"Добавьте описание для email\");\n\t\t\treturn;\n\t\t}\n\n\t\tonConfirm(`mailto:${email}`, \"\", \"\", ariaLabel, false);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetEmail(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на email\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<div className={cn(\"flexColumn\", \"gapMd\")}>\n\t\t\t\t\t<Input label=\"Email адрес\" value={email} onChange={setEmail} placeholder=\"some_email@mail.ru\" />\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Электронная почта руководителя городской думмы\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"outline\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"outline\" tone=\"success\" onClick={handleConfirm} disabled={!email || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { isSafe, validateUrl } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { CheckBox } from \"../check-box\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface LinkDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования ссылки в текстовом редакторе.\n */\nexport function LinkDialog({ isOpen, onClose, onConfirm, initialState }: LinkDialogProps) {\n\tconst [url, setUrl] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [showQrCode, setShowQrCode] = useState(false);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState)) {\n\t\t\tif (typeof initialState === \"string\") {\n\t\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t\t}\n\t\t}\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetUrl(state.url ?? \"\");\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst handleUrlChange = (value: string) => {\n\t\tsetUrl(value);\n\n\t\t// Очищаем ошибку при изменении URL\n\t\tif (error) {\n\t\t\tsetError(null);\n\t\t}\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tconst validation = validateUrl(url);\n\t\tif (!validation.isValid) {\n\t\t\tsetError(validation.error);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"добавьте описание для ссылки\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Добавляем протокол, если его нет\n\t\tconst finalUrl = url.startsWith(\"http\") ? url : `https://${url}`;\n\t\tonConfirm(finalUrl, \"\", \"\", ariaLabel, showQrCode);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetUrl(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на внешний url\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<Input label=\"Полный URL адрес\" value={url} onChange={handleUrlChange} placeholder=\"https://somesite.ru\" />\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Ссылка на официальный сайт городской думмы\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<CheckBox title=\"Показать кнопку для генерации QR кода ссылки\" value={showQrCode} onChange={setShowQrCode} />\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"outline\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"outline\" tone=\"success\" onClick={handleConfirm} disabled={!url || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { formatPhone } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { isSafe } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface PhoneDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования телефонной ссылки в текстовом редакторе.\n */\nexport function PhoneDialog({ isOpen, onClose, onConfirm, initialState }: PhoneDialogProps) {\n\tconst [phone, setPhone] = useState(\"\");\n\tconst [phoneAdd, setPhoneAdd] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState) && typeof initialState === \"string\") {\n\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t}\n\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetPhone((state.url ?? \"\").replace(/\\D/g, \"\").slice(0, 11).replace(/^7/, \"\"));\n\n\t\t\t\tif (!state.add) {\n\t\t\t\t\tsetPhoneAdd((state.url ?? \"\").replace(/\\D/g, \"\").slice(11));\n\t\t\t\t} else {\n\t\t\t\t\tsetPhoneAdd((state.add ?? \"\").replace(/\\D/g, \"\"));\n\t\t\t\t}\n\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst handlePhoneChange = (value: string) => {\n\t\tvalue = value.replace(/\\D/g, \"\");\n\t\tif (value.length <= 10) {\n\t\t\tsetPhone(value);\n\t\t\tsetError(null);\n\t\t} else {\n\t\t\tsetError(\"нельзя ввести более 10 цифр\");\n\t\t}\n\t};\n\n\tconst validatePhone = (phone: string): boolean => {\n\t\tif (phone.length !== 10) {\n\t\t\tsetError(\"номер телефона должен содержать 10 цифр\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validatePhone(phone)) return;\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"добавьте описание для телефона\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst formattedPhone = formatPhone(phone);\n\t\tconst fullPhone = `+7${phone}`;\n\t\tonConfirm(`tel:${fullPhone}`, phoneAdd ? `${formattedPhone} доб. ${phoneAdd}` : formattedPhone, phoneAdd, ariaLabel, false);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetPhone(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на телефон\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<div className={cn(\"flex\", \"alignItemsEnd\", \"gapSm\")}>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"Номер телефона без 7-ки\"\n\t\t\t\t\t\t\tdescription=\"Вводится только номер (10) цифр без каких-либо дополнительных символов. Ссылка будет привязана к текущему выделенному фрагменту текста. Поэтому текст самой ссылки можно оформить грамотно, например: +7 (3522) 12-34-56 доб. 100\"\n\t\t\t\t\t\t\tvalue={phone}\n\t\t\t\t\t\t\tonChange={handlePhoneChange}\n\t\t\t\t\t\t\tplaceholder=\"3522123456\"\n\t\t\t\t\t\t\tclassName=\"flex1\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input label=\"Добавочный номер\" value={phoneAdd} onChange={setPhoneAdd} placeholder=\"100\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tdescription=\"Обязательное поле для организации доступности ссылки для лиц с ОВЗ, использующих скринридеры\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Контактный телефон директора\"\n\t\t\t\t\t/>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm} disabled={!phone || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nexport interface AttributeField {\n\tname: string;\n\tlabel: string;\n\tdescription?: string;\n\tplaceholder?: string;\n\trequired?: boolean;\n\tvalidate?: (value: string) => string | null;\n}\n\nexport interface SemanticTagConfig {\n\ttagName: string;\n\ttitle: string;\n\tdescription: string;\n\texample: ReactNode;\n\tfields: AttributeField[];\n}\n\ninterface SemanticDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tconfig: SemanticTagConfig;\n\tinitialState?: Record<string, string>;\n\tinitialText?: string;\n}\n\n/**\n * Диалог настройки семантического тега и его атрибутов в текстовом редакторе.\n */\nexport function SemanticDialog({ isOpen, onClose, onConfirm, config, initialText = \"\", initialState = {} }: SemanticDialogProps) {\n\tconst [text, setText] = useState(initialText);\n\tconst [values, setValues] = useState<Record<string, string>>({});\n\tconst [errors, setErrors] = useState<Record<string, string | null>>({});\n\tconst [initialized, setInitialized] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (isOpen && !initialized) {\n\t\t\tconst initial = config.fields.reduce(\n\t\t\t\t(acc, field) => {\n\t\t\t\t\tacc[field.name] = initialState[field.name] ?? \"\";\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string>\n\t\t\t);\n\t\t\tsetValues(initial);\n\t\t\tsetErrors({});\n\t\t\tsetInitialized(true);\n\t\t} else if (!isOpen && initialized) {\n\t\t\tsetInitialized(false); // сбрасываем при закрытии\n\t\t}\n\t}, [isOpen, config.fields, initialState, initialized]);\n\n\tconst handleChange = (name: string, value: string) => {\n\t\tsetValues((prev) => ({ ...prev, [name]: value }));\n\t\tsetErrors((prev) => ({ ...prev, [name]: null }));\n\t};\n\n\tconst validate = (): boolean => {\n\t\tconst newErrors: Record<string, string | null> = {};\n\t\tlet isValid = true;\n\n\t\tif (!text.trim()) {\n\t\t\tnewErrors[\"text\"] = \"Обязательное поле\";\n\t\t\tisValid = false;\n\t\t}\n\n\t\tfor (const field of config.fields) {\n\t\t\tconst value = values[field.name]?.trim();\n\t\t\tif (field.required && !value) {\n\t\t\t\tnewErrors[field.name] = \"Обязательное поле\";\n\t\t\t\tisValid = false;\n\t\t\t} else if (field.validate) {\n\t\t\t\tconst err = field.validate(value);\n\t\t\t\tif (err) {\n\t\t\t\t\tnewErrors[field.name] = err;\n\t\t\t\t\tisValid = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn isValid;\n\t};\n\n\tconst handleConfirm = () => {\n\t\tif (!validate()) return;\n\t\tonConfirm(config.tagName, text.trim(), values);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title={`Вставка <${config.tagName}>`} size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{config.description}.<br />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<strong>Пример:</strong> {config.example}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel={config.title}\n\t\t\t\t\t\tdescription={`Данный текст будет вставлен в редактор и обёрнуть в специальный семантический тег ${config.tagName}`}\n\t\t\t\t\t\tvalue={text}\n\t\t\t\t\t\tonChange={setText}\n\t\t\t\t\t\terror={errors[\"text\"] ?? undefined}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t\t{config.fields.map((field) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tkey={field.name}\n\t\t\t\t\t\t\t\tlabel={field.label}\n\t\t\t\t\t\t\t\tdescription={field.description}\n\t\t\t\t\t\t\t\tplaceholder={field.placeholder}\n\t\t\t\t\t\t\t\tvalue={values[field.name] ?? \"\"}\n\t\t\t\t\t\t\t\tonChange={(value) => handleChange(field.name, value)}\n\t\t\t\t\t\t\t\terror={errors[field.name] ?? undefined}\n\t\t\t\t\t\t\t\trequired={field.required}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={onClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { TagTypes } from \"./toolbar\";\n\nimport type { SemanticTagConfig } from \"./SemanticDialog\";\n\nexport const SemanticTagConfigs: Record<TagTypes, SemanticTagConfig> = {\n\t[TagTypes.abbr]: {\n\t\ttagName: \"abbr\",\n\t\ttitle: \"Аббревиатура\",\n\t\tdescription: \"Обозначает аббревиатуры и сокращения, при наведении покажет расшифровку\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\t<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"title\",\n\t\t\t\tlabel: \"Расшифровка\",\n\t\t\t\tdescription: \"Появится как подсказка и будет прочитана скринридером\",\n\t\t\t\tplaceholder: \"например: HyperText Markup Language\",\n\t\t\t\trequired: true\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.lang]: {\n\t\ttagName: \"span\",\n\t\ttitle: \"Текст на другом языке\",\n\t\tdescription:\n\t\t\t\"Указывает язык фрагмента текста, если он отличается от основного языка страницы, скринридер прочитает это слово с французским произношением\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\t<span lang=\"fr\">Bonjour!</span> — сказал турист.\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`<span lang=\"fr\">Bonjour!</span> — сказал турист.`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"lang\",\n\t\t\t\tlabel: \"Код языка\",\n\t\t\t\tplaceholder: \"en, fr, ru\",\n\t\t\t\trequired: true,\n\t\t\t\tvalidate: (val) => (!/^[a-z]{2,3}(-[A-Z]{2})?$/.test(val) ? \"Неверный код языка (например, en или en-US)\" : null)\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.time]: {\n\t\ttagName: \"time\",\n\t\ttitle: \"Дата/время\",\n\t\tdescription: \"\",\n\t\texample: \"\",\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Дата/время (machine-readable)\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18, 14:30, 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: true\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.cite]: {\n\t\ttagName: \"cite\",\n\t\ttitle: \"Цитата источника\",\n\t\tdescription: \"Обозначает название книги, статьи, фильма или другого произведения, на которое вы ссылаетесь\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПо словам Эйнштейна: <cite>«Воображение важнее знания»</cite>.\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`По словам Эйнштейна: <cite>«Воображение важнее знания»</cite>.`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"title\",\n\t\t\t\tlabel: \"Название источника\",\n\t\t\t\tdescription: \"Будет отображаться как подсказка\",\n\t\t\t\tplaceholder: \"например: Википедия\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t},\n\t// [TagTypes.address]: {\n\t// \ttagName: \"address\",\n\t// \ttitle: \"Указывает контакты автора статьи/страницы (не для почтовых адресов компаний!)\",\n\t// \tdescription: \"\",\n\t// \texample: ``,\n\t// \tfields: [\n\t// \t\t{\n\t// \t\t\tname: \"aria-label\",\n\t// \t\t\tlabel: \"Описание (для доступности)\",\n\t// \t\t\tdescription: \"Содержимое будет прочитано скринридером, если адрес не очевиден\",\n\t// \t\t\tplaceholder: \"например: Контактный адрес компании\",\n\t// \t\t\trequired: false\n\t// \t\t}\n\t// \t]\n\t// },\n\t[TagTypes.del]: {\n\t\ttagName: \"del\",\n\t\ttitle: \"Изменения в тексте\",\n\t\tdescription: \"Удаленный фрагмент\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПроект сдачи: <del>1 июня</del> <ins>15 июня</ins>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Когда был удалён\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cite\",\n\t\t\t\tlabel: \"Источник/обоснование\",\n\t\t\t\tdescription: \"Ссылка на объяснение причины\",\n\t\t\t\tplaceholder: \"например: https://example.com/edit-log\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.ins]: {\n\t\ttagName: \"ins\",\n\t\ttitle: \"Изменения в тексте\",\n\t\tdescription: \"Новый добавленный текст\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПроект сдачи: <del>1 июня</del> <ins>15 июня</ins>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Когда был добавлен\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cite\",\n\t\t\t\tlabel: \"Источник/обоснование\",\n\t\t\t\tdescription: \"Ссылка на объяснение причины\",\n\t\t\t\tplaceholder: \"например: https://example.com/edit-log\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t}\n};\n","import { useEffect, useEffectEvent, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\nimport { RadioGroup } from \"../radio-group\";\n\ntype TimeDialogInitialState = {\n\tmode?: TimeMode;\n\tfrom?: string;\n\tto?: string;\n};\n\ninterface TimeDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tinitialState?: TimeDialogInitialState;\n}\n\ntype TimeMode = \"date\" | \"datetime\" | \"time\" | \"range-time\" | \"range-date\" | \"range-datetime\";\n\n/**\n * Диалог настройки временного атрибута или значения в текстовом редакторе.\n */\nexport function TimeDialog({ isOpen, onClose, onConfirm, initialState }: TimeDialogProps) {\n\tconst [mode, setMode] = useState<TimeMode | undefined>(\"date\");\n\tconst [from, setFrom] = useState(\"\");\n\tconst [to, setTo] = useState(\"\");\n\tconst [errors, setErrors] = useState<{ from?: string; to?: string }>({});\n\n\tconst syncInitialState = useEffectEvent((initialState?: TimeDialogInitialState) => {\n\t\tsetMode(initialState?.mode ?? \"date\");\n\t\tsetFrom(initialState?.from ?? \"\");\n\t\tsetTo(initialState?.to ?? \"\");\n\t\tsetErrors({});\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tsyncInitialState(initialState);\n\t\t}\n\t}, [isOpen, initialState]);\n\n\tconst validate = () => {\n\t\tconst newErrors: typeof errors = {};\n\t\t// const isValid = true;\n\n\t\tconst isDate = (v: string) => /^\\d{4}-\\d{2}-\\d{2}$/.test(v);\n\t\tconst isTime = (v: string) => /^\\d{2}:\\d{2}$/.test(v);\n\t\tconst isDateTime = (v: string) => /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(v);\n\n\t\tconst check = (label: string, value: string, type: \"date\" | \"time\" | \"datetime\") => {\n\t\t\tif (!value) return `${label} обязательно`;\n\t\t\tif (type === \"date\" && !isDate(value)) return \"Неверный формат даты (ГГГГ-ММ-ДД)\";\n\t\t\tif (type === \"time\" && !isTime(value)) return \"Неверный формат времени (ЧЧ:ММ)\";\n\t\t\tif (type === \"datetime\" && !isDateTime(value)) return \"Неверный формат даты и времени (ГГГГ-ММ-ДДTЧЧ:ММ)\";\n\t\t\treturn undefined;\n\t\t};\n\n\t\tswitch (mode) {\n\t\t\tcase \"date\":\n\t\t\t\tnewErrors.from = check(\"Дата\", from, \"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"time\":\n\t\t\t\tnewErrors.from = check(\"Время\", from, \"time\");\n\t\t\t\tbreak;\n\t\t\tcase \"datetime\":\n\t\t\t\tnewErrors.from = check(\"Дата и время\", from, \"datetime\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-time\":\n\t\t\t\tnewErrors.from = check(\"Время начала\", from, \"time\");\n\t\t\t\tnewErrors.to = check(\"Время окончания\", to, \"time\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-date\":\n\t\t\t\tnewErrors.from = check(\"Дата начала\", from, \"date\");\n\t\t\t\tnewErrors.to = check(\"Дата окончания\", to, \"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-datetime\":\n\t\t\t\tnewErrors.from = check(\"Начало\", from, \"datetime\");\n\t\t\t\tnewErrors.to = check(\"Окончание\", to, \"datetime\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn Object.values(newErrors).every((e) => !e);\n\t};\n\n\tconst handleConfirm = () => {\n\t\tif (!validate()) return;\n\n\t\tconst datetime = to ? `${from}/${to}` : from;\n\t\tonConfirm(\"time\", datetime, { datetime });\n\t\tonClose();\n\t};\n\n\tconst renderInputs = () => {\n\t\tswitch (mode) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime\":\n\t\t\tcase \"time\":\n\t\t\t\treturn (\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Значение\"\n\t\t\t\t\t\tplaceholder={mode === \"time\" ? \"09:00\" : mode === \"date\" ? \"2025-05-18\" : \"2025-05-18T09:00\"}\n\t\t\t\t\t\tvalue={from}\n\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\terror={errors.from}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"range-time\":\n\t\t\tcase \"range-date\":\n\t\t\tcase \"range-datetime\":\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"С\"\n\t\t\t\t\t\t\tplaceholder={mode.includes(\"time\") ? \"09:00\" : mode.includes(\"date\") ? \"2025-05-18\" : \"2025-05-18T09:00\"}\n\t\t\t\t\t\t\tvalue={from}\n\t\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\t\terror={errors.from}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"По\"\n\t\t\t\t\t\t\tplaceholder={mode.includes(\"time\") ? \"17:00\" : mode.includes(\"date\") ? \"2025-05-22\" : \"2025-05-22T17:00\"}\n\t\t\t\t\t\t\tvalue={to}\n\t\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\t\terror={errors.to}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title=\"Вставка <time>\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<RadioGroup label=\"Тип значения\" value={mode} onChange={setMode}>\n\t\t\t\t\t\t<RadioGroup.Option label=\"Дата\" value=\"date\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Дата и время\" value=\"datetime\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Время\" value=\"time\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон дат\" value=\"range-date\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон времени\" value=\"range-time\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон даты и времени\" value=\"range-datetime\" />\n\t\t\t\t\t</RadioGroup>\n\n\t\t\t\t\t<GridContainer gap=\"md\">{renderInputs()}</GridContainer>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={onClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import type { ComponentType } from \"react\";\n\nimport { EmailDialog } from \"./EmailDialog\";\nimport { LinkDialog } from \"./LinkDialog\";\nimport { PhoneDialog } from \"./PhoneDialog\";\nimport { SemanticDialog } from \"./SemanticDialog\";\nimport { SemanticTagConfigs } from \"./semanticTagConfigs\";\nimport { TimeDialog } from \"./TimeDialog\";\nimport { LinkTypes, TagTypes } from \"./toolbar\";\n\nimport type { LocalLinkDialogAdapterProps } from \"./editorModel\";\nimport type { LinkType } from \"./model/textEditorTypes\";\n\ninterface TextEditorDialogsProps {\n\tlinkTypeDialog: LinkTypes | null;\n\ttagTypeDialog: TagTypes | null;\n\tlocalLinkDialogComponent?: ComponentType<LocalLinkDialogAdapterProps>;\n\tonCloseLinkDialog: () => void;\n\tonCloseTagDialog: () => void;\n\tonAddLink: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tonAddLocalLink: (url: string, caption: string) => void;\n\tonInsertSemanticTag: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tgetCurrentSelectionText: () => string;\n\tgetSelectedLinkState: () => LinkType;\n}\n\n/**\n * Контейнер набора диалогов, которые используются редактором для вставки ссылок и семантических сущностей.\n */\nexport function TextEditorDialogs({\n\tlinkTypeDialog,\n\ttagTypeDialog,\n\tlocalLinkDialogComponent,\n\tonCloseLinkDialog,\n\tonCloseTagDialog,\n\tonAddLink,\n\tonAddLocalLink,\n\tonInsertSemanticTag,\n\tgetCurrentSelectionText,\n\tgetSelectedLinkState\n}: TextEditorDialogsProps) {\n\tconst LocalLinkDialogComponent = localLinkDialogComponent;\n\n\treturn (\n\t\t<>\n\t\t\t{linkTypeDialog && (\n\t\t\t\t<>\n\t\t\t\t\t{LocalLinkDialogComponent && (\n\t\t\t\t\t\t<LocalLinkDialogComponent\n\t\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.LOCAL_LINK}\n\t\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\t\tonConfirm={onAddLocalLink}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<LinkDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.LINK}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<PhoneDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.PHONE}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<EmailDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.EMAIL}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{tagTypeDialog &&\n\t\t\t\t(tagTypeDialog !== TagTypes.time ? (\n\t\t\t\t\t<SemanticDialog\n\t\t\t\t\t\tisOpen={true}\n\t\t\t\t\t\tonClose={onCloseTagDialog}\n\t\t\t\t\t\tonConfirm={onInsertSemanticTag}\n\t\t\t\t\t\tconfig={SemanticTagConfigs[tagTypeDialog]}\n\t\t\t\t\t\tinitialText={getCurrentSelectionText()}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<TimeDialog isOpen={true} onClose={onCloseTagDialog} onConfirm={onInsertSemanticTag} />\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { $generateHtmlFromNodes } from \"@lexical/html\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { type LexicalEditor, type EditorState as LexicalEditorState } from \"lexical\";\n\nimport { TextEditorCoreProps, isLexicalTextRaw } from \"./editorModel\";\nimport { InitialHtmlPlugin, SelectionStatePlugin } from \"./lexical/plugins\";\nimport { createLexicalRaw } from \"./lib/serialization/createLexicalRaw\";\nimport { useTextEditorLexicalActions } from \"./model/hooks/useTextEditorLexicalActions\";\nimport { DEFAULT_TOOLBAR_STATE, type LexicalToolbarState } from \"./model/textEditorTypes\";\nimport { AccessibleLinkNode } from \"./nodes/AccessibleLinkNode\";\nimport { SemanticTagNode } from \"./nodes/SemanticTagNode\";\nimport TextEditorStyle from \"./TextEditor.module.scss\";\nimport \"./TextEditor.scss\";\nimport { TextEditorDialogs } from \"./TextEditorDialogs\";\nimport { type LinkTypes, type TagTypes, TextEditorToolbarLexical } from \"./toolbar\";\n\ntype TextEditorProps = TextEditorCoreProps;\n\n/**\n * Редактор форматированного текста на базе Lexical. Поддерживает тулбар, бизнес-адаптеры и сериализацию контента в единый формат данных.\n */\nexport function TextEditorLexicalClient({ initialData, onChange, toolbarComponents, businessAdapters }: TextEditorProps) {\n\tconst LocalLinkDialogComponent = businessAdapters?.LocalLinkDialogComponent;\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [toolbarState, setToolbarState] = useState<LexicalToolbarState>(DEFAULT_TOOLBAR_STATE);\n\tconst [editor, setEditor] = useState<LexicalEditor | null>(null);\n\tconst [linkTypeDialog, setLinkTypeDialog] = useState<LinkTypes | null>(null);\n\tconst [tagTypeDialog, setTagTypeDialog] = useState<TagTypes | null>(null);\n\n\tconst lexicalRaw = isLexicalTextRaw(initialData?.raw) ? initialData.raw : null;\n\tconst hasLexicalRaw = !!lexicalRaw;\n\n\tconst initialEditorState = useMemo(() => {\n\t\tif (!lexicalRaw) return undefined;\n\t\treturn JSON.stringify(lexicalRaw.editorState);\n\t}, [lexicalRaw]);\n\n\tconst handleError = useCallback((error: Error) => {\n\t\tconsole.error(\"Ошибка редактора Lexical\", error);\n\t}, []);\n\n\tconst handleChange = useCallback(\n\t\t(editorState: LexicalEditorState, lexicalEditor: LexicalEditor) => {\n\t\t\tlet html = \"\";\n\t\t\teditorState.read(() => {\n\t\t\t\thtml = $generateHtmlFromNodes(lexicalEditor, null);\n\t\t\t});\n\n\t\t\tconst raw = createLexicalRaw(editorState);\n\t\t\tonChange({ raw, html });\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst openLinkDialog = useCallback((type: LinkTypes) => {\n\t\tsetLinkTypeDialog(type);\n\t}, []);\n\n\tconst openTagDialog = useCallback((type: TagTypes) => {\n\t\tsetTagTypeDialog(type);\n\t}, []);\n\n\tconst actions = useTextEditorLexicalActions({\n\t\teditor,\n\t\ttoolbarState,\n\t\thasLocalLinkDialog: !!LocalLinkDialogComponent,\n\t\tonOpenLinkDialog: openLinkDialog,\n\t\tonOpenTagDialog: openTagDialog\n\t});\n\n\tconst initialConfig = useMemo(\n\t\t() => ({\n\t\t\tnamespace: \"KtkTextEditorLexical\",\n\t\t\tonError: handleError,\n\t\t\ttheme: {\n\t\t\t\tparagraph: \"paragraph\",\n\t\t\t\ttext: {\n\t\t\t\t\tcode: \"lexicalTextCode\",\n\t\t\t\t\thighlight: \"lexicalTextHighlight\",\n\t\t\t\t\tunderline: \"lexicalTextUnderline\",\n\t\t\t\t\tstrikethrough: \"lexicalTextStrikethrough\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tnodes: [HeadingNode, QuoteNode, ListNode, ListItemNode, AccessibleLinkNode, SemanticTagNode],\n\t\t\teditorState: initialEditorState\n\t\t}),\n\t\t[handleError, initialEditorState]\n\t);\n\n\treturn (\n\t\t<div className={TextEditorStyle.textEditor}>\n\t\t\t<div\n\t\t\t\tclassName={cn(TextEditorStyle.textEditorContent, {\n\t\t\t\t\t[TextEditorStyle.focused]: isFocused\n\t\t\t\t})}>\n\t\t\t\t<LexicalComposer initialConfig={initialConfig}>\n\t\t\t\t\t<TextEditorToolbarLexical\n\t\t\t\t\t\ttoolbarComponents={toolbarComponents}\n\t\t\t\t\t\tstate={toolbarState}\n\t\t\t\t\t\tonBlockStyleToggle={actions.handleBlockStyleToggle}\n\t\t\t\t\t\tonInlineStyleToggle={actions.handleInlineStyleToggle}\n\t\t\t\t\t\tonAlignmentChange={actions.handleAlignmentChange}\n\t\t\t\t\t\tonLinkClick={actions.handleLinkClick}\n\t\t\t\t\t\tonTagClick={actions.handleTagClick}\n\t\t\t\t\t\tonUndo={actions.handleUndo}\n\t\t\t\t\t\tonRedo={actions.handleRedo}\n\t\t\t\t\t\tonCleanTag={actions.handleCleanSemanticTag}\n\t\t\t\t\t/>\n\t\t\t\t\t<RichTextPlugin\n\t\t\t\t\t\tcontentEditable={\n\t\t\t\t\t\t\t<ContentEditable\n\t\t\t\t\t\t\t\tclassName=\"lexicalEditorContentEditable\"\n\t\t\t\t\t\t\t\tonFocus={() => setIsFocused(true)}\n\t\t\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tplaceholder={<div className=\"lexicalEditorPlaceholder\">Введите текст...</div>}\n\t\t\t\t\t\tErrorBoundary={LexicalErrorBoundary}\n\t\t\t\t\t/>\n\t\t\t\t\t<HistoryPlugin />\n\t\t\t\t\t<ListPlugin />\n\t\t\t\t\t<SelectionStatePlugin onEditorReady={setEditor} onStateChange={setToolbarState} />\n\t\t\t\t\t<InitialHtmlPlugin initialHTML={initialData?.html} shouldSkip={hasLexicalRaw} />\n\t\t\t\t\t<OnChangePlugin onChange={handleChange} ignoreSelectionChange />\n\t\t\t\t</LexicalComposer>\n\t\t\t</div>\n\n\t\t\t<TextEditorDialogs\n\t\t\t\tlinkTypeDialog={linkTypeDialog}\n\t\t\t\ttagTypeDialog={tagTypeDialog}\n\t\t\t\tlocalLinkDialogComponent={LocalLinkDialogComponent}\n\t\t\t\tonCloseLinkDialog={() => setLinkTypeDialog(null)}\n\t\t\t\tonCloseTagDialog={() => setTagTypeDialog(null)}\n\t\t\t\tonAddLink={actions.handleAddLink}\n\t\t\t\tonAddLocalLink={actions.handleAddLocalLink}\n\t\t\t\tonInsertSemanticTag={actions.insertSemanticTagAtSelection}\n\t\t\t\tgetCurrentSelectionText={actions.getCurrentSelectionText}\n\t\t\t\tgetSelectedLinkState={actions.getSelectedLinkState}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,MAAoB,OACzB;CACN,QAAQ;CACR,SAAS;CACT,aAAa,EAAY,OAAO;AACjC,ICPY,KAAuB,MAA8B;CACjE,IAAI,IAAQ,GACR,IAA8B;CAElC,OAAO,IAEN,AADA,KAAS,GACT,IAAU,EAAQ,UAAU;CAG7B,OAAO;AACR,GCmBM,MAAgC,MAAuC;CAC5E,IAAI,EAAE,aAAmB,oBACxB,OAAO,EAAE,MAAM,KAAK;CAGrB,IAAM,IAAc,EAAQ;CAK5B,QAJK,MAAgB,QAAQ,MAAgB,OAAO,EAAQ,SAAS,WAAW,IACxE,EAAE,MAAM,KAAK,IAGd,EACN,MAAM,EAA0B,EAAQ,aAAa,MAAM,KAAK,IAAI;EACnE,KAAK,EAAQ,aAAa,KAAK;EAC/B,QAAQ,EAAQ,aAAa,QAAQ;EACrC,OAAO,EAAQ,aAAa,OAAO;EACnC,WAAW,EAAQ,aAAa,YAAY;EAC5C,QAAQ,EAAQ,aAAa,cAAc,MAAM;EACjD,KAAK;EACL,MAAM;CACP,CAAC,EACF;AACD,GAEa,IAAb,MAAa,UAA2B,GAAS;CAChD;CACA;CACA;CACA;CAEA,OAAO,UAAkB;EACxB,OAAO;CACR;CAEA,OAAO,MAAM,GAA8C;EAC1D,OAAO,IAAI,EACV,EAAK,OACL;GACC,KAAK,EAAK;GACV,QAAQ,EAAK;GACb,OAAO,EAAK;GACZ,WAAW,EAAK;GAChB,QAAQ,EAAK;GACb,KAAK,EAAK;GACV,MAAM,EAAK;EACZ,GACA,EAAK,KACN;CACD;CAEA,YAAY,IAAM,IAAI,IAAuC,CAAC,GAAG,GAAe;EAC/E,MAAM,GAAK,GAAY,CAAG;EAE1B,IAAM,EAAE,eAAY,MAAM,YAAS,IAAO,SAAM,MAAM,UAAO,SAAS;EAItE,AAHA,KAAK,cAAc,GACnB,KAAK,WAAW,GAChB,KAAK,QAAQ,GACb,KAAK,SAAS;CACf;CAEA,OAAO,YAAqC;EAC3C,OAAO,EACN,UAAU;GACT,YAAY;GACZ,UAAU;EACX,GACD;CACD;CAEA,OAAO,WAAW,GAAkE;EACnF,OAAO,EAA0B,CAAC,CAAC,eAAe,CAAc;CACjE;CAEA,eAAe,GAAuE;EACrF,OAAO,MACL,eAAe,CAAc,CAAC,CAC9B,aAAa,EAAe,aAAa,IAAI,CAAC,CAC9C,UAAU,CAAC,CAAC,EAAe,MAAM,CAAC,CAClC,OAAO,EAAe,OAAO,IAAI,CAAC,CAClC,QAAQ,EAAe,QAAQ,IAAI;CACtC;CAEA,aAA2C;EAC1C,OAAO;GACN,GAAG,MAAM,WAAW;GACpB,MAAM;GACN,SAAS;GACT,WAAW,KAAK,aAAa;GAC7B,QAAQ,KAAK,UAAU;GACvB,KAAK,KAAK,OAAO;GACjB,MAAM,KAAK,QAAQ;EACpB;CACD;CAEA,UAAU,GAAmC;EAC5C,IAAM,IAAM,MAAM,UAAU,CAAM;EAElC,OADA,KAAK,0BAA0B,MAAM,CAAG,GACjC;CACR;CAEA,UAAU,GAAgB,GAAqB,GAA+B;EAC7E,IAAM,IAAY,MAAM,UAAU,GAAU,GAAiB,CAAM;EAEnE,OADA,KAAK,0BAA0B,GAAU,CAAM,GACxC;CACR;CAEA,0BAA0B,GAAuB,GAA2B;EACrE,aAAkB,uBAIpB,CAAC,KAAY,EAAS,gBAAgB,KAAK,iBAC1C,KAAK,cACR,EAAO,aAAa,cAAc,KAAK,WAAW,IAElD,EAAO,gBAAgB,YAAY,KAIjC,CAAC,KAAY,EAAS,aAAa,KAAK,aAC3C,EAAO,aAAa,gBAAgB,KAAK,WAAW,SAAS,OAAO;CAEtE;CAEA,eAAe,GAA4B,IAAmB,IAA0B;EACvF,IAAM,IAAW,EAA0B,KAAK,OAAO;GACtD,KAAK,KAAK;GACV,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,MAAM,KAAK;EACZ,CAAC;EAED,OADA,KAAK,YAAY,GAAU,CAAgB,GACpC;CACR;CAEA,eAA8B;EAC7B,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,aAAa,GAAgC;EAC5C,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,cAAc,GAChB;CACR;CAEA,YAAqB;EACpB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,UAAU,GAAuB;EAChC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,WAAW,GACb;CACR;CAEA,SAAwB;EACvB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,OAAO,GAA0B;EAChC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,QAAQ,GACV;CACR;CAEA,UAAyB;EACxB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,QAAQ,GAA2B;EAClC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,SAAS,GACX;CACR;AACD,GAEa,KAA6B,IAAM,IAAI,MAC5C,EAAsB,IAAI,EAAmB,GAAK,CAAU,CAAC,GAGxD,KAAyB,MAC9B,aAAgB,GC7LlB,MAA4B,MAAgD;CACjF,IAAM,IAAoC,CAAC;CAK3C,OAJA,MAAM,KAAK,EAAQ,UAAU,CAAC,CAAC,SAAS,MAAS;EAC5C,EAAK,SAAS,YAClB,EAAW,EAAK,QAAQ,EAAK;CAC9B,CAAC,GACM;AACR,GAEM,KAA6B,MAAuC;CACzE,IAAI,EAAE,aAAmB,cACxB,OAAO,EAAE,MAAM,KAAK;CAGrB,IAAM,IAAM,EAAQ,QAAQ,YAAY;CACxC,IAAI,CAAC;EAAC;EAAQ;EAAQ;EAAQ;EAAQ;EAAO;CAAK,CAAC,CAAC,SAAS,CAAG,GAC/D,OAAO,EAAE,MAAM,KAAK;CAGrB,IAAM,IAAO,EAAQ;CAKrB,QAJK,MAAS,QAAQ,MAAS,OAAO,EAAQ,SAAS,WAAW,IAC1D,EAAE,MAAM,KAAK,IAGd,EACN,MAAM,EAAuB,GAAK,GAAyB,CAAO,GAAG,CAAI,EAC1E;AACD,GAEa,IAAb,MAAa,UAAwB,EAAY;CAChD;CACA;CACA;CAEA,OAAO,UAAkB;EACxB,OAAO;CACR;CAEA,OAAO,MAAM,GAAwC;EACpD,OAAO,IAAI,EAAgB,EAAK,OAAO,EAAK,cAAc,EAAK,QAAQ,EAAK,KAAK;CAClF;CAEA,YAAY,IAAM,QAAQ,IAAoC,CAAC,GAAG,IAAsB,MAAM,GAAe;EAI5G,AAHA,MAAM,CAAG,GACT,KAAK,QAAQ,GACb,KAAK,eAAe,GACpB,KAAK,SAAS;CACf;CAEA,OAAO,YAAqC;EAC3C,OAAO;GACN,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,aAAa;IAAE,YAAY;IAA2B,UAAU;GAAE;GAClE,YAAY;IAAE,YAAY;IAA2B,UAAU;GAAE;GACjE,YAAY;IAAE,YAAY;IAA2B,UAAU;GAAE;EAClE;CACD;CAEA,OAAO,WAAW,GAA4D;EAC7E,OAAO,EAAuB,EAAe,KAAK,EAAe,YAAY,EAAe,IAAI,CAAC,CAAC,eAAe,CAAc;CAChI;CAEA,eAAe,GAAoE;EAClF,OAAO,MACL,eAAe,CAAc,CAAC,CAC9B,OAAO,EAAe,GAAG,CAAC,CAC1B,cAAc,EAAe,cAAc,CAAC,CAAC,CAAC,CAC9C,QAAQ,EAAe,QAAQ,IAAI;CACtC;CAEA,aAAwC;EACvC,OAAO;GACN,GAAG,MAAM,WAAW;GACpB,MAAM;GACN,SAAS;GACT,KAAK,KAAK,OAAO;GACjB,YAAY,KAAK,cAAc;GAC/B,MAAM,KAAK,QAAQ;EACpB;CACD;CAEA,UAAU,GAAmC;EAE5C,IAAM,IAAU,SAAS,cAAc,KAAK,KAAK;EAEjD,OADA,KAAK,sBAAsB,CAAO,GAC3B;CACR;CAEA,UAAU,GAAgB,GAA2B;EAMpD,OALI,EAAS,UAAU,KAAK,SAI5B,KAAK,sBAAsB,CAAG,GACvB,MAJC;CAKT;CAEA,YAAsC;EACrC,IAAM,IAAU,SAAS,cAAc,KAAK,KAAK;EAIjD,OAHA,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,GAAK,OAAW;GAC3D,EAAQ,aAAa,GAAK,CAAK;EAChC,CAAC,GACM,EAAE,WAAQ;CAClB;CAEA,sBAAsB,GAAwB;EAM7C,AALA,EAAI,UAAU,IAAI,sBAAsB,GACxC,MAAM,KAAK,EAAI,UAAU,CAAC,CAAC,SAAS,MAAS;GACxC,EAAK,SAAS,WAClB,EAAI,gBAAgB,EAAK,IAAI;EAC9B,CAAC,GACD,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,GAAK,OAAW;GAC3D,EAAI,aAAa,GAAK,CAAK;EAC5B,CAAC;CACF;CAEA,eAAe,GAA4B,IAAmB,IAA0B;EACvF,IAAM,IAAO,EAAuB,KAAK,OAAO,KAAK,cAAc,KAAK,MAAM;EAE9E,OADA,KAAK,YAAY,GAAM,CAAgB,GAChC;CACR;CAEA,sBAA+B;EAC9B,OAAO;CACR;CAEA,qBAA8B;EAC7B,OAAO;CACR;CAEA,aAAsB;EACrB,OAAO;CACR;CAEA,WAAoB;EACnB,OAAO;CACR;CAEA,SAAiB;EAChB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,OAAO,GAAmB;EACzB,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,QAAQ,GACV;CACR;CAEA,gBAAuC;EACtC,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,cAAc,GAAyC;EACtD,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,eAAe,GACjB;CACR;CAEA,UAAyB;EACxB,OAAO,KAAK,UAAU,CAAC,CAAC;CACzB;CAEA,QAAQ,GAA2B;EAClC,IAAM,IAAW,KAAK,YAAY;EAElC,OADA,EAAS,SAAS,GACX;CACR;AACD,GAEa,KACZ,GACA,IAAoC,CAAC,GACrC,IAAsB,SAEf,EAAsB,IAAI,EAAgB,GAAK,GAAY,CAAI,CAAC,GAG3D,MAAsB,MAC3B,aAAgB;;;ACjKxB,SAAgB,GAA4B,EAC3C,WACA,iBACA,uBACA,qBACA,sBACqC;CACrC,IAAM,IAAyB,GAC7B,MAAkB;EACb,OAEL;OAAI,MAAU,uBAAuB;IACpC,IAAI,EAAa,cAAc,uBAAuB;KACrD,EAAO,gBAAgB,GAAqB,KAAA,CAAS;KACrD;IACD;IACA,EAAO,gBAAgB,IAA+B,KAAA,CAAS;IAC/D;GACD;GAEA,IAAI,MAAU,qBAAqB;IAClC,IAAI,EAAa,cAAc,qBAAqB;KACnD,EAAO,gBAAgB,GAAqB,KAAA,CAAS;KACrD;IACD;IACA,EAAO,gBAAgB,IAA6B,KAAA,CAAS;IAC7D;GACD;GAEA,EAAO,aAAa;IACnB,IAAM,IAAY,EAAc;IAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;IAEnC,IAAI,MAAU,cAAc,MAAU,aAAa;KAClD,EAAe,SAAiB,EAAqB,CAAC;KACtD;IACD;IAEA,IAAI,MAAU,cAAc;KAC3B,EAAe,SAAiB,GAAiB,CAAC;KAClD;IACD;IAEA,IAAM,IAAa,EAAqB,CAAK;IAC7C,AAAI,KACH,EAAe,SAAiB,GAAmB,CAAU,CAAC;GAEhE,CAAC;EA7BD;CA8BD,GACA,CAAC,GAAQ,EAAa,SAAS,CAChC,GAEM,IAA0B,GAC9B,MAAkB;EAClB,IAAI,CAAC,GAAQ;EAEb,IAAM,IAAe,EAAsB,CAAK;EAC3C,KAEL,EAAO,gBAAgB,IAAqB,CAAqB;CAClE,GACA,CAAC,CAAM,CACR,GAEM,IAAwB,GAC5B,MAA6B;EACxB,KACL,EAAO,gBAAgB,IAAwB,CAA8B;CAC9E,GACA,CAAC,CAAM,CACR,GAEM,IAAa,QAAkB;EAC/B,KACL,EAAO,gBAAgB,IAAc,KAAA,CAAS;CAC/C,GAAG,CAAC,CAAM,CAAC,GAEL,IAAa,QAAkB;EAC/B,KACL,EAAO,gBAAgB,IAAc,KAAA,CAAS;CAC/C,GAAG,CAAC,CAAM,CAAC,GAEL,IAA0B,QAA0B;EACzD,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAI,IAAO;EAOX,OANA,EAAO,eAAe,CAAC,CAAC,WAAW;GAClC,IAAM,IAAY,EAAc;GAC3B,EAAkB,CAAS,MAChC,IAAO,EAAU,eAAe;EACjC,CAAC,GAEM;CACR,GAAG,CAAC,CAAM,CAAC,GAEL,IAAwB,GAC5B,MAA+B;EAC1B,MAEL,EAAO,aAAa;GACnB,IAAM,IAAY,EAAc;GAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;GAEnC,IAAM,IAAgB,EAAU,eAAe,GACzC,IAAY,EAAQ,KAAK,SAAS,IAAI,EAAQ,OAAO;GAC3D,IAAI,CAAC,EAAU,KAAK,GAAG;GAEvB,IAAM,IAAW,EAA0B,EAAQ,KAAK;IACvD,QAAQ;IACR,KAAK;IACL,WAAW,EAAQ,aAAa,KAAiB;IACjD,QAAQ,EAAQ;IAChB,KAAK,EAAQ,OAAO;IACpB,MAAM;GACP,CAAC,GAEK,IAAW,EAAgB,CAAS;GAE1C,AADA,EAAS,OAAO,CAAQ,GACxB,EAAU,YAAY,CAAC,CAAQ,CAAC;EACjC,CAAC,GAED,4BAA4B;GAC3B,EAAO,MAAM;EACd,CAAC;CACF,GACA,CAAC,CAAM,CACR,GAEM,IAAgB,GACpB,GAAa,GAAc,GAAa,GAAmB,MAAwB;EACnF,EAAsB;GACrB;GACA;GACA;GACA;GACA,QAAQ;EACT,CAAC;CACF,GACA,CAAC,CAAqB,CACvB,GAEM,IAAqB,GACzB,GAAa,MAAoB;EACjC,EAAsB;GACrB;GACA,MAAM;GACN,KAAK;GACL,WAAW,kCAAkC;GAC7C,QAAQ;EACT,CAAC;CACF,GACA,CAAC,CAAqB,CACvB,GAEM,IAAuB,QAA4B;EACxD,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAI,IAAkB;EAqCtB,OApCA,EAAO,eAAe,CAAC,CAAC,WAAW;GAClC,IAAM,IAAY,EAAc;GAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;IAClC,IAAQ;IACR;GACD;GAEA,IAAM,IAAgB,EAAU,eAAe,GAEzC,IAAW,GADE,EAAU,OAAO,QACC,IAAa,MAAS,EAAsB,CAAI,KAAK,EAAY,CAAI,CAAC;GAE3G,IAAI,EAAsB,CAAQ,GAAG;IACpC,IAAQ;KACP,KAAK,EAAS,OAAO;KACrB,WAAW,EAAS,aAAa,KAAK;KACtC,MAAM,EAAS,QAAQ,KAAK;KAC5B,KAAK,EAAS,OAAO,KAAK;KAC1B,QAAQ,EAAS,UAAU;IAC5B;IACA;GACD;GAEA,IAAI,EAAY,CAAQ,GAAG;IAC1B,IAAQ;KACP,KAAK,EAAS,OAAO;KACrB,WAAW;KACX,MAAM;KACN,KAAK;KACL,QAAQ;IACT;IACA;GACD;GAEA,IAAQ;EACT,CAAC,GAEM;CACR,GAAG,CAAC,CAAM,CAAC,GAEL,IAAkB,GACtB,MAAoB;EAChB,MAAS,EAAU,cAAc,CAAC,KAItC,EAAiB,CAAI;CACtB,GACA,CAAC,GAAoB,CAAgB,CACtC,GAEM,IAA+B,GACnC,GAAa,GAAc,MAAuC;EAC7D,MAEL,EAAO,aAAa;GACnB,IAAM,IAAY,EAAc;GAChC,IAAI,CAAC,EAAkB,CAAS,GAAG;GAEnC,IAAM,IAAgB,EAAU,eAAe,CAAC,CAAC,KAAK,GAChD,IACL,KAAQ,KAAiB,EAAW,SAAY,EAAW,iBAAiB,OAAO,OAAO,CAAU,CAAC,CAAC,KAAK,GAAG,KAAK;GAEpH,IAAI,CAAC,EAAU,KAAK,GAAG;GAEvB,IAAM,IAAO,EAAuB,GAAK,GAAY,CAAS;GAE9D,AADA,EAAK,OAAO,EAAgB,CAAS,CAAC,GACtC,EAAU,YAAY,CAAC,CAAI,CAAC;EAC7B,CAAC,GAED,4BAA4B;GAC3B,EAAO,MAAM;EACd,CAAC;CACF,GACA,CAAC,CAAM,CACR;CAuCA,OAAO;EACN;EACA;EACA;EACA;EACA,wBA1C8B,QAAkB;GAC3C,KAEL,EAAO,aAAa;IACnB,IAAM,IAAY,EAAc;IAChC,IAAI,CAAC,EAAkB,CAAS,KAAK,EAAU,YAAY,GAAG;IAE9D,IAAM,IAAgB,EAAU,SAAS,GACnC,oBAAgB,IAAI,IAAqB;IAa/C,AAXA,EAAc,SAAS,MAAS;KAC/B,IAAI,IAA8B;KAClC,OAAO,IAIN,AAHI,GAAmB,CAAO,KAC7B,EAAc,IAAI,CAAO,GAE1B,IAAU,EAAQ,UAAU;IAE9B,CAAC,GAGD,MAD0B,KAAK,CAAa,CAAC,CAAC,MAAM,GAAG,MAAM,EAAoB,CAAC,IAAI,EAAoB,CAAC,CAC3G,CAAA,CAAY,SAAS,MAAS;KACxB,EAAK,WAAW,MAErB,EADsB,YACtB,CAAA,CAAS,SAAS,MAAU,EAAK,aAAa,CAAK,CAAC,GACpD,EAAK,OAAO;IACb,CAAC;GACF,CAAC;EACF,GAAG,CAAC,CAAM,CAcT;EACA;EACA;EACA;EACA,gBAhBsB,GACrB,MAAmB;GACnB,EAAgB,CAAI;EACrB,GACA,CAAC,CAAe,CAYhB;EACA;EACA;EACA;EACA;CACD;AACD;;;;;;;;;AErTA,SAAgB,GAAY,EAAE,WAAQ,YAAS,cAAW,mBAAkC;CAC3F,IAAM,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,KAAS,QACX,EAAO,CAAY,KAAK,OAAO,KAAiB,WAC5C;EAAE,MAAM;EAAI,KAAK;EAAI,WAAW;EAAI,KAAK;CAAa,IAGvD,CACP;CAED,QAAgB;EACf,AAAI,KACC,EAAO,CAAK,MACf,EAAS,EAAM,OAAO,EAAE,GACxB,EAAa,EAAM,aAAa,EAAE;CAGrC,GAAG,CAAC,GAAQ,CAAK,CAAC;CAElB,IAAM,KAAiB,MAEjB,6BAAW,KAAK,CAAK,IAInB,MAHN,EAAS,0BAA0B,GAC5B,KAKH,KAAiB,MAAkB;EACxC,MAAE,eAAe,GAEZ,EAAc,CAAK,GACxB;OAAI,CAAC,GAAW;IACf,EAAS,6BAA6B;IACtC;GACD;GAGA,AADA,EAAU,UAAU,KAAS,IAAI,IAAI,GAAW,EAAK,GACrD,EAAY;EAHZ;CAID,GAEM,UAAoB;EAIzB,AAHA,EAAS,EAAE,GACX,EAAa,EAAE,GACf,EAAS,IAAI,GACb,EAAQ;CACT;CAEA,OACC,kBAAC,GAAD;EAAe;EAAQ,SAAS;EAAa,OAAM;EAAkB,MAAK;YAA1E,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,OAAD;GAAK,WAAW,EAAG,cAAc,OAAO;aAAxC;IACC,kBAAC,GAAD;KAAO,OAAM;KAAc,OAAO;KAAO,UAAU;KAAU,aAAY;IAAsB,CAAA;IAE9F,KACA,kBAAC,OAAD;KAAK,WAAU;eAAf;MACC,kBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA;MAAC;MAAC,kBAAC,QAAD;OAAM,WAAU;iBAAc;MAAY,CAAA;KACrE;;IAGN,kBAAC,GAAD;KACC,OAAM;KACN,OAAO;KACP,UAAU;KACV,aAAY;IACZ,CAAA;GACG;KACQ,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAQ,SAAS;aAAa;EAExD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAU,SAAS;GAAe,UAAU,CAAC,KAAS,CAAC;aAAW;EAE5F,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AC/EA,SAAgB,EAAW,EAAE,WAAQ,YAAS,cAAW,mBAAiC;CACzF,IAAM,CAAC,GAAK,KAAU,EAAS,EAAE,GAC3B,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,CAAC,KAAS,QACX,EAAO,CAAY,KAClB,OAAO,KAAiB,WACpB;EAAE,MAAM;EAAI,KAAK;EAAI,WAAW;EAAI,KAAK;CAAa,IAGxD,CACP;CAED,QAAgB;EACf,AAAI,KACC,EAAO,CAAK,MACf,EAAO,EAAM,OAAO,EAAE,GACtB,EAAa,EAAM,aAAa,EAAE;CAGrC,GAAG,CAAC,GAAQ,CAAK,CAAC;CAElB,IAAM,KAAmB,MAAkB;EAI1C,AAHA,EAAO,CAAK,GAGR,KACH,EAAS,IAAI;CAEf,GAEM,KAAiB,MAAkB;EACxC,EAAE,eAAe;EAEjB,IAAM,IAAa,EAAY,CAAG;EAClC,IAAI,CAAC,EAAW,SAAS;GACxB,EAAS,EAAW,KAAK;GACzB;EACD;EAEA,IAAI,CAAC,GAAW;GACf,EAAS,8BAA8B;GACvC;EACD;EAKA,AADA,EADiB,EAAI,WAAW,MAAM,IAAI,IAAM,WAAW,KACvC,IAAI,IAAI,GAAW,CAAU,GACjD,EAAY;CACb,GAEM,UAAoB;EAIzB,AAHA,EAAO,EAAE,GACT,EAAa,EAAE,GACf,EAAS,IAAI,GACb,EAAQ;CACT;CAEA,OACC,kBAAC,GAAD;EAAe;EAAQ,SAAS;EAAa,OAAM;EAAwB,MAAK;YAAhF,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB;IACC,kBAAC,GAAD;KAAO,OAAM;KAAmB,OAAO;KAAK,UAAU;KAAiB,aAAY;IAAuB,CAAA;IAEzG,KACA,kBAAC,OAAD;KAAK,WAAU;eAAf;MACC,kBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA;MAAC;MAAC,kBAAC,QAAD;OAAM,WAAU;iBAAc;MAAY,CAAA;KACrE;;IAGN,kBAAC,GAAD;KACC,OAAM;KACN,OAAO;KACP,UAAU;KACV,aAAY;IACZ,CAAA;IAED,kBAAC,GAAD;KAAU,OAAM;KAA+C,OAAO;KAAY,UAAU;IAAgB,CAAA;GAC9F;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAQ,SAAS;aAAa;EAExD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAU,MAAK;GAAU,SAAS;GAAe,UAAU,CAAC,KAAO,CAAC;aAAW;EAE1F,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AC1FA,SAAgB,GAAY,EAAE,WAAQ,YAAS,cAAW,mBAAkC;CAC3F,IAAM,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAU,KAAe,EAAS,EAAE,GACrC,CAAC,GAAW,KAAgB,EAAS,EAAE,GACvC,CAAC,GAAO,KAAY,EAAwB,IAAI,GAChD,CAAC,KAAS,QACX,EAAO,CAAY,KAAK,OAAO,KAAiB,WAC5C;EAAE,MAAM;EAAI,KAAK;EAAI,WAAW;EAAI,KAAK;CAAa,IAGvD,CACP;CAED,QAAgB;EACf,AAAI,KACC,EAAO,CAAK,MACf,GAAU,EAAM,OAAO,GAAA,CAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,GAEvE,EAAM,MAGV,GAAa,EAAM,OAAO,GAAA,CAAI,QAAQ,OAAO,EAAE,CAAC,IAFhD,GAAa,EAAM,OAAO,GAAA,CAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAK3D,EAAa,EAAM,aAAa,EAAE;CAGrC,GAAG,CAAC,GAAQ,CAAK,CAAC;CAElB,IAAM,KAAqB,MAAkB;EAE5C,AADA,IAAQ,EAAM,QAAQ,OAAO,EAAE,GAC3B,EAAM,UAAU,MACnB,EAAS,CAAK,GACd,EAAS,IAAI,KAEb,EAAS,6BAA6B;CAExC,GAEM,KAAiB,MAClB,EAAM,WAAW,KAId,MAHN,EAAS,yCAAyC,GAC3C,KAKH,KAAiB,MAAkB;EAGxC,IAFA,EAAE,eAAe,GAEb,CAAC,EAAc,CAAK,GAAG;EAC3B,IAAI,CAAC,GAAW;GACf,EAAS,gCAAgC;GACzC;EACD;EAEA,IAAM,IAAiB,EAAY,CAAK;EAGxC,AADA,EAAU,OAAO,KADM,OACO,IAAW,GAAG,EAAe,QAAQ,MAAa,GAAgB,GAAU,GAAW,EAAK,GAC1H,EAAY;CACb,GAEM,UAAoB;EAIzB,AAHA,EAAS,EAAE,GACX,EAAa,EAAE,GACf,EAAS,IAAI,GACb,EAAQ;CACT;CAEA,OACC,kBAAC,GAAD;EAAe;EAAQ,SAAS;EAAa,OAAM;EAAoB,MAAK;YAA5E,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB;IACC,kBAAC,OAAD;KAAK,WAAW,EAAG,QAAQ,iBAAiB,OAAO;eAAnD,CACC,kBAAC,GAAD;MACC,OAAM;MACN,aAAY;MACZ,OAAO;MACP,UAAU;MACV,aAAY;MACZ,WAAU;KACV,CAAA,GACD,kBAAC,GAAD;MAAO,OAAM;MAAmB,OAAO;MAAU,UAAU;MAAa,aAAY;KAAO,CAAA,CACvF;;IACJ,KACA,kBAAC,OAAD;KAAK,WAAU;eAAf;MACC,kBAAC,UAAD,EAAA,UAAQ,gBAAqB,CAAA;MAAC;MAAC,kBAAC,QAAD;OAAM,WAAU;iBAAc;MAAY,CAAA;KACrE;;IAGN,kBAAC,GAAD;KACC,OAAM;KACN,aAAY;KACZ,OAAO;KACP,UAAU;KACV,aAAY;IACZ,CAAA;GACa;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAQ,SAAS;aAAa;EAEtD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAU,SAAS;GAAe,UAAU,CAAC,KAAS,CAAC;aAAW;EAE1F,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AChGA,SAAgB,GAAe,EAAE,WAAQ,YAAS,cAAW,WAAQ,iBAAc,IAAI,kBAAe,CAAC,KAA0B;CAChI,IAAM,CAAC,GAAM,KAAW,EAAS,CAAW,GACtC,CAAC,GAAQ,KAAa,EAAiC,CAAC,CAAC,GACzD,CAAC,GAAQ,KAAa,EAAwC,CAAC,CAAC,GAChE,CAAC,GAAa,KAAkB,EAAS,EAAK;CAEpD,QAAgB;EACf,IAAI,KAAU,CAAC,GAAa;GAC3B,IAAM,IAAU,EAAO,OAAO,QAC5B,GAAK,OACL,EAAI,EAAM,QAAQ,EAAa,EAAM,SAAS,IACvC,IAER,CAAC,CACF;GAGA,AAFA,EAAU,CAAO,GACjB,EAAU,CAAC,CAAC,GACZ,EAAe,EAAI;EACpB,OAAO,AAAI,CAAC,KAAU,KACrB,EAAe,EAAK;CAEtB,GAAG;EAAC;EAAQ,EAAO;EAAQ;EAAc;CAAW,CAAC;CAErD,IAAM,KAAgB,GAAc,MAAkB;EAErD,AADA,GAAW,OAAU;GAAE,GAAG;IAAO,IAAO;EAAM,EAAE,GAChD,GAAW,OAAU;GAAE,GAAG;IAAO,IAAO;EAAK,EAAE;CAChD,GAEM,UAA0B;EAC/B,IAAM,IAA2C,CAAC,GAC9C,IAAU;EAEd,AAAK,EAAK,KAAK,MACd,EAAU,OAAU,qBACpB,IAAU;EAGX,KAAK,IAAM,KAAS,EAAO,QAAQ;GAClC,IAAM,IAAQ,EAAO,EAAM,KAAK,EAAE,KAAK;GACvC,IAAI,EAAM,YAAY,CAAC,GAEtB,AADA,EAAU,EAAM,QAAQ,qBACxB,IAAU;QACJ,IAAI,EAAM,UAAU;IAC1B,IAAM,IAAM,EAAM,SAAS,CAAK;IAChC,AAAI,MACH,EAAU,EAAM,QAAQ,GACxB,IAAU;GAEZ;EACD;EAGA,OADA,EAAU,CAAS,GACZ;CACR;CAQA,OACC,kBAAC,GAAD;EAAe;EAAiB;EAAS,OAAO,YAAY,EAAO,QAAQ;EAAI,MAAK;YAApF,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB;IACC,kBAAC,OAAD,EAAA,UAAA;KACE,EAAO;KAAY;KAAC,kBAAC,MAAD,CAAK,CAAA;IACtB,EAAA,CAAA;IAEL,kBAAC,OAAD,EAAA,UAAA;KACC,kBAAC,UAAD,EAAA,UAAQ,UAAe,CAAA;KAAC;KAAE,EAAO;IAC7B,EAAA,CAAA;IAEL,kBAAC,GAAD;KACC,OAAO,EAAO;KACd,aAAa,qFAAqF,EAAO;KACzG,OAAO;KACP,UAAU;KACV,OAAO,EAAO,QAAW,KAAA;KACzB,UAAA;IACA,CAAA;IACA,EAAO,OAAO,KAAK,MAElB,kBAAC,GAAD;KAEC,OAAO,EAAM;KACb,aAAa,EAAM;KACnB,aAAa,EAAM;KACnB,OAAO,EAAO,EAAM,SAAS;KAC7B,WAAW,MAAU,EAAa,EAAM,MAAM,CAAK;KACnD,OAAO,EAAO,EAAM,SAAS,KAAA;KAC7B,UAAU,EAAM;IAChB,GARK,EAAM,IAQX,CAEF;GACa;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAQ,SAAS;aAAS;EAElD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAU,eA9CjB;IACtB,EAAS,MACd,EAAU,EAAO,SAAS,EAAK,KAAK,GAAG,CAAM,GAC7C,EAAQ;GACT;aA0CqE;EAE1D,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;AC3IA,IAAa,KAA0D;EACrE,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,QAAD;GAAM,OAAM;aAAkF;EAAU,CAAA,GACxG,kBAAC,OAAD;GAAK,WAAU;aACd,kBAAC,QAAD,EAAA,UAAO,8GAAkH,CAAA;EACrH,CAAA,CACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EACC,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aACC;EACD,SACC,kBAAA,GAAA,EAAA,UAAA;GACC,kBAAC,QAAD;IAAM,MAAK;cAAK;GAAc,CAAA;GAAC;GAC/B,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,qDAAyD,CAAA;GAC5D,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,UAAU;GACV,WAAW,MAAU,2BAA2B,KAAK,CAAG,IAAoD,OAAhD;EAC7D,CACD;CACD;EACC,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aAAa;EACb,SAAS;EACT,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EACC,EAAS,OAAO;EAChB,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA;GAAE;GACoB,kBAAC,QAAD,EAAA,UAAM,8BAAiC,CAAA;GAAC;GAC7D,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,iEAAuE,CAAA;GAC1E,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EAgBC,EAAS,MAAM;EACf,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA;GAAE;GACa,kBAAC,OAAD,EAAA,UAAK,SAAW,CAAA;GAAC;GAAC,kBAAC,OAAD,EAAA,UAAK,UAAY,CAAA;GACjD,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,qDAA2D,CAAA;GAC9D,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,GACA;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;EACC,EAAS,MAAM;EACf,SAAS;EACT,OAAO;EACP,aAAa;EACb,SACC,kBAAA,GAAA,EAAA,UAAA;GAAE;GACa,kBAAC,OAAD,EAAA,UAAK,SAAW,CAAA;GAAC;GAAC,kBAAC,OAAD,EAAA,UAAK,UAAY,CAAA;GACjD,kBAAC,OAAD;IAAK,WAAU;cACd,kBAAC,QAAD,EAAA,UAAO,qDAA2D,CAAA;GAC9D,CAAA;EACJ,EAAA,CAAA;EAEH,QAAQ,CACP;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,GACA;GACC,MAAM;GACN,OAAO;GACP,aAAa;GACb,aAAa;GACb,UAAU;EACX,CACD;CACD;AACD;;;ACtIA,SAAgB,GAAW,EAAE,WAAQ,YAAS,cAAW,mBAAiC;CACzF,IAAM,CAAC,GAAM,KAAW,EAA+B,MAAM,GACvD,CAAC,GAAM,KAAW,EAAS,EAAE,GAC7B,CAAC,GAAI,KAAS,EAAS,EAAE,GACzB,CAAC,GAAQ,KAAa,EAAyC,CAAC,CAAC,GAEjE,IAAmB,GAAgB,MAA0C;EAIlF,AAHA,EAAQ,GAAc,QAAQ,MAAM,GACpC,EAAQ,GAAc,QAAQ,EAAE,GAChC,EAAM,GAAc,MAAM,EAAE,GAC5B,EAAU,CAAC,CAAC;CACb,CAAC;CAED,QAAgB;EACf,AAAI,KACH,EAAiB,CAAY;CAE/B,GAAG,CAAC,GAAQ,CAAY,CAAC;CAEzB,IAAM,UAAiB;EACtB,IAAM,IAA2B,CAAC,GAG5B,KAAU,MAAc,sBAAsB,KAAK,CAAC,GACpD,KAAU,MAAc,gBAAgB,KAAK,CAAC,GAC9C,KAAc,MAAc,kCAAkC,KAAK,CAAC,GAEpE,KAAS,GAAe,GAAe,MAAuC;GACnF,IAAI,CAAC,GAAO,OAAO,GAAG,EAAM;GAC5B,IAAI,MAAS,UAAU,CAAC,EAAO,CAAK,GAAG,OAAO;GAC9C,IAAI,MAAS,UAAU,CAAC,EAAO,CAAK,GAAG,OAAO;GAC9C,IAAI,MAAS,cAAc,CAAC,EAAW,CAAK,GAAG,OAAO;EAEvD;EAEA,QAAQ,GAAR;GACC,KAAK;IACJ,EAAU,OAAO,EAAM,QAAQ,GAAM,MAAM;IAC3C;GACD,KAAK;IACJ,EAAU,OAAO,EAAM,SAAS,GAAM,MAAM;IAC5C;GACD,KAAK;IACJ,EAAU,OAAO,EAAM,gBAAgB,GAAM,UAAU;IACvD;GACD,KAAK;IAEJ,AADA,EAAU,OAAO,EAAM,gBAAgB,GAAM,MAAM,GACnD,EAAU,KAAK,EAAM,mBAAmB,GAAI,MAAM;IAClD;GACD,KAAK;IAEJ,AADA,EAAU,OAAO,EAAM,eAAe,GAAM,MAAM,GAClD,EAAU,KAAK,EAAM,kBAAkB,GAAI,MAAM;IACjD;GACD,KAAK;IAEJ,AADA,EAAU,OAAO,EAAM,UAAU,GAAM,UAAU,GACjD,EAAU,KAAK,EAAM,aAAa,GAAI,UAAU;IAChD;EACF;EAGA,OADA,EAAU,CAAS,GACZ,OAAO,OAAO,CAAS,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;CAChD;CAgDA,OACC,kBAAC,GAAD;EAAe;EAAiB;EAAS,OAAM;EAAiB,MAAK;YAArE,CACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAe,KAAI;aAAnB,CACC,kBAAC,GAAD;IAAY,OAAM;IAAe,OAAO;IAAM,UAAU;cAAxD;KACC,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAO,OAAM;KAAQ,CAAA;KAC9C,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAe,OAAM;KAAY,CAAA;KAC1D,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAQ,OAAM;KAAQ,CAAA;KAC/C,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAe,OAAM;KAAc,CAAA;KAC5D,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAAmB,OAAM;KAAc,CAAA;KAChE,kBAAC,EAAW,QAAZ;MAAmB,OAAM;MAA0B,OAAM;KAAkB,CAAA;IAChE;OAEZ,kBAAC,GAAD;IAAe,KAAI;qBAnDI;KAC1B,QAAQ,GAAR;MACC,KAAK;MACL,KAAK;MACL,KAAK,QACJ,OACC,kBAAC,GAAD;OACC,OAAM;OACN,aAAa,MAAS,SAAS,UAAU,MAAS,SAAS,eAAe;OAC1E,OAAO;OACP,UAAU;OACV,OAAO,EAAO;MACd,CAAA;MAEH,KAAK;MACL,KAAK;MACL,KAAK,kBACJ,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;OACC,OAAM;OACN,aAAa,EAAK,SAAS,MAAM,IAAI,UAAU,EAAK,SAAS,MAAM,IAAI,eAAe;OACtF,OAAO;OACP,UAAU;OACV,OAAO,EAAO;MACd,CAAA,GACD,kBAAC,GAAD;OACC,OAAM;OACN,aAAa,EAAK,SAAS,MAAM,IAAI,UAAU,EAAK,SAAS,MAAM,IAAI,eAAe;OACtF,OAAO;OACP,UAAU;OACV,OAAO,EAAO;MACd,CAAA,CACA,EAAA,CAAA;KAEL;IACD,EAe6B,CAAa;GAAiB,CAAA,CACzC;KACF,CAAA,GACd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAQ,SAAS;aAAS;EAElD,CAAA,GACR,kBAAC,GAAD;GAAQ,YAAW;GAAQ,MAAK;GAAU,eAlEjB;IAC3B,IAAI,CAAC,EAAS,GAAG;IAEjB,IAAM,IAAW,IAAK,GAAG,EAAK,GAAG,MAAO;IAExC,AADA,EAAU,QAAQ,GAAU,EAAE,YAAS,CAAC,GACxC,EAAQ;GACT;aA4DqE;EAE1D,CAAA,CACI,EAAA,CAAA,CACP;;AAET;;;ACpIA,SAAgB,GAAkB,EACjC,mBACA,kBACA,6BACA,sBACA,qBACA,cACA,mBACA,wBACA,4BACA,2BAC0B;CAC1B,IAAM,IAA2B;CAEjC,OACC,kBAAA,GAAA,EAAA,UAAA,CACE,KACA,kBAAA,GAAA,EAAA,UAAA;EACE,KACA,kBAAC,GAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,SAAS;GACT,WAAW;EACX,CAAA;EAGF,kBAAC,GAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,cAAc,EAAqB;GACnC,SAAS;GACT,WAAW;EACX,CAAA;EAED,kBAAC,IAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,cAAc,EAAqB;GACnC,SAAS;GACT,WAAW;EACX,CAAA;EAED,kBAAC,IAAD;GACC,QAAQ,MAAmB,EAAU;GACrC,cAAc,EAAqB;GACnC,SAAS;GACT,WAAW;EACX,CAAA;CACA,EAAA,CAAA,GAGF,MACC,MAAkB,EAAS,OAS3B,kBAAC,IAAD;EAAY,QAAQ;EAAM,SAAS;EAAkB,WAAW;CAAsB,CAAA,IARtF,kBAAC,IAAD;EACC,QAAQ;EACR,SAAS;EACT,WAAW;EACX,QAAQ,GAAmB;EAC3B,aAAa,EAAwB;CACrC,CAAA,EAIF,EAAA,CAAA;AAEJ;;;AC5DA,SAAgB,GAAwB,EAAE,gBAAa,aAAU,sBAAmB,uBAAqC;CACxH,IAAM,IAA2B,GAAkB,0BAC7C,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAc,KAAmB,EAA8B,CAAqB,GACrF,CAAC,GAAQ,KAAa,EAA+B,IAAI,GACzD,CAAC,GAAgB,KAAqB,EAA2B,IAAI,GACrE,CAAC,GAAe,KAAoB,EAA0B,IAAI,GAElE,IAAa,EAAiB,GAAa,GAAG,IAAI,EAAY,MAAM,MACpE,IAAgB,CAAC,CAAC,GAElB,IAAqB,QAAc;EACnC,OACL,OAAO,KAAK,UAAU,EAAW,WAAW;CAC7C,GAAG,CAAC,CAAU,CAAC,GAET,IAAc,GAAa,MAAiB;EACjD,QAAQ,MAAM,4BAA4B,CAAK;CAChD,GAAG,CAAC,CAAC,GAEC,IAAe,GACnB,GAAiC,MAAiC;EAClE,IAAI,IAAO;EAMX,AALA,EAAY,WAAW;GACtB,IAAO,EAAuB,GAAe,IAAI;EAClD,CAAC,GAGD,EAAS;GAAE,KADC,GAAiB,CAClB;GAAK;EAAK,CAAC;CACvB,GACA,CAAC,CAAQ,CACV,GAEM,IAAiB,GAAa,MAAoB;EACvD,EAAkB,CAAI;CACvB,GAAG,CAAC,CAAC,GAEC,IAAgB,GAAa,MAAmB;EACrD,EAAiB,CAAI;CACtB,GAAG,CAAC,CAAC,GAEC,IAAU,GAA4B;EAC3C;EACA;EACA,oBAAoB,CAAC,CAAC;EACtB,kBAAkB;EAClB,iBAAiB;CAClB,CAAC,GAEK,IAAgB,SACd;EACN,WAAW;EACX,SAAS;EACT,OAAO;GACN,WAAW;GACX,MAAM;IACL,MAAM;IACN,WAAW;IACX,WAAW;IACX,eAAe;GAChB;EACD;EACA,OAAO;GAAC;GAAa;GAAW;GAAU;GAAc;GAAoB;EAAe;EAC3F,aAAa;CACd,IACA,CAAC,GAAa,CAAkB,CACjC;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW,EAAgB;YAAhC,CACC,kBAAC,OAAD;GACC,WAAW,EAAG,EAAgB,mBAAmB,GAC/C,EAAgB,UAAU,EAC5B,CAAC;aACD,kBAAC,GAAD;IAAgC;cAAhC;KACC,kBAAC,GAAD;MACoB;MACnB,OAAO;MACP,oBAAoB,EAAQ;MAC5B,qBAAqB,EAAQ;MAC7B,mBAAmB,EAAQ;MAC3B,aAAa,EAAQ;MACrB,YAAY,EAAQ;MACpB,QAAQ,EAAQ;MAChB,QAAQ,EAAQ;MAChB,YAAY,EAAQ;KACpB,CAAA;KACD,kBAAC,IAAD;MACC,iBACC,kBAAC,GAAD;OACC,WAAU;OACV,eAAe,EAAa,EAAI;OAChC,cAAc,EAAa,EAAK;MAChC,CAAA;MAEF,aAAa,kBAAC,OAAD;OAAK,WAAU;iBAA2B;MAAqB,CAAA;MAC5E,eAAe;KACf,CAAA;KACD,kBAAC,GAAD,CAAgB,CAAA;KAChB,kBAAC,GAAD,CAAa,CAAA;KACb,kBAAC,GAAD;MAAsB,eAAe;MAAW,eAAe;KAAkB,CAAA;KACjF,kBAAC,GAAD;MAAmB,aAAa,GAAa;MAAM,YAAY;KAAgB,CAAA;KAC/E,kBAAC,GAAD;MAAgB,UAAU;MAAc,uBAAA;KAAuB,CAAA;IAC/C;;EACb,CAAA,GAEL,kBAAC,IAAD;GACiB;GACD;GACf,0BAA0B;GAC1B,yBAAyB,EAAkB,IAAI;GAC/C,wBAAwB,EAAiB,IAAI;GAC7C,WAAW,EAAQ;GACnB,gBAAgB,EAAQ;GACxB,qBAAqB,EAAQ;GAC7B,yBAAyB,EAAQ;GACjC,sBAAsB,EAAQ;EAC9B,CAAA,CACG;;AAEP"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./ui.module-BisoTevy.js";
2
- import { c as t, o as n } from "./Input-Ce2HXBUc.js";
2
+ import { c as t, o as n } from "./Input-BmjlpA09.js";
3
3
  import { cn as r } from "@ryuzaki13/react-foundation-lib/utils";
4
4
  import { jsx as i } from "react/jsx-runtime";
5
5
  var a = { textarea: "TjY2iu" };
@@ -41,4 +41,4 @@ function o({ label: o, description: s, className: c, disabled: l, size: u, value
41
41
  //#endregion
42
42
  export { o as t };
43
43
 
44
- //# sourceMappingURL=Textarea-DeJJjjkI.js.map
44
+ //# sourceMappingURL=Textarea-C9UdUueF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea-DeJJjjkI.js","names":[],"sources":["../../src/textarea/Textarea.module.scss","../../src/textarea/Textarea.tsx"],"sourcesContent":[".textarea {\n\twidth: 100%;\n\tmin-height: 6em;\n\tresize: vertical;\n\tpadding: var(--space-sm);\n\tdisplay: block;\n}\n","import { TextareaHTMLAttributes } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputUI, useInputFieldIds } from \"../input\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Textarea.module.scss\";\n\nexport interface TextareaProps\n\textends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"children\" | \"onChange\" | \"size\" | \"value\">, UiBaseProps<string> {\n\terror?: string;\n\tonClearError?: () => void;\n}\n\n/**\n * Многострочное текстовое поле для ввода свободного текста. Поддерживает подпись, описание, ошибки и единый визуальный стиль формы.\n */\nexport function Textarea({\n\tlabel,\n\tdescription,\n\tclassName,\n\tdisabled,\n\tsize,\n\tvalue,\n\tonChange,\n\terror,\n\tonClearError,\n\tid: externalId,\n\t...props\n}: TextareaProps) {\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid: externalId,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tsize={size}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t<textarea\n\t\t\t\t{...props}\n\t\t\t\tid={controlId}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tvalue={value}\n\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\taria-labelledby={labelId}\n\t\t\t\taria-describedby={describedBy}\n\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\tclassName={cn(uiStyles.uiControl, styles.textarea, \"scrollable\", className)}\n\t\t\t\tonChange={(event) => {\n\t\t\t\t\tonChange?.(event.target.value);\n\t\t\t\t\tif (error && onClearError) {\n\t\t\t\t\t\tonClearError();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</InputUI>\n\t);\n}\n"],"mappings":";;;;;;;ACmBA,SAAgB,EAAS,EACxB,UACA,gBACA,cACA,aACA,SACA,UACA,aACA,UACA,iBACA,IAAI,GACJ,GAAG,KACc;CACjB,IAAM,EAAE,cAAW,YAAS,kBAAe,YAAS,mBAAgB,EAAiB;EACpF,IAAI;EACJ,UAAU,KAAiC;EAC3C,gBAAgB,CAAC,CAAC;EAClB,UAAU,CAAC,CAAC;CACb,CAAC;CAED,OACC,kBAAC,GAAD;EACQ;EACM;EACH;EACJ;EACC;EACI;EACF;EACM;EACN;YACT,kBAAC,YAAD;GACC,GAAI;GACJ,IAAI;GACM;GACH;GACP,gBAAc,CAAC,CAAC,KAAS,KAAA;GACzB,mBAAiB;GACjB,oBAAkB;GAClB,gBAAc,IAAQ,KAAK,KAAA;GAC3B,WAAW,EAAG,EAAS,WAAW,EAAO,UAAU,cAAc,CAAS;GAC1E,WAAW,MAAU;IAEpB,AADA,IAAW,EAAM,OAAO,KAAK,GACzB,KAAS,KACZ,EAAa;GAEf;EACA,CAAA;CACO,CAAA;AAEX"}
1
+ {"version":3,"file":"Textarea-C9UdUueF.js","names":[],"sources":["../../src/textarea/Textarea.module.scss","../../src/textarea/Textarea.tsx"],"sourcesContent":[".textarea {\n\twidth: 100%;\n\tmin-height: 6em;\n\tresize: vertical;\n\tpadding: var(--space-sm);\n\tdisplay: block;\n}\n","import { TextareaHTMLAttributes } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputUI, useInputFieldIds } from \"../input\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Textarea.module.scss\";\n\nexport interface TextareaProps\n\textends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"children\" | \"onChange\" | \"size\" | \"value\">, UiBaseProps<string> {\n\terror?: string;\n\tonClearError?: () => void;\n}\n\n/**\n * Многострочное текстовое поле для ввода свободного текста. Поддерживает подпись, описание, ошибки и единый визуальный стиль формы.\n */\nexport function Textarea({\n\tlabel,\n\tdescription,\n\tclassName,\n\tdisabled,\n\tsize,\n\tvalue,\n\tonChange,\n\terror,\n\tonClearError,\n\tid: externalId,\n\t...props\n}: TextareaProps) {\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid: externalId,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tsize={size}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t<textarea\n\t\t\t\t{...props}\n\t\t\t\tid={controlId}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tvalue={value}\n\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\taria-labelledby={labelId}\n\t\t\t\taria-describedby={describedBy}\n\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\tclassName={cn(uiStyles.uiControl, styles.textarea, \"scrollable\", className)}\n\t\t\t\tonChange={(event) => {\n\t\t\t\t\tonChange?.(event.target.value);\n\t\t\t\t\tif (error && onClearError) {\n\t\t\t\t\t\tonClearError();\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</InputUI>\n\t);\n}\n"],"mappings":";;;;;;;ACmBA,SAAgB,EAAS,EACxB,UACA,gBACA,cACA,aACA,SACA,UACA,aACA,UACA,iBACA,IAAI,GACJ,GAAG,KACc;CACjB,IAAM,EAAE,cAAW,YAAS,kBAAe,YAAS,mBAAgB,EAAiB;EACpF,IAAI;EACJ,UAAU,KAAiC;EAC3C,gBAAgB,CAAC,CAAC;EAClB,UAAU,CAAC,CAAC;CACb,CAAC;CAED,OACC,kBAAC,GAAD;EACQ;EACM;EACH;EACJ;EACC;EACI;EACF;EACM;EACN;YACT,kBAAC,YAAD;GACC,GAAI;GACJ,IAAI;GACM;GACH;GACP,gBAAc,CAAC,CAAC,KAAS,KAAA;GACzB,mBAAiB;GACjB,oBAAkB;GAClB,gBAAc,IAAQ,KAAK,KAAA;GAC3B,WAAW,EAAG,EAAS,WAAW,EAAO,UAAU,cAAc,CAAS;GAC1E,WAAW,MAAU;IAEpB,AADA,IAAW,EAAM,OAAO,KAAK,GACzB,KAAS,KACZ,EAAa;GAEf;EACA,CAAA;CACO,CAAA;AAEX"}
@@ -1,20 +1,20 @@
1
- import { t as e } from "./wheel-picker-DUHGy7wE.js";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
- import { createCalendarDate as r, parseDate as i } from "@ryuzaki13/react-foundation-lib/formatters";
1
+ import { t as e } from "./wheel-picker-FS58cRsQ.js";
2
+ import { createCalendarDate as t, parseDate as n } from "@ryuzaki13/react-foundation-lib/formatters";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
4
  import { parseDateSegmentMask as a } from "@ryuzaki13/react-foundation-lib/date-segments";
5
5
  //#region src/date-time-input/lib/dateTimeValue.ts
6
6
  var o = "dd.MM.yyyy HH:mm", s = "HH:mm", c = 1970, l = 0, u = 1;
7
7
  a(s);
8
- function d(e = 0, t = 0) {
9
- return r(c, l, u, e, t, 0, 0);
8
+ function d(e = 0, n = 0) {
9
+ return t(c, l, u, e, n, 0, 0);
10
10
  }
11
11
  function f(e = "date-time") {
12
12
  return e === "time" ? s : o;
13
13
  }
14
14
  function p(e, t = "date-time") {
15
15
  if (e == null) return null;
16
- let n = i(e);
17
- return n ? t === "time" ? d(n.getHours(), n.getMinutes()) : n : null;
16
+ let r = n(e);
17
+ return r ? t === "time" ? d(r.getHours(), r.getMinutes()) : r : null;
18
18
  }
19
19
  function m(e, t, n, r = "date-time") {
20
20
  let i = p(e, r);
@@ -25,12 +25,12 @@ function m(e, t, n, r = "date-time") {
25
25
  }
26
26
  return !(t && i < t || n && i > n);
27
27
  }
28
- function h(e, t) {
29
- let n = p(t), i = n?.getHours() ?? 0, a = n?.getMinutes() ?? 0;
30
- return r(e.getFullYear(), e.getMonth(), e.getDate(), i, a, 0, 0);
28
+ function h(e, n) {
29
+ let r = p(n), i = r?.getHours() ?? 0, a = r?.getMinutes() ?? 0;
30
+ return t(e.getFullYear(), e.getMonth(), e.getDate(), i, a, 0, 0);
31
31
  }
32
- function g(e, t, n, i = "date-time") {
33
- return i === "time" ? d(t, n) : r(e.getFullYear(), e.getMonth(), e.getDate(), t, n, 0, 0);
32
+ function g(e, n, r, i = "date-time") {
33
+ return i === "time" ? d(n, r) : t(e.getFullYear(), e.getMonth(), e.getDate(), n, r, 0, 0);
34
34
  }
35
35
  function _(e, t, n = "date-time") {
36
36
  return n === "time" ? p(e, "time") ?? d() : p(e, n) ?? t;
@@ -85,44 +85,44 @@ var x = {
85
85
  };
86
86
  //#endregion
87
87
  //#region src/date-time-input/ui/TimePanel.tsx
88
- function S({ value: r, disabled: i, minDate: a, maxDate: o, mode: s = "date-time", onChange: c }) {
89
- let l = b(r, a, o, s), u = (e) => String(e).padStart(2, "0");
90
- return l.disabled ? /* @__PURE__ */ t("div", {
88
+ function S({ value: t, disabled: n, minDate: a, maxDate: o, mode: s = "date-time", onChange: c }) {
89
+ let l = b(t, a, o, s), u = (e) => String(e).padStart(2, "0");
90
+ return l.disabled ? /* @__PURE__ */ r("div", {
91
91
  className: x.timePanel,
92
- children: /* @__PURE__ */ t("p", {
92
+ children: /* @__PURE__ */ r("p", {
93
93
  className: x.hint,
94
94
  children: "Для выбранного дня нет доступного времени в заданном диапазоне."
95
95
  })
96
- }) : /* @__PURE__ */ t("div", {
96
+ }) : /* @__PURE__ */ r("div", {
97
97
  className: x.timePanel,
98
- children: /* @__PURE__ */ n("div", {
98
+ children: /* @__PURE__ */ i("div", {
99
99
  className: x.fields,
100
- children: [/* @__PURE__ */ n("label", {
100
+ children: [/* @__PURE__ */ i("label", {
101
101
  className: x.field,
102
- children: [/* @__PURE__ */ t("span", {
102
+ children: [/* @__PURE__ */ r("span", {
103
103
  className: x.label,
104
104
  children: "Часы"
105
- }), /* @__PURE__ */ t(e, {
105
+ }), /* @__PURE__ */ r(e, {
106
106
  className: x.wheel,
107
107
  items: l.hours,
108
108
  value: l.selectedHour,
109
109
  onChange: (e) => c(e, l.selectedMinute),
110
110
  ariaLabel: "Выбор часов",
111
- disabled: i,
111
+ disabled: n,
112
112
  formatItem: u
113
113
  })]
114
- }), /* @__PURE__ */ n("label", {
114
+ }), /* @__PURE__ */ i("label", {
115
115
  className: x.field,
116
- children: [/* @__PURE__ */ t("span", {
116
+ children: [/* @__PURE__ */ r("span", {
117
117
  className: x.label,
118
118
  children: "Минуты"
119
- }), /* @__PURE__ */ t(e, {
119
+ }), /* @__PURE__ */ r(e, {
120
120
  className: x.wheel,
121
121
  items: l.minutes,
122
122
  value: l.selectedMinute,
123
123
  onChange: (e) => c(l.selectedHour, e),
124
124
  ariaLabel: "Выбор минут",
125
- disabled: i,
125
+ disabled: n,
126
126
  formatItem: u
127
127
  })]
128
128
  })]
@@ -132,4 +132,4 @@ function S({ value: r, disabled: i, minDate: a, maxDate: o, mode: s = "date-time
132
132
  //#endregion
133
133
  export { m as a, p as c, f as i, _ as l, y as n, h as o, d as r, g as s, S as t };
134
134
 
135
- //# sourceMappingURL=TimePanel-_kF2RtHk.js.map
135
+ //# sourceMappingURL=TimePanel-b4saqoUY.js.map