sveltekit-ui 1.0.28 → 1.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,3 +29,7 @@ npm run dev
29
29
  ## Browser
30
30
 
31
31
  That should spit out a url like http://localhost:5173/ where you should see your starting website.
32
+
33
+ ## Code Generator
34
+
35
+ This is experimental but you can check out https://www.contibase.com/code_generator for component building help
@@ -152,6 +152,8 @@
152
152
  ? `padding: ${set_closurable(manager?.val_prepped?.attributes?.padding)}rem;`
153
153
  : ''} {manager?.val_prepped?.attributes?.border_radius
154
154
  ? `border-radius: ${set_closurable(manager?.val_prepped?.attributes?.border_radius)}rem;`
155
+ : ''} {manager?.val_prepped?.attributes?.gap
156
+ ? `gap: ${set_closurable(manager?.val_prepped?.attributes?.gap)}rem;`
155
157
  : ''} {manager?.val_prepped?.attributes?.padding
156
158
  ? `padding: ${set_closurable(manager?.val_prepped?.attributes?.padding)}rem;`
157
159
  : ''} {manager?.val_prepped?.attributes?.align_content || manager?.val_prepped?.attributes?.justify_content
@@ -145,6 +145,11 @@
145
145
  <Dropdown manager={manager?.attributes_manager?.justify_content_dropdown_manager} />
146
146
  {/snippet}
147
147
  </DefinedTypeInput>
148
+ <DefinedTypeInput manager={manager?.attributes_manager?.gap_defined_type_input_manager}>
149
+ {#snippet content()}
150
+ <Slider manager={manager?.attributes_manager?.gap_slider_manager} />
151
+ {/snippet}
152
+ </DefinedTypeInput>
148
153
  {:else if manager?.content_type == "show_conditions"}
149
154
  <DefinedTypeInput manager={manager?.attributes_manager?.is_run_serverside_defined_type_input_manager}>
150
155
  {#snippet content()}
@@ -359,6 +359,24 @@ export function create_attributes_input_manager(config) {
359
359
  attributes: config?.val,
360
360
  })
361
361
  )
362
+
363
+ let gap_slider_manager = $state(
364
+ create_slider_manager({
365
+ min: 0,
366
+ max: 5,
367
+ step: 0.1,
368
+ val: config?.val?.gap ?? 0,
369
+ })
370
+ )
371
+ let gap_defined_type_input_manager = $state(
372
+ create_defined_type_input_manager({
373
+ get_defined_options: config?.get_defined_options,
374
+ label: "Gap",
375
+ attribute_root_key: "gap",
376
+ attribute_const_val: () => gap_slider_manager?.val,
377
+ attributes: config?.val,
378
+ })
379
+ )
362
380
  attributes_manager = {
363
381
  background_color_color_input_manager: background_color_color_input_manager,
364
382
  background_color_defined_type_input_manager: background_color_defined_type_input_manager,
@@ -372,6 +390,8 @@ export function create_attributes_input_manager(config) {
372
390
  align_content_defined_type_input_manager: align_content_defined_type_input_manager,
373
391
  justify_content_dropdown_manager: justify_content_dropdown_manager,
374
392
  justify_content_defined_type_input_manager: justify_content_defined_type_input_manager,
393
+ gap_slider_manager: gap_slider_manager,
394
+ gap_defined_type_input_manager: gap_defined_type_input_manager,
375
395
  get val() {
376
396
  return {
377
397
  ...background_color_defined_type_input_manager?.val,
@@ -3,17 +3,24 @@
3
3
  import Popover from "../../../Popover/index.svelte"
4
4
  import TextInput from "../../../TextInput/index.svelte"
5
5
  import AddElement from "../AddElement/index.svelte"
6
- import Self from './index.svelte'
6
+ import Self from "./index.svelte"
7
7
  import { node_types } from "../../../../client/index.js"
8
8
 
9
9
  let { manager, element_manager } = $props()
10
-
11
10
  </script>
12
11
 
13
12
  <div
14
13
  class="container"
15
14
  class:is_highlight={element_manager?.element?.selector_id &&
16
15
  element_manager?.element?.selector_id == manager?.focused_selector_id}
16
+ class:is_drop_dragover={manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id}
17
+ role="listitem"
18
+ draggable="true"
19
+ aria-grabbed="false"
20
+ ondragover={(e) => manager?.handle_element_child_drag_over(e, element_manager?.element?.selector_id)}
21
+ ondrop={(e) => manager?.handle_element_child_drag_drop(e, element_manager?.element?.selector_id)}
22
+ ondragstart={(e) => manager?.handle_element_child_drag_start(e, element_manager?.element?.selector_id)}
23
+ ondragend={(e) => manager?.handle_element_child_drag_end(e, element_manager?.element?.selector_id)}
17
24
  >
18
25
  <div
19
26
  class="event_handler"
@@ -23,12 +30,30 @@
23
30
  >
24
31
  <div class="el_row">
25
32
  {#if element_manager?.element}
33
+ {#if manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id && element_manager?.element?.selector_id != manager?.dragging_selector_id && !manager?.dragged_over_element_child?.is_children}
34
+ <div class="drop_area" style="left: 0; top: 0;">Move Before Element</div>
35
+ {/if}
26
36
  <div class="el_name">
27
- <h4 class="el_title">{element_manager?.element?.type_id}</h4>
37
+ <h4 class="el_title">
38
+ {element_manager?.element?.type_id}
39
+ </h4>
28
40
  <p class="el_id">{element_manager?.element?.selector_id}</p>
29
41
  {#if Object.keys(node_types?.[element_manager?.element?.type_id]?.attributes || {})?.length > 0 || node_types?.[element_manager?.element?.type_id]?.custom_attributes_input}
30
42
  <Button manager={element_manager?.edit_attributes_popover_button_manager} />
31
43
  {/if}
44
+ {#if manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id && Object.keys(node_types?.[element_manager?.element?.type_id]?.child_elements || {}).length > 0}
45
+ <div
46
+ class="child_drop"
47
+ role="listitem"
48
+ ondragover={(e) =>
49
+ manager?.handle_element_child_drag_over(e, element_manager?.element?.selector_id, true)}
50
+ ondrop={(e) => manager?.handle_element_child_drag_drop(e, element_manager?.element?.selector_id, true)}
51
+ class:is_child_drop_dragover={manager?.dragged_over_element_child?.selector_id ==
52
+ element_manager?.element?.selector_id && manager?.dragged_over_element_child?.is_children}
53
+ >
54
+ Child Drop Zone
55
+ </div>
56
+ {/if}
32
57
  </div>
33
58
  {/if}
34
59
  <div style="display: flex; flex: 0;">
@@ -39,10 +64,11 @@
39
64
  <Button manager={element_manager?.small_preempt_add_child_element_button_manager} />
40
65
  {/if}
41
66
  {#if element_manager?.element}
42
- <Button manager={element_manager?.extra_popover_button_manager} />
67
+ <Button manager={element_manager?.extra_popover_button_manager} />
43
68
  {/if}
44
69
  <Popover manager={element_manager?.extra_popover_manager}>
45
70
  {#snippet content()}
71
+ <Button manager={element_manager?.reset_ids_button_manager} />
46
72
  <Button manager={element_manager?.copy_markdown_button_manager} />
47
73
  <Button manager={element_manager?.copy_astc_button_manager} />
48
74
  {#if Array.isArray(element_manager?.avail_child_element_ids) && element_manager?.avail_child_element_ids?.length > 0}
@@ -73,8 +99,13 @@
73
99
  </div>
74
100
  </div>
75
101
  </div>
76
- {#if Array.isArray(element_manager?.children)}
77
- {#each element_manager.children as child}
102
+ {#if manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id && element_manager?.element?.selector_id != manager?.dragging_selector_id && manager?.dragged_over_element_child?.is_children}
103
+ <div style="position: relative;">
104
+ <div class="drop_area" style="left: 1rem; top: 50%; ">Move to Element Children</div>
105
+ </div>
106
+ {/if}
107
+ {#if Array.isArray(element_manager?.children) && element_manager?.children.length > 0}
108
+ {#each element_manager.children as child, i}
78
109
  <Self {manager} element_manager={child} />
79
110
  {/each}
80
111
  {/if}
@@ -95,6 +126,7 @@
95
126
  transition: 0.2s;
96
127
  }
97
128
  .el_row {
129
+ position: relative;
98
130
  display: flex;
99
131
  /* align-items: center; */
100
132
  justify-content: space-between;
@@ -111,6 +143,36 @@
111
143
  font-weight: 600 !important;
112
144
  margin-left: 0.5rem;
113
145
  }
146
+ .is_drop_dragover {
147
+ background-color: oklch(var(--l12-t) var(--c10) var(--h16) / var(--o15));
148
+ border-radius: 0.5rem;
149
+ }
150
+ .drop_area {
151
+ position: absolute;
152
+ width: fit-content;
153
+ transform: translateY(-50%);
154
+ font-size: 1rem !important;
155
+ pointer-events: none;
156
+ border-radius: 0.5rem;
157
+ padding: 0.2rem 0.5rem;
158
+ border: 1px solid oklch(var(--l2-t) var(--c5) var(--h3) / var(--o22));
159
+ background-color: oklch(var(--l5-t) var(--c10) var(--h3) / var(--o20));
160
+ color: oklch(var(--l16-t) var(--c10) var(--h3));
161
+ }
162
+ .child_drop {
163
+ margin-left: 2rem;
164
+ border: 1px dotted var(--g3-t);
165
+ border-radius: 0.5rem;
166
+ display: grid;
167
+ place-content: center;
168
+ min-width: fit-content;
169
+ padding: 0.2rem 0.5rem;
170
+ white-space: nowrap;
171
+ }
172
+ .is_child_drop_dragover {
173
+ background-color: oklch(var(--l2-t) var(--c1) var(--h3) / var(--o15));
174
+ color: var(--g24-t);
175
+ }
114
176
  .el_id {
115
177
  color: var(--g8-t);
116
178
  font-size: 1.2rem;
@@ -39,6 +39,8 @@ export function create_content_input_manager(config) {
39
39
  let attributes_input = $state(null)
40
40
  let focused_selector_id = $state(null)
41
41
  let definition_stack = $state([])
42
+ let dragging_selector_id = $state(null)
43
+ let dragged_over_element_child = $state(null)
42
44
 
43
45
  let mapkit_js_token = $derived(set_closurable(config?.mapkit_js_token, null))
44
46
 
@@ -109,6 +111,7 @@ export function create_content_input_manager(config) {
109
111
  let preempt_add_child_element_button_manager = $state(null)
110
112
  let small_preempt_add_child_element_button_manager = $state(null)
111
113
  let preempt_add_sibling_element_below_button_manager = $state(null)
114
+ let reset_ids_button_manager = $state(null)
112
115
  let copy_markdown_button_manager = $state(null)
113
116
  let copy_astc_button_manager = $state(null)
114
117
  let shift_element_up_5_button_manager = $state(null)
@@ -177,6 +180,19 @@ export function create_content_input_manager(config) {
177
180
  border_radius: 0.5,
178
181
  on_click: () => initiate_add_child_el_to_selector(element?.selector_id),
179
182
  })
183
+ reset_ids_button_manager = create_button_manager({
184
+ type: "soft",
185
+ support_icon: "refresh",
186
+ text_align: "left",
187
+ text: "Reset IDs",
188
+ is_success_animation: true,
189
+ on_click: () => {
190
+ extra_popover_manager.close()
191
+ setTimeout(() => {
192
+ reset_ids(element?.selector_id)
193
+ }, 200)
194
+ },
195
+ })
180
196
  copy_markdown_button_manager = create_button_manager({
181
197
  type: "soft",
182
198
  support_icon: "clipboard",
@@ -336,6 +352,9 @@ export function create_content_input_manager(config) {
336
352
  get preempt_add_sibling_element_below_button_manager() {
337
353
  return preempt_add_sibling_element_below_button_manager
338
354
  },
355
+ get reset_ids_button_manager() {
356
+ return reset_ids_button_manager
357
+ },
339
358
  get copy_markdown_button_manager() {
340
359
  return copy_markdown_button_manager
341
360
  },
@@ -376,7 +395,7 @@ export function create_content_input_manager(config) {
376
395
  }
377
396
  }
378
397
 
379
- function get_parent_el(selector_id) {
398
+ function get_parent_el(selector_id, element = null) {
380
399
  function get_parent_el_recursive(selector_id, element) {
381
400
  if (selector_id && element && Array.isArray(element?.children)) {
382
401
  for (let child of element.children) {
@@ -393,7 +412,7 @@ export function create_content_input_manager(config) {
393
412
  }
394
413
  return null
395
414
  }
396
- return get_parent_el_recursive(selector_id, versions?.[selected_version_index])
415
+ return get_parent_el_recursive(selector_id, element ?? versions?.[selected_version_index])
397
416
  }
398
417
 
399
418
  function add_version(version) {
@@ -405,6 +424,92 @@ export function create_content_input_manager(config) {
405
424
  }
406
425
  }
407
426
 
427
+ function handle_element_child_drag_over(e, selector_id, is_children = false) {
428
+ e.preventDefault()
429
+ e.stopPropagation()
430
+ dragged_over_element_child = { selector_id, is_children }
431
+ }
432
+
433
+ function handle_element_child_drag_drop(e, selector_id, is_children = false) {
434
+ e.stopPropagation()
435
+ console.log("handle_element_child_drag_drop", { selector_id, dragging_selector_id, is_children })
436
+ if (selector_id == dragging_selector_id) {
437
+ dragging_selector_id = null
438
+ return
439
+ }
440
+ const found_element = traverse_els_for_match(dragging_selector_id)
441
+ const removed_version = remove_el_recursive(selected_version_prepped?.element, dragging_selector_id)
442
+ let readded_version = null
443
+ if (is_children) {
444
+ readded_version = add_child_to_el_recursive(removed_version, selector_id, found_element)
445
+ } else {
446
+ let dom_el_parent = get_parent_el(selector_id, removed_version)
447
+ const element_index_of_siblings = Array.isArray(dom_el_parent?.children)
448
+ ? dom_el_parent.children.findIndex((h) => h.selector_id == selector_id)
449
+ : null
450
+ if (dom_el_parent && found_element) {
451
+ if (Array.isArray(dom_el_parent?.children)) {
452
+ dom_el_parent.children.splice(element_index_of_siblings, 0, found_element)
453
+ } else {
454
+ dom_el_parent.children = [found_element]
455
+ }
456
+ readded_version = replace_el_recursive(removed_version, dom_el_parent?.selector_id, dom_el_parent)
457
+ }
458
+ }
459
+ add_version(readded_version)
460
+ dragging_selector_id = null
461
+ }
462
+ function handle_element_child_drag_start(e, selector_id) {
463
+ e.stopPropagation()
464
+ dragging_selector_id = selector_id
465
+ }
466
+ function handle_element_child_drag_end(e, selector_id) {
467
+ dragged_over_element_child = null
468
+ dragging_selector_id = null
469
+ }
470
+
471
+ function reset_ids(selector_id) {
472
+ const found_element = traverse_els_for_match(selector_id)
473
+ const clean_element = reset_ids_recursive(found_element)
474
+ const new_version = find_and_replace_element(selector_id, selected_version_prepped?.element, clean_element)
475
+ add_version(new_version)
476
+ }
477
+
478
+ function reset_ids_recursive(element, selector_id) {
479
+ if (!element?.selector_id || element?.selector_id == selector_id) {
480
+ return null
481
+ }
482
+ element.selector_id = create_unique_id(null, 8)
483
+ let new_children = []
484
+ if (Array.isArray(element?.children)) {
485
+ for (let child of element?.children) {
486
+ const child_new_el = reset_ids_recursive(child, selector_id)
487
+ if (child_new_el) {
488
+ new_children.push(child_new_el)
489
+ }
490
+ }
491
+ }
492
+ element.children = new_children
493
+ return element
494
+ }
495
+
496
+ function find_and_replace_element(selector_id, root_el, replacement_el) {
497
+ function replace_recursive(node) {
498
+ if (!node) return null
499
+ if (node.selector_id === selector_id) {
500
+ return deep_copy(replacement_el)
501
+ }
502
+ const new_children = Array.isArray(node.children) ? node.children.map(replace_recursive).filter(Boolean) : []
503
+ return {
504
+ type_id: node.type_id,
505
+ selector_id: node.selector_id,
506
+ attributes: node.attributes ? { ...node.attributes } : node.attributes,
507
+ children: new_children,
508
+ }
509
+ }
510
+ return replace_recursive(root_el)
511
+ }
512
+
408
513
  function copy_markdown() {
409
514
  copy_to_clipboard(astc_to_markdown(selected_version_prepped?.element))
410
515
  }
@@ -449,7 +554,6 @@ export function create_content_input_manager(config) {
449
554
  }
450
555
 
451
556
  function add_sibling_el(selector_id, el_type_id, element_to_add = null) {
452
- console.log("add_sibling_el", selector_id, el_type_id)
453
557
  let dom_el_parent = get_parent_el(selector_id)
454
558
  const element_index_of_siblings = Array.isArray(dom_el_parent?.children)
455
559
  ? dom_el_parent.children.findIndex((h) => h.selector_id == selector_id)
@@ -469,10 +573,8 @@ export function create_content_input_manager(config) {
469
573
  }
470
574
 
471
575
  function initiate_add_sibling_el_to_selector(selector_id) {
472
- console.log("initiate_add_sibling_el_to_selector", selector_id)
473
576
  const dom_el_parent = get_parent_el(selector_id)
474
577
  const avail_element_ids = calc_child_element_options(dom_el_parent)
475
- console.log("avail_element_ids", avail_element_ids)
476
578
  if (avail_element_ids.length > 1) {
477
579
  location_to_add_element = "sibling"
478
580
  find_and_open_add_element_popover_selector_id(selected_version_prepped, selector_id ?? "root")
@@ -518,7 +620,6 @@ export function create_content_input_manager(config) {
518
620
  }
519
621
 
520
622
  function add_el_to_el_children(selector_id, new_element) {
521
- console.log("add_el_to_el_children", selector_id)
522
623
  add_version(add_child_to_el_recursive(selected_version_prepped?.element, selector_id, new_element))
523
624
  }
524
625
 
@@ -1013,6 +1114,12 @@ export function create_content_input_manager(config) {
1013
1114
  get attributes_input() {
1014
1115
  return attributes_input
1015
1116
  },
1117
+ get dragging_selector_id() {
1118
+ return dragging_selector_id
1119
+ },
1120
+ get dragged_over_element_child() {
1121
+ return dragged_over_element_child
1122
+ },
1016
1123
 
1017
1124
  init,
1018
1125
  clean_content,
@@ -1049,5 +1156,11 @@ export function create_content_input_manager(config) {
1049
1156
  set_element_attributes,
1050
1157
 
1051
1158
  pass_event_down,
1159
+ reset_ids,
1160
+
1161
+ handle_element_child_drag_over,
1162
+ handle_element_child_drag_drop,
1163
+ handle_element_child_drag_start,
1164
+ handle_element_child_drag_end,
1052
1165
  }
1053
1166
  }
@@ -689,6 +689,10 @@ export const content_types = {
689
689
  type: "text_literal",
690
690
  display_name: "Justify Content",
691
691
  },
692
+ gap: {
693
+ type: "float_literal",
694
+ display_name: "Gap",
695
+ },
692
696
  },
693
697
  child_elements: {
694
698
  ...main_child_element_options,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sveltekit-ui",
3
- "version": "1.0.28",
3
+ "version": "1.0.30",
4
4
  "description": "A SvelteKit UI component library for building modern web applications",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "devDependencies": {
28
28
  "@sveltejs/adapter-vercel": "^5.10.2",
29
- "@sveltejs/kit": "^2.36.1",
29
+ "@sveltejs/kit": "^2.36.2",
30
30
  "@sveltejs/package": "^2.5.0",
31
31
  "@sveltejs/vite-plugin-svelte": "^6.1.3",
32
32
  "@vercel/analytics": "^1.5.0",
@@ -152,6 +152,8 @@
152
152
  ? `padding: ${set_closurable(manager?.val_prepped?.attributes?.padding)}rem;`
153
153
  : ''} {manager?.val_prepped?.attributes?.border_radius
154
154
  ? `border-radius: ${set_closurable(manager?.val_prepped?.attributes?.border_radius)}rem;`
155
+ : ''} {manager?.val_prepped?.attributes?.gap
156
+ ? `gap: ${set_closurable(manager?.val_prepped?.attributes?.gap)}rem;`
155
157
  : ''} {manager?.val_prepped?.attributes?.padding
156
158
  ? `padding: ${set_closurable(manager?.val_prepped?.attributes?.padding)}rem;`
157
159
  : ''} {manager?.val_prepped?.attributes?.align_content || manager?.val_prepped?.attributes?.justify_content
@@ -145,6 +145,11 @@
145
145
  <Dropdown manager={manager?.attributes_manager?.justify_content_dropdown_manager} />
146
146
  {/snippet}
147
147
  </DefinedTypeInput>
148
+ <DefinedTypeInput manager={manager?.attributes_manager?.gap_defined_type_input_manager}>
149
+ {#snippet content()}
150
+ <Slider manager={manager?.attributes_manager?.gap_slider_manager} />
151
+ {/snippet}
152
+ </DefinedTypeInput>
148
153
  {:else if manager?.content_type == "show_conditions"}
149
154
  <DefinedTypeInput manager={manager?.attributes_manager?.is_run_serverside_defined_type_input_manager}>
150
155
  {#snippet content()}
@@ -359,6 +359,24 @@ export function create_attributes_input_manager(config) {
359
359
  attributes: config?.val,
360
360
  })
361
361
  )
362
+
363
+ let gap_slider_manager = $state(
364
+ create_slider_manager({
365
+ min: 0,
366
+ max: 5,
367
+ step: 0.1,
368
+ val: config?.val?.gap ?? 0,
369
+ })
370
+ )
371
+ let gap_defined_type_input_manager = $state(
372
+ create_defined_type_input_manager({
373
+ get_defined_options: config?.get_defined_options,
374
+ label: "Gap",
375
+ attribute_root_key: "gap",
376
+ attribute_const_val: () => gap_slider_manager?.val,
377
+ attributes: config?.val,
378
+ })
379
+ )
362
380
  attributes_manager = {
363
381
  background_color_color_input_manager: background_color_color_input_manager,
364
382
  background_color_defined_type_input_manager: background_color_defined_type_input_manager,
@@ -372,6 +390,8 @@ export function create_attributes_input_manager(config) {
372
390
  align_content_defined_type_input_manager: align_content_defined_type_input_manager,
373
391
  justify_content_dropdown_manager: justify_content_dropdown_manager,
374
392
  justify_content_defined_type_input_manager: justify_content_defined_type_input_manager,
393
+ gap_slider_manager: gap_slider_manager,
394
+ gap_defined_type_input_manager: gap_defined_type_input_manager,
375
395
  get val() {
376
396
  return {
377
397
  ...background_color_defined_type_input_manager?.val,
@@ -3,17 +3,24 @@
3
3
  import Popover from "$lib/Components/Popover/index.svelte"
4
4
  import TextInput from "$lib/Components/TextInput/index.svelte"
5
5
  import AddElement from "$lib/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte"
6
- import Self from './index.svelte'
6
+ import Self from "./index.svelte"
7
7
  import { node_types } from "$lib/client/index.js"
8
8
 
9
9
  let { manager, element_manager } = $props()
10
-
11
10
  </script>
12
11
 
13
12
  <div
14
13
  class="container"
15
14
  class:is_highlight={element_manager?.element?.selector_id &&
16
15
  element_manager?.element?.selector_id == manager?.focused_selector_id}
16
+ class:is_drop_dragover={manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id}
17
+ role="listitem"
18
+ draggable="true"
19
+ aria-grabbed="false"
20
+ ondragover={(e) => manager?.handle_element_child_drag_over(e, element_manager?.element?.selector_id)}
21
+ ondrop={(e) => manager?.handle_element_child_drag_drop(e, element_manager?.element?.selector_id)}
22
+ ondragstart={(e) => manager?.handle_element_child_drag_start(e, element_manager?.element?.selector_id)}
23
+ ondragend={(e) => manager?.handle_element_child_drag_end(e, element_manager?.element?.selector_id)}
17
24
  >
18
25
  <div
19
26
  class="event_handler"
@@ -23,12 +30,30 @@
23
30
  >
24
31
  <div class="el_row">
25
32
  {#if element_manager?.element}
33
+ {#if manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id && element_manager?.element?.selector_id != manager?.dragging_selector_id && !manager?.dragged_over_element_child?.is_children}
34
+ <div class="drop_area" style="left: 0; top: 0;">Move Before Element</div>
35
+ {/if}
26
36
  <div class="el_name">
27
- <h4 class="el_title">{element_manager?.element?.type_id}</h4>
37
+ <h4 class="el_title">
38
+ {element_manager?.element?.type_id}
39
+ </h4>
28
40
  <p class="el_id">{element_manager?.element?.selector_id}</p>
29
41
  {#if Object.keys(node_types?.[element_manager?.element?.type_id]?.attributes || {})?.length > 0 || node_types?.[element_manager?.element?.type_id]?.custom_attributes_input}
30
42
  <Button manager={element_manager?.edit_attributes_popover_button_manager} />
31
43
  {/if}
44
+ {#if manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id && Object.keys(node_types?.[element_manager?.element?.type_id]?.child_elements || {}).length > 0}
45
+ <div
46
+ class="child_drop"
47
+ role="listitem"
48
+ ondragover={(e) =>
49
+ manager?.handle_element_child_drag_over(e, element_manager?.element?.selector_id, true)}
50
+ ondrop={(e) => manager?.handle_element_child_drag_drop(e, element_manager?.element?.selector_id, true)}
51
+ class:is_child_drop_dragover={manager?.dragged_over_element_child?.selector_id ==
52
+ element_manager?.element?.selector_id && manager?.dragged_over_element_child?.is_children}
53
+ >
54
+ Child Drop Zone
55
+ </div>
56
+ {/if}
32
57
  </div>
33
58
  {/if}
34
59
  <div style="display: flex; flex: 0;">
@@ -39,10 +64,11 @@
39
64
  <Button manager={element_manager?.small_preempt_add_child_element_button_manager} />
40
65
  {/if}
41
66
  {#if element_manager?.element}
42
- <Button manager={element_manager?.extra_popover_button_manager} />
67
+ <Button manager={element_manager?.extra_popover_button_manager} />
43
68
  {/if}
44
69
  <Popover manager={element_manager?.extra_popover_manager}>
45
70
  {#snippet content()}
71
+ <Button manager={element_manager?.reset_ids_button_manager} />
46
72
  <Button manager={element_manager?.copy_markdown_button_manager} />
47
73
  <Button manager={element_manager?.copy_astc_button_manager} />
48
74
  {#if Array.isArray(element_manager?.avail_child_element_ids) && element_manager?.avail_child_element_ids?.length > 0}
@@ -73,8 +99,13 @@
73
99
  </div>
74
100
  </div>
75
101
  </div>
76
- {#if Array.isArray(element_manager?.children)}
77
- {#each element_manager.children as child}
102
+ {#if manager?.dragged_over_element_child?.selector_id == element_manager?.element?.selector_id && element_manager?.element?.selector_id != manager?.dragging_selector_id && manager?.dragged_over_element_child?.is_children}
103
+ <div style="position: relative;">
104
+ <div class="drop_area" style="left: 1rem; top: 50%; ">Move to Element Children</div>
105
+ </div>
106
+ {/if}
107
+ {#if Array.isArray(element_manager?.children) && element_manager?.children.length > 0}
108
+ {#each element_manager.children as child, i}
78
109
  <Self {manager} element_manager={child} />
79
110
  {/each}
80
111
  {/if}
@@ -95,6 +126,7 @@
95
126
  transition: 0.2s;
96
127
  }
97
128
  .el_row {
129
+ position: relative;
98
130
  display: flex;
99
131
  /* align-items: center; */
100
132
  justify-content: space-between;
@@ -111,6 +143,36 @@
111
143
  font-weight: 600 !important;
112
144
  margin-left: 0.5rem;
113
145
  }
146
+ .is_drop_dragover {
147
+ background-color: oklch(var(--l12-t) var(--c10) var(--h16) / var(--o15));
148
+ border-radius: 0.5rem;
149
+ }
150
+ .drop_area {
151
+ position: absolute;
152
+ width: fit-content;
153
+ transform: translateY(-50%);
154
+ font-size: 1rem !important;
155
+ pointer-events: none;
156
+ border-radius: 0.5rem;
157
+ padding: 0.2rem 0.5rem;
158
+ border: 1px solid oklch(var(--l2-t) var(--c5) var(--h3) / var(--o22));
159
+ background-color: oklch(var(--l5-t) var(--c10) var(--h3) / var(--o20));
160
+ color: oklch(var(--l16-t) var(--c10) var(--h3));
161
+ }
162
+ .child_drop {
163
+ margin-left: 2rem;
164
+ border: 1px dotted var(--g3-t);
165
+ border-radius: 0.5rem;
166
+ display: grid;
167
+ place-content: center;
168
+ min-width: fit-content;
169
+ padding: 0.2rem 0.5rem;
170
+ white-space: nowrap;
171
+ }
172
+ .is_child_drop_dragover {
173
+ background-color: oklch(var(--l2-t) var(--c1) var(--h3) / var(--o15));
174
+ color: var(--g24-t);
175
+ }
114
176
  .el_id {
115
177
  color: var(--g8-t);
116
178
  font-size: 1.2rem;