@lionrapid/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/README.md +106 -0
  2. package/dist/base/event-emitter.d.ts +91 -0
  3. package/dist/base/event-emitter.d.ts.map +1 -0
  4. package/dist/base/event-emitter.js +330 -0
  5. package/dist/base/event-emitter.js.map +1 -0
  6. package/dist/base/index.d.ts +5 -0
  7. package/dist/base/index.d.ts.map +1 -0
  8. package/dist/base/index.js +5 -0
  9. package/dist/base/index.js.map +1 -0
  10. package/dist/browser/auto-init.d.ts +57 -0
  11. package/dist/browser/auto-init.d.ts.map +1 -0
  12. package/dist/browser/auto-init.js +304 -0
  13. package/dist/browser/auto-init.js.map +1 -0
  14. package/dist/browser/auto-translator.d.ts +98 -0
  15. package/dist/browser/auto-translator.d.ts.map +1 -0
  16. package/dist/browser/auto-translator.js +218 -0
  17. package/dist/browser/auto-translator.js.map +1 -0
  18. package/dist/browser/block-extractor.d.ts +26 -0
  19. package/dist/browser/block-extractor.d.ts.map +1 -0
  20. package/dist/browser/block-extractor.js +143 -0
  21. package/dist/browser/block-extractor.js.map +1 -0
  22. package/dist/browser/dom-observer.d.ts +42 -0
  23. package/dist/browser/dom-observer.d.ts.map +1 -0
  24. package/dist/browser/dom-observer.js +109 -0
  25. package/dist/browser/dom-observer.js.map +1 -0
  26. package/dist/browser/editor/editor-api.d.ts +67 -0
  27. package/dist/browser/editor/editor-api.d.ts.map +1 -0
  28. package/dist/browser/editor/editor-api.js +233 -0
  29. package/dist/browser/editor/editor-api.js.map +1 -0
  30. package/dist/browser/editor/editor-init.d.ts +11 -0
  31. package/dist/browser/editor/editor-init.d.ts.map +1 -0
  32. package/dist/browser/editor/editor-init.js +181 -0
  33. package/dist/browser/editor/editor-init.js.map +1 -0
  34. package/dist/browser/editor/editor-styles.d.ts +6 -0
  35. package/dist/browser/editor/editor-styles.d.ts.map +1 -0
  36. package/dist/browser/editor/editor-styles.js +419 -0
  37. package/dist/browser/editor/editor-styles.js.map +1 -0
  38. package/dist/browser/editor/inspector.d.ts +22 -0
  39. package/dist/browser/editor/inspector.d.ts.map +1 -0
  40. package/dist/browser/editor/inspector.js +125 -0
  41. package/dist/browser/editor/inspector.js.map +1 -0
  42. package/dist/browser/editor/key-resolver.d.ts +19 -0
  43. package/dist/browser/editor/key-resolver.d.ts.map +1 -0
  44. package/dist/browser/editor/key-resolver.js +49 -0
  45. package/dist/browser/editor/key-resolver.js.map +1 -0
  46. package/dist/browser/editor/live-preview.d.ts +10 -0
  47. package/dist/browser/editor/live-preview.d.ts.map +1 -0
  48. package/dist/browser/editor/live-preview.js +57 -0
  49. package/dist/browser/editor/live-preview.js.map +1 -0
  50. package/dist/browser/editor/sidebar.d.ts +50 -0
  51. package/dist/browser/editor/sidebar.d.ts.map +1 -0
  52. package/dist/browser/editor/sidebar.js +353 -0
  53. package/dist/browser/editor/sidebar.js.map +1 -0
  54. package/dist/browser/editor/toolbar.d.ts +29 -0
  55. package/dist/browser/editor/toolbar.d.ts.map +1 -0
  56. package/dist/browser/editor/toolbar.js +131 -0
  57. package/dist/browser/editor/toolbar.js.map +1 -0
  58. package/dist/browser/exclude-filter.d.ts +21 -0
  59. package/dist/browser/exclude-filter.d.ts.map +1 -0
  60. package/dist/browser/exclude-filter.js +51 -0
  61. package/dist/browser/exclude-filter.js.map +1 -0
  62. package/dist/browser/index.d.ts +32 -0
  63. package/dist/browser/index.d.ts.map +1 -0
  64. package/dist/browser/index.js +28 -0
  65. package/dist/browser/index.js.map +1 -0
  66. package/dist/browser/language-switcher.d.ts +70 -0
  67. package/dist/browser/language-switcher.d.ts.map +1 -0
  68. package/dist/browser/language-switcher.js +339 -0
  69. package/dist/browser/language-switcher.js.map +1 -0
  70. package/dist/browser/lionrapid.auto.dev.js +5757 -0
  71. package/dist/browser/lionrapid.auto.dev.js.map +7 -0
  72. package/dist/browser/lionrapid.auto.js +5757 -0
  73. package/dist/browser/lionrapid.auto.js.map +7 -0
  74. package/dist/browser/lionrapid.auto.min.js +80 -0
  75. package/dist/browser/lionrapid.auto.min.js.map +7 -0
  76. package/dist/browser/lionrapid.editor.js +1869 -0
  77. package/dist/browser/lionrapid.editor.js.map +7 -0
  78. package/dist/browser/lionrapid.editor.min.js +415 -0
  79. package/dist/browser/lionrapid.editor.min.js.map +7 -0
  80. package/dist/browser/lionrapid.esm.js +4786 -0
  81. package/dist/browser/lionrapid.esm.js.map +7 -0
  82. package/dist/browser/lionrapid.esm.min.js +3 -0
  83. package/dist/browser/lionrapid.esm.min.js.map +7 -0
  84. package/dist/browser/lionrapid.iife.dev.js +4809 -0
  85. package/dist/browser/lionrapid.iife.dev.js.map +7 -0
  86. package/dist/browser/lionrapid.iife.js +4809 -0
  87. package/dist/browser/lionrapid.iife.js.map +7 -0
  88. package/dist/browser/lionrapid.iife.min.js +3 -0
  89. package/dist/browser/lionrapid.iife.min.js.map +7 -0
  90. package/dist/browser/lionrapid.umd.js +4822 -0
  91. package/dist/browser/lionrapid.umd.js.map +7 -0
  92. package/dist/browser/lionrapid.umd.min.js +18 -0
  93. package/dist/browser/lionrapid.umd.min.js.map +7 -0
  94. package/dist/browser/markup-parser.d.ts +13 -0
  95. package/dist/browser/markup-parser.d.ts.map +1 -0
  96. package/dist/browser/markup-parser.js +56 -0
  97. package/dist/browser/markup-parser.js.map +1 -0
  98. package/dist/browser/md5.d.ts +16 -0
  99. package/dist/browser/md5.d.ts.map +1 -0
  100. package/dist/browser/md5.js +145 -0
  101. package/dist/browser/md5.js.map +1 -0
  102. package/dist/browser/storage/cache-storage-repository.d.ts +44 -0
  103. package/dist/browser/storage/cache-storage-repository.d.ts.map +1 -0
  104. package/dist/browser/storage/cache-storage-repository.js +186 -0
  105. package/dist/browser/storage/cache-storage-repository.js.map +1 -0
  106. package/dist/browser/storage/localstorage-repository.d.ts +51 -0
  107. package/dist/browser/storage/localstorage-repository.d.ts.map +1 -0
  108. package/dist/browser/storage/localstorage-repository.js +270 -0
  109. package/dist/browser/storage/localstorage-repository.js.map +1 -0
  110. package/dist/builder.d.ts +24 -0
  111. package/dist/builder.d.ts.map +1 -0
  112. package/dist/builder.js +169 -0
  113. package/dist/builder.js.map +1 -0
  114. package/dist/cache/CacheManager.d.ts +132 -0
  115. package/dist/cache/CacheManager.d.ts.map +1 -0
  116. package/dist/cache/CacheManager.js +277 -0
  117. package/dist/cache/CacheManager.js.map +1 -0
  118. package/dist/cache/index.d.ts +6 -0
  119. package/dist/cache/index.d.ts.map +1 -0
  120. package/dist/cache/index.js +5 -0
  121. package/dist/cache/index.js.map +1 -0
  122. package/dist/config/index.d.ts +6 -0
  123. package/dist/config/index.d.ts.map +1 -0
  124. package/dist/config/index.js +6 -0
  125. package/dist/config/index.js.map +1 -0
  126. package/dist/config/lionrapid.config.d.ts +12 -0
  127. package/dist/config/lionrapid.config.d.ts.map +1 -0
  128. package/dist/config/lionrapid.config.js +2 -0
  129. package/dist/config/lionrapid.config.js.map +1 -0
  130. package/dist/config/logger.config.d.ts +19 -0
  131. package/dist/config/logger.config.d.ts.map +1 -0
  132. package/dist/config/logger.config.js +9 -0
  133. package/dist/config/logger.config.js.map +1 -0
  134. package/dist/config/repository.config.d.ts +87 -0
  135. package/dist/config/repository.config.d.ts.map +1 -0
  136. package/dist/config/repository.config.js +5 -0
  137. package/dist/config/repository.config.js.map +1 -0
  138. package/dist/content/index.d.ts +20 -0
  139. package/dist/content/index.d.ts.map +1 -0
  140. package/dist/content/index.js +13 -0
  141. package/dist/content/index.js.map +1 -0
  142. package/dist/content/parser/IParser.d.ts +33 -0
  143. package/dist/content/parser/IParser.d.ts.map +1 -0
  144. package/dist/content/parser/IParser.js +6 -0
  145. package/dist/content/parser/IParser.js.map +1 -0
  146. package/dist/content/parser/MarkupParser.d.ts +67 -0
  147. package/dist/content/parser/MarkupParser.d.ts.map +1 -0
  148. package/dist/content/parser/MarkupParser.js +231 -0
  149. package/dist/content/parser/MarkupParser.js.map +1 -0
  150. package/dist/content/serializer/HTMLSerializer.d.ts +61 -0
  151. package/dist/content/serializer/HTMLSerializer.d.ts.map +1 -0
  152. package/dist/content/serializer/HTMLSerializer.js +100 -0
  153. package/dist/content/serializer/HTMLSerializer.js.map +1 -0
  154. package/dist/content/serializer/ISerializer.d.ts +33 -0
  155. package/dist/content/serializer/ISerializer.d.ts.map +1 -0
  156. package/dist/content/serializer/ISerializer.js +6 -0
  157. package/dist/content/serializer/ISerializer.js.map +1 -0
  158. package/dist/content/style-mapper/DefaultStyleMapper.d.ts +59 -0
  159. package/dist/content/style-mapper/DefaultStyleMapper.d.ts.map +1 -0
  160. package/dist/content/style-mapper/DefaultStyleMapper.js +128 -0
  161. package/dist/content/style-mapper/DefaultStyleMapper.js.map +1 -0
  162. package/dist/content/style-mapper/IStyleMapper.d.ts +50 -0
  163. package/dist/content/style-mapper/IStyleMapper.d.ts.map +1 -0
  164. package/dist/content/style-mapper/IStyleMapper.js +6 -0
  165. package/dist/content/style-mapper/IStyleMapper.js.map +1 -0
  166. package/dist/content/types.d.ts +39 -0
  167. package/dist/content/types.d.ts.map +1 -0
  168. package/dist/content/types.js +6 -0
  169. package/dist/content/types.js.map +1 -0
  170. package/dist/content/validator/ContentValidator.d.ts +57 -0
  171. package/dist/content/validator/ContentValidator.d.ts.map +1 -0
  172. package/dist/content/validator/ContentValidator.js +215 -0
  173. package/dist/content/validator/ContentValidator.js.map +1 -0
  174. package/dist/content/validator/IValidator.d.ts +82 -0
  175. package/dist/content/validator/IValidator.d.ts.map +1 -0
  176. package/dist/content/validator/IValidator.js +6 -0
  177. package/dist/content/validator/IValidator.js.map +1 -0
  178. package/dist/errors/translation-errors.d.ts +55 -0
  179. package/dist/errors/translation-errors.d.ts.map +1 -0
  180. package/dist/errors/translation-errors.js +85 -0
  181. package/dist/errors/translation-errors.js.map +1 -0
  182. package/dist/handlers/async-storage-handler.d.ts +77 -0
  183. package/dist/handlers/async-storage-handler.d.ts.map +1 -0
  184. package/dist/handlers/async-storage-handler.js +239 -0
  185. package/dist/handlers/async-storage-handler.js.map +1 -0
  186. package/dist/handlers/handler-chain.d.ts +79 -0
  187. package/dist/handlers/handler-chain.d.ts.map +1 -0
  188. package/dist/handlers/handler-chain.js +366 -0
  189. package/dist/handlers/handler-chain.js.map +1 -0
  190. package/dist/handlers/index.d.ts +7 -0
  191. package/dist/handlers/index.d.ts.map +1 -0
  192. package/dist/handlers/index.js +7 -0
  193. package/dist/handlers/index.js.map +1 -0
  194. package/dist/handlers/network-handler.d.ts +90 -0
  195. package/dist/handlers/network-handler.d.ts.map +1 -0
  196. package/dist/handlers/network-handler.js +283 -0
  197. package/dist/handlers/network-handler.js.map +1 -0
  198. package/dist/handlers/sync-storage-handler.d.ts +88 -0
  199. package/dist/handlers/sync-storage-handler.d.ts.map +1 -0
  200. package/dist/handlers/sync-storage-handler.js +270 -0
  201. package/dist/handlers/sync-storage-handler.js.map +1 -0
  202. package/dist/index.d.ts +37 -0
  203. package/dist/index.d.ts.map +1 -0
  204. package/dist/index.js +30 -0
  205. package/dist/index.js.map +1 -0
  206. package/dist/interfaces/emitter.interface.d.ts +33 -0
  207. package/dist/interfaces/emitter.interface.d.ts.map +1 -0
  208. package/dist/interfaces/emitter.interface.js +2 -0
  209. package/dist/interfaces/emitter.interface.js.map +1 -0
  210. package/dist/interfaces/handler.interface.d.ts +50 -0
  211. package/dist/interfaces/handler.interface.d.ts.map +1 -0
  212. package/dist/interfaces/handler.interface.js +5 -0
  213. package/dist/interfaces/handler.interface.js.map +1 -0
  214. package/dist/interfaces/index.d.ts +8 -0
  215. package/dist/interfaces/index.d.ts.map +1 -0
  216. package/dist/interfaces/index.js +8 -0
  217. package/dist/interfaces/index.js.map +1 -0
  218. package/dist/interfaces/plugin.interface.d.ts +49 -0
  219. package/dist/interfaces/plugin.interface.d.ts.map +1 -0
  220. package/dist/interfaces/plugin.interface.js +6 -0
  221. package/dist/interfaces/plugin.interface.js.map +1 -0
  222. package/dist/interfaces/repository.interface.d.ts +56 -0
  223. package/dist/interfaces/repository.interface.d.ts.map +1 -0
  224. package/dist/interfaces/repository.interface.js +2 -0
  225. package/dist/interfaces/repository.interface.js.map +1 -0
  226. package/dist/lionRapid.d.ts +225 -0
  227. package/dist/lionRapid.d.ts.map +1 -0
  228. package/dist/lionRapid.js +596 -0
  229. package/dist/lionRapid.js.map +1 -0
  230. package/dist/repositories/index.d.ts +3 -0
  231. package/dist/repositories/index.d.ts.map +1 -0
  232. package/dist/repositories/index.js +3 -0
  233. package/dist/repositories/index.js.map +1 -0
  234. package/dist/repositories/memory-repository.d.ts +30 -0
  235. package/dist/repositories/memory-repository.d.ts.map +1 -0
  236. package/dist/repositories/memory-repository.js +100 -0
  237. package/dist/repositories/memory-repository.js.map +1 -0
  238. package/dist/repositories/network-repository.d.ts +138 -0
  239. package/dist/repositories/network-repository.d.ts.map +1 -0
  240. package/dist/repositories/network-repository.js +516 -0
  241. package/dist/repositories/network-repository.js.map +1 -0
  242. package/dist/sync/missing-translation-queue.d.ts +64 -0
  243. package/dist/sync/missing-translation-queue.d.ts.map +1 -0
  244. package/dist/sync/missing-translation-queue.js +184 -0
  245. package/dist/sync/missing-translation-queue.js.map +1 -0
  246. package/dist/types/cache.types.d.ts +62 -0
  247. package/dist/types/cache.types.d.ts.map +1 -0
  248. package/dist/types/cache.types.js +6 -0
  249. package/dist/types/cache.types.js.map +1 -0
  250. package/dist/types/event-payloads.types.d.ts +46 -0
  251. package/dist/types/event-payloads.types.d.ts.map +1 -0
  252. package/dist/types/event-payloads.types.js +6 -0
  253. package/dist/types/event-payloads.types.js.map +1 -0
  254. package/dist/types/generated.types.d.ts +31 -0
  255. package/dist/types/generated.types.d.ts.map +1 -0
  256. package/dist/types/generated.types.js +6 -0
  257. package/dist/types/generated.types.js.map +1 -0
  258. package/dist/types/index.d.ts +7 -0
  259. package/dist/types/index.d.ts.map +1 -0
  260. package/dist/types/index.js +7 -0
  261. package/dist/types/index.js.map +1 -0
  262. package/dist/types/lionRapid.types.d.ts +169 -0
  263. package/dist/types/lionRapid.types.d.ts.map +1 -0
  264. package/dist/types/lionRapid.types.js +8 -0
  265. package/dist/types/lionRapid.types.js.map +1 -0
  266. package/dist/types/parameters.types.d.ts +36 -0
  267. package/dist/types/parameters.types.d.ts.map +1 -0
  268. package/dist/types/parameters.types.js +6 -0
  269. package/dist/types/parameters.types.js.map +1 -0
  270. package/dist/types/translation-data.types.d.ts +54 -0
  271. package/dist/types/translation-data.types.d.ts.map +1 -0
  272. package/dist/types/translation-data.types.js +6 -0
  273. package/dist/types/translation-data.types.js.map +1 -0
  274. package/dist/types/translation.types.d.ts +94 -0
  275. package/dist/types/translation.types.d.ts.map +1 -0
  276. package/dist/types/translation.types.js +5 -0
  277. package/dist/types/translation.types.js.map +1 -0
  278. package/dist/utils/context-utils.d.ts +23 -0
  279. package/dist/utils/context-utils.d.ts.map +1 -0
  280. package/dist/utils/context-utils.js +36 -0
  281. package/dist/utils/context-utils.js.map +1 -0
  282. package/dist/utils/index.d.ts +10 -0
  283. package/dist/utils/index.d.ts.map +1 -0
  284. package/dist/utils/index.js +19 -0
  285. package/dist/utils/index.js.map +1 -0
  286. package/dist/utils/logger.d.ts +229 -0
  287. package/dist/utils/logger.d.ts.map +1 -0
  288. package/dist/utils/logger.js +345 -0
  289. package/dist/utils/logger.js.map +1 -0
  290. package/dist/utils/namespace-utils.d.ts +30 -0
  291. package/dist/utils/namespace-utils.d.ts.map +1 -0
  292. package/dist/utils/namespace-utils.js +56 -0
  293. package/dist/utils/namespace-utils.js.map +1 -0
  294. package/dist/utils/translation-flow.d.ts +18 -0
  295. package/dist/utils/translation-flow.d.ts.map +1 -0
  296. package/dist/utils/translation-flow.js +74 -0
  297. package/dist/utils/translation-flow.js.map +1 -0
  298. package/dist/utils/translation-value-utils.d.ts +57 -0
  299. package/dist/utils/translation-value-utils.d.ts.map +1 -0
  300. package/dist/utils/translation-value-utils.js +194 -0
  301. package/dist/utils/translation-value-utils.js.map +1 -0
  302. package/package.json +76 -0
@@ -0,0 +1,415 @@
1
+ "use strict";var LionRapidEditor=(()=>{var V=Object.defineProperty;var J=(i,n,e)=>n in i?V(i,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[n]=e;var a=(i,n,e)=>J(i,typeof n!="symbol"?n+"":n,e);var q=`
2
+ /* Reset inside shadow DOM */
3
+ :host {
4
+ all: initial;
5
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
6
+ font-size: 14px;
7
+ color: #1a1a2e;
8
+ line-height: 1.5;
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ *, *::before, *::after {
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ /* \u2500\u2500 FAB (replaces fixed toolbar) \u2500\u2500 */
17
+ .lr-fab {
18
+ position: fixed;
19
+ bottom: 20px;
20
+ right: 20px;
21
+ z-index: 2147483647;
22
+ display: flex;
23
+ align-items: center;
24
+ gap: 0;
25
+ user-select: none;
26
+ }
27
+
28
+ .lr-fab-btn {
29
+ width: 48px;
30
+ height: 48px;
31
+ border-radius: 50%;
32
+ background: #2d7f7f;
33
+ color: #fff;
34
+ border: none;
35
+ font-weight: 700;
36
+ font-size: 16px;
37
+ cursor: grab;
38
+ box-shadow: 0 4px 12px rgba(0,0,0,0.25);
39
+ transition: box-shadow 0.15s;
40
+ flex-shrink: 0;
41
+ z-index: 1;
42
+ }
43
+
44
+ .lr-fab-btn:hover {
45
+ box-shadow: 0 6px 20px rgba(0,0,0,0.3);
46
+ }
47
+
48
+ .lr-fab-btn:active {
49
+ cursor: grabbing;
50
+ }
51
+
52
+ .lr-fab-panel {
53
+ display: none;
54
+ align-items: center;
55
+ gap: 8px;
56
+ background: #1a1a2e;
57
+ color: #fff;
58
+ padding: 8px 12px;
59
+ border-radius: 8px;
60
+ margin-right: 8px;
61
+ box-shadow: 0 4px 12px rgba(0,0,0,0.25);
62
+ white-space: nowrap;
63
+ }
64
+
65
+ .lr-fab.expanded .lr-fab-panel {
66
+ display: flex;
67
+ }
68
+
69
+ .lr-lang-dropdown {
70
+ position: relative;
71
+ }
72
+
73
+ .lr-lang-btn {
74
+ background: rgba(255,255,255,0.1);
75
+ color: #fff;
76
+ border: 1px solid rgba(255,255,255,0.2);
77
+ border-radius: 4px;
78
+ padding: 4px 10px;
79
+ font-size: 13px;
80
+ font-weight: 600;
81
+ cursor: pointer;
82
+ outline: none;
83
+ }
84
+
85
+ .lr-lang-btn:hover {
86
+ background: rgba(255,255,255,0.2);
87
+ }
88
+
89
+ .lr-lang-menu {
90
+ display: none;
91
+ position: absolute;
92
+ bottom: calc(100% + 6px);
93
+ left: 0;
94
+ background: #1a1a2e;
95
+ border: 1px solid rgba(255,255,255,0.15);
96
+ border-radius: 6px;
97
+ padding: 4px;
98
+ min-width: 60px;
99
+ box-shadow: 0 4px 16px rgba(0,0,0,0.4);
100
+ }
101
+
102
+ .lr-lang-menu.open {
103
+ display: flex;
104
+ flex-direction: column;
105
+ gap: 2px;
106
+ }
107
+
108
+ .lr-lang-item {
109
+ background: none;
110
+ color: #ccc;
111
+ border: none;
112
+ padding: 6px 10px;
113
+ font-size: 13px;
114
+ font-weight: 500;
115
+ cursor: pointer;
116
+ border-radius: 4px;
117
+ text-align: left;
118
+ }
119
+
120
+ .lr-lang-item:hover {
121
+ background: rgba(255,255,255,0.1);
122
+ color: #fff;
123
+ }
124
+
125
+ .lr-lang-item.active {
126
+ background: #2d7f7f;
127
+ color: #fff;
128
+ }
129
+
130
+ .lr-fab-progress {
131
+ font-size: 13px;
132
+ color: rgba(255,255,255,0.7);
133
+ }
134
+
135
+ .lr-fab-exit {
136
+ background: none;
137
+ border: 1px solid rgba(255,255,255,0.3);
138
+ color: #fff;
139
+ padding: 4px 10px;
140
+ border-radius: 4px;
141
+ cursor: pointer;
142
+ font-size: 13px;
143
+ }
144
+
145
+ .lr-fab-exit:hover {
146
+ background: rgba(255,255,255,0.1);
147
+ }
148
+
149
+ /* \u2500\u2500 Overlay \u2500\u2500 */
150
+ .lr-overlay {
151
+ position: fixed;
152
+ pointer-events: none;
153
+ border: 2px solid #2d7f7f;
154
+ border-radius: 3px;
155
+ background: rgba(45, 127, 127, 0.06);
156
+ transition: all 0.1s ease;
157
+ z-index: 2147483646;
158
+ display: none;
159
+ }
160
+
161
+ .lr-overlay.active {
162
+ display: block;
163
+ }
164
+
165
+ /* \u2500\u2500 Sidebar \u2500\u2500 */
166
+ .lr-sidebar {
167
+ position: fixed;
168
+ top: 0;
169
+ right: 0;
170
+ width: 360px;
171
+ min-width: 280px;
172
+ max-width: 600px;
173
+ bottom: 0;
174
+ background: #fff;
175
+ border-left: 1px solid #e0e0e0;
176
+ z-index: 2147483647;
177
+ overflow-y: auto;
178
+ transform: translateX(100%);
179
+ transition: transform 0.2s ease;
180
+ }
181
+
182
+ .lr-sidebar.open {
183
+ transform: translateX(0);
184
+ }
185
+
186
+ /* Resize handle on left edge */
187
+ .lr-sidebar-resize {
188
+ position: absolute;
189
+ top: 0;
190
+ left: -4px;
191
+ width: 8px;
192
+ bottom: 0;
193
+ cursor: col-resize;
194
+ z-index: 1;
195
+ }
196
+
197
+ .lr-sidebar-resize:hover,
198
+ .lr-sidebar-resize.active {
199
+ background: rgba(45, 127, 127, 0.3);
200
+ }
201
+
202
+ .lr-sidebar-header {
203
+ padding: 16px;
204
+ border-bottom: 1px solid #e0e0e0;
205
+ display: flex;
206
+ align-items: center;
207
+ justify-content: space-between;
208
+ }
209
+
210
+ .lr-sidebar-title {
211
+ font-weight: 600;
212
+ font-size: 15px;
213
+ }
214
+
215
+ .lr-sidebar-close {
216
+ background: none;
217
+ border: none;
218
+ font-size: 20px;
219
+ cursor: pointer;
220
+ color: #666;
221
+ padding: 4px 8px;
222
+ line-height: 1;
223
+ }
224
+
225
+ .lr-sidebar-close:hover {
226
+ color: #1a1a2e;
227
+ }
228
+
229
+ .lr-sidebar-body {
230
+ padding: 16px;
231
+ }
232
+
233
+ .lr-field {
234
+ margin-bottom: 16px;
235
+ }
236
+
237
+ .lr-field-label {
238
+ display: block;
239
+ font-size: 12px;
240
+ font-weight: 600;
241
+ color: #666;
242
+ text-transform: uppercase;
243
+ letter-spacing: 0.5px;
244
+ margin-bottom: 6px;
245
+ }
246
+
247
+ .lr-field-key {
248
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
249
+ font-size: 12px;
250
+ color: #2d7f7f;
251
+ background: #f0f7f7;
252
+ padding: 4px 8px;
253
+ border-radius: 4px;
254
+ word-break: break-all;
255
+ }
256
+
257
+ .lr-field-original {
258
+ font-size: 13px;
259
+ color: #333;
260
+ background: #f8f8f8;
261
+ padding: 10px 12px;
262
+ border-radius: 6px;
263
+ border: 1px solid #eee;
264
+ white-space: pre-wrap;
265
+ word-break: break-word;
266
+ }
267
+
268
+ .lr-field-tag {
269
+ display: inline;
270
+ background: #d9eded;
271
+ color: #2d7f7f;
272
+ padding: 0 3px;
273
+ border-radius: 2px;
274
+ font-family: monospace;
275
+ font-size: 12px;
276
+ }
277
+
278
+ .lr-textarea {
279
+ width: 100%;
280
+ min-height: 100px;
281
+ padding: 10px 12px;
282
+ border: 1px solid #ddd;
283
+ border-radius: 6px;
284
+ font-family: inherit;
285
+ font-size: 14px;
286
+ line-height: 1.5;
287
+ resize: vertical;
288
+ outline: none;
289
+ transition: border-color 0.15s;
290
+ }
291
+
292
+ .lr-textarea:focus {
293
+ border-color: #2d7f7f;
294
+ box-shadow: 0 0 0 3px rgba(45, 127, 127, 0.1);
295
+ }
296
+
297
+ .lr-preview {
298
+ padding: 10px 12px;
299
+ background: #f8f8f8;
300
+ border: 1px solid #eee;
301
+ border-radius: 6px;
302
+ font-size: 13px;
303
+ min-height: 40px;
304
+ }
305
+
306
+ .lr-status {
307
+ padding: 10px 16px;
308
+ font-size: 12px;
309
+ color: #666;
310
+ text-align: center;
311
+ border-top: 1px solid #eee;
312
+ background: #fafafa;
313
+ }
314
+
315
+ .lr-status.saved {
316
+ color: #22c55e;
317
+ }
318
+
319
+ .lr-status.error {
320
+ color: #ef4444;
321
+ }
322
+
323
+ .lr-status.unsaved {
324
+ color: #f59e0b;
325
+ }
326
+
327
+ /* \u2500\u2500 Page blocks list \u2500\u2500 */
328
+ .lr-blocks-section {
329
+ margin-top: 16px;
330
+ padding-top: 16px;
331
+ border-top: 1px solid #eee;
332
+ }
333
+
334
+ .lr-blocks-title {
335
+ font-size: 12px;
336
+ font-weight: 600;
337
+ color: #666;
338
+ text-transform: uppercase;
339
+ letter-spacing: 0.5px;
340
+ margin-bottom: 8px;
341
+ }
342
+
343
+ .lr-block-item {
344
+ padding: 8px 10px;
345
+ border: 1px solid #eee;
346
+ border-radius: 4px;
347
+ margin-bottom: 4px;
348
+ cursor: pointer;
349
+ font-size: 13px;
350
+ color: #333;
351
+ overflow: hidden;
352
+ transition: background 0.1s;
353
+ display: flex;
354
+ align-items: flex-start;
355
+ gap: 8px;
356
+ }
357
+
358
+ .lr-block-item:hover {
359
+ background: #f0f7f7;
360
+ border-color: #2d7f7f;
361
+ }
362
+
363
+ .lr-block-item.active {
364
+ background: #e5f2f2;
365
+ border-color: #2d7f7f;
366
+ }
367
+
368
+ /* \u2500\u2500 Status dots \u2500\u2500 */
369
+ .lr-status-dot {
370
+ width: 8px;
371
+ height: 8px;
372
+ border-radius: 50%;
373
+ flex-shrink: 0;
374
+ margin-top: 5px;
375
+ background: #d1d5db;
376
+ }
377
+
378
+ .lr-status-dot.missing { background: #d1d5db; }
379
+ .lr-status-dot.mt { background: #60a5fa; }
380
+ .lr-status-dot.edited { background: #f97316; }
381
+ .lr-status-dot.confirmed { background: #22c55e; }
382
+ .lr-status-dot.ready { background: #22c55e; }
383
+ .lr-status-dot.locked { background: #a855f7; }
384
+ .lr-status-dot.unsaved { background: #f59e0b; }
385
+
386
+ /* \u2500\u2500 Locked textarea \u2500\u2500 */
387
+ .lr-textarea-locked {
388
+ background: #f3f4f6;
389
+ color: #6b7280;
390
+ cursor: not-allowed;
391
+ border-color: #e5e7eb;
392
+ }
393
+
394
+ /* \u2500\u2500 Block text layout \u2500\u2500 */
395
+ .lr-block-text {
396
+ overflow: hidden;
397
+ min-width: 0;
398
+ }
399
+
400
+ .lr-block-source {
401
+ overflow: hidden;
402
+ text-overflow: ellipsis;
403
+ white-space: nowrap;
404
+ }
405
+
406
+ .lr-block-preview {
407
+ font-size: 11px;
408
+ color: #888;
409
+ overflow: hidden;
410
+ text-overflow: ellipsis;
411
+ white-space: nowrap;
412
+ margin-top: 2px;
413
+ }
414
+ `;var C=class{constructor(){a(this,"elementToStyles",{b:"bold",strong:"bold",i:"italic",em:"italic",u:"underline",s:"strikethrough",del:"strikethrough",strike:"strikethrough",code:"code",mark:"highlight",sub:"subscript",sup:"superscript"});a(this,"styleToElement",{bold:"b",italic:"i",underline:"u",strikethrough:"s",code:"code",highlight:"mark",subscript:"sub",superscript:"sup",strong:"b",b:"b",em:"i",i:"i",u:"u",s:"s",del:"s",strike:"s",mark:"mark",sub:"sub",sup:"sup"})}mapElementToStyles(n,e){let t=[],r=n.toLowerCase(),s=this.elementToStyles[r];return s&&t.push(s),r==="a"&&e.href&&t.push(`hyperlink:${e.href}`),t}mapStylesToElement(n){for(let e of n)if(e.startsWith("hyperlink:"))return{element:"a",attrs:{href:e.slice(10)}};for(let e of n){let t=this.styleToElement[e];if(t)return{element:t,attrs:{}}}return{element:"span",attrs:{}}}};var Y=new C;function S(i){let n={},e=0;function t(s){if(s.nodeType===Node.TEXT_NODE)return s.nodeValue??"";if(s.nodeType!==Node.ELEMENT_NODE)return"";let o=s,d=o.tagName.toLowerCase(),c={};for(let l=0;l<o.attributes.length;l++){let h=o.attributes[l];c[h.name.toLowerCase()]=h.value}let p=Y.mapElementToStyles(d,c);if(p.length>0){e++;let l=e;n[String(l)]=p;let h="";for(let m=0;m<s.childNodes.length;m++)h+=t(s.childNodes[m]);return`<${l}>${h}</${l}>`}let u="";for(let l=0;l<s.childNodes.length;l++)u+=t(s.childNodes[l]);return u}let r="";for(let s=0;s<i.childNodes.length;s++)r+=t(i.childNodes[s]);return{text:r,styles:n}}function w(i,n){let e=(i&65535)+(n&65535);return(i>>16)+(n>>16)+(e>>16)<<16|e&65535}function G(i,n){return i<<n|i>>>32-n}function M(i,n,e,t,r,s){return w(G(w(w(n,i),w(t,s)),r),e)}function f(i,n,e,t,r,s,o){return M(n&e|~n&t,i,n,r,s,o)}function b(i,n,e,t,r,s,o){return M(n&t|e&~t,i,n,r,s,o)}function v(i,n,e,t,r,s,o){return M(n^e^t,i,n,r,s,o)}function y(i,n,e,t,r,s,o){return M(e^(n|~t),i,n,r,s,o)}function Q(i,n){i[n>>5]|=128<<n%32,i[(n+64>>>9<<4)+14]=n;let e=1732584193,t=-271733879,r=-1732584194,s=271733878;for(let o=0;o<i.length;o+=16){let d=e,c=t,p=r,u=s;e=f(e,t,r,s,i[o],7,-680876936),s=f(s,e,t,r,i[o+1],12,-389564586),r=f(r,s,e,t,i[o+2],17,606105819),t=f(t,r,s,e,i[o+3],22,-1044525330),e=f(e,t,r,s,i[o+4],7,-176418897),s=f(s,e,t,r,i[o+5],12,1200080426),r=f(r,s,e,t,i[o+6],17,-1473231341),t=f(t,r,s,e,i[o+7],22,-45705983),e=f(e,t,r,s,i[o+8],7,1770035416),s=f(s,e,t,r,i[o+9],12,-1958414417),r=f(r,s,e,t,i[o+10],17,-42063),t=f(t,r,s,e,i[o+11],22,-1990404162),e=f(e,t,r,s,i[o+12],7,1804603682),s=f(s,e,t,r,i[o+13],12,-40341101),r=f(r,s,e,t,i[o+14],17,-1502002290),t=f(t,r,s,e,i[o+15],22,1236535329),e=b(e,t,r,s,i[o+1],5,-165796510),s=b(s,e,t,r,i[o+6],9,-1069501632),r=b(r,s,e,t,i[o+11],14,643717713),t=b(t,r,s,e,i[o],20,-373897302),e=b(e,t,r,s,i[o+5],5,-701558691),s=b(s,e,t,r,i[o+10],9,38016083),r=b(r,s,e,t,i[o+15],14,-660478335),t=b(t,r,s,e,i[o+4],20,-405537848),e=b(e,t,r,s,i[o+9],5,568446438),s=b(s,e,t,r,i[o+14],9,-1019803690),r=b(r,s,e,t,i[o+3],14,-187363961),t=b(t,r,s,e,i[o+8],20,1163531501),e=b(e,t,r,s,i[o+13],5,-1444681467),s=b(s,e,t,r,i[o+2],9,-51403784),r=b(r,s,e,t,i[o+7],14,1735328473),t=b(t,r,s,e,i[o+12],20,-1926607734),e=v(e,t,r,s,i[o+5],4,-378558),s=v(s,e,t,r,i[o+8],11,-2022574463),r=v(r,s,e,t,i[o+11],16,1839030562),t=v(t,r,s,e,i[o+14],23,-35309556),e=v(e,t,r,s,i[o+1],4,-1530992060),s=v(s,e,t,r,i[o+4],11,1272893353),r=v(r,s,e,t,i[o+7],16,-155497632),t=v(t,r,s,e,i[o+10],23,-1094730640),e=v(e,t,r,s,i[o+13],4,681279174),s=v(s,e,t,r,i[o+0],11,-358537222),r=v(r,s,e,t,i[o+3],16,-722521979),t=v(t,r,s,e,i[o+6],23,76029189),e=v(e,t,r,s,i[o+9],4,-640364487),s=v(s,e,t,r,i[o+12],11,-421815835),r=v(r,s,e,t,i[o+15],16,530742520),t=v(t,r,s,e,i[o+2],23,-995338651),e=y(e,t,r,s,i[o],6,-198630844),s=y(s,e,t,r,i[o+7],10,1126891415),r=y(r,s,e,t,i[o+14],15,-1416354905),t=y(t,r,s,e,i[o+5],21,-57434055),e=y(e,t,r,s,i[o+12],6,1700485571),s=y(s,e,t,r,i[o+3],10,-1894986606),r=y(r,s,e,t,i[o+10],15,-1051523),t=y(t,r,s,e,i[o+1],21,-2054922799),e=y(e,t,r,s,i[o+8],6,1873313359),s=y(s,e,t,r,i[o+15],10,-30611744),r=y(r,s,e,t,i[o+6],15,-1560198380),t=y(t,r,s,e,i[o+13],21,1309151649),e=y(e,t,r,s,i[o+4],6,-145523070),s=y(s,e,t,r,i[o+11],10,-1120210379),r=y(r,s,e,t,i[o+2],15,718787259),t=y(t,r,s,e,i[o+9],21,-343485551),e=w(e,d),t=w(t,c),r=w(r,p),s=w(s,u)}return[e,t,r,s]}function Z(i){let n="0123456789abcdef",e="";for(let t=0;t<i.length*4;t++)e+=n.charAt(i[t>>2]>>t%4*8+4&15)+n.charAt(i[t>>2]>>t%4*8&15);return e}function ee(i){let n=[];for(let e=0;e<i.length*8;e+=8)n[e>>5]|=(i.charCodeAt(e/8)&255)<<e%32;return n}function te(i){return Z(Q(ee(i),i.length*8))}function T(i){let n=i.trim();return"auto_"+te(n).substring(0,12)}var ne="p,h1,h2,h3,h4,h5,h6,li,td,th,label,button,figcaption,dt,dd,summary,caption";function W(i){let n=i.closest("[data-lr-block]");if(n){let r=n.getAttribute("data-lr-block"),s=n.getAttribute("data-lr-original"),o,d=null;if(s){let c=document.createElement(n.tagName);c.innerHTML=s,o=S(c),d=S(n)}else o=S(n);return{key:r,unit:o,translatedUnit:d,element:n}}let e=i.closest(ne);if(e){let r=S(e);return{key:T(r.text),unit:r,translatedUnit:null,element:e}}let t=i.textContent?.trim();return t&&t.length>=2?{key:T(t),unit:{text:t,styles:{}},translatedUnit:null,element:i}:null}var se=new Set(["SCRIPT","STYLE","CODE","PRE","TEXTAREA","NOSCRIPT","SVG"]),X="p,h1,h2,h3,h4,h5,h6,li,td,th,label,button,figcaption,dt,dd,summary,caption",R=class{constructor(n,e){a(this,"overlay");a(this,"currentTarget",null);a(this,"onSelect");a(this,"rafId",null);a(this,"active",!0);this.onSelect=e,this.overlay=document.createElement("div"),this.overlay.className="lr-overlay",n.appendChild(this.overlay),this.handleMouseOver=this.handleMouseOver.bind(this),this.handleClick=this.handleClick.bind(this),this.handleScroll=this.handleScroll.bind(this),document.addEventListener("mouseover",this.handleMouseOver,!0),document.addEventListener("click",this.handleClick,!0),window.addEventListener("scroll",this.handleScroll,!0),window.addEventListener("resize",this.handleScroll)}destroy(){this.active=!1,document.removeEventListener("mouseover",this.handleMouseOver,!0),document.removeEventListener("click",this.handleClick,!0),window.removeEventListener("scroll",this.handleScroll,!0),window.removeEventListener("resize",this.handleScroll),this.rafId!==null&&cancelAnimationFrame(this.rafId),this.overlay.remove()}clearHighlight(){this.currentTarget=null,this.overlay.classList.remove("active")}handleMouseOver(n){if(!this.active)return;let e=n.target;if(!e||!e.closest||e.closest("#__lionrapid-editor"))return;if(this.shouldSkip(e)){this.clearHighlight();return}let t=e.closest(X)||e.closest("[data-lr-block]");if(!t){this.clearHighlight();return}t!==this.currentTarget&&(this.currentTarget=t,this.positionOverlay(t))}handleClick(n){if(!this.active)return;let e=n.target;if(!e||!e.closest||e.closest("#__lionrapid-editor"))return;let t=e.closest(X)||e.closest("[data-lr-block]");if(!t||this.shouldSkip(t))return;n.preventDefault(),n.stopPropagation();let r=W(t);r&&this.onSelect(r)}handleScroll(){this.currentTarget&&(this.rafId!==null&&cancelAnimationFrame(this.rafId),this.rafId=requestAnimationFrame(()=>{this.currentTarget&&this.positionOverlay(this.currentTarget)}))}positionOverlay(n){let e=n.getBoundingClientRect();this.overlay.style.top=`${e.top}px`,this.overlay.style.left=`${e.left}px`,this.overlay.style.width=`${e.width}px`,this.overlay.style.height=`${e.height}px`,this.overlay.classList.add("active")}shouldSkip(n){let e=n;for(;e;){if(se.has(e.tagName)||e.hasAttribute("data-no-translate")||e.getAttribute("translate")==="no")return!0;e=e.parentElement}return!1}};var A=class{constructor(n,e,t,r,s){a(this,"el");a(this,"langBtnEl");a(this,"langMenuEl");a(this,"progressEl");a(this,"expanded",!1);a(this,"currentLocale");a(this,"onLanguageChange");a(this,"onExit");a(this,"dragging",!1);a(this,"dragOffsetX",0);a(this,"dragOffsetY",0);this.onLanguageChange=r,this.onExit=s,this.currentLocale=t,this.el=document.createElement("div"),this.el.className="lr-fab";let o=document.createElement("button");o.className="lr-fab-btn",o.textContent="LR",o.addEventListener("click",u=>{this.dragging||(u.stopPropagation(),this.toggle())}),this.el.appendChild(o);let d=document.createElement("div");d.className="lr-fab-panel";let c=document.createElement("div");c.className="lr-lang-dropdown",this.langBtnEl=document.createElement("button"),this.langBtnEl.className="lr-lang-btn",this.langBtnEl.textContent=t.toUpperCase(),this.langBtnEl.addEventListener("click",u=>{u.stopPropagation(),this.langMenuEl.classList.toggle("open")}),c.appendChild(this.langBtnEl),this.langMenuEl=document.createElement("div"),this.langMenuEl.className="lr-lang-menu";for(let u of e){let l=document.createElement("button");l.className="lr-lang-item",u===t&&l.classList.add("active"),l.textContent=u.toUpperCase(),l.addEventListener("click",h=>{h.stopPropagation(),this.currentLocale=u,this.langBtnEl.textContent=u.toUpperCase(),this.langMenuEl.classList.remove("open"),this.langMenuEl.querySelectorAll(".lr-lang-item").forEach(m=>m.classList.remove("active")),l.classList.add("active"),this.onLanguageChange(u)}),this.langMenuEl.appendChild(l)}c.appendChild(this.langMenuEl),d.appendChild(c),this.progressEl=document.createElement("span"),this.progressEl.className="lr-fab-progress",d.appendChild(this.progressEl);let p=document.createElement("button");p.className="lr-fab-exit",p.textContent="Exit",p.addEventListener("click",()=>this.onExit()),d.appendChild(p),this.el.appendChild(d),n.appendChild(this.el),this.handleMouseDown=this.handleMouseDown.bind(this),this.handleMouseMove=this.handleMouseMove.bind(this),this.handleMouseUp=this.handleMouseUp.bind(this),o.addEventListener("mousedown",this.handleMouseDown)}toggle(){this.expanded=!this.expanded,this.el.classList.toggle("expanded",this.expanded)}updateProgress(n,e){this.progressEl.textContent=`${n}/${e}`}getCurrentLocale(){return this.currentLocale}destroy(){document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.el.remove()}handleMouseDown(n){this.dragging=!1,this.dragOffsetX=n.clientX-this.el.getBoundingClientRect().left,this.dragOffsetY=n.clientY-this.el.getBoundingClientRect().top,document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}handleMouseMove(n){this.dragging=!0;let e=Math.max(0,Math.min(n.clientX-this.dragOffsetX,window.innerWidth-this.el.offsetWidth)),t=Math.max(0,Math.min(n.clientY-this.dragOffsetY,window.innerHeight-this.el.offsetHeight));this.el.style.left=`${e}px`,this.el.style.top=`${t}px`,this.el.style.right="auto",this.el.style.bottom="auto"}handleMouseUp(){document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.dragging&&setTimeout(()=>{this.dragging=!1},0)}};var L=class{constructor(n={}){a(this,"styleMapper");this.styleMapper=n.styleMapper??new C}serialize(n){let{text:e,styles:t}=n,r=/<(\/?)?(\d+)(\/)?>/g,s="",o=0,d;for(;(d=r.exec(e))!==null;){s+=e.slice(o,d.index);let[c,p,u,l]=d,m=t[u]||[];if(p){let g=this.styleMapper.mapStylesToElement(m);s+=`</${g.element}>`}else if(l){let g=this.styleMapper.mapStylesToElement(m),k=this.formatAttributes(g.attrs);s+=`<${g.element}${k} />`}else{let g=this.styleMapper.mapStylesToElement(m),k=this.formatAttributes(g.attrs);s+=`<${g.element}${k}>`}o=d.index+c.length}return s+=e.slice(o),s}formatAttributes(n){let e=Object.entries(n);return e.length===0?"":" "+e.map(([t,r])=>`${t}="${this.escapeAttributeValue(r)}"`).join(" ")}escapeAttributeValue(n){return n.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}};var re=new L;function K(i,n,e,t,r,s){i.hasAttribute("data-lr-original")||i.setAttribute("data-lr-original",i.innerHTML);let d=window.LionRapid?.autoTranslator?ie():null;if(d){let c=`${r}:${s}:${t}`;d.set(c,n,e)}if(e&&Object.keys(e).length>0){let c={text:n,styles:e};i.innerHTML=re.serialize(c)}else i.textContent=n;i.setAttribute("data-lr-block",t),i.setAttribute("data-lionrapid-client","1")}function ie(){try{let i=window.LionRapid;if(!i)return null;let n=i.autoTranslator;if(!n)return null;let e=n.core;if(!e)return null;let t=e.cache;return!t||typeof t.set!="function"?null:t}catch{return null}}var oe={emails:!0,urls:!0,numbers:!0,phones:!0},I={email:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,url:/^(https?:\/\/|www\.)[^\s]+$/i,number:/^[\d\s.,+-]+$/,phone:/^[+\d][\d\s().-]{6,}$/},N=class{constructor(n={},e=2){a(this,"patterns");a(this,"minTextLength");this.patterns={...oe,...n},this.minTextLength=e}shouldExclude(n){let e=n.trim();return!!(e.length<this.minTextLength||this.patterns.emails&&I.email.test(e)||this.patterns.urls&&I.url.test(e)||this.patterns.numbers&&I.number.test(e)||this.patterns.phones&&I.phone.test(e))}};var F="p,h1,h2,h3,h4,h5,h6,li,td,th,label,button,figcaption,dt,dd,summary,caption",ae=new Set(["SCRIPT","STYLE","CODE","PRE","TEXTAREA","NOSCRIPT","SVG"]),le=["data-lionrapid-translated","data-lionrapid-client","data-no-translate"],O=class{constructor(n={},e=[],t=2){a(this,"excludeFilter");a(this,"excludeSelectors");this.excludeFilter=new N(n,t),this.excludeSelectors=e}extract(n,e=!1){let t=[],r=n.querySelectorAll(F),s=[];n instanceof Element&&n.matches(F)&&s.push(n);for(let o=0;o<r.length;o++)s.push(r[o]);for(let o=0;o<s.length;o++){let d=s[o];if(this.isInsideSkipTag(d)||!e&&this.hasSkipAttribute(d)||this.matchesExcludeSelector(d)||d.getAttribute("translate")==="no"||d.querySelector(F))continue;let c=d.getAttribute("data-lr-block"),p=d.getAttribute("data-lr-original"),u;if(p){let m=document.createElement(d.tagName);m.innerHTML=p,u=S(m)}else u=S(d);let l=u.text.replace(/<\/?[0-9]+\/?>/g,"");if(this.excludeFilter.shouldExclude(l))continue;let h;if(c)h=c;else{let m=d.getAttribute("data-i18n");m?h=m.includes(":")?m:`common:${m}`:h=T(u.text)}t.push({element:d,unit:u,key:h})}return t}isInsideSkipTag(n){let e=n.parentElement;for(;e;){if(ae.has(e.tagName))return!0;e=e.parentElement}return!1}hasSkipAttribute(n){let e=n;for(;e;){for(let t of le)if(e.hasAttribute(t))return!0;e=e.parentElement}return!1}matchesExcludeSelector(n){for(let e of this.excludeSelectors)try{if(n.matches(e)||n.closest(e))return!0}catch{}return!1}};var de=new L,P=class{constructor(n,e,t,r,s,o){a(this,"el");a(this,"bodyEl");a(this,"statusEl");a(this,"api");a(this,"locale");a(this,"namespace");a(this,"defaultLocale");a(this,"current",null);a(this,"blockExtractor");a(this,"onBlockClick");a(this,"statusMap",new Map);a(this,"unsavedKeys",new Set);a(this,"onProgressUpdate",null);a(this,"lastFetchTime",0);a(this,"lastFlushTime",0);this.api=e,this.locale=t,this.namespace=r,this.defaultLocale=s,this.onBlockClick=o,this.blockExtractor=new O,this.el=document.createElement("div"),this.el.className="lr-sidebar";let d=document.createElement("div");d.className="lr-sidebar-resize",this.initResize(d),this.el.appendChild(d);let c=document.createElement("div");c.className="lr-sidebar-header";let p=document.createElement("span");p.className="lr-sidebar-title",p.textContent="Edit Translation",c.appendChild(p);let u=document.createElement("button");u.className="lr-sidebar-close",u.innerHTML="&times;",u.addEventListener("click",()=>this.close()),c.appendChild(u),this.el.appendChild(c),this.bodyEl=document.createElement("div"),this.bodyEl.className="lr-sidebar-body",this.el.appendChild(this.bodyEl),this.statusEl=document.createElement("div"),this.statusEl.className="lr-status",this.api.setStatusCallback((l,h)=>{this.statusEl.textContent=h||l,this.statusEl.className=`lr-status ${l}`}),this.api.setFlushedCallback(async l=>{this.lastFlushTime=Date.now();let h=await this.api.fetchStatus(l,this.locale,this.namespace);for(let[m,g]of Object.entries(h))this.statusMap.set(m,g),this.unsavedKeys.delete(m);this.refreshBlocksList(),this.emitProgress()}),n.appendChild(this.el)}open(n){this.current=n,this.el.classList.add("open"),this.renderContent(n)}close(){this.current=null,this.el.classList.remove("open")}isOpen(){return this.el.classList.contains("open")}updateLocale(n){this.locale=n,this.statusMap.clear(),this.unsavedKeys.clear()}setProgressCallback(n){this.onProgressUpdate=n}async hydrateStatus(){let n=this.blockExtractor.extract(document.body,!0),e=n.map(r=>r.key);if(e.length===0)return;let t=await this.api.fetchStatus(e,this.locale,this.namespace);for(let[r,s]of Object.entries(t))this.statusMap.set(r,s);for(let r of n){let s=this.statusMap.get(r.key);s&&s.text&&!s.isReady&&K(r.element,s.text,r.unit.styles,r.key,this.locale,this.namespace)}this.emitProgress()}getTranslatedCount(){let n=0;for(let e of this.statusMap.values())e&&e.rowState!=="empty"&&n++;return n}getTotalCount(){return this.blockExtractor.extract(document.body,!0).length}emitProgress(){this.onProgressUpdate&&this.onProgressUpdate(this.getTranslatedCount(),this.getTotalCount())}destroy(){this.el.remove()}async renderContent(n){let{key:e,unit:t,element:r}=n;if(this.bodyEl.innerHTML="",this.lastFlushTime>this.lastFetchTime||this.lastFetchTime===0){let h=this.blockExtractor.extract(document.body,!0).map(g=>g.key);h.includes(e)||h.push(e);let m=await this.api.fetchStatus(h,this.locale,this.namespace);for(let[g,k]of Object.entries(m))this.statusMap.set(g,k);this.lastFetchTime=Date.now()}else{let l=await this.api.fetchStatus([e],this.locale,this.namespace);l[e]!==void 0&&this.statusMap.set(e,l[e])}let o=this.statusMap.get(e)??null;this.addField("Key",()=>{let l=document.createElement("div");return l.className="lr-field-key",l.textContent=e,l}),this.addField("Original",()=>{let l=document.createElement("div");return l.className="lr-field-original",l.innerHTML=this.renderTextWithTags(t.text),l});let d=this.locale===this.defaultLocale,c=d||o?.isLocked||o?.isReady||!1,p=document.createElement("textarea");this.addField("Translation",()=>(p.className="lr-textarea",p.value=o?.text||n.translatedUnit?.text||"",p.placeholder=t.text,c&&(p.readOnly=!0,p.classList.add("lr-textarea-locked"),p.title=d?"Source language \u2014 switch to a target language to edit":o?.isReady?"Approved for delivery \u2014 read only":"Locked \u2014 read only"),p)),this.bodyEl.appendChild(this.statusEl);let u=document.createElement("div");this.addField("Preview",()=>(u.className="lr-preview",p.value&&(u.innerHTML=this.renderPreview(p.value,t.styles)),u)),c||p.addEventListener("input",()=>{let l=p.value;u.innerHTML=this.renderPreview(l,t.styles),l&&K(r,l,t.styles,e,this.locale,this.namespace),this.unsavedKeys.add(e),this.api.queueSave({key:e,locale:this.locale,namespace:this.namespace,text:l,styles:t.styles})}),this.renderBlocksList(),c||setTimeout(()=>p.focus(),100)}addField(n,e){let t=document.createElement("div");t.className="lr-field";let r=document.createElement("span");r.className="lr-field-label",r.textContent=n,t.appendChild(r),t.appendChild(e()),this.bodyEl.appendChild(t)}getDotClass(n){if(this.unsavedKeys.has(n))return"unsaved";let e=this.statusMap.get(n);return e?e.isLocked?"locked":e.isReady?"ready":e.isConfirmed?"confirmed":e.rowState==="edited"?"edited":e.rowState==="machine_translated"?"mt":"missing":"missing"}renderTextWithTags(n){return n.replace(/<(\/?)?(\d+)(\/)?>/g,e=>`<span class="lr-field-tag">${e}</span>`)}renderPreview(n,e){if(!n)return"";if(Object.keys(e).length>0){let t={text:n,styles:e};return de.serialize(t)}return n}initResize(n){let e=0,t=0,r=o=>{let d=t+(e-o.clientX),c=Math.max(280,Math.min(600,d));this.el.style.width=`${c}px`},s=()=>{n.classList.remove("active"),document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",s)};n.addEventListener("mousedown",o=>{o.preventDefault(),e=o.clientX,t=this.el.offsetWidth,n.classList.add("active"),document.addEventListener("mousemove",r),document.addEventListener("mouseup",s)})}refreshBlocksList(){let n=this.bodyEl.querySelector(".lr-blocks-section");n&&n.remove(),this.renderBlocksList()}renderBlocksList(){let n=document.createElement("div");n.className="lr-blocks-section";let e=this.blockExtractor.extract(document.body,!0),t=this.getTranslatedCount(),r=document.createElement("div");r.className="lr-blocks-title",r.textContent=`Blocks on this page (${t}/${e.length} translated)`,n.appendChild(r);for(let s of e){let o=document.createElement("div");o.className="lr-block-item",this.current&&s.element===this.current.element&&o.classList.add("active");let c=document.createElement("span");c.className="lr-status-dot",c.classList.add(this.getDotClass(s.key)),o.appendChild(c);let p=document.createElement("div");p.className="lr-block-text";let u=s.unit.text.replace(/<\/?[0-9]+\/?>/g,""),l=document.createElement("div");l.className="lr-block-source",l.textContent=u.length>60?u.slice(0,60)+"...":u,l.title=u,p.appendChild(l);let h=this.statusMap.get(s.key);if(h&&h.text){let m=document.createElement("div");m.className="lr-block-preview";let g=h.text.replace(/<\/?[0-9]+\/?>/g,"");m.textContent=g.length>50?g.slice(0,50)+"...":g,p.appendChild(m)}o.appendChild(p),o.addEventListener("click",()=>{s.element.scrollIntoView({behavior:"smooth",block:"center"}),this.onBlockClick({key:s.key,unit:s.unit,translatedUnit:null,element:s.element})}),n.appendChild(o)}this.bodyEl.appendChild(n)}};var z=class{constructor(n,e,t){a(this,"queue",[]);a(this,"apiBase");a(this,"sessionToken");a(this,"projectId");a(this,"flushInterval",null);a(this,"renewalInterval",null);a(this,"onStatus",()=>{});a(this,"onFlushed",()=>{});a(this,"onSessionExpired",null);a(this,"statusAbort",null);a(this,"handleVisibility",()=>{document.visibilityState==="hidden"&&this.flush()});this.apiBase=n.replace(/\/$/,""),this.sessionToken=e,this.projectId=t}setStatusCallback(n){this.onStatus=n}setFlushedCallback(n){this.onFlushed=n}setSessionExpiredCallback(n){this.onSessionExpired=n}startAutoFlush(){this.flushInterval=setInterval(()=>this.flush(),3e4),document.addEventListener("visibilitychange",this.handleVisibility),this.renewalInterval=setInterval(()=>this.maybeRenewSession(),6e4)}async stopAndFlush(){this.flushInterval&&(clearInterval(this.flushInterval),this.flushInterval=null),this.renewalInterval&&(clearInterval(this.renewalInterval),this.renewalInterval=null),document.removeEventListener("visibilitychange",this.handleVisibility),await this.flush()}queueSave(n){let e=this.queue.findIndex(t=>t.key===n.key&&t.locale===n.locale&&t.namespace===n.namespace);e>=0?this.queue[e]=n:this.queue.push(n),this.onStatus("unsaved",`${this.queue.length} unsaved`),this.queue.length>50&&this.flush()}async flush(){if(this.queue.length===0)return;let n=[...this.queue];this.onStatus("saving");try{let e=await fetch(`${this.apiBase}/api/integrations/targets/batch`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({translations:n.map(r=>({key:`${r.locale}:${r.namespace}:${r.key}`,value:{text:r.text,styles:r.styles}}))})});if(e.status===401){this.handleSessionExpired();return}if(!e.ok)throw new Error(`HTTP ${e.status}`);let t=n.map(r=>r.key);for(let r of n){let s=this.queue.indexOf(r);s>=0&&this.queue.splice(s,1)}this.onFlushed(t),this.queue.length===0?this.onStatus("saved","All changes saved"):this.onStatus("unsaved",`${this.queue.length} unsaved`)}catch(e){this.onStatus("error",`Save failed: ${e.message}`)}}async fetchStatus(n,e,t){if(n.length===0)return{};this.statusAbort&&this.statusAbort.abort(),this.statusAbort=new AbortController;let r=n.slice(0,200),s=new URLSearchParams({locale:e,namespace:t,keys:r.join(",")});try{let o=await fetch(`${this.apiBase}/api/integrations/targets/status?${s}`,{headers:{Authorization:`Bearer ${this.sessionToken}`},signal:this.statusAbort.signal});return o.status===401?(this.handleSessionExpired(),{}):o.ok?(await o.json()).translations:{}}catch(o){return o.name==="AbortError"?{}:{}}}get pendingCount(){return this.queue.length}async maybeRenewSession(){let n=this.getSessionExp();!n||n*1e3-Date.now()>12e4||await this.renewSession()}async renewSession(){try{let n=await fetch(`${this.apiBase}/api/editor/renew`,{method:"POST",headers:{Authorization:`Bearer ${this.sessionToken}`}});if(n.status===401){this.handleSessionExpired();return}if(!n.ok)return;let e=await n.json();this.sessionToken=e.session_token;try{let r=(this.sessionToken.startsWith("es_")?this.sessionToken.slice(3):this.sessionToken).split(".");if(r.length===3){let s=JSON.parse(atob(r[1]));sessionStorage.setItem("__lr_editor_session",JSON.stringify({token:this.sessionToken,exp:s.exp||0}))}}catch{}}catch{}}getSessionExp(){try{let e=(this.sessionToken.startsWith("es_")?this.sessionToken.slice(3):this.sessionToken).split(".");return e.length!==3?null:JSON.parse(atob(e[1])).exp||null}catch{return null}}handleSessionExpired(){this.onStatus("error","Session expired. Please reopen the editor from the dashboard."),this.onSessionExpired&&this.onSessionExpired()}};var B="__lr_editor_session";function ce(){try{let i=sessionStorage.getItem(B);if(!i)return null;let n=JSON.parse(i);return n.exp*1e3<Date.now()+3e4?(sessionStorage.removeItem(B),null):n.token}catch{return null}}function ue(i){try{let e=(i.startsWith("es_")?i.slice(3):i).split(".");if(e.length!==3)return;let t=JSON.parse(atob(e[1])),r={token:i,exp:t.exp||0};sessionStorage.setItem(B,JSON.stringify(r))}catch{}}function pe(){sessionStorage.removeItem(B)}function he(){let i=document.querySelector("script[data-grant]");if(!i){console.warn("[LionRapid Editor] No script tag with data-grant found");return}let n=i.dataset.grant||"",e=i.dataset.locale||"",t=i.dataset.api||"https://api.lionrapid.com",r=i.dataset.project||"",s=0,o=100,d=setInterval(()=>{s++;let c=window.LionRapid;c?(clearInterval(d),me(c,n,e,t,r)):s>=o&&(clearInterval(d),console.warn("[LionRapid Editor] Timed out waiting for window.LionRapid"))},100)}async function me(i,n,e,t,r){let s=window.__lionrapidConfig,o=s?.languages||[e],d=s?.namespace||"default",c=s?.defaultLocale||"en",p=e||i.getCurrentLocale(),u=t.replace(/\/$/,""),l=ce();if(!l&&n)try{let x=await fetch(`${u}/api/editor/exchange`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant:n,domain:window.location.host})});if(!x.ok){console.error("[LionRapid Editor] Grant exchange failed:",x.status);return}l=(await x.json()).session_token,l&&ue(l)}catch(x){console.error("[LionRapid Editor] Grant exchange error:",x);return}if(!l){console.error("[LionRapid Editor] No valid session. Please reopen the editor from the dashboard.");return}let h=document.createElement("div");h.id="__lionrapid-editor",h.setAttribute("data-no-translate",""),document.body.appendChild(h);let m=h.attachShadow({mode:"closed"}),g=document.createElement("style");g.textContent=q,m.appendChild(g);let k=document.querySelector("[data-lionrapid-switcher]");k&&(k.style.display="none");let $=new z(u,l,r);$.startAutoFlush();let j=x=>{E.open(x),_.clearHighlight()},E=new P(m,$,p,d,c,j),_=new R(m,j),U=new A(m,o,p,async x=>{E.updateLocale(x),E.close(),_.clearHighlight(),await i.changeLanguage(x),await E.hydrateStatus()},async()=>{await $.stopAndFlush(),_.destroy(),U.destroy(),E.destroy(),h.remove(),pe()});E.setProgressCallback((x,D)=>{U.updateProgress(x,D)}),E.hydrateStatus().then(()=>{U.updateProgress(E.getTranslatedCount(),E.getTotalCount())});let H=new URL(window.location.href);H.searchParams.has("__lr_editor")&&(H.searchParams.delete("__lr_editor"),history.replaceState(null,"",H.toString()))}he();})();
415
+ //# sourceMappingURL=lionrapid.editor.min.js.map