THIS IS A GUIDE FOR ADDING YOUR OWN CRAFTS
(For datapack creators)

Step 1
Create a function in your datapack with the following content:

# Sound of crafting
execute as @e[tag=ICTcraft] at @s on attacker positioned ~ ~1 ~ align xyz positioned ~0.5 ~ ~0.5 as @e[tag=ICTslot01Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot02Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot03Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot04Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot05Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot06Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot07Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot08Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot09Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot10Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot11Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot12Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot13Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot14Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot15Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot16Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] run playsound minecraft:block.smithing_table.use ambient @a ~ ~ ~ 0.45 1

# Particles during crafting
execute as @e[tag=ICTcraft] at @s on attacker positioned ~ ~1 ~ align xyz positioned ~0.5 ~ ~0.5 as @e[tag=ICTslot01Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot02Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot03Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot04Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot05Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot06Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot07Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot08Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot09Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot10Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot11Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot12Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot13Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot14Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot15Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot16Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] run particle minecraft:cloud ~ ~0.15 ~ 0 0 0 0.025 5

# Crafting result
execute as @e[tag=ICTcraft] at @s on attacker positioned ~ ~1 ~ align xyz positioned ~0.5 ~ ~0.5 as @e[tag=ICTslot01Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot02Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot03Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot04Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot05Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot06Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot07Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot08Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot09Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot10Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot11Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot12Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot13Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot14Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot15Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot16Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] run summon minecraft:item ~ ~ ~ {Motion:[0.0d,0.35d,0.0d],Item:{id:"minecraft:apple",Count:1b,tag:{display:{Name:'["",{"text":"Crafted Apple","italic":false,"color":"white"}]'}}}}

# Function to clear slots
execute as @e[tag=ICTcraft] at @s on attacker positioned ~ ~1 ~ align xyz positioned ~0.5 ~ ~0.5 as @e[tag=ICTslot01Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot02Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot03Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot04Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot05Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot06Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot07Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot08Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot09Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot10Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot11Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot12Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot13Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot14Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot15Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslot16Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}] as @e[tag=ICTslotDisp,distance=..0.5] run function ict:ic_table_slots_clear

(this function should play continuously)

Step 2
Replace minecraft:structure_void with the desired namespace and item id. Do this for 16 slots in the first command, then copy the conditions into the remaining 3 commands.

                                                                          Namespace (default is minecraft)
                 Slot number (from 01 to 16)                              ↓         id (leave as is if the slot is empty)
                 ↓                                                        ↓         ↓
as @e[tag=ICTslot01Disp,sort=nearest,limit=1] if entity @s[nbt={item:{id:"minecraft:structure_void"}}]

You can determine the slot number using this layout:

01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16

Step 3
Add your crafting result (edit the item NBT in the 3rd command). A small template has been prepared for you :)

Step 4
Create several variants of your recipe.
Explanation:

Let’s say you have a 3x3 recipe:

ns sb ns --     ns | ns
co ct co --     co | co ← the recipe is vertically symmetrical
ib an ib --     ib | ib
-- -- -- --

Since the recipe is symmetrical, you need 3 more variations (the smaller the recipe — the more variations) depending on the position in the grid:

-- ns sb ns     -- -- -- --     -- -- -- --
-- co ct co     ns sb ns --     -- ns sb ns
-- ib an ib     co ct co --     -- co ct co
-- -- -- --     ib an ib --     -- ib an ib
top-right       bottom-left     bottom-right

For non-symmetrical recipes, you’ll need twice as many variations
(4x if you plan to add horizontal-symmetry versions too)

!!! Note:
If you want to create a shapeless recipe (item positions don’t matter), contact me on Discord: Mr-rubik
I’ll try to help you ;)
PS I am a Russian speaker, so please use a translator.