@skillcdn/console 0.4.3 → 0.4.5

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 (268) hide show
  1. package/README.md +6 -6
  2. package/dist/api.d.ts +4 -4
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +4 -4
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli/cli.d.ts.map +1 -1
  7. package/dist/cli/cli.js +255 -33
  8. package/dist/cli/cli.js.map +1 -1
  9. package/dist/cli/format.d.ts +20 -5
  10. package/dist/cli/format.d.ts.map +1 -1
  11. package/dist/cli/format.js +98 -26
  12. package/dist/cli/format.js.map +1 -1
  13. package/dist/cli/help.d.ts.map +1 -1
  14. package/dist/cli/help.js +39 -15
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/plugin-check.d.ts +5 -1
  17. package/dist/cli/plugin-check.d.ts.map +1 -1
  18. package/dist/cli/plugin-check.js +23 -4
  19. package/dist/cli/plugin-check.js.map +1 -1
  20. package/dist/cli/plugin-cli.d.ts.map +1 -1
  21. package/dist/cli/plugin-cli.js +10 -1
  22. package/dist/cli/plugin-cli.js.map +1 -1
  23. package/dist/cli/plugin-init.d.ts +2 -0
  24. package/dist/cli/plugin-init.d.ts.map +1 -1
  25. package/dist/cli/plugin-init.js +6 -0
  26. package/dist/cli/plugin-init.js.map +1 -1
  27. package/dist/client.d.ts +32 -1
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +14 -2
  30. package/dist/client.js.map +1 -1
  31. package/dist/compat.js +1 -1
  32. package/dist/components/board.d.ts +8 -0
  33. package/dist/components/board.d.ts.map +1 -1
  34. package/dist/components/board.js +49 -18
  35. package/dist/components/board.js.map +1 -1
  36. package/dist/components/decision-form.d.ts +6 -3
  37. package/dist/components/decision-form.d.ts.map +1 -1
  38. package/dist/components/decision-form.js +24 -18
  39. package/dist/components/decision-form.js.map +1 -1
  40. package/dist/components/decision-list.d.ts +5 -1
  41. package/dist/components/decision-list.d.ts.map +1 -1
  42. package/dist/components/decision-list.js +25 -5
  43. package/dist/components/decision-list.js.map +1 -1
  44. package/dist/components/event-feed.d.ts.map +1 -1
  45. package/dist/components/event-feed.js +34 -8
  46. package/dist/components/event-feed.js.map +1 -1
  47. package/dist/components/goals.d.ts.map +1 -1
  48. package/dist/components/goals.js +2 -2
  49. package/dist/components/goals.js.map +1 -1
  50. package/dist/components/home.d.ts +35 -0
  51. package/dist/components/home.d.ts.map +1 -0
  52. package/dist/components/home.js +326 -0
  53. package/dist/components/home.js.map +1 -0
  54. package/dist/components/my-decisions.d.ts +20 -3
  55. package/dist/components/my-decisions.d.ts.map +1 -1
  56. package/dist/components/my-decisions.js +14 -1
  57. package/dist/components/my-decisions.js.map +1 -1
  58. package/dist/components/pack-connect.d.ts.map +1 -1
  59. package/dist/components/pack-connect.js +5 -4
  60. package/dist/components/pack-connect.js.map +1 -1
  61. package/dist/components/people.d.ts +45 -1
  62. package/dist/components/people.d.ts.map +1 -1
  63. package/dist/components/people.js +125 -4
  64. package/dist/components/people.js.map +1 -1
  65. package/dist/components/picker.d.ts +8 -0
  66. package/dist/components/picker.d.ts.map +1 -1
  67. package/dist/components/picker.js +2 -2
  68. package/dist/components/picker.js.map +1 -1
  69. package/dist/components/plugin-frame.d.ts +3 -13
  70. package/dist/components/plugin-frame.d.ts.map +1 -1
  71. package/dist/components/plugin-frame.js +75 -21
  72. package/dist/components/plugin-frame.js.map +1 -1
  73. package/dist/components/plugin-settings.d.ts +5 -1
  74. package/dist/components/plugin-settings.d.ts.map +1 -1
  75. package/dist/components/plugin-settings.js +283 -45
  76. package/dist/components/plugin-settings.js.map +1 -1
  77. package/dist/components/projects.d.ts +0 -8
  78. package/dist/components/projects.d.ts.map +1 -1
  79. package/dist/components/projects.js +4 -14
  80. package/dist/components/projects.js.map +1 -1
  81. package/dist/components/searches.d.ts +11 -0
  82. package/dist/components/searches.d.ts.map +1 -0
  83. package/dist/components/searches.js +30 -0
  84. package/dist/components/searches.js.map +1 -0
  85. package/dist/components/task-form.d.ts.map +1 -1
  86. package/dist/components/task-form.js +6 -5
  87. package/dist/components/task-form.js.map +1 -1
  88. package/dist/components/task-view.d.ts.map +1 -1
  89. package/dist/components/task-view.js +2 -1
  90. package/dist/components/task-view.js.map +1 -1
  91. package/dist/components/ui.d.ts +16 -0
  92. package/dist/components/ui.d.ts.map +1 -1
  93. package/dist/components/ui.js +15 -2
  94. package/dist/components/ui.js.map +1 -1
  95. package/dist/connect-page.d.ts.map +1 -1
  96. package/dist/connect-page.js +5 -6
  97. package/dist/connect-page.js.map +1 -1
  98. package/dist/console.css +1123 -258
  99. package/dist/console.d.ts +12 -4
  100. package/dist/console.d.ts.map +1 -1
  101. package/dist/console.js +123 -27
  102. package/dist/console.js.map +1 -1
  103. package/dist/data.d.ts +18 -3
  104. package/dist/data.d.ts.map +1 -1
  105. package/dist/data.js +41 -1
  106. package/dist/data.js.map +1 -1
  107. package/dist/docs-page.d.ts.map +1 -1
  108. package/dist/docs-page.js +6 -5
  109. package/dist/docs-page.js.map +1 -1
  110. package/dist/home-tiles.d.ts +92 -0
  111. package/dist/home-tiles.d.ts.map +1 -0
  112. package/dist/home-tiles.js +294 -0
  113. package/dist/home-tiles.js.map +1 -0
  114. package/dist/i18n/en.d.ts +264 -1
  115. package/dist/i18n/en.d.ts.map +1 -1
  116. package/dist/i18n/en.js +260 -1
  117. package/dist/i18n/en.js.map +1 -1
  118. package/dist/i18n/index.d.ts +4 -2
  119. package/dist/i18n/index.d.ts.map +1 -1
  120. package/dist/i18n/index.js +10 -11
  121. package/dist/i18n/index.js.map +1 -1
  122. package/dist/i18n/ko.d.ts.map +1 -1
  123. package/dist/i18n/ko.js +255 -4
  124. package/dist/i18n/ko.js.map +1 -1
  125. package/dist/index.d.ts +7 -5
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +7 -5
  128. package/dist/index.js.map +1 -1
  129. package/dist/limits.d.ts +12 -0
  130. package/dist/limits.d.ts.map +1 -1
  131. package/dist/limits.js +12 -0
  132. package/dist/limits.js.map +1 -1
  133. package/dist/plugin/args.d.ts +6 -1
  134. package/dist/plugin/args.d.ts.map +1 -1
  135. package/dist/plugin/args.js +16 -11
  136. package/dist/plugin/args.js.map +1 -1
  137. package/dist/plugin/bridge.d.ts +63 -3
  138. package/dist/plugin/bridge.d.ts.map +1 -1
  139. package/dist/plugin/bridge.js +54 -0
  140. package/dist/plugin/bridge.js.map +1 -1
  141. package/dist/plugin/capabilities.d.ts +7 -1
  142. package/dist/plugin/capabilities.d.ts.map +1 -1
  143. package/dist/plugin/capabilities.js +24 -1
  144. package/dist/plugin/capabilities.js.map +1 -1
  145. package/dist/plugin/context.d.ts +174 -12
  146. package/dist/plugin/context.d.ts.map +1 -1
  147. package/dist/plugin/define.d.ts +14 -1
  148. package/dist/plugin/define.d.ts.map +1 -1
  149. package/dist/plugin/define.js +18 -2
  150. package/dist/plugin/define.js.map +1 -1
  151. package/dist/plugin/limits.d.ts +9 -2
  152. package/dist/plugin/limits.d.ts.map +1 -1
  153. package/dist/plugin/limits.js +9 -2
  154. package/dist/plugin/limits.js.map +1 -1
  155. package/dist/plugin/manifest.d.ts +98 -6
  156. package/dist/plugin/manifest.d.ts.map +1 -1
  157. package/dist/plugin/manifest.js +171 -10
  158. package/dist/plugin/manifest.js.map +1 -1
  159. package/dist/plugin/rest-schemas.d.ts +120 -0
  160. package/dist/plugin/rest-schemas.d.ts.map +1 -1
  161. package/dist/plugin/rest-schemas.js +78 -5
  162. package/dist/plugin/rest-schemas.js.map +1 -1
  163. package/dist/plugin/sandbox.d.ts +4 -3
  164. package/dist/plugin/sandbox.d.ts.map +1 -1
  165. package/dist/plugin/sandbox.js +33 -6
  166. package/dist/plugin/sandbox.js.map +1 -1
  167. package/dist/plugin/semver.d.ts +26 -0
  168. package/dist/plugin/semver.d.ts.map +1 -0
  169. package/dist/plugin/semver.js +76 -0
  170. package/dist/plugin/semver.js.map +1 -0
  171. package/dist/plugin/testing.d.ts +15 -1
  172. package/dist/plugin/testing.d.ts.map +1 -1
  173. package/dist/plugin/testing.js +42 -5
  174. package/dist/plugin/testing.js.map +1 -1
  175. package/dist/plugin/web.d.ts +16 -1
  176. package/dist/plugin/web.d.ts.map +1 -1
  177. package/dist/plugin/web.js +44 -1
  178. package/dist/plugin/web.js.map +1 -1
  179. package/dist/plugin.d.ts +3 -2
  180. package/dist/plugin.d.ts.map +1 -1
  181. package/dist/plugin.js +3 -2
  182. package/dist/plugin.js.map +1 -1
  183. package/dist/router.d.ts +19 -0
  184. package/dist/router.d.ts.map +1 -1
  185. package/dist/router.js +18 -0
  186. package/dist/router.js.map +1 -1
  187. package/dist/routes.d.ts +11 -2
  188. package/dist/routes.d.ts.map +1 -1
  189. package/dist/routes.js +14 -1
  190. package/dist/routes.js.map +1 -1
  191. package/dist/rules.d.ts +2 -2
  192. package/dist/rules.js +3 -3
  193. package/dist/schemas.d.ts +864 -2
  194. package/dist/schemas.d.ts.map +1 -1
  195. package/dist/schemas.js +156 -9
  196. package/dist/schemas.js.map +1 -1
  197. package/dist/use-action.d.ts +8 -2
  198. package/dist/use-action.d.ts.map +1 -1
  199. package/dist/use-action.js +13 -6
  200. package/dist/use-action.js.map +1 -1
  201. package/dist/vocabulary.d.ts +3 -1
  202. package/dist/vocabulary.d.ts.map +1 -1
  203. package/dist/vocabulary.js +9 -0
  204. package/dist/vocabulary.js.map +1 -1
  205. package/docs/specs/cli.md +10 -6
  206. package/docs/specs/plugins.md +83 -62
  207. package/docs/specs/rest.md +34 -16
  208. package/package.json +1 -1
  209. package/skills/building-a-plugin/SKILL.md +15 -12
  210. package/skills/planning-the-board/references/setting-up.md +2 -1
  211. package/skills/working-the-board/SKILL.md +3 -3
  212. package/src/api.ts +23 -0
  213. package/src/cli/cli.ts +323 -30
  214. package/src/cli/format.ts +122 -26
  215. package/src/cli/help.ts +43 -14
  216. package/src/cli/plugin-check.ts +41 -2
  217. package/src/cli/plugin-cli.ts +10 -1
  218. package/src/cli/plugin-init.ts +8 -0
  219. package/src/client.ts +78 -0
  220. package/src/compat.ts +1 -1
  221. package/src/components/board.tsx +86 -45
  222. package/src/components/decision-form.tsx +73 -36
  223. package/src/components/decision-list.tsx +45 -13
  224. package/src/components/event-feed.tsx +40 -7
  225. package/src/components/goals.tsx +4 -1
  226. package/src/components/home.tsx +615 -0
  227. package/src/components/my-decisions.tsx +50 -5
  228. package/src/components/pack-connect.tsx +5 -4
  229. package/src/components/people.tsx +500 -61
  230. package/src/components/picker.tsx +11 -2
  231. package/src/components/plugin-frame.tsx +85 -63
  232. package/src/components/plugin-settings.tsx +735 -185
  233. package/src/components/projects.tsx +14 -69
  234. package/src/components/searches.ts +47 -0
  235. package/src/components/task-form.tsx +23 -28
  236. package/src/components/task-view.tsx +7 -0
  237. package/src/components/ui.tsx +42 -2
  238. package/src/connect-page.tsx +5 -6
  239. package/src/console.tsx +303 -64
  240. package/src/data.ts +62 -3
  241. package/src/docs-page.tsx +6 -5
  242. package/src/home-tiles.ts +438 -0
  243. package/src/i18n/en.ts +274 -0
  244. package/src/i18n/index.ts +17 -14
  245. package/src/i18n/ko.ts +267 -4
  246. package/src/index.ts +18 -5
  247. package/src/limits.ts +12 -0
  248. package/src/plugin/args.ts +16 -11
  249. package/src/plugin/bridge.ts +122 -1
  250. package/src/plugin/capabilities.ts +28 -1
  251. package/src/plugin/context.ts +186 -9
  252. package/src/plugin/define.ts +38 -1
  253. package/src/plugin/limits.ts +9 -2
  254. package/src/plugin/manifest.ts +228 -13
  255. package/src/plugin/rest-schemas.ts +89 -6
  256. package/src/plugin/sandbox.ts +36 -8
  257. package/src/plugin/semver.ts +89 -0
  258. package/src/plugin/testing.ts +63 -6
  259. package/src/plugin/web.ts +66 -0
  260. package/src/plugin.ts +19 -0
  261. package/src/router.ts +25 -0
  262. package/src/routes.ts +17 -2
  263. package/src/rules.ts +3 -3
  264. package/src/schemas.ts +197 -10
  265. package/src/styles/console.css +1123 -258
  266. package/src/use-action.ts +16 -7
  267. package/src/vocabulary.ts +10 -0
  268. package/template/plugin/console-plugin.json +3 -1
@@ -0,0 +1,294 @@
1
+ import { MAX_HOME_ROW, MAX_HOME_TILES } from "./limits.js";
2
+ import { PLUGIN_WIDGET_SIZE_CELLS, widgetSizesOf } from "./plugin/manifest.js";
3
+ // The front page as a person arranges it (ADR-0061): one grid of square cells, on which the
4
+ // projects and the plugins' widgets are tiles alike, each at a place of its own. What there is
5
+ // comes from what the person may see; where each stands comes from what they kept, one layout
6
+ // for each width of the grid. What is new takes the first room, what they took off stays off,
7
+ // and what they may no longer see waits out of sight for its place. Pure functions, so that the
8
+ // page and the tests read the same arrangement.
9
+ /** The grid's columns at each width: wide, a laptop's, a tablet's, a phone's. */
10
+ export const HOME_COLUMNS = [12, 8, 6, 4];
11
+ /** The width in pixels from which the grid has so many columns, so that a cell stays of a size to read. */
12
+ const COLUMNS_FROM = [
13
+ [1520, 12],
14
+ [900, 8],
15
+ [560, 6],
16
+ ];
17
+ /** The columns of the grid at a width in pixels. */
18
+ export function columnsFor(width) {
19
+ return COLUMNS_FROM.find(([from]) => width >= from)?.[1] ?? 4;
20
+ }
21
+ /** The cells a tile takes at each size: an icon one, the widgets' family as the phones have it. */
22
+ export const HOME_TILE_CELLS = { icon: { columns: 1, rows: 1 }, ...PLUGIN_WIDGET_SIZE_CELLS };
23
+ const PROJECT_SIZES = ["icon", "small"];
24
+ /**
25
+ * Every tile the person may see: the widgets of the plugins that are on, which they hold a role
26
+ * for, and the projects, those a manifest places at the top first and those at the bottom last.
27
+ * An administrator reads every plugin installed, and one that is off has no frame to show.
28
+ */
29
+ export function homeTiles(plugins, projects) {
30
+ const widgets = plugins
31
+ .filter((plugin) => plugin.state === "enabled")
32
+ .flatMap((plugin) => plugin.widgets.map((widget) => {
33
+ const { sizes, defaultSize } = widgetSizesOf(widget);
34
+ return {
35
+ kind: "widget",
36
+ id: `widget:${plugin.key}:${widget.key}`,
37
+ plugin,
38
+ widget,
39
+ sizes,
40
+ defaultSize,
41
+ };
42
+ }));
43
+ return [
44
+ ...widgets.filter((tile) => tile.widget.place === "home:top"),
45
+ ...projects.map((project) => ({
46
+ kind: "project",
47
+ id: `project:${project.id}`,
48
+ project,
49
+ sizes: PROJECT_SIZES,
50
+ defaultSize: "icon",
51
+ })),
52
+ ...widgets.filter((tile) => tile.widget.place !== "home:top"),
53
+ ];
54
+ }
55
+ /**
56
+ * The sizes a tile may have on a grid of so many columns: those that fit it. A widget always has
57
+ * one (ADR-0062); only a console older than the rule can answer one that has none, and then it
58
+ * keeps what it has, drawn as wide as the grid.
59
+ */
60
+ export function sizesAt(tile, columns) {
61
+ const fitting = tile.sizes.filter((size) => HOME_TILE_CELLS[size].columns <= columns);
62
+ return fitting.length > 0 ? fitting : tile.sizes;
63
+ }
64
+ /** The size a tile starts at on a grid of so many columns: its own where that fits, else the largest that does. */
65
+ export function startingSizeAt(tile, columns) {
66
+ const fitting = sizesAt(tile, columns);
67
+ if (fitting.includes(tile.defaultSize)) {
68
+ return tile.defaultSize;
69
+ }
70
+ const area = (size) => HOME_TILE_CELLS[size].columns * HOME_TILE_CELLS[size].rows;
71
+ return [...fitting].sort((a, b) => area(b) - area(a))[0] ?? tile.defaultSize;
72
+ }
73
+ /** The cells a size takes on a grid of so many columns: never wider than the grid. */
74
+ export function footprintOf(size, columns) {
75
+ const cells = HOME_TILE_CELLS[size];
76
+ return { w: Math.min(cells.columns, columns), h: cells.rows };
77
+ }
78
+ const inReadingOrder = (tiles) => [...tiles].sort((a, b) => a.y - b.y || a.x - b.x);
79
+ /** The cells taken, each as one number. */
80
+ function occupied(placed, columns) {
81
+ const taken = new Set();
82
+ for (const tile of placed) {
83
+ occupy(taken, tile, footprintOf(tile.size, columns), columns);
84
+ }
85
+ return taken;
86
+ }
87
+ function occupy(taken, place, shape, columns) {
88
+ for (let row = 0; row < shape.h; row += 1) {
89
+ for (let column = 0; column < shape.w; column += 1) {
90
+ taken.add((place.y + row) * columns + place.x + column);
91
+ }
92
+ }
93
+ }
94
+ function fits(taken, place, shape, columns) {
95
+ if (place.x < 0 || place.y < 0 || place.x + shape.w > columns) {
96
+ return false;
97
+ }
98
+ for (let row = 0; row < shape.h; row += 1) {
99
+ for (let column = 0; column < shape.w; column += 1) {
100
+ if (taken.has((place.y + row) * columns + place.x + column)) {
101
+ return false;
102
+ }
103
+ }
104
+ }
105
+ return true;
106
+ }
107
+ /** The first room for the shape, reading the grid from the top. Below everything there is always some. */
108
+ function firstRoom(taken, shape, columns) {
109
+ for (let y = 0;; y += 1) {
110
+ for (let x = 0; x + shape.w <= columns; x += 1) {
111
+ if (fits(taken, { x, y }, shape, columns)) {
112
+ return { x, y };
113
+ }
114
+ }
115
+ }
116
+ }
117
+ /** The room for the shape nearest a place. */
118
+ function nearestRoom(taken, shape, near, columns) {
119
+ const bottom = Math.max(0, ...[...taken].map((cell) => Math.floor(cell / columns) + 1));
120
+ let best = firstRoom(taken, shape, columns);
121
+ let distance = (best.x - near.x) ** 2 + (best.y - near.y) ** 2;
122
+ for (let y = 0; y <= Math.max(bottom, near.y); y += 1) {
123
+ for (let x = 0; x + shape.w <= columns; x += 1) {
124
+ const away = (x - near.x) ** 2 + (y - near.y) ** 2;
125
+ if (away < distance && fits(taken, { x, y }, shape, columns)) {
126
+ best = { x, y };
127
+ distance = away;
128
+ }
129
+ }
130
+ }
131
+ return best;
132
+ }
133
+ /** What a layout starts from at a width: what was kept for it, or the same order from another. */
134
+ function keptAt(home, columns) {
135
+ const own = home?.layouts[columns];
136
+ if (own !== undefined) {
137
+ return { entries: own, placed: true };
138
+ }
139
+ for (const other of HOME_COLUMNS) {
140
+ const entries = home?.layouts[other];
141
+ if (entries !== undefined) {
142
+ return { entries: inReadingOrder(entries), placed: false };
143
+ }
144
+ }
145
+ return { entries: [], placed: false };
146
+ }
147
+ /**
148
+ * The page as it stands: what the person kept for this width where they stand, or, kept for
149
+ * another width, the same order packed from the top; a tile they may no longer see stays out, a
150
+ * size it no longer comes in, or that is too wide for this grid, becomes the one it starts at
151
+ * here, and a tile on another's cells moves to the nearest room. What they have not seen yet takes the first room, a plugin's widgets as soon
152
+ * as it is on; what they took off stays off.
153
+ */
154
+ export function arranged(tiles, home, columns) {
155
+ const byId = new Map(tiles.map((tile) => [tile.id, tile]));
156
+ const hidden = new Set(home?.hidden ?? []);
157
+ const { entries, placed: keepsPlaces } = keptAt(home, columns);
158
+ const taken = new Set();
159
+ const placed = [];
160
+ const seen = new Set();
161
+ const put = (tile, size, wanted) => {
162
+ const shape = footprintOf(size, columns);
163
+ const place = wanted === undefined
164
+ ? firstRoom(taken, shape, columns)
165
+ : fits(taken, wanted, shape, columns)
166
+ ? wanted
167
+ : nearestRoom(taken, shape, wanted, columns);
168
+ occupy(taken, place, shape, columns);
169
+ placed.push({ tile, size, ...place });
170
+ seen.add(tile.id);
171
+ };
172
+ for (const entry of entries) {
173
+ const tile = byId.get(entry.tile);
174
+ if (tile !== undefined && !hidden.has(tile.id) && !seen.has(tile.id)) {
175
+ const size = sizesAt(tile, columns).includes(entry.size)
176
+ ? entry.size
177
+ : startingSizeAt(tile, columns);
178
+ put(tile, size, keepsPlaces ? { x: entry.x, y: entry.y } : undefined);
179
+ }
180
+ }
181
+ for (const tile of tiles) {
182
+ if (!hidden.has(tile.id) && !seen.has(tile.id)) {
183
+ put(tile, startingSizeAt(tile, columns), undefined);
184
+ }
185
+ }
186
+ return placed;
187
+ }
188
+ /** How many rows the page takes. */
189
+ export function rowsOf(placed, columns) {
190
+ return Math.max(0, ...placed.map((tile) => tile.y + footprintOf(tile.size, columns).h));
191
+ }
192
+ const sameTile = (a, b) => a.tile.id === b.tile.id;
193
+ const overlapping = (a, b, columns) => {
194
+ const shapeA = footprintOf(a.size, columns);
195
+ const shapeB = footprintOf(b.size, columns);
196
+ return (a.x < b.x + shapeB.w && b.x < a.x + shapeA.w && a.y < b.y + shapeB.h && b.y < a.y + shapeA.h);
197
+ };
198
+ /** The tile where it is to stand, and those on its cells moved to the nearest room. */
199
+ function makingRoom(others, at, columns) {
200
+ const inTheWay = others.filter((tile) => overlapping(tile, at, columns));
201
+ const staying = [...others.filter((tile) => !overlapping(tile, at, columns)), at];
202
+ const taken = occupied(staying, columns);
203
+ const moved = inReadingOrder(inTheWay).map((tile) => {
204
+ const shape = footprintOf(tile.size, columns);
205
+ const place = nearestRoom(taken, shape, tile, columns);
206
+ occupy(taken, place, shape, columns);
207
+ return { ...tile, ...place };
208
+ });
209
+ return [...staying, ...moved];
210
+ }
211
+ /**
212
+ * The page with a tile moved to a place, as a phone's home screen does it. Where the place is
213
+ * free it stands there. On a tile of its own shape, the tiles of that shape between the two
214
+ * places each move one place towards the one it left, so that a row of icons closes up. A smaller
215
+ * tile gives way to the nearest room, and a larger one stays: the tile lands in the room beside it.
216
+ */
217
+ export function moved(placed, id, x, y, columns) {
218
+ const moving = placed.find((tile) => tile.tile.id === id);
219
+ if (moving === undefined) {
220
+ return placed;
221
+ }
222
+ const shape = footprintOf(moving.size, columns);
223
+ const at = {
224
+ ...moving,
225
+ x: Math.max(0, Math.min(x, columns - shape.w)),
226
+ y: Math.max(0, Math.min(y, MAX_HOME_ROW)),
227
+ };
228
+ const others = placed.filter((tile) => !sameTile(tile, moving));
229
+ const inTheWay = others.filter((tile) => overlapping(tile, at, columns));
230
+ const [first] = inTheWay;
231
+ if (first === undefined) {
232
+ return [...others, at];
233
+ }
234
+ const shapeOf = (tile) => footprintOf(tile.size, columns);
235
+ const sameShape = (tile) => shapeOf(tile).w === shape.w && shapeOf(tile).h === shape.h;
236
+ if (inTheWay.length === 1 && first.x === at.x && first.y === at.y && sameShape(first)) {
237
+ const peers = inReadingOrder(placed.filter(sameShape));
238
+ const places = peers.map(({ x: px, y: py }) => ({ x: px, y: py }));
239
+ const order = peers.filter((tile) => !sameTile(tile, moving));
240
+ order.splice(peers.findIndex((tile) => sameTile(tile, first)), 0, moving);
241
+ return [
242
+ ...placed.filter((tile) => !sameShape(tile)),
243
+ ...order.map((tile, index) => ({ ...tile, ...places[index] })),
244
+ ];
245
+ }
246
+ const area = (tile) => shapeOf(tile).w * shapeOf(tile).h;
247
+ if (inTheWay.some((tile) => area(tile) > area(moving))) {
248
+ return [...others, { ...at, ...nearestRoom(occupied(others, columns), shape, at, columns) }];
249
+ }
250
+ return makingRoom(others, at, columns);
251
+ }
252
+ /** How far apart in time the tiles in the way move, by the cells between them, in milliseconds. */
253
+ const WAIT_PER_CELL_MS = 22;
254
+ const LONGEST_WAIT_MS = 130;
255
+ /**
256
+ * How long a tile waits before it gives way to the tile being put down at `from`: the further off
257
+ * the later, so that the push runs outward from there, as water does.
258
+ */
259
+ export function waitToGiveWay(tile, from) {
260
+ const cells = Math.hypot(tile.x - from.x, tile.y - from.y);
261
+ return Math.min(Math.round(cells * WAIT_PER_CELL_MS), LONGEST_WAIT_MS);
262
+ }
263
+ /** The page with a tile at another size, where it stands; what its new cells cover moves aside. */
264
+ export function resized(placed, id, size, columns) {
265
+ const tile = placed.find((candidate) => candidate.tile.id === id);
266
+ if (tile === undefined) {
267
+ return placed;
268
+ }
269
+ const at = { ...tile, size, x: Math.min(tile.x, columns - footprintOf(size, columns).w) };
270
+ return makingRoom(placed.filter((candidate) => !sameTile(candidate, tile)), at, columns);
271
+ }
272
+ /** The page with a tile back on it, at the first room, at the size it starts at. */
273
+ export function added(placed, tile, columns) {
274
+ const size = startingSizeAt(tile, columns);
275
+ const room = firstRoom(occupied(placed, columns), footprintOf(size, columns), columns);
276
+ return [...placed, { tile, size, ...room }];
277
+ }
278
+ /** What is kept of the page: the layout at this width, the others as they were. */
279
+ export function homeWith(home, placed, hidden, columns) {
280
+ const shown = new Set(placed.map((tile) => tile.tile.id));
281
+ // What the person may not see for now keeps its place, for the day it is back.
282
+ const away = (home?.layouts[columns] ?? []).filter((entry) => !shown.has(entry.tile) && !hidden.includes(entry.tile));
283
+ const entries = inReadingOrder(placed).map(({ tile, x, y, size }) => ({
284
+ tile: tile.id,
285
+ x,
286
+ y,
287
+ size,
288
+ }));
289
+ return {
290
+ hidden: hidden.slice(0, MAX_HOME_TILES),
291
+ layouts: { ...home?.layouts, [columns]: [...entries, ...away].slice(0, MAX_HOME_TILES) },
292
+ };
293
+ }
294
+ //# sourceMappingURL=home-tiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-tiles.js","sourceRoot":"","sources":["../src/home-tiles.ts"],"names":[],"mappings":"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"}