@bicharts/chart-host 0.5.70 → 0.5.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -750,10 +750,11 @@ function computeQualifyFilterView(groups, term) {
750
750
  if (grp.heading !== null) (any ? showHeadings : hideHeadings).push(grp.heading);
751
751
  }
752
752
  const filtering = fit.tier !== "all";
753
- const openRefusals = filtering && fit.rows.length === 0 && ref.rows.length > 0;
753
+ const nameOnlyBelow = fit.tier === "desc" && (ref.tier === "name" || ref.tier === "namePart");
754
+ const openRefusals = filtering && ref.rows.length > 0 && (fit.rows.length === 0 || nameOnlyBelow);
754
755
  let note = "none";
755
756
  if (filtering) {
756
- if (fit.tier === "desc") note = "descFallback";
757
+ if (fit.tier === "desc") note = nameOnlyBelow ? "descAndRefusalName" : "descFallback";
757
758
  else if (fit.tier === "none") note = openRefusals ? "onlyRefusals" : "noMatch";
758
759
  }
759
760
  return {
@@ -216,15 +216,20 @@ export interface QualifyFilterGroup<E> {
216
216
  *
217
217
  * "none" - a name tier answered, or nothing is being filtered. Say nothing: the reader's
218
218
  * own word was found where they expected it and needs no explanation.
219
- * "descFallback" - no name matched; these matched on description. MUST be said - a silent
220
- * fall-through is indistinguishable from bad matching.
219
+ * "descFallback" - no name matched ANYWHERE; these matched on description. MUST be said - a
220
+ * silent fall-through is indistinguishable from bad matching.
221
221
  * "onlyRefusals" - nothing that FITS matches, but something in the refusal block does. Say where
222
222
  * it went; that block is now open.
223
+ * "descAndRefusalName" - both at once, and the state that made this a five-way rather than a
224
+ * four-way decision (2026-09-04). The fitting list answered on DESCRIPTION and
225
+ * the refusal block answered on a NAME, so "no name matches" is a lie told over
226
+ * the top of a visible name match, and the reader's own word needs BOTH halves
227
+ * said: why the rows above look unrelated, and where the row they typed went.
223
228
  * "noMatch" - nothing anywhere. NEVER phrase this like "nothing fits your data": one is a
224
229
  * statement about a typed string and is fixed with backspace, the other is a
225
230
  * statement about the data and is not.
226
231
  */
227
- export type QualifyFilterNoteKind = "none" | "descFallback" | "onlyRefusals" | "noMatch";
232
+ export type QualifyFilterNoteKind = "none" | "descFallback" | "onlyRefusals" | "descAndRefusalName" | "noMatch";
228
233
  export interface QualifyFilterView<E> {
229
234
  /** Rows to show, and rows to hide. Two lists rather than one predicate so a host can write
230
235
  * them in one pass without asking a Set per element. */
@@ -243,11 +248,17 @@ export interface QualifyFilterView<E> {
243
248
  /**
244
249
  * Does the refusal block need to be OPEN for this term?
245
250
  *
246
- * True only when the term matches nothing that fits and something that does not. "Why isn't
247
- * my chart here" is the only question that section is open to ask, and the reader has just
251
+ * True when the block holds a match the fitting list cannot show the reader. "Why isn't my
252
+ * chart here" is the only question that section is open to ask, and the reader has just
248
253
  * asked it by name - the server's own sentence about why it cannot be drawn is already
249
254
  * rendered, one collapsed checkbox away.
250
255
  *
256
+ * TWO WAYS TO EARN IT, and the second was missing until 2026-09-04: nothing that fits
257
+ * matched at all, OR the only NAME match is down there while the fitting list answered on
258
+ * description. A description match above is not a substitute for the row the reader typed -
259
+ * it is a weaker tier, and leaving the block shut hides the actual answer behind a checkbox
260
+ * the reader has no reason to tick.
261
+ *
251
262
  * THE HOST MUST TREAT THIS AS AN OVERRIDE, NOT A SETTING: remember what the reader's own
252
263
  * checkbox said before the first override, and put it back the moment this goes false. An
253
264
  * auto-expansion that sticks leaves the reader with a section they never opened.
@@ -131,13 +131,23 @@ export declare function shouldOpenChooserOnGenerate(i: ChooserGateInput): boolea
131
131
  * a card that CLIPS, so past a certain smallness its buttons are simply not on screen and the
132
132
  * reader is trapped. A panel that flows inside a scrolling pane, with a wrapping button row,
133
133
  * cannot reach that state: swept across 63 pane sizes down to 200x120, every one stayed usable
134
- * - the footer wrapped from one line to three (38px to 86px) and stayed inside the panel, and
135
- * the list kept four or more rows because it carries its own max-height and scrolls.
136
- *
137
- * So a size clause here would not protect anybody; it would only switch the feature off for a
138
- * default task pane, which is narrower than the modal's floor. Two hosts, two layouts, two
139
- * honest answers - written next to each other so the difference reads as a decision rather than
140
- * as one of them having forgotten.
134
+ * - the footer wrapped from one line to three (38px to 86px) and stayed inside the panel.
135
+ *
136
+ * So a size clause here would not protect anybody. Two hosts, two layouts, two honest answers -
137
+ * written next to each other so the difference reads as a decision rather than as one of them
138
+ * having forgotten.
139
+ *
140
+ * TWO CLAIMS THIS COMMENT USED TO MAKE HAVE BEEN WITHDRAWN (2026-09-04), because the modal's
141
+ * re-measure discredits the sweep they came from rather than this function:
142
+ *
143
+ * * "a default task pane is narrower than the modal's floor" - it no longer is. The floor moved
144
+ * to 320x220 and an ordinary task pane clears it, so the two gates now agree on the pane that
145
+ * used to be the whole argument. The asymmetry survives only below the card's drawable
146
+ * minimum, which is the only place it ever described something real.
147
+ * * "the list kept four or more rows" - measured the same way the modal's rows were, which is
148
+ * to say without the DESCRIPTION every row carries. Whatever that number is, it is not four,
149
+ * and no claim is made here in its place. It was never the reason for having no size clause:
150
+ * the panel scrolls and the footer wraps, and THAT is the reason.
141
151
  */
142
152
  export declare function shouldOpenInlineChooserOnGenerate(i: {
143
153
  enabled: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bicharts/chart-host",
3
- "version": "0.5.70",
3
+ "version": "0.5.72",
4
4
  "description": "Run a BIC-generated D3 chart in any web host: compiles the generated render() function, applies the shared option defaults, resolves mark clicks (through tooltip overlays), owns the selection affordance, and translates row indices between cross-filtered charts. The same contract the BIC Power BI visual implements, minus Power BI. React bindings at @bicharts/chart-host/react.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",