@terrafirmagreg-team/recipe 0.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/package.json +16 -16
  2. package/src/components/button-copy.tsx +1 -0
  3. package/src/components/cards/card/index.tsx +5 -3
  4. package/src/components/cards/card/scene.tsx +4 -2
  5. package/src/components/cards/card/strip.tsx +4 -2
  6. package/src/components/cards/card/text.tsx +2 -1
  7. package/src/components/cards/card/tips.tsx +1 -0
  8. package/src/components/cards/default-item.tsx +6 -2
  9. package/src/components/cards/glare-filter.tsx +1 -0
  10. package/src/components/cards/paged-card.tsx +1 -0
  11. package/src/components/cards/slot-hitbox.tsx +4 -2
  12. package/src/components/cards/strip-card/buttons.tsx +7 -2
  13. package/src/components/cards/strip-card/index.tsx +3 -1
  14. package/src/components/cards/strip-card/member-cell.tsx +4 -2
  15. package/src/components/cards/strip-card/sprite.tsx +1 -0
  16. package/src/components/embed-card.tsx +44 -0
  17. package/src/components/mdx/recipe.tsx +34 -16
  18. package/src/components/tool-list.tsx +1 -0
  19. package/src/{lib/tree.ts → components/tree.tsx} +20 -12
  20. package/src/components/views/alloy/index.tsx +14 -7
  21. package/src/components/views/alloy/list.tsx +3 -2
  22. package/src/components/views/alloy/mix/index.tsx +1 -0
  23. package/src/components/views/alloy/mix/ratio.tsx +7 -6
  24. package/src/components/views/alloy/mix/rows.tsx +6 -7
  25. package/src/components/views/alloy/mix/status.tsx +8 -7
  26. package/src/components/views/alloy/mix/total.tsx +13 -12
  27. package/src/components/views/alloy/range-bar.tsx +2 -1
  28. package/src/components/views/alloy/stack-bar.tsx +4 -2
  29. package/src/components/views/browser/axis-switcher.tsx +13 -12
  30. package/src/components/views/browser/card-grid.tsx +2 -1
  31. package/src/components/views/browser/favorite-button.tsx +2 -1
  32. package/src/components/views/browser/frame.tsx +3 -2
  33. package/src/components/views/browser/index.tsx +20 -2
  34. package/src/components/views/browser/item-panel/index.tsx +11 -9
  35. package/src/components/views/browser/item-panel/skeleton.tsx +1 -0
  36. package/src/components/views/browser/item-panel-grid/cell.tsx +5 -3
  37. package/src/components/views/browser/item-panel-grid/favorite-cell.tsx +4 -2
  38. package/src/components/views/browser/item-panel-grid/index.tsx +4 -2
  39. package/src/components/views/browser/item-view/index.tsx +7 -12
  40. package/src/components/views/browser/item-view/tags.tsx +7 -5
  41. package/src/components/views/browser/item-view-header.tsx +10 -9
  42. package/src/components/views/browser/pane-tabs.tsx +1 -0
  43. package/src/components/views/browser/place-header.tsx +4 -3
  44. package/src/components/views/browser/query-controls.tsx +3 -1
  45. package/src/components/views/browser/recipe-item-header.tsx +5 -4
  46. package/src/components/views/browser/settings.tsx +4 -3
  47. package/src/components/views/browser/toolbar.tsx +3 -2
  48. package/src/components/views/browser/type-tabs.tsx +5 -3
  49. package/src/components/views/browser/type-view.tsx +7 -12
  50. package/src/components/views/browser/workstation-rail.tsx +4 -3
  51. package/src/components/views/calc/calculator/actions.tsx +4 -14
  52. package/src/components/views/calc/calculator/help.tsx +69 -28
  53. package/src/components/views/calc/calculator/index.tsx +34 -82
  54. package/src/components/views/calc/dot-overlay.tsx +1 -0
  55. package/src/components/views/calc/edge.tsx +134 -32
  56. package/src/components/views/calc/flow/index.tsx +92 -54
  57. package/src/components/views/calc/flow/picker-dialogs.tsx +84 -6
  58. package/src/components/views/calc/flow/toolbar.tsx +9 -21
  59. package/src/components/views/calc/flow/view-menu.tsx +16 -120
  60. package/src/components/views/calc/member-picker.tsx +8 -6
  61. package/src/components/views/calc/node-card/actions.tsx +28 -106
  62. package/src/components/views/calc/node-card/badges.tsx +10 -28
  63. package/src/components/views/calc/node-card/chips.tsx +8 -40
  64. package/src/components/views/calc/node-card/far.tsx +13 -65
  65. package/src/components/views/calc/node-card/full.tsx +133 -83
  66. package/src/components/views/calc/node-card/index.tsx +1 -0
  67. package/src/components/views/calc/node-card/menu.tsx +93 -22
  68. package/src/components/views/calc/node-card/port-cells.tsx +186 -0
  69. package/src/components/views/calc/node-card/port-rails.tsx +251 -0
  70. package/src/components/views/calc/node-card/ports.tsx +86 -0
  71. package/src/components/views/calc/recipe-picker/body.tsx +17 -14
  72. package/src/components/views/calc/recipe-picker/footer.tsx +5 -3
  73. package/src/components/views/calc/recipe-picker/index.tsx +5 -0
  74. package/src/components/views/calc/sidebar.tsx +19 -10
  75. package/src/components/views/calc/trees/icon-picker.tsx +3 -2
  76. package/src/components/views/calc/trees/index.tsx +5 -4
  77. package/src/components/views/calc/trees/label.tsx +6 -4
  78. package/src/components/views/calc/trees/rows.tsx +6 -5
  79. package/src/components/views/forge/gui.tsx +2 -1
  80. package/src/components/views/forge/index.tsx +14 -7
  81. package/src/components/views/forge/list.tsx +3 -2
  82. package/src/components/views/forge/workbench/controls.tsx +13 -6
  83. package/src/components/views/forge/workbench/index.tsx +3 -2
  84. package/src/components/views/forge/workbench/panel.tsx +1 -0
  85. package/src/components/views/forge/workbench/ruler.tsx +5 -4
  86. package/src/components/views/forge/workbench/status.tsx +6 -5
  87. package/src/components/views/forge/workbench/tape.tsx +5 -4
  88. package/src/hooks/alloy/use-fluid-colors.ts +12 -9
  89. package/src/hooks/alloy/use-mix-state.ts +3 -2
  90. package/src/hooks/calc/flow/use-engage.ts +129 -0
  91. package/src/hooks/calc/flow/use-handlers.ts +192 -0
  92. package/src/hooks/calc/flow/use-layout.ts +105 -0
  93. package/src/hooks/calc/flow/{mount.ts → use-mount.ts} +1 -0
  94. package/src/hooks/calc/flow/{nodes.ts → use-nodes.ts} +46 -37
  95. package/src/hooks/calc/flow/use-pickers.ts +57 -0
  96. package/src/hooks/calc/flow/{viewport.ts → use-viewport.ts} +13 -26
  97. package/src/hooks/calc/flow/{window.ts → use-window.ts} +1 -0
  98. package/src/hooks/calc/use-actions.ts +208 -229
  99. package/src/hooks/calc/use-amounts.ts +23 -60
  100. package/src/hooks/calc/use-data.ts +106 -192
  101. package/src/hooks/calc/use-defaults.ts +4 -2
  102. package/src/hooks/calc/use-far-mode.ts +1 -0
  103. package/src/hooks/calc/use-focus.ts +8 -7
  104. package/src/hooks/calc/use-maps.ts +1 -0
  105. package/src/hooks/calc/use-reset.ts +1 -0
  106. package/src/hooks/calc/use-resolver.ts +32 -196
  107. package/src/hooks/calc/use-session.ts +1 -0
  108. package/src/hooks/calc/use-share.ts +5 -2
  109. package/src/hooks/calc/use-storage.ts +5 -4
  110. package/src/hooks/calc/use-tier.ts +1 -0
  111. package/src/hooks/calc/use-view-mode.ts +1 -0
  112. package/src/hooks/calc/use-worker.ts +56 -121
  113. package/src/hooks/forge/use-anvil-gui.ts +4 -2
  114. package/src/hooks/forge/use-forge-state.ts +1 -0
  115. package/src/hooks/forge/use-ruler.ts +1 -0
  116. package/src/hooks/use-add-to-calc.ts +23 -19
  117. package/src/hooks/use-categories-by-id.ts +18 -0
  118. package/src/hooks/use-favorite-hotkey.ts +1 -0
  119. package/src/hooks/use-favorites.ts +1 -0
  120. package/src/hooks/use-group-outlines.ts +1 -0
  121. package/src/hooks/use-hide-unused.ts +2 -1
  122. package/src/hooks/use-index.ts +6 -2
  123. package/src/hooks/use-item-feeds.ts +3 -1
  124. package/src/hooks/use-item-pane.ts +6 -4
  125. package/src/hooks/use-item-press.ts +27 -23
  126. package/src/hooks/use-item-tag-groups.ts +4 -2
  127. package/src/hooks/use-item-tooltips.ts +3 -1
  128. package/src/hooks/use-left-sidebar-tree.ts +11 -3
  129. package/src/hooks/use-mod-names.ts +4 -2
  130. package/src/hooks/use-mount-limit.ts +1 -0
  131. package/src/hooks/use-panel-cells.ts +3 -1
  132. package/src/hooks/use-panel-page.ts +9 -6
  133. package/src/hooks/use-panel-tabs.ts +2 -1
  134. package/src/hooks/use-query.ts +8 -6
  135. package/src/hooks/use-session.ts +6 -2
  136. package/src/hooks/use-sidebar-group.ts +3 -7
  137. package/src/hooks/use-tag-members.ts +3 -1
  138. package/src/hooks/use-tool-recipes.ts +1 -0
  139. package/src/hooks/use-type-filter.ts +1 -0
  140. package/src/lib/alloy/mix.ts +1 -0
  141. package/src/lib/alloy/parse.ts +1 -0
  142. package/src/lib/calc/defaults.ts +6 -4
  143. package/src/lib/calc/flow.ts +143 -107
  144. package/src/lib/calc/focus.ts +1 -0
  145. package/src/lib/calc/meta.ts +3 -1
  146. package/src/lib/calc/pack.ts +47 -154
  147. package/src/lib/calc/ports.ts +43 -0
  148. package/src/lib/calc/resolve.ts +6 -38
  149. package/src/lib/calc/route/buckets.ts +1 -0
  150. package/src/lib/calc/route/geometry.ts +13 -24
  151. package/src/lib/calc/route/index.ts +1 -0
  152. package/src/lib/calc/route/polyline.ts +3 -3
  153. package/src/lib/calc/route/router.ts +181 -57
  154. package/src/lib/calc/scheme.ts +226 -0
  155. package/src/lib/calc/storage/entry.ts +27 -19
  156. package/src/lib/calc/storage/index.ts +2 -0
  157. package/src/lib/calc/storage/keys.ts +4 -8
  158. package/src/lib/calc/storage/store.ts +11 -36
  159. package/src/lib/calc/tree/index.ts +2 -16
  160. package/src/lib/calc/tree/materials.ts +1 -0
  161. package/src/lib/calc/tree/recipe.ts +1 -0
  162. package/src/lib/calc/tree/share.ts +86 -149
  163. package/src/lib/calc/worker/api.ts +3 -11
  164. package/src/lib/calc/worker/fetch.ts +1 -0
  165. package/src/lib/calc/worker/flush.ts +7 -20
  166. package/src/lib/calc/worker/index.ts +1 -1
  167. package/src/lib/calc/worker/protocol.ts +16 -13
  168. package/src/lib/calc/worker/resolve.ts +32 -84
  169. package/src/lib/calc/worker/state.ts +5 -6
  170. package/src/{components/cards/card/model.ts → lib/card-model.ts} +1 -0
  171. package/src/lib/client/recipe-categories.ts +11 -93
  172. package/src/lib/client/recipe.ts +13 -11
  173. package/src/lib/client-index/catalog.ts +33 -27
  174. package/src/lib/client-index/chrome.ts +30 -30
  175. package/src/lib/client-index/index.ts +1 -0
  176. package/src/lib/client-index/registry.ts +70 -59
  177. package/src/lib/client-index/rows.ts +63 -57
  178. package/src/lib/client-index/tooltips.ts +28 -34
  179. package/src/lib/config.ts +2 -1
  180. package/src/lib/data/category/dto.ts +4 -3
  181. package/src/lib/data/category/load.ts +9 -8
  182. package/src/lib/data/category/parse.ts +4 -3
  183. package/src/lib/data/dto.ts +4 -3
  184. package/src/lib/data/grid.ts +2 -1
  185. package/src/lib/data/parse/entry.ts +3 -2
  186. package/src/lib/data/parse/index.ts +1 -0
  187. package/src/lib/data/parse/layout.ts +5 -2
  188. package/src/lib/data/parse/slots.ts +3 -2
  189. package/src/lib/data/parse/widgets.ts +3 -2
  190. package/src/lib/data/scene.ts +1 -1
  191. package/src/lib/data/slot-io.ts +1 -0
  192. package/src/lib/dump.ts +4 -3
  193. package/src/lib/embed.ts +22 -0
  194. package/src/lib/favorite-hover.ts +1 -0
  195. package/src/lib/fluid-outputs.ts +10 -12
  196. package/src/lib/forge/actions.ts +2 -1
  197. package/src/lib/forge/data.ts +2 -1
  198. package/src/lib/forge/solve.ts +1 -0
  199. package/src/lib/group.ts +1 -0
  200. package/src/lib/index-store.ts +15 -9
  201. package/src/lib/links.ts +15 -9
  202. package/src/lib/lookup.ts +10 -8
  203. package/src/lib/panel-outline.ts +1 -0
  204. package/src/lib/panel.ts +3 -2
  205. package/src/lib/preview.ts +12 -8
  206. package/src/lib/recipe-slots.ts +1 -0
  207. package/src/lib/search.ts +1 -0
  208. package/src/lib/sidebar.ts +1 -0
  209. package/src/lib/used-items.ts +1 -0
  210. package/src/locales/en_us.json +170 -226
  211. package/src/locales/ru_ru.json +170 -226
  212. package/src/locales.ts +1 -0
  213. package/src/types/alloy.ts +1 -0
  214. package/src/{hooks/calc/flow/props.ts → types/calc-flow-props.ts} +18 -14
  215. package/src/types/calc.ts +41 -44
  216. package/src/types/forge.ts +1 -0
  217. package/src/types/index.ts +4 -2
  218. package/styles/calc.css +308 -47
  219. package/src/components/cards/fit-card.tsx +0 -26
  220. package/src/components/views/calc/target.tsx +0 -271
  221. package/src/hooks/calc/flow/engage.ts +0 -89
  222. package/src/hooks/calc/flow/handlers.ts +0 -115
  223. package/src/hooks/calc/flow/layout.ts +0 -149
  224. package/src/hooks/calc/flow/pickers.ts +0 -50
  225. package/src/hooks/calc/use-calc-fill.ts +0 -91
  226. package/src/hooks/calc/use-density.ts +0 -28
  227. package/src/hooks/calc/use-derived.ts +0 -258
  228. package/src/hooks/calc/use-direction.ts +0 -23
  229. package/src/hooks/calc/use-edge-style.ts +0 -40
  230. package/src/hooks/calc/use-fill.ts +0 -213
  231. package/src/lib/alloy/alloy.test.ts +0 -186
  232. package/src/lib/calc/tree/build.ts +0 -196
  233. package/src/lib/calc/tree/context.ts +0 -42
  234. package/src/lib/calc/tree/goal.ts +0 -64
  235. package/src/lib/calc/tree/ideal.ts +0 -36
  236. package/src/lib/calc/tree/pick.ts +0 -68
  237. package/src/lib/calc/tree/tree.test.ts +0 -169
  238. package/src/lib/calc/worker/fill.ts +0 -123
  239. package/src/lib/client-index/cache.ts +0 -13
  240. package/src/lib/forge/forge.test.ts +0 -123
@@ -1,228 +1,172 @@
1
1
  {
2
- "recipe": {
3
- "forge": {
4
- "title": "Ковка",
5
- "search": "Поиск рецептов",
6
- "empty": "В этом дампе нет подходящих рецептов.",
7
- "missing": "Рецепт не найден в этом дампе. Выберите другой рецепт.",
8
- "load_error": "Не удалось загрузить рецепты. Обновите страницу для повторной попытки.",
9
- "unsupported": "В дампе отсутствуют или не распознаны правила ковки. Безопасное решение рассчитать нельзя.",
10
- "current": "Текущая работа",
11
- "target": "Цель",
12
- "solve": "Решить",
13
- "undo": "Отменить действие",
14
- "reset": "Сбросить заготовку",
15
- "copy": "Копировать шаги",
16
- "copied": "Скопировано",
17
- "work": "Работа",
18
- "no_solution": "Для этой цели нет последовательности с такими правилами. Сбросьте заготовку и попробуйте другую цель.",
19
- "over_target": "Работа выше цели — вернитесь протяжкой или лёгкими ударами.",
20
- "trim_to": "Обрезать до этого шага",
21
- "expand_steps": "Показать все шаги",
22
- "done": "Готово",
23
- "ruler": "Шкала работы",
24
- "solving": "Решается…"
25
- },
26
- "alloy": {
27
- "title": "Сплавы",
28
- "search": "Поиск сплавов",
29
- "empty": "В этом дампе нет подходящих рецептов.",
30
- "missing": "Рецепт не найден в этом дампе. Выберите другой сплав.",
31
- "load_error": "Не удалось загрузить рецепты. Обновите страницу для повторной попытки.",
32
- "total": "Целевой итог",
33
- "invalid_total": "Введите положительное количество металла.",
34
- "units": "ед.",
35
- "valid": "Сплав верный",
36
- "invalid": "Вне допустимых диапазонов",
37
- "result": "Сплав",
38
- "fill": "Заполнить по рецепту",
39
- "fix": "Долить до минимума",
40
- "reset": "Сброс к соотношению",
41
- "total_in": "Всего",
42
- "unit": {
43
- "mb": "мБ",
44
- "ingot": "сл."
45
- },
46
- "ratio_ingots": "Соотношение рецепта в слитках",
47
- "apply": "Подставить",
48
- "hint": {
49
- "mb": "Миллибакеты (мБ)",
50
- "ingot": "Слитки — 1 слиток = 144 мБ",
51
- "fill": "Распределить целевой итог по металлам в пропорции рецепта",
52
- "scale": "Масштабирует текущую смесь под этот итог по мере ввода",
53
- "fix": "Долить минимум металла, чтобы все доли попали в диапазоны",
54
- "reset": "Вернуть смесь по соотношению рецепта",
55
- "apply": "Подставить соотношение рецепта в целых слитках",
56
- "mult": "Подставить соотношение рецепта с множителем",
57
- "snap": "Округлить каждый металл до целых слитков, оставаясь в диапазонах",
58
- "economize": "Поставить металл на нижнюю границу диапазона; остальные — по пропорции рецепта"
59
- },
60
- "presets": "Готовые итоги",
61
- "snap_ingots": "Округлить до слитков",
62
- "copy_mix": "Скопировать смесь текстом",
63
- "economize": "Минимум",
64
- "step": {
65
- "up": "Добавить 1",
66
- "down": "Убрать 1"
67
- },
68
- "range_allowed": "Допустимое окно"
69
- },
70
- "calculator": "Калькулятор",
71
- "add_favorite": "Добавить в избранное",
72
- "remove_favorite": "Убрать из избранного",
73
- "all_items": "Все предметы",
74
- "axis_type": "Категории",
75
- "copied": "Скопировано",
76
- "copy": "Копировать id",
77
- "copy_nbt": "Копировать NBT",
78
- "copy_recipe_id": "Копировать id рецепта",
79
- "copy_stack": "Копировать id стака",
80
- "empty_items": "Нет подходящих предметов.",
81
- "empty_tags": "У этого предмета нет тегов.",
82
- "empty_type": "Нет рецептов этого типа.",
83
- "expand": "Развернуть",
84
- "favorites": "Избранное",
85
- "favorites_empty": "Пока ничего не добавлено.",
86
- "hide_unused": "Скрывать неиспользуемые",
87
- "hide_unused_empty": "С включённым «Скрывать неиспользуемые» предметов не найдено. Отключите фильтр, чтобы открыть весь каталог.",
88
- "items": "Предметы",
89
- "loading": "Загрузка рецепта…",
90
- "nbt": "NBT",
91
- "no_dump": "Нет дампа рецептов для этого пака. Запустите экспорт, чтобы сгенерировать данные.",
92
- "no_image": "В дампе нет изображения рецепта.",
93
- "page_of": "{page}/{pages}",
94
- "pane_recipes": "Рецепты",
95
- "pane_tags": "Теги",
96
- "pane_uses": "Используется",
97
- "search": "Поиск предметов",
98
- "settings": "Настройки",
99
- "sidebar_group_mod": "Группировать сайдбар по модам",
100
- "tags_block": "Блоки",
101
- "tags_item": "Предметы",
102
- "search_empty": "Ничего не найдено",
103
- "calc": {
104
- "add": {
105
- "title": "В калькулятор",
106
- "stock": "На склад",
107
- "node": "Добавить недостающий узел"
108
- },
109
- "set_target": "Сделать целью",
110
- "auto": {
111
- "title": "Рецепт по умолчанию",
112
- "build": "Заполнить дерево"
113
- },
114
- "experimental": "Экспериментально",
115
- "remove": {
116
- "recipe": "Убрать рецепт",
117
- "history": "Удалить из истории",
118
- "title": "Убрать цель"
119
- },
120
- "relayout": "Раскладка",
121
- "hint": {
122
- "collapsed": "Свёрнуто — выберите рецепт для развёртывания",
123
- "cycle": "Цикл — рецепт требует сам себя выше по цепочке",
124
- "catalyst": "Катализатор — нужен рецепту, но не расходуется",
125
- "source": "Нет рецепта — берётся из остатков или добывается"
126
- },
127
- "pick": {
128
- "title": "Выбрать рецепт",
129
- "icon": "Выбрать иконку"
130
- },
131
- "catalysts": "Катализаторы",
132
- "clear": {
133
- "title": "Очистить",
134
- "default": "Забыть рецепт"
135
- },
136
- "collapse": "Свернуть",
137
- "copy_id": "Копировать id",
138
- "dir": {
139
- "h": "Горизонтальная раскладка",
140
- "v": "Вертикальная раскладка"
141
- },
142
- "edge": {
143
- "title": "Тип линий",
144
- "default": "Безье",
145
- "straight": "Прямая",
146
- "step": "Ступенчатая",
147
- "smoothstep": "Плавная ступенчатая",
148
- "circuit": "Схема"
149
- },
150
- "empty": "Кликните по предмету в каталоге, чтобы задать цель.",
151
- "far": {
152
- "title": "Карточки при отдалении",
153
- "full": "Полная карточка",
154
- "preview": "Превью",
155
- "hidden": "Скрыть"
156
- },
157
- "goal": "Цель",
158
- "stock": "Склад",
159
- "ideal": "Без остатков ×{count}",
160
- "trees": "Деревья",
161
- "new_tab": "Новое дерево",
162
- "history": "История",
163
- "rename": "Переименовать",
164
- "close_tab": "Закрыть дерево",
165
- "tab": {
166
- "untitled": "Дерево без названия"
167
- },
168
- "help": {
169
- "title": "Справка калькулятора",
170
- "recipe": "Узел разрешён рецептом",
171
- "catalyst": "Катализатор (не расходуется)",
172
- "cycle": "Цикл в рецептах",
173
- "chip": "Рецепт/член тега — выбор",
174
- "ctx": "Меню узла",
175
- "satisfied": "Часть потребности покрыта остатками",
176
- "edges": "Стрелки идут от ингредиента к продукту",
177
- "edge_out": "Исходящие связи",
178
- "edge_in": "Входящие связи",
179
- "edge_catalyst": "Связь-катализатор",
180
- "focus": "Сфокусированный узел",
181
- "sec_nodes": "Узлы",
182
- "sec_edges": "Связи",
183
- "sec_actions": "Действия",
184
- "hover": "Превью рецепта",
185
- "source": "Рецепта нет; сырьё",
186
- "modes": "Режимы вида",
187
- "nav": "Панорама и зум"
188
- },
189
- "member": {
190
- "title": "Выбрать член тега",
191
- "search": "Найти член тега…"
192
- },
193
- "mode": {
194
- "mini": "Компактный вид",
195
- "normal": "Карточки",
196
- "detailed": "Рецепты"
197
- },
198
- "open": {
199
- "title": "Открыть калькулятор",
200
- "item": "Открыть страницу предмета"
201
- },
202
- "inputs": "Входы",
203
- "outputs": "Выходы",
204
- "satisfied": "покрыто складом или остатками",
205
- "chance": "шанс потребления",
206
- "select": "Выбрать рецепт",
207
- "set_default": "Запомнить рецепт",
208
- "view": {
209
- "title": "Настройки вида",
210
- "modes": "Карточки",
211
- "dir": "Раскладка",
212
- "edge": "Линии"
213
- },
214
- "share": "Поделиться",
215
- "density": {
216
- "title": "Плотность",
217
- "compact": "Компактная",
218
- "comfortable": "Свободная"
219
- }
220
- }
221
- },
222
- "sections": {
223
- "recipe": "Рецепты",
224
- "desc": {
225
- "recipe": "Крафт и переработка"
226
- }
227
- }
2
+ "Actions(recipe.calc.help.sec_actions)": "Действия",
3
+ "Add 1(recipe.alloy.step.up)": "Добавить 1",
4
+ "Add card(recipe.calc.add.goal)": "Добавить карточку",
5
+ "Add just enough metal to bring every share into its range(recipe.alloy.hint.fix)": "Долить минимум металла, чтобы все доли попали в диапазоны",
6
+ "Add to calculator(recipe.calc.add.title)": "В калькулятор",
7
+ "Add to favorites(recipe.add_favorite)": "Добавить в избранное",
8
+ "All items(recipe.all_items)": "Все предметы",
9
+ "Allowed window(recipe.alloy.range_allowed)": "Допустимое окно",
10
+ "Alloy(recipe.alloy.result)": "Сплав",
11
+ "Alloys(recipe.alloy.title)": "Сплавы",
12
+ "Apply the recipe ratio multiplied(recipe.alloy.hint.mult)": "Подставить соотношение рецепта с множителем",
13
+ "Apply(recipe.alloy.apply)": "Подставить",
14
+ "Arrows flow from ingredient to product(recipe.calc.help.edges)": "Стрелки идут от ингредиента к продукту",
15
+ "Auto layout(recipe.calc.relayout)": "Раскладка",
16
+ "Blocks(recipe.tags_block)": "Блоки",
17
+ "Calculator help(recipe.calc.help.title)": "Справка калькулятора",
18
+ "Calculator(recipe.calculator)": "Калькулятор",
19
+ "Card view(recipe.calc.mode.normal)": "Карточки",
20
+ "Cards when zoomed out(recipe.calc.far.title)": "Карточки при отдалении",
21
+ "Cards(recipe.calc.view.modes)": "Карточки",
22
+ "Catalyst: needed but not consumed; wire it or click to pick a supplier(recipe.calc.help.port_cat)": "Катализатор: нужен, но не расходуется; провод или клик выбрать поставщика",
23
+ "Catalyst: required by the recipe but not consumed(recipe.calc.hint.catalyst)": "Катализатор: нужен рецепту, но не расходуется",
24
+ "Catalysts(recipe.calc.catalysts)": "Катализаторы",
25
+ "Categories(recipe.axis_type)": "Категории",
26
+ "Choose recipe(recipe.calc.select)": "Выбрать рецепт",
27
+ "Choose tag member(recipe.calc.member.title)": "Выбрать член тега",
28
+ "Clear(recipe.calc.clear.title)": "Очистить",
29
+ "Click an item in the catalog to add a card.(recipe.calc.empty)": "Кликните по предмету в каталоге, чтобы добавить карточку.",
30
+ "Close scheme(recipe.calc.close_tab)": "Закрыть схему",
31
+ "Collapse(recipe.calc.collapse)": "Свернуть",
32
+ "Compact view(recipe.calc.mode.mini)": "Компактный вид",
33
+ "Copied(recipe.copied)": "Скопировано",
34
+ "Copied(recipe.forge.copied)": "Скопировано",
35
+ "Copy NBT(recipe.copy_nbt)": "Копировать NBT",
36
+ "Copy id(recipe.calc.copy_id)": "Копировать id",
37
+ "Copy id(recipe.copy)": "Копировать id",
38
+ "Copy recipe id(recipe.copy_recipe_id)": "Копировать id рецепта",
39
+ "Copy stack id(recipe.copy_stack)": "Копировать id стака",
40
+ "Copy steps(recipe.forge.copy)": "Копировать шаги",
41
+ "Copy the mix as text(recipe.alloy.copy_mix)": "Скопировать смесь текстом",
42
+ "Could not load recipes. Reload the page to retry.(recipe.alloy.load_error)": "Не удалось загрузить рецепты. Обновите страницу для повторной попытки.",
43
+ "Could not load recipes. Reload the page to retry.(recipe.forge.load_error)": "Не удалось загрузить рецепты. Обновите страницу для повторной попытки.",
44
+ "Covered by another card output(recipe.calc.help.satisfied)": "Покрыто выходом другой карточки",
45
+ "Crafting and processing recipes(sections.desc.recipe)": "Крафт и переработка",
46
+ "Crafts(recipe.calc.crafts.title)": "Крафты",
47
+ "Current work(recipe.forge.current)": "Текущая работа",
48
+ "Default recipe(recipe.calc.auto.title)": "Рецепт по умолчанию",
49
+ "Done(recipe.forge.done)": "Готово",
50
+ "Drag port to port to link; drag a wire end to retarget(recipe.calc.help.edge_link)": "Тяните от порта к порту; конец линии можно перетащить на другой порт",
51
+ "Edges(recipe.calc.help.sec_edges)": "Связи",
52
+ "Enter a positive total amount.(recipe.alloy.invalid_total)": "Введите положительное количество металла.",
53
+ "Expand(recipe.expand)": "Развернуть",
54
+ "Favorites(recipe.favorites)": "Избранное",
55
+ "Fewer crafts(recipe.calc.crafts.down)": "Меньше крафтов",
56
+ "Fill by recipe(recipe.alloy.fill)": "Заполнить по рецепту",
57
+ "Fill fields with the recipe ratio in whole ingots(recipe.alloy.hint.apply)": "Подставить соотношение рецепта в целых слитках",
58
+ "Flow on a wire - shows on hover; click to cap the amount(recipe.calc.help.edge_flow)": "Число на линии - поток; видно при наведении, клик ограничивает",
59
+ "Focused node(recipe.calc.help.focus)": "Сфокусированный узел",
60
+ "Forging(recipe.forge.title)": "Ковка",
61
+ "Full card(recipe.calc.far.full)": "Полная карточка",
62
+ "Group sidebar by mod(recipe.sidebar_group_mod)": "Группировать сайдбар по модам",
63
+ "Hidden ports - scroll the rail or click the arrow(recipe.calc.help.port_more)": "Скрытые порты - прокрутите колесом или стрелкой",
64
+ "Hide unused(recipe.hide_unused)": "Скрывать неиспользуемые",
65
+ "Hide(recipe.calc.far.hidden)": "Скрыть",
66
+ "History(recipe.calc.history)": "История",
67
+ "Incoming edges(recipe.calc.help.edge_in)": "Входящие связи",
68
+ "Ingots: 1 ingot = 144 mB(recipe.alloy.hint.ingot)": "Слитки: 1 слиток = 144 мБ",
69
+ "Input port: click to pick a supplier or drag a wire(recipe.calc.help.port_in)": "Вход: клик выбрать поставщика или протянуть провод",
70
+ "Inputs(recipe.calc.inputs)": "Входы",
71
+ "Items(recipe.items)": "Предметы",
72
+ "Items(recipe.tags_item)": "Предметы",
73
+ "Keep as external source(recipe.calc.supply.source)": "Оставить внешним источником",
74
+ "Loading recipe…(recipe.loading)": "Загрузка рецепта…",
75
+ "Millibuckets (mB)(recipe.alloy.hint.mb)": "Миллибакеты (мБ)",
76
+ "Minimize(recipe.alloy.economize)": "Минимум",
77
+ "More crafts(recipe.calc.crafts.up)": "Больше крафтов",
78
+ "NBT(recipe.nbt)": "NBT",
79
+ "New card with recipe(recipe.calc.supply.recipe)": "Новая карточка с рецептом",
80
+ "New scheme(recipe.calc.new_tab)": "Новая схема",
81
+ "No favorites yet.(recipe.favorites_empty)": "Пока ничего не добавлено.",
82
+ "No items match with Hide unused enabled. Turn it off to browse the full catalog.(recipe.hide_unused_empty)": "С включённым «Скрывать неиспользуемые» предметов не найдено. Отключите фильтр, чтобы открыть весь каталог.",
83
+ "No matching items.(recipe.empty_items)": "Нет подходящих предметов.",
84
+ "No matching recipes in this dump.(recipe.alloy.empty)": "В этом дампе нет подходящих рецептов.",
85
+ "No matching recipes in this dump.(recipe.forge.empty)": "В этом дампе нет подходящих рецептов.",
86
+ "No recipe dump for this dataset. Run export to generate data.(recipe.no_dump)": "Нет дампа рецептов для этого пака. Запустите экспорт, чтобы сгенерировать данные.",
87
+ "No recipe image in dump.(recipe.no_image)": "В дампе нет изображения рецепта.",
88
+ "No recipe: taken from remainders or gathered externally(recipe.calc.hint.source)": "Нет рецепта: берётся из остатков или добывается",
89
+ "No recipe; raw material(recipe.calc.help.source)": "Рецепта нет; сырьё",
90
+ "No recipes of this type.(recipe.empty_type)": "Нет рецептов этого типа.",
91
+ "No results found(recipe.search_empty)": "Ничего не найдено",
92
+ "No sequence reaches this target under these rules. Reset the workpiece and try another target.(recipe.forge.no_solution)": "Для этой цели нет последовательности с такими правилами. Сбросьте заготовку и попробуйте другую цель.",
93
+ "No tags for this item.(recipe.empty_tags)": "У этого предмета нет тегов.",
94
+ "Node context menu(recipe.calc.help.ctx)": "Меню узла",
95
+ "Nodes(recipe.calc.help.sec_nodes)": "Узлы",
96
+ "Open calculator(recipe.calc.open.title)": "Открыть калькулятор",
97
+ "Open item page(recipe.calc.open.item)": "Открыть страницу предмета",
98
+ "Outgoing edges(recipe.calc.help.edge_out)": "Исходящие связи",
99
+ "Output port: click to pick a recipe or drag a wire(recipe.calc.help.port_out)": "Выход: клик выбрать рецепт или протянуть провод",
100
+ "Outputs(recipe.calc.outputs)": "Выходы",
101
+ "Outside allowed ranges(recipe.alloy.invalid)": "Вне допустимых диапазонов",
102
+ "Overdrawn: more is wired out than produced(recipe.calc.overdrawn)": "Перерасход: соединено больше, чем производится",
103
+ "Pan and zoom(recipe.calc.help.nav)": "Панорама и зум",
104
+ "Pick a recipe(recipe.calc.pick.title)": "Выбрать рецепт",
105
+ "Pick icon(recipe.calc.pick.icon)": "Выбрать иконку",
106
+ "Pin as default recipe(recipe.calc.set_default)": "Запомнить рецепт",
107
+ "Plan(recipe.calc.plan)": "План",
108
+ "Ports(recipe.calc.help.sec_ports)": "Порты",
109
+ "Preview(recipe.calc.far.preview)": "Превью",
110
+ "Products(recipe.calc.products)": "Продукты",
111
+ "Quick totals(recipe.alloy.presets)": "Готовые итоги",
112
+ "Recipe cycle: the recipe needs itself upstream(recipe.calc.hint.cycle)": "Цикл: рецепт требует сам себя выше по цепочке",
113
+ "Recipe cycle(recipe.calc.help.cycle)": "Цикл в рецептах",
114
+ "Recipe not found in this dump. Select another alloy.(recipe.alloy.missing)": "Рецепт не найден в этом дампе. Выберите другой сплав.",
115
+ "Recipe not found in this dump. Select another recipe.(recipe.forge.missing)": "Рецепт не найден в этом дампе. Выберите другой рецепт.",
116
+ "Recipe preview(recipe.calc.help.hover)": "Превью рецепта",
117
+ "Recipe ratio in ingots(recipe.alloy.ratio_ingots)": "Соотношение рецепта в слитках",
118
+ "Recipe view(recipe.calc.mode.detailed)": "Рецепты",
119
+ "Recipe/tag member: open picker(recipe.calc.help.chip)": "Рецепт/член тега: выбор",
120
+ "Recipes(recipe.pane_recipes)": "Рецепты",
121
+ "Recipes(sections.recipe)": "Рецепты",
122
+ "Remove 1(recipe.alloy.step.down)": "Убрать 1",
123
+ "Remove card(recipe.calc.remove.title)": "Убрать карточку",
124
+ "Remove from favorites(recipe.remove_favorite)": "Убрать из избранного",
125
+ "Remove from history(recipe.calc.remove.history)": "Удалить из истории",
126
+ "Remove recipe(recipe.calc.remove.recipe)": "Убрать рецепт",
127
+ "Rename(recipe.calc.rename)": "Переименовать",
128
+ "Reset the workpiece(recipe.forge.reset)": "Сбросить заготовку",
129
+ "Reset to recipe ratio(recipe.alloy.reset)": "Сброс к соотношению",
130
+ "Resolved with a recipe(recipe.calc.help.recipe)": "Узел разрешён рецептом",
131
+ "Restore the recipe-ratio mix(recipe.alloy.hint.reset)": "Вернуть смесь по соотношению рецепта",
132
+ "Round each metal to whole ingots, staying inside the ranges(recipe.alloy.hint.snap)": "Округлить каждый металл до целых слитков, оставаясь в диапазонах",
133
+ "Scales the current mix to this total as you type(recipe.alloy.hint.scale)": "Масштабирует текущую смесь под этот итог по мере ввода",
134
+ "Schemes(recipe.calc.trees)": "Схемы",
135
+ "Search alloys(recipe.alloy.search)": "Поиск сплавов",
136
+ "Search items(recipe.search)": "Поиск предметов",
137
+ "Search member…(recipe.calc.member.search)": "Найти член тега…",
138
+ "Search recipes(recipe.forge.search)": "Поиск рецептов",
139
+ "Set this metal to the lower bound of its range; others keep the recipe ratio(recipe.alloy.hint.economize)": "Поставить металл на нижнюю границу диапазона; остальные по пропорции рецепта",
140
+ "Settings(recipe.settings)": "Настройки",
141
+ "Share(recipe.calc.share)": "Поделиться",
142
+ "Shift + hover a wire shows x - click to delete it(recipe.calc.help.edge_cut)": "Shift + наведение на линию показывает x - клик удаляет её",
143
+ "Show all steps(recipe.forge.expand_steps)": "Показать все шаги",
144
+ "Snap to whole ingots(recipe.alloy.snap_ingots)": "Округлить до слитков",
145
+ "Solve(recipe.forge.solve)": "Решить",
146
+ "Solving…(recipe.forge.solving)": "Решается…",
147
+ "Split the target total between metals by the recipe ratio(recipe.alloy.hint.fill)": "Распределить целевой итог по металлам в пропорции рецепта",
148
+ "Tags(recipe.pane_tags)": "Теги",
149
+ "Target total(recipe.alloy.total)": "Целевой итог",
150
+ "Target(recipe.forge.target)": "Цель",
151
+ "The dump contains missing or unrecognized forging rules. A safe solution cannot be calculated.(recipe.forge.unsupported)": "В дампе отсутствуют или не распознаны правила ковки. Безопасное решение рассчитать нельзя.",
152
+ "Top up to minimum(recipe.alloy.fix)": "Долить до минимума",
153
+ "Total(recipe.alloy.total_in)": "Всего",
154
+ "Trim to this step(recipe.forge.trim_to)": "Обрезать до этого шага",
155
+ "Undo last action(recipe.forge.undo)": "Отменить действие",
156
+ "Unpin default recipe(recipe.calc.clear.default)": "Забыть рецепт",
157
+ "Untitled scheme(recipe.calc.tab.untitled)": "Схема без названия",
158
+ "Use an existing card(recipe.calc.supply.existing)": "Взять существующую карточку",
159
+ "Uses(recipe.pane_uses)": "Используется",
160
+ "Valid alloy(recipe.alloy.valid)": "Сплав верный",
161
+ "View modes(recipe.calc.help.modes)": "Режимы вида",
162
+ "View settings(recipe.calc.view.title)": "Настройки вида",
163
+ "Work is above the target, use Draw or lighter hits to come back.(recipe.forge.over_target)": "Работа выше цели, вернитесь протяжкой или лёгкими ударами.",
164
+ "Work ruler(recipe.forge.ruler)": "Шкала работы",
165
+ "Work(recipe.forge.work)": "Работа",
166
+ "ing.(recipe.alloy.unit.ingot)": "сл.",
167
+ "input(recipe.calc.port.in)": "вход",
168
+ "mB(recipe.alloy.unit.mb)": "мБ",
169
+ "output(recipe.calc.port.out)": "выход",
170
+ "units(recipe.alloy.units)": "ед.",
171
+ "{page}/{pages}(recipe.page_of)": "{page}/{pages}"
228
172
  }
package/src/locales.ts CHANGED
@@ -3,3 +3,4 @@ import { createLocaleCatalog } from '@terrafirmagreg-team/translate/lib/locales'
3
3
  export const locales = createLocaleCatalog(
4
4
  import.meta.glob('./locales/*.json', { eager: true, import: 'default' }),
5
5
  );
6
+
@@ -17,3 +17,4 @@ export type AlloyMixRow = {
17
17
  percent: number;
18
18
  valid: boolean;
19
19
  };
20
+
@@ -1,40 +1,44 @@
1
+ import type { DatasetRef } from '@terrafirmagreg-team/sites/location';
1
2
  import type { ReactNode, RefObject } from 'react';
2
3
  import type {
3
- CalcDensity,
4
- CalcDirection,
5
- CalcEdgeStyle,
6
4
  CalcFarMode,
7
5
  CalcFlowData,
8
6
  CalcViewMode,
9
7
  } from '@terrafirmagreg-team/recipe/lib/calc/flow';
10
- import type { CalcGoal } from '@terrafirmagreg-team/recipe/lib/calc/tree';
8
+ import type {
9
+ CalcCard,
10
+ CalcNode,
11
+ CalcWire,
12
+ } from '@terrafirmagreg-team/recipe/types/calc';
11
13
  import type { RecipeSession } from '@terrafirmagreg-team/recipe/types';
12
14
 
13
15
  export type CalcFlowProps = {
14
- goals: CalcGoal[];
15
- dataset: string;
16
+ nodes: CalcNode[];
17
+ wires: CalcWire[];
18
+ flows?: readonly (number | undefined)[];
19
+ cards: CalcCard[];
20
+ dataset: DatasetRef;
16
21
  session: RecipeSession;
17
22
  data: Omit<
18
23
  CalcFlowData,
19
- 'node' | 'mode' | 'direction' | 'onRequestPicker' | 'onRequestMemberPicker'
24
+ | 'node'
25
+ | 'mode'
26
+ | 'onRequestPicker'
27
+ | 'onRequestMemberPicker'
28
+ | 'onRequestSupply'
20
29
  >;
21
30
  mode: CalcViewMode;
22
31
  onModeChange: (mode: CalcViewMode) => void;
23
- direction: CalcDirection;
24
- onDirectionChange: (direction: CalcDirection) => void;
25
- edgeStyle: CalcEdgeStyle;
26
- onEdgeStyleChange: (style: CalcEdgeStyle) => void;
27
32
  farCards: CalcFarMode;
28
33
  onFarCardsChange: (mode: CalcFarMode) => void;
29
- density: CalcDensity;
30
- onDensityChange: (density: CalcDensity) => void;
31
34
  treeReady?: boolean;
32
35
  resetGen?: number;
33
36
  canvasId?: string;
34
37
  actions?: ReactNode;
35
- panel?: ReactNode;
36
38
  empty?: ReactNode;
37
39
  focusRef?: RefObject<((materialId: string) => void) | null>;
38
40
  focusNodeId?: string | null;
39
41
  onFocusedNode?: (id: string) => void;
42
+ onRelayout?: (positions: Map<string, { x: number; y: number }>) => void;
40
43
  };
44
+
package/src/types/calc.ts CHANGED
@@ -33,63 +33,60 @@ export type CalcRecipeSummary = {
33
33
  row: RecipeCompactRow;
34
34
  };
35
35
 
36
- export type CalcNode = {
36
+ export type CalcCard = {
37
+ id: string;
37
38
  materialId: string;
38
39
  kind: CalcKind;
39
- amount: number;
40
- satisfied: number;
41
- need: number;
42
- recipe: CalcRecipe | null;
43
- batches: number;
44
- produced: number;
45
- cycle: boolean;
46
- catalyst: boolean;
47
- children: CalcNode[];
48
- availableRecipes: CalcRecipeSummary[];
49
- depth: number;
50
-
51
- consumeChance?: number;
52
- tagId?: string;
53
- members?: string[];
54
-
55
- path?: string;
56
-
57
- expandable?: boolean;
58
-
59
- auto?: boolean;
60
-
61
- collapsed?: boolean;
62
-
63
- loading?: boolean;
40
+ recipeId: string | null;
41
+ crafts: number;
42
+ pos?: { x: number; y: number };
64
43
  };
65
44
 
66
- export type CalculatorTarget = {
67
- id: string;
68
- kind: CalcKind;
69
- amount: number;
45
+ export type CalcWire = {
46
+ from: string;
47
+ to: string;
48
+ input: number;
49
+ out?: number;
50
+ amount?: number;
70
51
  };
71
52
 
72
53
  export type CalculatorState = {
73
-
74
- target: CalculatorTarget | null;
75
-
76
- inventory?: CalcMaterial[];
77
- selections: Record<string, string>;
54
+ cards: CalcCard[];
55
+ wires: CalcWire[];
78
56
  tagSelections: Record<string, string>;
57
+ };
79
58
 
80
- collapsed?: string[];
59
+ export type CalcNodeInput = {
60
+ id?: string;
61
+ kind: CalcKind;
62
+ amount: number;
63
+ catalyst: boolean;
64
+ tagId?: string;
65
+ wired: boolean;
66
+ covered: number;
67
+ };
81
68
 
82
- auto?: string[];
69
+ export type CalcOutput = CalcMaterial & {
70
+ allocated: number;
71
+ remaining: number;
83
72
  };
84
73
 
85
- export type BuildTreeInput = {
74
+ export type CalcNode = {
75
+ id: string;
86
76
  materialId: string;
87
77
  kind: CalcKind;
88
- amount: number;
89
- depth: number;
78
+ crafts: number;
79
+ produced: number;
80
+ allocated: number;
81
+ remaining: number;
82
+ outputs: CalcOutput[];
83
+ recipe: CalcRecipe | null;
84
+ inputs: CalcNodeInput[];
85
+ availableRecipes: CalcRecipeSummary[];
86
+ cycle: boolean;
87
+ products: boolean;
90
88
  tagId?: string;
91
- catalyst?: boolean;
92
-
93
- consumeChance?: number;
94
- path?: string;
89
+ members?: string[];
90
+ loading?: boolean;
95
91
  };
92
+
@@ -18,3 +18,4 @@ export type ForgeRecipe = {
18
18
  rules: ForgeRule[];
19
19
  rulesSupported: boolean;
20
20
  };
21
+