cursedbelt 5.7.0 → 5.7.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"fileTreeSelection.d.ts","sourceRoot":"","sources":["../../../src/react/file-tree/fileTreeSelection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,kBAAkB,EAGxB,MAAM,2CAA2C,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,WAAW,EAAE,EAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAQV;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,MAAM,EAAE,CAaV;AAED,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC;IACjF;;;OAGG;IACH,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,uBAAuB,GAAG,SAAS,CAYzF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,GAC3D,MAAM,GAAG,IAAI,CAEf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,GAC3D,MAAM,GAAG,IAAI,CAEf;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,4EAA4E;AAC5E,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,QAAQ,GAAG,IAAI,CAYjB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,YAAY,EAAE,CAOhB;AAYD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,GAAG,CAAC,MAAM,CAAC,CAIb"}
1
+ {"version":3,"file":"fileTreeSelection.d.ts","sourceRoot":"","sources":["../../../src/react/file-tree/fileTreeSelection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,YAAY,EACjB,KAAK,WAAW,EAEhB,KAAK,kBAAkB,EAGxB,MAAM,2CAA2C,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,WAAW,EAAE,EAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAQV;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,MAAM,EAAE,CAaV;AAED,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC;IACjF;;;OAGG;IACH,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,uBAAuB,GAAG,SAAS,CAmBzF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,GAC3D,MAAM,GAAG,IAAI,CAEf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,GAC3D,MAAM,GAAG,IAAI,CAEf;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,4EAA4E;AAC5E,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,QAAQ,GAAG,IAAI,CAYjB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,YAAY,EAAE,CAOhB;AAYD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,GAAG,CAAC,MAAM,CAAC,CAIb"}
@@ -117,6 +117,13 @@ export function topmostSelected(nodes, ids) {
117
117
  export function resolveMultiDrop({ dragIds, ...rest }) {
118
118
  if (dragIds.length === 0)
119
119
  return resolveDrop({ ...rest, dragId: null });
120
+ // 🔴 `takesDrop` is the one input that can make the TARGET vary by row (a sheet goes INTO a
121
+ // workbook, a note beside it), and the loop below relies on the target not varying. So a
122
+ // selection is a candidate for going inside a file only if every row in it is: a sheet and a
123
+ // note dragged together over a workbook are filed beside it, never half merged.
124
+ const { takesDrop } = rest;
125
+ if (takesDrop && dragIds.length > 1)
126
+ rest.takesDrop = (_dragId, file) => dragIds.every((id) => takesDrop(id, file));
120
127
  let agreed = null;
121
128
  for (const dragId of dragIds) {
122
129
  const offer = resolveDrop({ ...rest, dragId });
@@ -1 +1 @@
1
- {"version":3,"file":"fileTreeSelection.js","sourceRoot":"","sources":["../../../src/react/file-tree/fileTreeSelection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileTreeSelection.js","sourceRoot":"","sources":["../../../src/react/file-tree/fileTreeSelection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAEL,eAAe,EAGf,UAAU,EAEV,WAAW,EACX,YAAY,GACb,MAAM,2CAA2C,CAAC;AAEnD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC5B,IAA4B,EAC5B,QAAuB,EACvB,OAAe;IAEf,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC/D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC1F,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAsB,EAAE,EAAU;IAC/D,OAAO,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAC7B,KAA8B,EAC9B,GAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACvB,oFAAoF;QACpF,oFAAoF;QACpF,UAAU;QACV,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;YACjC,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAUD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAA2B;IAC5E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,4FAA4F;IAC5F,yFAAyF;IACzF,6FAA6F;IAC7F,gFAAgF;IAChF,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC3B,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACjF,IAAI,MAAM,GAAqB,IAAI,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAChC,uFAAuF;QACvF,sFAAsF;QACtF,qFAAqF;QACrF,MAAM,KAAK,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CACxB,KAA8B,EAC9B,GAAsB,EACtB,OAA4D;IAE5D,OAAO,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CACxB,KAA8B,EAC9B,GAAsB,EACtB,OAA4D;IAE5D,OAAO,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,4FAA4F;AAC5F,SAAS,YAAY,CACnB,KAA8B,EAC9B,GAAsB,EACtB,IAAyD;IAEzD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAgBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,QAAQ,CACtB,KAA8B,EAC9B,GAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO;QACL,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;QAClC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,KAA8B,EAC9B,GAAsB;IAEtB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wFAAwF;AACxF,SAAS,QAAQ,CAAC,KAA8B,EAAE,EAAU;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,KAA8B,EAC9B,GAAsB;IAEtB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,EAAE,IAAI,GAAG;QAAE,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrF,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cursedbelt",
3
- "version": "5.7.0",
3
+ "version": "5.7.2",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "description": "The React design system of the cursedbelt split — components, styles, theme. cursedbelt-core below it; server tier in cursedbelt-server.",
@@ -75,7 +75,7 @@ describe('checkAreaStyles', () => {
75
75
  const js = [`const a="flex rounded-full";const b=\`recharts-tip \${x}\`;`];
76
76
  const css = [`.flex{display:flex}.rounded-full{border-radius:9999px}`];
77
77
  const result = checkAreaStyles({ js, css }, BELT);
78
- expect(result.missing).toEqual([{ className: 'recharts-tip', area: 'charts' }]);
78
+ expect(result.missing).toEqual([{ className: 'recharts-tip', area: 'charts', areas: ['charts'] }]);
79
79
  expect(result.referenced).toBe(3);
80
80
  });
81
81
 
@@ -177,7 +177,23 @@ describe('an area is `@source inline` candidates since 5.1.0 (task 2124)', () =>
177
177
  const belt = readBeltSheets();
178
178
  expect(inlineCandidatesIn(belt.areas.core ?? '').size).toBeGreaterThan(400);
179
179
  const { missing } = checkAreaStyles({ js: ['x("truncate")'], css: [''] }, belt);
180
- expect(missing).toEqual([{ className: 'truncate', area: 'core' }]);
180
+ expect(missing).toEqual([{ className: 'truncate', area: 'core', areas: ['core'] }]);
181
+ });
182
+ });
183
+
184
+ describe('🔴 a class two areas carry names BOTH (5.7.2)', () => {
185
+ test("station's `min-w-40`: `media` AND `workbench`, not just the alphabetically first", () => {
186
+ // Measured 2026-09-24: station adopted `ListToolbar` (a `workbench` module), its gate went red
187
+ // on `min-w-40`, and the fix this printed was `media.css` — an area station renders nothing from.
188
+ const { missing } = checkAreaStyles({ js: ['x("min-w-40")'], css: [''] }, readBeltSheets());
189
+ expect(missing).toHaveLength(1);
190
+ expect(missing[0]?.areas).toContain('media');
191
+ expect(missing[0]?.areas).toContain('workbench');
192
+ });
193
+
194
+ test('the areas are sorted and never repeat — whatever order the sheets were read in', () => {
195
+ const belt = { union: '.w-1{width:1px}', areas: { zeta: '@source inline("w-1");\n.w-1{width:1px}', alpha: '@source inline("w-1");' } };
196
+ expect(checkAreaStyles({ js: ['x("w-1")'], css: [''] }, belt).missing).toEqual([{ className: 'w-1', area: 'alpha', areas: ['alpha', 'zeta'] }]);
181
197
  });
182
198
  });
183
199
 
@@ -476,8 +476,13 @@ function filesUnder(dir: string, ext: string, out: string[] = []): string[] {
476
476
  }
477
477
 
478
478
  export interface AreaCheckResult {
479
- /** Belt classes the JS uses and the CSS does not style → the area that carries each. */
480
- missing: { className: string; area: string }[];
479
+ /**
480
+ * Belt classes the JS uses and the CSS does not style → the areas that carry each. `areas` is
481
+ * EVERY area whose sheet carries the class, sorted; `area` is the first of them. 🔴 Name them all:
482
+ * `min-w-40` is in both `media` and `workbench`, and until 5.7.2 this said only `media` —
483
+ * the wrong advice for station, whose `min-w-40` came from `ListToolbar` (a `workbench` module).
484
+ */
485
+ missing: { className: string; area: string; areas: string[] }[];
481
486
  jsFiles: number;
482
487
  cssFiles: number;
483
488
  /** How many belt classes the JS references — a zero here means the check saw nothing. */
@@ -494,9 +499,9 @@ export function checkAreaStyles(
494
499
  belt: { union: string; areas: Record<string, string> },
495
500
  ): Omit<AreaCheckResult, 'jsFiles' | 'cssFiles' | 'outOfOrder' | 'undefinedVariables'> {
496
501
  const union = classesInCss(belt.union);
497
- const areaOf = new Map<string, string>();
498
- for (const [area, css] of Object.entries(belt.areas)) {
499
- for (const name of [...classesInCss(css), ...inlineCandidatesIn(css)]) if (!areaOf.has(name)) areaOf.set(name, area);
502
+ const areaOf = new Map<string, string[]>();
503
+ for (const [area, css] of Object.entries(belt.areas).sort(([a], [b]) => a.localeCompare(b))) {
504
+ for (const name of new Set([...classesInCss(css), ...inlineCandidatesIn(css)])) areaOf.set(name, [...(areaOf.get(name) ?? []), area]);
500
505
  }
501
506
  const emitted = new Set<string>();
502
507
  for (const css of input.css) for (const name of classesInCss(css)) emitted.add(name);
@@ -507,7 +512,10 @@ export function checkAreaStyles(
507
512
  .filter((name) => !emitted.has(name))
508
513
  .filter((name) => !onlyInMergeTables(name, allJs) && !onlyAsPropertyName(name, allJs))
509
514
  .sort()
510
- .map((className) => ({ className, area: areaOf.get(className) as string }));
515
+ .map((className) => {
516
+ const areas = areaOf.get(className) as string[];
517
+ return { className, area: areas[0] as string, areas };
518
+ });
511
519
  return { missing, referenced: referenced.size };
512
520
  }
513
521
 
@@ -595,9 +603,14 @@ if (import.meta.main) {
595
603
  process.exit(0);
596
604
  }
597
605
  const byArea = new Map<string, string[]>();
598
- for (const { className, area } of result.missing) byArea.set(area, [...(byArea.get(area) ?? []), className]);
606
+ for (const { className, areas } of result.missing) {
607
+ const key = areas.map((a) => `${a}.css`).join(' | ');
608
+ byArea.set(key, [...(byArea.get(key) ?? []), className]);
609
+ }
599
610
  console.error(`✗ ${result.missing.length} cursedbelt class(es) the built JS uses have NO rule in the built CSS.`);
600
- console.error(' Import the area that carries them — `@import "cursedbelt/styles-areas/<area>.css";`:');
601
- for (const [area, names] of [...byArea].sort()) console.error(` ${area}.css ← ${names.slice(0, 8).join(' ')}${names.length > 8 ? ` … +${names.length - 8}` : ''}`);
611
+ console.error(' Import the area that carries them — `@import "cursedbelt/styles-areas/<area>.css";`.');
612
+ console.error(' Where a line names several (`a.css | b.css`), any one fixes it: import the area of the component you');
613
+ console.error(" mounted (scripts/styleAreas.ts says which that is) — not the first name, which is only alphabetical:");
614
+ for (const [areas, names] of [...byArea].sort()) console.error(` ${areas} ← ${names.slice(0, 8).join(' ')}${names.length > 8 ? ` … +${names.length - 8}` : ''}`);
602
615
  process.exit(1);
603
616
  }
@@ -136,6 +136,18 @@ describe('resolveMultiDrop — whether a drop is legal for N dragged ids', () =>
136
136
  ).toEqual({ target: { kind: 'into', parentId: 'travels' }, refused: false, reason: null });
137
137
  });
138
138
 
139
+ test('🔴 a selection goes INTO a file only if every row in it is a candidate', () => {
140
+ const book: FileTreeNode = { id: 'book', name: 'Book', kind: 'file', acceptsDrop: true };
141
+ const nodes: FileTreeNode[] = [folder('work', 'Work', [book]), file('sheet', 'sheet.csv'), file('note', 'note.md')];
142
+ const row = flattenFileTree(nodes, []).find((entry) => entry.node.id === 'book') ?? null;
143
+ const takesDrop = (dragId: string | null) => dragId === 'sheet';
144
+ const at = (dragIds: string[]) => resolveMultiDrop({ nodes, row, offsetRatio: 0.5, dragIds, takesDrop }).target;
145
+ expect(at(['sheet'])).toEqual({ kind: 'into', parentId: 'book' });
146
+ // Mixed: filed beside the workbook, whichever row the loop happens to ask first.
147
+ expect(at(['sheet', 'note'])).toEqual({ kind: 'into', parentId: 'work' });
148
+ expect(at(['note', 'sheet'])).toEqual({ kind: 'into', parentId: 'work' });
149
+ });
150
+
139
151
  test('the blank space below the tree is the top level for a whole selection', () => {
140
152
  // *"drag and drop them to another folder or to the root outside of any folder"* — the one
141
153
  // gesture with no target row, and it must survive the plural.
@@ -141,6 +141,13 @@ export interface ResolveMultiDropOptions extends Omit<ResolveDropOptions, 'dragI
141
141
  */
142
142
  export function resolveMultiDrop({ dragIds, ...rest }: ResolveMultiDropOptions): DropOffer {
143
143
  if (dragIds.length === 0) return resolveDrop({ ...rest, dragId: null });
144
+ // 🔴 `takesDrop` is the one input that can make the TARGET vary by row (a sheet goes INTO a
145
+ // workbook, a note beside it), and the loop below relies on the target not varying. So a
146
+ // selection is a candidate for going inside a file only if every row in it is: a sheet and a
147
+ // note dragged together over a workbook are filed beside it, never half merged.
148
+ const { takesDrop } = rest;
149
+ if (takesDrop && dragIds.length > 1)
150
+ rest.takesDrop = (_dragId, file) => dragIds.every((id) => takesDrop(id, file));
144
151
  let agreed: DropOffer | null = null;
145
152
  for (const dragId of dragIds) {
146
153
  const offer = resolveDrop({ ...rest, dragId });