sveltekit-ui 1.1.17 → 1.1.18

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 (199) hide show
  1. package/dist/Components/Alert/index.svelte +88 -0
  2. package/dist/Components/Alert/index.svelte.js +101 -0
  3. package/dist/Components/ArrowToggle/index.svelte +62 -0
  4. package/dist/Components/Attachment/index.svelte +77 -0
  5. package/dist/Components/Attachment/index.svelte.js +119 -0
  6. package/dist/Components/Audio/index.svelte +193 -0
  7. package/dist/Components/Audio/index.svelte.js +463 -0
  8. package/dist/Components/AudioEditor/index.svelte +252 -0
  9. package/dist/Components/AudioEditor/index.svelte.js +977 -0
  10. package/dist/Components/AudioEditor/samples/alloy-voice-sample.mp3 +0 -0
  11. package/dist/Components/AudioEditor/samples/echo-voice-sample.mp3 +0 -0
  12. package/dist/Components/AudioEditor/samples/fable-voice-sample.mp3 +0 -0
  13. package/dist/Components/AudioEditor/samples/nova-voice-sample.mp3 +0 -0
  14. package/dist/Components/AudioEditor/samples/onyx-voice-sample.mp3 +0 -0
  15. package/dist/Components/AudioEditor/samples/shimmer-voice-sample.mp3 +0 -0
  16. package/dist/Components/AuthCodeInput/index.svelte +85 -0
  17. package/dist/Components/AuthCodeInput/index.svelte.js +95 -0
  18. package/dist/Components/Breadcrumbs/index.svelte +27 -0
  19. package/dist/Components/Breadcrumbs/index.svelte.js +88 -0
  20. package/dist/Components/Button/index.svelte +721 -0
  21. package/dist/Components/Button/index.svelte.js +375 -0
  22. package/dist/Components/Chart/Klines/index.svelte +87 -0
  23. package/dist/Components/Chart/index.svelte +226 -0
  24. package/dist/Components/Chart/index.svelte.js +1090 -0
  25. package/dist/Components/ChartInput/DisplayNav/Klines/index.svelte +150 -0
  26. package/dist/Components/ChartInput/DisplayNav/Lines/index.svelte +45 -0
  27. package/dist/Components/ChartInput/DisplayNav/index.svelte +297 -0
  28. package/dist/Components/ChartInput/EditPanel/index.svelte +155 -0
  29. package/dist/Components/ChartInput/index.svelte +21 -0
  30. package/dist/Components/ChartInput/index.svelte.js +671 -0
  31. package/dist/Components/Checkbox/index.svelte +411 -0
  32. package/dist/Components/Checkbox/index.svelte.js +178 -0
  33. package/dist/Components/Code/index.svelte +23 -0
  34. package/dist/Components/Code/index.svelte.js +33 -0
  35. package/dist/Components/Color/index.svelte +51 -0
  36. package/dist/Components/Color/index.svelte.js +31 -0
  37. package/dist/Components/ColorInput/ChromaPicker/index.svelte +50 -0
  38. package/dist/Components/ColorInput/ColorPalette/index.svelte +62 -0
  39. package/dist/Components/ColorInput/OpacityPicker/index.svelte +68 -0
  40. package/dist/Components/ColorInput/ShowcasePicker/index.svelte +136 -0
  41. package/dist/Components/ColorInput/index.svelte +70 -0
  42. package/dist/Components/ColorInput/index.svelte.js +386 -0
  43. package/dist/Components/ConditionsInput/index.svelte +46 -0
  44. package/dist/Components/ConditionsInput/index.svelte.js +201 -0
  45. package/dist/Components/Confetti/index.svelte +98 -0
  46. package/dist/Components/Confetti/index.svelte.js +94 -0
  47. package/dist/Components/Content/index.svelte +500 -0
  48. package/dist/Components/Content/index.svelte.js +910 -0
  49. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte +31 -0
  50. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte.js +258 -0
  51. package/dist/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte +31 -0
  52. package/dist/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte.js +258 -0
  53. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte +58 -0
  54. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte.js +206 -0
  55. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte +28 -0
  56. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte.js +224 -0
  57. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte +44 -0
  58. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte.js +272 -0
  59. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte +41 -0
  60. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte.js +202 -0
  61. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte +19 -0
  62. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte.js +117 -0
  63. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte +60 -0
  64. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte.js +542 -0
  65. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte +47 -0
  66. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte.js +185 -0
  67. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte +35 -0
  68. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte.js +222 -0
  69. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte +20 -0
  70. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte.js +84 -0
  71. package/dist/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte +25 -0
  72. package/dist/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte.js +91 -0
  73. package/dist/Components/ContentInput/AttributesInput/index.svelte +352 -0
  74. package/dist/Components/ContentInput/AttributesInput/index.svelte.js +1436 -0
  75. package/dist/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte +64 -0
  76. package/dist/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte.js +97 -0
  77. package/dist/Components/ContentInput/ContentPanelBuilder/ElementList/index.svelte +184 -0
  78. package/dist/Components/ContentInput/ContentPanelBuilder/index.svelte +41 -0
  79. package/dist/Components/ContentInput/index.svelte +78 -0
  80. package/dist/Components/ContentInput/index.svelte.js +1197 -0
  81. package/dist/Components/CronInput/index.svelte +78 -0
  82. package/dist/Components/CronInput/index.svelte.js +198 -0
  83. package/dist/Components/DataTypeInput/index.svelte +174 -0
  84. package/dist/Components/DataTypeInput/index.svelte.js +565 -0
  85. package/dist/Components/Dropdown/index.svelte +116 -0
  86. package/dist/Components/Dropdown/index.svelte.js +403 -0
  87. package/dist/Components/EmailAddress/index.svelte +22 -0
  88. package/dist/Components/EmailAddress/index.svelte.js +45 -0
  89. package/dist/Components/ErrorX/index.svelte +58 -0
  90. package/dist/Components/Eye/index.svelte +57 -0
  91. package/dist/Components/FileInput/index.svelte +146 -0
  92. package/dist/Components/FileInput/index.svelte.js +225 -0
  93. package/dist/Components/Hamburger/index.svelte +99 -0
  94. package/dist/Components/HorizScrollBox/index.svelte +145 -0
  95. package/dist/Components/Icon/index.svelte +412 -0
  96. package/dist/Components/Icon/index.svelte.js +116 -0
  97. package/dist/Components/IconInput/index.svelte +77 -0
  98. package/dist/Components/IconInput/index.svelte.js +259 -0
  99. package/dist/Components/Image/index.svelte +126 -0
  100. package/dist/Components/Image/index.svelte.js +116 -0
  101. package/dist/Components/ImageEditor/Image/CropBox/index.svelte +165 -0
  102. package/dist/Components/ImageEditor/Image/index.svelte +104 -0
  103. package/dist/Components/ImageEditor/Panels/AI/index.svelte +44 -0
  104. package/dist/Components/ImageEditor/Panels/Crop/index.svelte +96 -0
  105. package/dist/Components/ImageEditor/Panels/File/QualityPicker/index.svelte +124 -0
  106. package/dist/Components/ImageEditor/Panels/File/index.svelte +74 -0
  107. package/dist/Components/ImageEditor/Panels/Filters/index.svelte +46 -0
  108. package/dist/Components/ImageEditor/Panels/Resize/index.svelte +58 -0
  109. package/dist/Components/ImageEditor/index.svelte +93 -0
  110. package/dist/Components/ImageEditor/index.svelte.js +1961 -0
  111. package/dist/Components/ImageSlider/index.svelte +124 -0
  112. package/dist/Components/ImageSlider/index.svelte.js +99 -0
  113. package/dist/Components/InfoBox/index.svelte +89 -0
  114. package/dist/Components/Json/Nested/index.svelte +157 -0
  115. package/dist/Components/Json/index.svelte +60 -0
  116. package/dist/Components/Json/index.svelte.js +594 -0
  117. package/dist/Components/LabeledItem/index.svelte +102 -0
  118. package/dist/Components/Layout/NavBar/FullNav/index.svelte +52 -0
  119. package/dist/Components/Layout/NavBar/NavGuts/index.svelte +87 -0
  120. package/dist/Components/Layout/NavBar/index.svelte +72 -0
  121. package/dist/Components/Layout/index.svelte +149 -0
  122. package/dist/Components/Layout/index.svelte.js +360 -0
  123. package/dist/Components/Link/index.svelte +47 -0
  124. package/dist/Components/Link/index.svelte.js +136 -0
  125. package/dist/Components/LoadingSuccessDiv/index.svelte +51 -0
  126. package/dist/Components/LoadingWheel/index.svelte +38 -0
  127. package/dist/Components/Location/index.svelte +79 -0
  128. package/dist/Components/Location/index.svelte.js +288 -0
  129. package/dist/Components/LocationInput/index.svelte +197 -0
  130. package/dist/Components/LocationInput/index.svelte.js +965 -0
  131. package/dist/Components/Number/index.svelte +47 -0
  132. package/dist/Components/Number/index.svelte.js +151 -0
  133. package/dist/Components/PhoneCountryCode/index.svelte +7 -0
  134. package/dist/Components/PhoneCountryCode/index.svelte.js +260 -0
  135. package/dist/Components/PhoneNumber/index.svelte +22 -0
  136. package/dist/Components/PhoneNumber/index.svelte.js +41 -0
  137. package/dist/Components/Popover/index.svelte +396 -0
  138. package/dist/Components/Popover/index.svelte.js +319 -0
  139. package/dist/Components/Qr/index.svelte +85 -0
  140. package/dist/Components/Qr/index.svelte.js +301 -0
  141. package/dist/Components/QrInput/index.svelte +47 -0
  142. package/dist/Components/QrInput/index.svelte.js +218 -0
  143. package/dist/Components/Slider/index.svelte +239 -0
  144. package/dist/Components/Slider/index.svelte.js +469 -0
  145. package/dist/Components/Spacer/index.svelte +41 -0
  146. package/dist/Components/StoragePicker/DisplayFile/index.svelte +15 -0
  147. package/dist/Components/StoragePicker/index.svelte +187 -0
  148. package/dist/Components/StoragePicker/index.svelte.js +592 -0
  149. package/dist/Components/SuccessCheck/index.svelte +56 -0
  150. package/dist/Components/TableAdvanced/ColumnInput/index.svelte +117 -0
  151. package/dist/Components/TableAdvanced/ColumnInput/index.svelte.js +456 -0
  152. package/dist/Components/TableAdvanced/FilterInput/index.svelte +54 -0
  153. package/dist/Components/TableAdvanced/FilterInput/index.svelte.js +247 -0
  154. package/dist/Components/TableAdvanced/Pagination/index.svelte +43 -0
  155. package/dist/Components/TableAdvanced/Pagination/index.svelte.js +97 -0
  156. package/dist/Components/TableAdvanced/SortByInput/index.svelte +72 -0
  157. package/dist/Components/TableAdvanced/SortByInput/index.svelte.js +176 -0
  158. package/dist/Components/TableAdvanced/index.svelte +275 -0
  159. package/dist/Components/TableAdvanced/index.svelte.js +1565 -0
  160. package/dist/Components/Tag/index.svelte +45 -0
  161. package/dist/Components/Tag/index.svelte.js +76 -0
  162. package/dist/Components/TextArrayInput/index.svelte +108 -0
  163. package/dist/Components/TextArrayInput/index.svelte.js +239 -0
  164. package/dist/Components/TextInput/PasswordTooltip/index.svelte +89 -0
  165. package/dist/Components/TextInput/index.svelte +223 -0
  166. package/dist/Components/TextInput/index.svelte.js +447 -0
  167. package/dist/Components/Time/index.svelte +7 -0
  168. package/dist/Components/Time/index.svelte.js +38 -0
  169. package/dist/Components/TimeInput/NumberToggler/index.svelte +34 -0
  170. package/dist/Components/TimeInput/NumberToggler/index.svelte.js +79 -0
  171. package/dist/Components/TimeInput/index.js +702 -0
  172. package/dist/Components/TimeInput/index.svelte +211 -0
  173. package/dist/Components/TimeInput/index.svelte.js +638 -0
  174. package/dist/Components/Tooltip/index.svelte +143 -0
  175. package/dist/Components/TransparentBackground/index.svelte +153 -0
  176. package/dist/Components/TypingDots/index.svelte +84 -0
  177. package/dist/Components/VariablePathInput/index.svelte +63 -0
  178. package/dist/Components/VariablePathInput/index.svelte.js +273 -0
  179. package/dist/Components/VideoTBD/index.svelte +100 -0
  180. package/dist/Components/XFollow/index.svelte +42 -0
  181. package/dist/Components/XPost/index.svelte +52 -0
  182. package/dist/Components/XPost/index.svelte.js +64 -0
  183. package/dist/Components/YoutubeChannelButton/index.svelte +82 -0
  184. package/dist/Components/YoutubeVideo/index.svelte +73 -0
  185. package/dist/Components/YoutubeVideo/index.svelte.js +54 -0
  186. package/dist/actions/draggable.js +49 -0
  187. package/dist/actions/index.js +24 -0
  188. package/dist/actions/no_spaces.js +33 -0
  189. package/dist/actions/numbers_only.js +26 -0
  190. package/dist/actions/scroll_y.js +28 -0
  191. package/dist/actions/stop_scroll_propagation_y.js +42 -0
  192. package/dist/actions/swipe_handler.js +295 -0
  193. package/dist/client/astc_formatting/index.js +1128 -0
  194. package/dist/client/docs/index.js +7622 -0
  195. package/dist/client/index.js +735 -0
  196. package/dist/client/types/index.js +2812 -0
  197. package/dist/index.js +180 -0
  198. package/dist/style.css +682 -0
  199. package/package.json +1 -1
@@ -0,0 +1,1197 @@
1
+ import {
2
+ create_unique_id,
3
+ copy_to_clipboard,
4
+ astc_to_markdown,
5
+ astc_to_embedding_text,
6
+ markdown_to_astc,
7
+ json_to_data_type,
8
+ node_types,
9
+ deep_copy,
10
+ set_closurable,
11
+ } from "../../client/index.js"
12
+ import { create_button_manager } from "../Button/index.svelte.js"
13
+ import { create_popover_manager } from "../Popover/index.svelte.js"
14
+ import { create_dropdown_manager } from "../Dropdown/index.svelte.js"
15
+ import { create_text_input_manager } from "../TextInput/index.svelte.js"
16
+ import { create_attributes_input_manager } from "./AttributesInput/index.svelte.js"
17
+ import { create_content_manager } from "../Content/index.svelte.js"
18
+ import { create_add_element_manager } from "./ContentPanelBuilder/AddElement/index.svelte.js"
19
+
20
+ export function create_content_input_manager(config) {
21
+ const id = create_unique_id(null, 20)
22
+
23
+ let versions = $state([])
24
+ let selected_version_index = $state(0)
25
+ let versions_len = $derived(Array.isArray(versions) ? versions.length : 0)
26
+ let storage = $state(null)
27
+ let storage_default_folder_path = $state(null)
28
+ let storage_path = $state(null)
29
+ let preempt_add_first_element_button_manager = $state(null)
30
+ let first_el_add_element_manager = $state(null)
31
+ let selected_version_prepped = $state(null)
32
+ let paste_astc_markdown_popover_manager = $state(null)
33
+ let paste_astc_markdown_location_to_add_element = $state(null)
34
+ let paste_astc_markdown_dropdown_manager = $state(null)
35
+ let paste_astc_markdown_text_input_manager = $state(null)
36
+ let paste_astc_markdown_finish_button_manager = $state(null)
37
+ let location_to_add_element = $state(null)
38
+ let content_manager = $state(null)
39
+ let attributes_input = $state(null)
40
+ let focused_selector_id = $state(null)
41
+ let definition_stack = $state([])
42
+ let dragging_selector_id = $state(null)
43
+ let dragged_over_element_child = $state(null)
44
+
45
+ let mapkit_js_token = $derived(set_closurable(config?.mapkit_js_token, null))
46
+
47
+ function pass_event_down(input) {
48
+ if (typeof content_manager?.pass_event_down == "function") {
49
+ content_manager?.pass_event_down(input)
50
+ }
51
+ }
52
+
53
+ function get_defined_at_selector_id(selector_id) {
54
+ function traverse(input) {
55
+ let defined = {}
56
+ if (input?.type_id == selector_id) {
57
+ return { defined, is_found_selector_id: true }
58
+ } else if (input?.type_id == "loop") {
59
+ if (input?.attributes?.iter_identifier) {
60
+ defined[input?.attributes?.iter_identifier] = { type: "text_literal" }
61
+ }
62
+ }
63
+ if (Array.isArray(input?.children)) {
64
+ for (let child of input?.children) {
65
+ let res = traverse(child)
66
+ defined = { ...defined, ...res?.defined }
67
+ if (res?.is_found_selector_id) {
68
+ break
69
+ }
70
+ }
71
+ }
72
+ return { defined }
73
+ }
74
+ return traverse(versions?.[selected_version_index])?.defined
75
+ }
76
+
77
+ function get_defined_options(selector_id) {
78
+ const defined_at_selector_id = get_defined_at_selector_id(selector_id)
79
+ const defined_data_type = json_to_data_type(
80
+ Object.assign({}, ...[...(Array.isArray(definition_stack) ? definition_stack : [])].reverse())
81
+ )
82
+ return Object.entries({ ...(defined_data_type?.properties || {}), ...defined_at_selector_id }).map(
83
+ ([key, val]) => ({
84
+ key,
85
+ name: key,
86
+ data_type: val,
87
+ })
88
+ )
89
+ }
90
+
91
+ function set_selected_version(version_index) {
92
+ selected_version_index = version_index
93
+ let selected_version = versions?.[selected_version_index]
94
+ selected_version_prepped = prep_element(selected_version)
95
+ content_manager = create_content_manager({
96
+ val: selected_version,
97
+ on_event: config?.on_event,
98
+ storage_path: storage_path,
99
+ mapkit_js_token: mapkit_js_token,
100
+ definition_stack: definition_stack,
101
+ get focused_selector_id() {
102
+ return focused_selector_id
103
+ },
104
+ set_focused_selector_id,
105
+ open_edit_element_attributes_popover,
106
+ })
107
+ }
108
+
109
+ function prep_element(element) {
110
+ let extra_popover_manager = $state(null)
111
+ let extra_popover_button_manager = $state(null)
112
+ let edit_attributes_popover_button_manager = $state(null)
113
+ let preempt_add_child_element_button_manager = $state(null)
114
+ let small_preempt_add_child_element_button_manager = $state(null)
115
+ let preempt_add_sibling_element_below_button_manager = $state(null)
116
+ let reset_ids_button_manager = $state(null)
117
+ let copy_markdown_button_manager = $state(null)
118
+ let copy_astc_button_manager = $state(null)
119
+ let shift_element_up_5_button_manager = $state(null)
120
+ let shift_element_up_button_manager = $state(null)
121
+ let shift_element_down_button_manager = $state(null)
122
+ let shift_element_down_5_button_manager = $state(null)
123
+ let delete_button_manager = $state(null)
124
+ let add_element_manager = $state(null)
125
+ edit_attributes_popover_button_manager = create_button_manager({
126
+ type: "soft",
127
+ is_uniform: true,
128
+ support_icon: "edit",
129
+ icon_size: 1.6,
130
+ icon_sw: 40,
131
+ min_height: 2,
132
+ border_radius: 0.5,
133
+ popover_target: () => `popover_${attributes_input?.popover_manager?.id}`,
134
+ on_click: () => open_edit_attributes_popover(),
135
+ })
136
+ function open_edit_attributes_popover() {
137
+ attributes_input.init({
138
+ storage: storage,
139
+ storage_default_folder_path: storage_default_folder_path,
140
+ storage_path: storage_path,
141
+ header: `Edit ${node_types?.[element?.type_id]?.name ? `${node_types?.[element?.type_id]?.name} ` : ""} (${
142
+ element?.selector_id
143
+ }) Attributes`,
144
+ content_type: element?.type_id,
145
+ selector_id: element?.selector_id,
146
+ val: element?.attributes,
147
+ get_defined_options: () => get_defined_options(element?.selector_id),
148
+ on_finish: (input) => {
149
+ attributes_input.popover_manager.close()
150
+ set_element_attributes(element?.selector_id, input)
151
+ },
152
+ })
153
+ setTimeout(() => {
154
+ attributes_input.popover_manager.open()
155
+ }, 200)
156
+ }
157
+ extra_popover_manager = create_popover_manager({
158
+ type: "dropdown",
159
+ min_width: 100,
160
+ target_width: 220,
161
+ min_height: 100,
162
+ target_height: 240,
163
+ anchor_id: () => `button_${extra_popover_button_manager?.id}`,
164
+ })
165
+ extra_popover_button_manager = create_button_manager({
166
+ type: "soft",
167
+ is_uniform: true,
168
+ support_icon: "three_dots",
169
+ icon_sw: 80,
170
+ icon_size: 1.6,
171
+ min_height: 2,
172
+ border_radius: 0.5,
173
+ popover_target: `popover_${extra_popover_manager?.id}`,
174
+ })
175
+ small_preempt_add_child_element_button_manager = create_button_manager({
176
+ type: "soft",
177
+ support_icon: "plus",
178
+ is_uniform: true,
179
+ icon_size: 1.6,
180
+ icon_sw: 40,
181
+ min_height: 2,
182
+ border_radius: 0.5,
183
+ on_click: () => initiate_add_child_el_to_selector(element?.selector_id),
184
+ })
185
+ reset_ids_button_manager = create_button_manager({
186
+ type: "soft",
187
+ support_icon: "refresh",
188
+ text_align: "left",
189
+ text: "Reset IDs",
190
+ is_success_animation: true,
191
+ on_click: () => {
192
+ extra_popover_manager.close()
193
+ setTimeout(() => {
194
+ reset_ids(element?.selector_id)
195
+ }, 200)
196
+ },
197
+ })
198
+ copy_markdown_button_manager = create_button_manager({
199
+ type: "soft",
200
+ support_icon: "clipboard",
201
+ text_align: "left",
202
+ text: "Copy Markdown",
203
+ is_success_animation: true,
204
+ on_click: () => copy_element_markdown(element?.selector_id),
205
+ })
206
+ copy_astc_button_manager = create_button_manager({
207
+ type: "soft",
208
+ support_icon: "clipboard",
209
+ text: "Copy astc",
210
+ text_align: "left",
211
+ is_success_animation: true,
212
+ on_click: () => copy_element_astc(element?.selector_id),
213
+ })
214
+ preempt_add_child_element_button_manager = create_button_manager({
215
+ type: "soft",
216
+ support_icon: "plus",
217
+ text_align: "left",
218
+ text: "Add Child Element",
219
+ on_click: () => initiate_add_child_el_to_selector(element?.selector_id),
220
+ })
221
+ preempt_add_sibling_element_below_button_manager = create_button_manager({
222
+ type: "soft",
223
+ support_icon: "plus",
224
+ text_align: "left",
225
+ text: "Add Element Below",
226
+ on_click: () => initiate_add_sibling_el_to_selector(element?.selector_id),
227
+ })
228
+ shift_element_up_5_button_manager = create_button_manager({
229
+ type: "soft",
230
+ support_icon: "arrow_tailed",
231
+ icon_deg: 270,
232
+ text_align: "left",
233
+ text: "Shift Element Up 5",
234
+ on_click: () => {
235
+ extra_popover_manager.close()
236
+ setTimeout(() => {
237
+ shift_el(element?.selector_id, -5)
238
+ }, 500)
239
+ },
240
+ })
241
+ shift_element_up_button_manager = create_button_manager({
242
+ type: "soft",
243
+ support_icon: "arrow_tailed",
244
+ icon_deg: 270,
245
+ text_align: "left",
246
+ text: "Shift Element Up",
247
+ on_click: () => {
248
+ extra_popover_manager.close()
249
+ setTimeout(() => {
250
+ shift_el(element?.selector_id, -1)
251
+ }, 500)
252
+ },
253
+ })
254
+ shift_element_down_button_manager = create_button_manager({
255
+ type: "soft",
256
+ support_icon: "arrow_tailed",
257
+ icon_deg: 90,
258
+ text_align: "left",
259
+ text: "Shift Element Down",
260
+ on_click: () => {
261
+ extra_popover_manager.close()
262
+ setTimeout(() => {
263
+ shift_el(element?.selector_id, 1)
264
+ }, 500)
265
+ },
266
+ })
267
+ shift_element_down_5_button_manager = create_button_manager({
268
+ type: "soft",
269
+ support_icon: "arrow_tailed",
270
+ icon_deg: 90,
271
+ text_align: "left",
272
+ text: "Shift Element Down 5",
273
+ on_click: () => {
274
+ extra_popover_manager.close()
275
+ setTimeout(() => {
276
+ shift_el(element?.selector_id, 5)
277
+ }, 500)
278
+ },
279
+ })
280
+ delete_button_manager = create_button_manager({
281
+ type: "outlined",
282
+ support_icon: "trashcan",
283
+ color: "var(--error-t)",
284
+ icon_sw: 20,
285
+ text_align: "left",
286
+ text: "Delete",
287
+ on_click: () => {
288
+ extra_popover_manager.close()
289
+ setTimeout(() => {
290
+ delete_el(element?.selector_id)
291
+ }, 500)
292
+ },
293
+ })
294
+ const avail_child_element_ids = calc_child_element_options(element)
295
+ const parent_el = get_parent_el(element?.selector_id)
296
+ const avail_sibling_element_ids = calc_child_element_options(parent_el)
297
+ const total_siblings = Array.isArray(parent_el?.children) ? parent_el?.children.length : 0
298
+ const element_index_of_siblings = Array.isArray(parent_el?.children)
299
+ ? parent_el.children.findIndex((h) => h?.selector_id == element?.selector_id)
300
+ : null
301
+ add_element_manager = create_add_element_manager({
302
+ header: () => (location_to_add_element == "sibling" ? "Add Element below" : "Add Child Element"),
303
+ avail_element_ids: () =>
304
+ location_to_add_element == "sibling" ? avail_sibling_element_ids : avail_child_element_ids,
305
+ on_item_click: (input) => {
306
+ if (input == "paste") {
307
+ paste_astc_markdown_location_to_add_element = {
308
+ selector_id: element?.selector_id,
309
+ location_to_add_element: location_to_add_element == "sibling" ? "sibling" : "child",
310
+ }
311
+ paste_astc_markdown_popover_manager.open()
312
+ return
313
+ }
314
+ setTimeout(() => {
315
+ if (location_to_add_element == "sibling") {
316
+ add_sibling_el(element?.selector_id, input)
317
+ } else {
318
+ add_child_el(element?.selector_id, input)
319
+ }
320
+ }, 500)
321
+ },
322
+ })
323
+ let children = $state([])
324
+ if (Array.isArray(element?.children)) {
325
+ for (let child of element?.children) {
326
+ children.push(prep_element(child))
327
+ }
328
+ }
329
+ return {
330
+ get element() {
331
+ return element
332
+ },
333
+ get children() {
334
+ return children
335
+ },
336
+ get edit_attributes_popover_button_manager() {
337
+ return edit_attributes_popover_button_manager
338
+ },
339
+ get extra_popover_manager() {
340
+ return extra_popover_manager
341
+ },
342
+ get extra_popover_button_manager() {
343
+ return extra_popover_button_manager
344
+ },
345
+ get add_element_manager() {
346
+ return add_element_manager
347
+ },
348
+ get preempt_add_child_element_button_manager() {
349
+ return preempt_add_child_element_button_manager
350
+ },
351
+ get small_preempt_add_child_element_button_manager() {
352
+ return small_preempt_add_child_element_button_manager
353
+ },
354
+ get preempt_add_sibling_element_below_button_manager() {
355
+ return preempt_add_sibling_element_below_button_manager
356
+ },
357
+ get reset_ids_button_manager() {
358
+ return reset_ids_button_manager
359
+ },
360
+ get copy_markdown_button_manager() {
361
+ return copy_markdown_button_manager
362
+ },
363
+ get copy_astc_button_manager() {
364
+ return copy_astc_button_manager
365
+ },
366
+ get shift_element_up_5_button_manager() {
367
+ return shift_element_up_5_button_manager
368
+ },
369
+ get shift_element_up_button_manager() {
370
+ return shift_element_up_button_manager
371
+ },
372
+ get shift_element_down_button_manager() {
373
+ return shift_element_down_button_manager
374
+ },
375
+ get shift_element_down_5_button_manager() {
376
+ return shift_element_down_5_button_manager
377
+ },
378
+ get delete_button_manager() {
379
+ return delete_button_manager
380
+ },
381
+ get avail_child_element_ids() {
382
+ return avail_child_element_ids
383
+ },
384
+ get avail_sibling_element_ids() {
385
+ return avail_sibling_element_ids
386
+ },
387
+ get parent_el() {
388
+ return parent_el
389
+ },
390
+ get total_siblings() {
391
+ return total_siblings
392
+ },
393
+ get element_index_of_siblings() {
394
+ return element_index_of_siblings
395
+ },
396
+ open_edit_attributes_popover,
397
+ }
398
+ }
399
+
400
+ function get_parent_el(selector_id, element = null) {
401
+ function get_parent_el_recursive(selector_id, element) {
402
+ if (selector_id && element && Array.isArray(element?.children)) {
403
+ for (let child of element.children) {
404
+ if (child?.selector_id == selector_id) {
405
+ return element
406
+ }
407
+ }
408
+ for (let child of element.children) {
409
+ const res = get_parent_el_recursive(selector_id, child)
410
+ if (res) {
411
+ return res
412
+ }
413
+ }
414
+ }
415
+ return null
416
+ }
417
+ return get_parent_el_recursive(selector_id, element ?? versions?.[selected_version_index])
418
+ }
419
+
420
+ function add_version(version) {
421
+ versions = [deep_copy(version), ...versions.slice(selected_version_index)]
422
+ selected_version_index = 0
423
+ set_selected_version(0)
424
+ if (config?.on_change) {
425
+ config?.on_change(deep_copy(version))
426
+ }
427
+ }
428
+
429
+ function handle_element_child_drag_over(e, selector_id, is_children = false) {
430
+ e.preventDefault()
431
+ e.stopPropagation()
432
+ dragged_over_element_child = { selector_id, is_children }
433
+ }
434
+
435
+ function handle_element_child_drag_drop(e, selector_id, is_children = false) {
436
+ e.stopPropagation()
437
+ if (selector_id == dragging_selector_id) {
438
+ dragging_selector_id = null
439
+ return
440
+ }
441
+ const found_element = traverse_els_for_match(dragging_selector_id)
442
+ const removed_version = remove_el_recursive(selected_version_prepped?.element, dragging_selector_id)
443
+ let readded_version = null
444
+ if (is_children) {
445
+ readded_version = add_child_to_el_recursive(removed_version, selector_id, found_element)
446
+ } else {
447
+ let dom_el_parent = get_parent_el(selector_id, removed_version)
448
+ const element_index_of_siblings = Array.isArray(dom_el_parent?.children)
449
+ ? dom_el_parent.children.findIndex((h) => h.selector_id == selector_id)
450
+ : null
451
+ if (dom_el_parent && found_element) {
452
+ if (Array.isArray(dom_el_parent?.children)) {
453
+ dom_el_parent.children.splice(element_index_of_siblings, 0, found_element)
454
+ } else {
455
+ dom_el_parent.children = [found_element]
456
+ }
457
+ readded_version = replace_el_recursive(removed_version, dom_el_parent?.selector_id, dom_el_parent)
458
+ }
459
+ }
460
+ add_version(readded_version)
461
+ dragging_selector_id = null
462
+ }
463
+ function handle_element_child_drag_start(e, selector_id) {
464
+ e.stopPropagation()
465
+ dragging_selector_id = selector_id
466
+ }
467
+ function handle_element_child_drag_end(e, selector_id) {
468
+ dragged_over_element_child = null
469
+ dragging_selector_id = null
470
+ }
471
+
472
+ function reset_ids(selector_id) {
473
+ const found_element = traverse_els_for_match(selector_id)
474
+ const clean_element = reset_ids_recursive(found_element)
475
+ const new_version = find_and_replace_element(selector_id, selected_version_prepped?.element, clean_element)
476
+ add_version(new_version)
477
+ }
478
+
479
+ function reset_ids_recursive(element, selector_id) {
480
+ if (!element?.selector_id || element?.selector_id == selector_id) {
481
+ return null
482
+ }
483
+ element.selector_id = create_unique_id(null, 8)
484
+ let new_children = []
485
+ if (Array.isArray(element?.children)) {
486
+ for (let child of element?.children) {
487
+ const child_new_el = reset_ids_recursive(child, selector_id)
488
+ if (child_new_el) {
489
+ new_children.push(child_new_el)
490
+ }
491
+ }
492
+ }
493
+ element.children = new_children
494
+ return element
495
+ }
496
+
497
+ function find_and_replace_element(selector_id, root_el, replacement_el) {
498
+ function replace_recursive(node) {
499
+ if (!node) return null
500
+ if (node.selector_id === selector_id) {
501
+ return deep_copy(replacement_el)
502
+ }
503
+ const new_children = Array.isArray(node.children) ? node.children.map(replace_recursive).filter(Boolean) : []
504
+ return {
505
+ type_id: node.type_id,
506
+ selector_id: node.selector_id,
507
+ attributes: node.attributes ? { ...node.attributes } : node.attributes,
508
+ children: new_children,
509
+ }
510
+ }
511
+ return replace_recursive(root_el)
512
+ }
513
+
514
+ function copy_markdown() {
515
+ copy_to_clipboard(astc_to_markdown(selected_version_prepped?.element))
516
+ }
517
+
518
+ function copy_astc() {
519
+ copy_to_clipboard(JSON.stringify(selected_version_prepped?.element))
520
+ }
521
+
522
+ function copy_text() {
523
+ copy_to_clipboard(astc_to_embedding_text(selected_version_prepped?.element))
524
+ }
525
+
526
+ function finish() {
527
+ if (typeof config?.on_finish == "function") {
528
+ config?.on_finish(selected_version_prepped?.element)
529
+ }
530
+ }
531
+
532
+ function open_edit_markdown_modal() {
533
+ paste_astc_markdown_text_input_manager.set_val(astc_to_markdown(selected_version_prepped?.element))
534
+ paste_astc_markdown_popover_manager.open()
535
+ }
536
+
537
+ function set_astc_from_markdown() {
538
+ add_version(markdown_to_astc(paste_astc_markdown_text_input_manager?.val))
539
+ paste_astc_markdown_popover_manager.close()
540
+ }
541
+
542
+ let astc_element_string = $state(null)
543
+ function add_astc_to_element_children(element) {
544
+ if (Array.isArray(element?.children) && astc_element_string) {
545
+ element.children.push(JSON.parse(astc_element_string))
546
+ } else if (astc_element_string) {
547
+ element.children = [JSON.parse(astc_element_string)]
548
+ }
549
+ astc_element_string = null
550
+ paste_astc_markdown_popover_manager.close()
551
+ }
552
+
553
+ function scroll_to_selector_id(selector_id) {
554
+ const container = document.getElementById(`panel_scroll_${id}`)
555
+ if (!container || !selector_id) return
556
+ const el = container.querySelector(`#selector_id_${selector_id}`)
557
+ if (!el) return
558
+ const el_rect = el.getBoundingClientRect()
559
+ const c_rect = container.getBoundingClientRect()
560
+ const is_visible = el_rect.top >= c_rect.top && el_rect.bottom <= c_rect.bottom
561
+ if (!is_visible) {
562
+ el.scrollIntoView({
563
+ behavior: "smooth",
564
+ block: "center",
565
+ inline: "nearest",
566
+ })
567
+ }
568
+ }
569
+
570
+ function pulse_focus(selector_id) {
571
+ const container = document.getElementById(`panel_scroll_${id}`)
572
+ const el = container?.querySelector(`#selector_id_${selector_id}`)
573
+ if (!el) return
574
+ el.classList.add("focus_pulse")
575
+ setTimeout(() => el.classList.remove("focus_pulse"), 1000)
576
+ }
577
+
578
+ function set_focused_selector_id(selector_id, is_scroll_to = false) {
579
+ focused_selector_id = selector_id
580
+ if (selector_id && is_scroll_to) {
581
+ scroll_to_selector_id(selector_id)
582
+ pulse_focus(selector_id)
583
+ }
584
+ }
585
+
586
+ function add_sibling_el(selector_id, el_type_id, element_to_add = null) {
587
+ let dom_el_parent = get_parent_el(selector_id)
588
+ const element_index_of_siblings = Array.isArray(dom_el_parent?.children)
589
+ ? dom_el_parent.children.findIndex((h) => h.selector_id == selector_id)
590
+ : null
591
+ if (!element_to_add) {
592
+ element_to_add = get_new_element_to_add(el_type_id)
593
+ }
594
+ if (dom_el_parent && element_to_add) {
595
+ if (Array.isArray(dom_el_parent.children)) {
596
+ dom_el_parent.children.splice(element_index_of_siblings + 1, 0, element_to_add)
597
+ } else {
598
+ dom_el_parent.children = [element_to_add]
599
+ }
600
+ replace_el(dom_el_parent?.selector_id, dom_el_parent)
601
+ }
602
+ location_to_add_element = "child"
603
+ }
604
+
605
+ function initiate_add_sibling_el_to_selector(selector_id) {
606
+ const dom_el_parent = get_parent_el(selector_id)
607
+ const avail_element_ids = calc_child_element_options(dom_el_parent)
608
+ if (avail_element_ids.length > 1) {
609
+ location_to_add_element = "sibling"
610
+ find_and_open_add_element_popover_selector_id(selected_version_prepped, selector_id ?? "root")
611
+ } else if (avail_element_ids.length == 1) {
612
+ add_sibling_el(selector_id, avail_element_ids?.[0])
613
+ }
614
+ }
615
+
616
+ function initiate_add_child_el_to_selector(selector_id) {
617
+ const found_element = traverse_els_for_match(selector_id)
618
+ const avail_child_element_ids = calc_child_element_options(found_element)
619
+ location_to_add_element = "child"
620
+ if (avail_child_element_ids.length > 1) {
621
+ find_and_open_add_element_popover_selector_id(selected_version_prepped, selector_id ?? "root")
622
+ } else if (avail_child_element_ids.length == 1) {
623
+ add_child_el(selector_id, avail_child_element_ids[0])
624
+ }
625
+ }
626
+
627
+ function find_and_open_add_element_popover_selector_id(element_prepped, selector_id) {
628
+ if (element_prepped?.element?.selector_id == selector_id) {
629
+ if (typeof element_prepped?.add_element_manager?.popover_manager?.open == "function") {
630
+ element_prepped.add_element_manager.popover_manager.open()
631
+ return
632
+ }
633
+ } else if (Array.isArray(element_prepped?.children)) {
634
+ for (let child of element_prepped?.children) {
635
+ find_and_open_add_element_popover_selector_id(child, selector_id)
636
+ }
637
+ }
638
+ return
639
+ }
640
+
641
+ function add_child_el(selector_id, type_id) {
642
+ const found_element = traverse_els_for_match(selector_id)
643
+ const element_to_add = get_new_element_to_add(type_id)
644
+ if (!found_element) {
645
+ replace_el(selector_id, element_to_add)
646
+ } else {
647
+ add_el_to_el_children(selector_id, element_to_add)
648
+ }
649
+ location_to_add_element = "child"
650
+ }
651
+
652
+ function add_el_to_el_children(selector_id, new_element) {
653
+ add_version(add_child_to_el_recursive(selected_version_prepped?.element, selector_id, new_element))
654
+ }
655
+
656
+ function add_child_to_el_recursive(element, selector_id, new_element) {
657
+ if (element?.selector_id == selector_id) {
658
+ const existing_children = Array.isArray(element?.children) ? element?.children : []
659
+ element.children = [...existing_children, new_element]
660
+ return element
661
+ }
662
+ let new_children = []
663
+ if (Array.isArray(element?.children)) {
664
+ for (let child of element?.children) {
665
+ new_children = [...new_children, add_child_to_el_recursive(child, selector_id, new_element)]
666
+ }
667
+ }
668
+ element.children = new_children
669
+ return element
670
+ }
671
+
672
+ function replace_el(selector_id, new_element) {
673
+ add_version(replace_el_recursive(selected_version_prepped?.element, selector_id, new_element))
674
+ }
675
+
676
+ function replace_el_recursive(element, selector_id, new_element) {
677
+ if (!element?.selector_id || element?.selector_id == selector_id) {
678
+ return new_element
679
+ }
680
+ let new_children = []
681
+ if (Array.isArray(element?.children)) {
682
+ for (let child of element?.children) {
683
+ new_children = [...new_children, replace_el_recursive(child, selector_id, new_element)]
684
+ }
685
+ }
686
+ element.children = new_children
687
+ return element
688
+ }
689
+
690
+ function delete_el(selector_id) {
691
+ add_version(remove_el_recursive(selected_version_prepped?.element, selector_id))
692
+ }
693
+
694
+ function remove_el_recursive(element, selector_id) {
695
+ if (!element?.selector_id || element?.selector_id == selector_id) {
696
+ return null
697
+ }
698
+ let new_children = []
699
+ if (Array.isArray(element?.children)) {
700
+ for (let child of element?.children) {
701
+ const child_without_removed_el = remove_el_recursive(child, selector_id)
702
+ if (child_without_removed_el) {
703
+ new_children = [...new_children, child_without_removed_el]
704
+ }
705
+ }
706
+ }
707
+ element.children = new_children
708
+ return element
709
+ }
710
+
711
+ function traverse_els_for_match(selector_id) {
712
+ return traverse_els_for_match_recursive(selected_version_prepped?.element, selector_id)
713
+ }
714
+
715
+ function traverse_els_for_match_recursive(element, selector_id) {
716
+ if (element?.selector_id == selector_id) {
717
+ return element
718
+ }
719
+ if (Array.isArray(element?.children)) {
720
+ for (let child of element?.children) {
721
+ const matched_element_from_children = traverse_els_for_match_recursive(child, selector_id)
722
+ if (matched_element_from_children) {
723
+ return matched_element_from_children
724
+ }
725
+ }
726
+ }
727
+ return null
728
+ }
729
+
730
+ function shift_el(selector_id, i_shift) {
731
+ let dom_el_parent = get_parent_el(selector_id)
732
+ if (!dom_el_parent) {
733
+ return
734
+ }
735
+ const selector_index = dom_el_parent.children.findIndex((h) => h.selector_id == selector_id)
736
+ function move_element(array, from, to) {
737
+ const copy = [...array]
738
+ const element_to_move = copy.splice(from, 1)[0]
739
+ copy.splice(to, 0, element_to_move)
740
+ return copy
741
+ }
742
+ dom_el_parent.children = move_element(deep_copy(dom_el_parent.children), selector_index, selector_index + i_shift)
743
+ replace_el(selected_version_prepped?.element, dom_el_parent?.selector_id, dom_el_parent)
744
+ }
745
+
746
+ function set_el_from_astc_el_string(selector_id, astc_string) {
747
+ add_version(replace_el(selected_version_prepped?.element, selector_id, JSON.parse(astc_string)))
748
+ }
749
+
750
+ function copy_element_astc(selector_id) {
751
+ copy_to_clipboard(JSON.stringify(traverse_els_for_match(selector_id)))
752
+ }
753
+
754
+ function copy_element_markdown(selector_id) {
755
+ copy_to_clipboard(astc_to_markdown(traverse_els_for_match(selector_id)))
756
+ }
757
+
758
+ function open_edit_element_attributes_popover(selector_id) {
759
+ const found_element = traverse_els_for_match(selector_id)
760
+ if (!node_types?.hasOwnProperty(found_element?.type_id) || !node_types?.[found_element?.type_id]?.attributes) {
761
+ return
762
+ }
763
+ find_and_open_edit_element_attributes(selected_version_prepped, selector_id)
764
+ }
765
+
766
+ function find_and_open_edit_element_attributes(element_prepped, selector_id) {
767
+ if (element_prepped?.element?.selector_id == selector_id) {
768
+ if (typeof element_prepped?.open_edit_attributes_popover == "function") {
769
+ element_prepped?.open_edit_attributes_popover()
770
+ return
771
+ }
772
+ } else if (Array.isArray(element_prepped?.children)) {
773
+ for (let child of element_prepped?.children) {
774
+ find_and_open_edit_element_attributes(child, selector_id)
775
+ }
776
+ }
777
+ return
778
+ }
779
+
780
+ function get_new_element_to_add(type_id) {
781
+ let new_dom_el = {
782
+ type_id: type_id,
783
+ selector_id: create_unique_id(null, 8),
784
+ children: [],
785
+ attributes: {},
786
+ }
787
+ function add_base_attributes_to_element(element, node_types) {
788
+ if (!node_types || !element) {
789
+ return element
790
+ } else if (!node_types?.[element.type_id] || !node_types[element.type_id]?.attributes) {
791
+ element.attributes = null
792
+ return element
793
+ }
794
+ let attribute_obj = {}
795
+ for (let key of Object.keys(node_types[element.type_id].attributes)) {
796
+ attribute_obj[key] = null
797
+ }
798
+ element.attributes = attribute_obj
799
+ return element
800
+ }
801
+ function add_base_children_to_element(element) {
802
+ if (!element || !element.type_id) {
803
+ return element
804
+ }
805
+ let children = Array.isArray(element?.children) ? element.children : []
806
+ if (node_types[element.type_id] && node_types[element.type_id]?.child_elements) {
807
+ for (let childElementId of Object.keys(node_types[element.type_id].child_elements)) {
808
+ if (
809
+ node_types[element.type_id].child_elements[childElementId].child_min_limit > 0 &&
810
+ children.length < node_types[element.type_id].child_elements[childElementId].child_min_limit
811
+ ) {
812
+ children.push(get_new_element_to_add(childElementId))
813
+ }
814
+ }
815
+ }
816
+ element.children = children
817
+ return element
818
+ }
819
+ new_dom_el = add_base_attributes_to_element(new_dom_el)
820
+ new_dom_el = add_base_children_to_element(new_dom_el)
821
+ return new_dom_el
822
+ }
823
+
824
+ function calc_child_element_options(element, is_sibling = false) {
825
+ if (!node_types) {
826
+ return []
827
+ }
828
+ let parent_el = element
829
+ if (is_sibling) {
830
+ parent_el = get_parent_el(element?.selector_id)
831
+ }
832
+ if (!parent_el?.type_id) {
833
+ return Object.keys(node_types)
834
+ }
835
+ let allowed_to_add_child_element_ids = []
836
+ for (let [key, val] of Object.entries(node_types?.[parent_el?.type_id]?.child_elements || {})) {
837
+ let cur_el_children_of_type = Array.isArray(parent_el?.children)
838
+ ? parent_el.children.filter((h) => h?.type_id === key)
839
+ : []
840
+ if (!val?.child_max_limit || cur_el_children_of_type.length < val?.child_max_limit) {
841
+ allowed_to_add_child_element_ids.push(key)
842
+ }
843
+ }
844
+ allowed_to_add_child_element_ids.sort((a, b) => {
845
+ const display_order_a = node_types[a]?.display_order
846
+ const display_order_b = node_types[b]?.display_order
847
+ if (display_order_a === null) return 1
848
+ if (display_order_b === null) return -1
849
+ return display_order_a - display_order_b
850
+ })
851
+ return allowed_to_add_child_element_ids
852
+ }
853
+
854
+ const all_selector_ids = $derived(collect_all_selector_ids(selected_version_prepped?.element))
855
+
856
+ function collect_all_selector_ids(element) {
857
+ let acc = []
858
+ if (element?.selector_id) {
859
+ acc = [element.selector_id]
860
+ }
861
+ if (Array.isArray(element?.children)) {
862
+ for (let element_child of element.children) {
863
+ const acc_child = collect_all_selector_ids(element_child)
864
+ acc = [...acc, ...acc_child]
865
+ }
866
+ }
867
+ return acc
868
+ }
869
+
870
+ function set_element_attributes(selector_id, new_attributes) {
871
+ add_version(change_el_attrs(selected_version_prepped?.element, selector_id, new_attributes))
872
+ }
873
+
874
+ function change_el_attrs(content_el, selector_id, attributes) {
875
+ let children = []
876
+ if (Array.isArray(content_el?.children) && content_el?.children.length > 0) {
877
+ for (let child of content_el.children) {
878
+ children = [...children, change_el_attrs(child, selector_id, attributes)]
879
+ }
880
+ }
881
+ content_el.children = children
882
+ if (content_el?.selector_id == selector_id) {
883
+ content_el.attributes = attributes
884
+ }
885
+ return content_el
886
+ }
887
+
888
+ function set_element_attribute(selector_id, attribute, val) {
889
+ add_version(change_el_attr(selected_version_prepped?.element, selector_id, attribute, val))
890
+ }
891
+
892
+ function change_el_attr(content_el, selector_id, attribute, val) {
893
+ let children = []
894
+ if (Array.isArray(content_el?.children) && content_el?.children.length > 0) {
895
+ for (let child of content_el.children) {
896
+ children = [...children, change_el_attr(child, selector_id, attribute, val)]
897
+ }
898
+ }
899
+ content_el.children = children
900
+ if (content_el?.selector_id == selector_id) {
901
+ content_el.attributes[attribute] = val
902
+ }
903
+ return content_el
904
+ }
905
+
906
+ function clean_content(val) {
907
+ let word_count = 0
908
+ let character_count = 0
909
+ let embedding_text_items = []
910
+ let cleaned_attributes = {}
911
+ let cleaned_children = []
912
+ let total_elements = 1
913
+ let total_nests = 1
914
+ let warnings = []
915
+ if (!val?.type_id || !node_types.hasOwnProperty(val?.type_id)) {
916
+ warnings.push({ type: "error", message: `type_id of ${val?.type_id} is not allowed` })
917
+ return {
918
+ warnings,
919
+ word_count,
920
+ character_count,
921
+ embedding_text: "",
922
+ total_elements,
923
+ total_nests,
924
+ val: null,
925
+ }
926
+ }
927
+ for (let [attribute_key, attribute_value] of Object.entries(node_types[val?.type_id]?.attributes)) {
928
+ if (val?.attributes && typeof val.attributes == "object" && !Array.isArray(val?.attributes)) {
929
+ // attribute_value?.type example color_literal and i should call a clean function for that
930
+ const from_variable_path_key = `${attribute_key}_from_variable_path`
931
+ if (val?.attributes.hasOwnProperty(attribute_key)) {
932
+ cleaned_attributes[attribute_key] = val?.attributes[attribute_key]
933
+ } else if (
934
+ val?.attributes.hasOwnProperty(from_variable_path_key) &&
935
+ Array.isArray(val?.attributes?.[from_variable_path_key])
936
+ ) {
937
+ cleaned_attributes[from_variable_path_key] = val?.attributes[from_variable_path_key]
938
+ }
939
+ if (attribute_key == "content" && val?.attributes?.content) {
940
+ embedding_text_items.push(val?.attributes.content)
941
+ word_count += val.attributes.content.split(/\s+/).filter(Boolean).length
942
+ character_count += val.attributes.content.length
943
+ }
944
+ }
945
+ }
946
+ if (Array.isArray(val?.children) && val?.children.length > 0) {
947
+ for (let child of val?.children) {
948
+ const res = clean_content(child)
949
+ word_count += res.word_count
950
+ character_count += res.character_count
951
+ total_elements += res.total_elements
952
+ total_nests += res.total_nests
953
+ embedding_text_items.push(res.embedding_text)
954
+ warnings = warnings.concat(res.warnings)
955
+ cleaned_children.push(res?.val)
956
+ }
957
+ }
958
+ let embedding_text = embedding_text_items
959
+ .join(" ")
960
+ .replace(/\s{2,}/g, " ")
961
+ .replace(/[^\x00-\x7F]/g, "")
962
+ .replace(/"/g, "")
963
+ .trim()
964
+ const sentence_endings = [".", "?", "!"]
965
+ if (["h1", "h2", "h3", "h4", "h5", "h6", "td", "th", "li", "p", "div"].includes(val?.type_id)) {
966
+ let last_char = embedding_text.slice(-1)
967
+ if (!sentence_endings.includes(last_char)) {
968
+ embedding_text += "."
969
+ }
970
+ }
971
+ embedding_text = embedding_text.replace(/\n/g, "")
972
+ return {
973
+ warnings,
974
+ word_count,
975
+ character_count,
976
+ embedding_text,
977
+ total_elements,
978
+ total_nests,
979
+ val: {
980
+ type_id: val?.type_id,
981
+ selector_id: val?.selector_id,
982
+ attributes: cleaned_attributes,
983
+ children: cleaned_children,
984
+ },
985
+ }
986
+ }
987
+
988
+ function init(config) {
989
+ definition_stack = config?.definition_stack ?? []
990
+ versions = [config?.val]
991
+ storage = config?.storage
992
+ storage_default_folder_path = config?.storage_default_folder_path
993
+ storage_path = config?.storage_path
994
+ preempt_add_first_element_button_manager = create_button_manager({
995
+ type: "outlined",
996
+ support_icon: "edit",
997
+ is_compressed: true,
998
+ text: "Add First Element",
999
+ on_click: () => first_el_add_element_manager?.popover_manager?.open(),
1000
+ })
1001
+ let allowed_to_add_element_ids = []
1002
+ for (let [key, val] of Object.entries(node_types || {})) {
1003
+ if (val?.kind == "content") {
1004
+ allowed_to_add_element_ids.push(key)
1005
+ }
1006
+ }
1007
+ first_el_add_element_manager = create_add_element_manager({
1008
+ header: "Add First Element",
1009
+ avail_element_ids: () => allowed_to_add_element_ids,
1010
+ on_item_click: (input) => {
1011
+ if (input == "paste") {
1012
+ paste_astc_markdown_location_to_add_element = null
1013
+ paste_astc_markdown_popover_manager.open()
1014
+ return
1015
+ }
1016
+ setTimeout(() => {
1017
+ const element_to_add = get_new_element_to_add(input)
1018
+ add_version(element_to_add)
1019
+ }, 500)
1020
+ },
1021
+ })
1022
+ paste_astc_markdown_popover_manager = create_popover_manager({
1023
+ type: "panel",
1024
+ header: "Markdown to astc",
1025
+ target_width: 600,
1026
+ target_height: 600,
1027
+ })
1028
+ paste_astc_markdown_dropdown_manager = create_dropdown_manager({
1029
+ val: "astc",
1030
+ options: ["astc", "markdown"],
1031
+ label: "Input Type",
1032
+ is_button_compressed: true,
1033
+ mb: 1,
1034
+ })
1035
+ paste_astc_markdown_text_input_manager = create_text_input_manager({
1036
+ type: "text_area",
1037
+ rows: 15,
1038
+ placeholder: () =>
1039
+ paste_astc_markdown_dropdown_manager?.val == "markdown"
1040
+ ? "## Some Markdown"
1041
+ : `{
1042
+ type_id: "p",
1043
+ selector_id: "p_dxeox",
1044
+ attributes: {},
1045
+ children: [
1046
+ {
1047
+ type_id: "base_text",
1048
+ selector_id: "base_text_ylzrw",
1049
+ children: [],
1050
+ attributes: {
1051
+ content: "Example",
1052
+ },
1053
+ },
1054
+ ],
1055
+ }`,
1056
+ })
1057
+ paste_astc_markdown_finish_button_manager = create_button_manager({
1058
+ mt: 0.5,
1059
+ text: "Set from astc/Markdown",
1060
+ on_click: () => {
1061
+ let astc_to_add = null
1062
+ if (paste_astc_markdown_dropdown_manager?.val == "markdown") {
1063
+ astc_to_add = markdown_to_astc(paste_astc_markdown_text_input_manager?.val)
1064
+ } else if (paste_astc_markdown_dropdown_manager?.val == "astc") {
1065
+ astc_to_add = JSON.parse(paste_astc_markdown_text_input_manager?.val)
1066
+ }
1067
+ setTimeout(() => {
1068
+ if (paste_astc_markdown_location_to_add_element?.location_to_add_element == "sibling") {
1069
+ add_sibling_el(paste_astc_markdown_location_to_add_element?.selector_id, null, astc_to_add)
1070
+ } else if (paste_astc_markdown_location_to_add_element?.location_to_add_element == "child") {
1071
+ add_el_to_el_children(paste_astc_markdown_location_to_add_element?.selector_id, astc_to_add)
1072
+ } else {
1073
+ add_version(astc_to_add)
1074
+ }
1075
+ paste_astc_markdown_popover_manager.close()
1076
+ paste_astc_markdown_text_input_manager.set_val(null)
1077
+ }, 500)
1078
+ },
1079
+ })
1080
+ attributes_input = create_attributes_input_manager({
1081
+ storage: storage,
1082
+ storage_default_folder_path: storage_default_folder_path,
1083
+ storage_path: storage_path,
1084
+ get_defined_options: get_defined_options,
1085
+ set_focused_selector_id: set_focused_selector_id,
1086
+ })
1087
+ set_selected_version(0)
1088
+ }
1089
+
1090
+ init(config)
1091
+
1092
+ return {
1093
+ id,
1094
+ get val() {
1095
+ return versions?.[selected_version_index]
1096
+ },
1097
+ get versions_len() {
1098
+ return versions_len
1099
+ },
1100
+ get selected_version_prepped() {
1101
+ return selected_version_prepped
1102
+ },
1103
+ get storage() {
1104
+ return storage
1105
+ },
1106
+ get storage_default_folder_path() {
1107
+ return storage_default_folder_path
1108
+ },
1109
+ get focused_selector_id() {
1110
+ return focused_selector_id
1111
+ },
1112
+ get paste_astc_markdown_popover_manager() {
1113
+ return paste_astc_markdown_popover_manager
1114
+ },
1115
+ get paste_astc_markdown_location_to_add_element() {
1116
+ return paste_astc_markdown_location_to_add_element
1117
+ },
1118
+ get paste_astc_markdown_dropdown_manager() {
1119
+ return paste_astc_markdown_dropdown_manager
1120
+ },
1121
+ get paste_astc_markdown_text_input_manager() {
1122
+ return paste_astc_markdown_text_input_manager
1123
+ },
1124
+ get paste_astc_markdown_finish_button_manager() {
1125
+ return paste_astc_markdown_finish_button_manager
1126
+ },
1127
+ get location_to_add_element() {
1128
+ return location_to_add_element
1129
+ },
1130
+ get astc_element_string() {
1131
+ return astc_element_string
1132
+ },
1133
+ get all_selector_ids() {
1134
+ return all_selector_ids
1135
+ },
1136
+ get preempt_add_first_element_button_manager() {
1137
+ return preempt_add_first_element_button_manager
1138
+ },
1139
+ get first_el_add_element_manager() {
1140
+ return first_el_add_element_manager
1141
+ },
1142
+ get content_manager() {
1143
+ return content_manager
1144
+ },
1145
+ get attributes_input() {
1146
+ return attributes_input
1147
+ },
1148
+ get dragging_selector_id() {
1149
+ return dragging_selector_id
1150
+ },
1151
+ get dragged_over_element_child() {
1152
+ return dragged_over_element_child
1153
+ },
1154
+
1155
+ init,
1156
+ clean_content,
1157
+ add_version,
1158
+ finish,
1159
+ copy_markdown,
1160
+ copy_astc,
1161
+ copy_text,
1162
+ set_focused_selector_id,
1163
+ get_new_element_to_add,
1164
+ calc_child_element_options,
1165
+
1166
+ // content overview
1167
+ open_edit_markdown_modal,
1168
+ set_astc_from_markdown,
1169
+
1170
+ // add element
1171
+ initiate_add_sibling_el_to_selector,
1172
+ add_sibling_el,
1173
+ initiate_add_child_el_to_selector,
1174
+ add_child_el,
1175
+ add_astc_to_element_children,
1176
+
1177
+ // element more
1178
+ copy_element_astc,
1179
+ copy_element_markdown,
1180
+ shift_el,
1181
+ set_el_from_astc_el_string,
1182
+ delete_el,
1183
+
1184
+ // element attributes
1185
+ open_edit_element_attributes_popover,
1186
+ set_element_attribute,
1187
+ set_element_attributes,
1188
+
1189
+ pass_event_down,
1190
+ reset_ids,
1191
+
1192
+ handle_element_child_drag_over,
1193
+ handle_element_child_drag_drop,
1194
+ handle_element_child_drag_start,
1195
+ handle_element_child_drag_end,
1196
+ }
1197
+ }