@issuegraph/editor 0.4.0 → 0.22.1

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 (137) hide show
  1. package/README.md +65 -9
  2. package/dist/a11y/baseline.d.ts +182 -0
  3. package/dist/a11y/baseline.d.ts.map +1 -0
  4. package/dist/a11y/baseline.js +434 -0
  5. package/dist/a11y/baseline.js.map +1 -0
  6. package/dist/audit/findings.d.ts +107 -1
  7. package/dist/audit/findings.d.ts.map +1 -1
  8. package/dist/audit/findings.js +113 -6
  9. package/dist/audit/findings.js.map +1 -1
  10. package/dist/audit/panel.d.ts +277 -0
  11. package/dist/audit/panel.d.ts.map +1 -0
  12. package/dist/audit/panel.js +462 -0
  13. package/dist/audit/panel.js.map +1 -0
  14. package/dist/audit/refused.d.ts +99 -0
  15. package/dist/audit/refused.d.ts.map +1 -0
  16. package/dist/audit/refused.js +276 -0
  17. package/dist/audit/refused.js.map +1 -0
  18. package/dist/audit/styles.d.ts +1 -1
  19. package/dist/audit/styles.d.ts.map +1 -1
  20. package/dist/audit/styles.js +429 -1
  21. package/dist/audit/styles.js.map +1 -1
  22. package/dist/audit/surface.d.ts +54 -12
  23. package/dist/audit/surface.d.ts.map +1 -1
  24. package/dist/audit/surface.js +53 -13
  25. package/dist/audit/surface.js.map +1 -1
  26. package/dist/create/draft.d.ts +36 -0
  27. package/dist/create/draft.d.ts.map +1 -1
  28. package/dist/create/draft.js +40 -0
  29. package/dist/create/draft.js.map +1 -1
  30. package/dist/create/keys.d.ts +134 -9
  31. package/dist/create/keys.d.ts.map +1 -1
  32. package/dist/create/keys.js +119 -20
  33. package/dist/create/keys.js.map +1 -1
  34. package/dist/firstpass/candidates.d.ts +17 -1
  35. package/dist/firstpass/candidates.d.ts.map +1 -1
  36. package/dist/index.d.ts +42 -17
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +45 -14
  39. package/dist/index.js.map +1 -1
  40. package/dist/overlay/render.d.ts +11 -3
  41. package/dist/overlay/render.d.ts.map +1 -1
  42. package/dist/overlay/render.js +76 -20
  43. package/dist/overlay/render.js.map +1 -1
  44. package/dist/overlay/request.d.ts +71 -0
  45. package/dist/overlay/request.d.ts.map +1 -0
  46. package/dist/overlay/request.js +129 -0
  47. package/dist/overlay/request.js.map +1 -0
  48. package/dist/overlay/styles.d.ts +1 -1
  49. package/dist/overlay/styles.d.ts.map +1 -1
  50. package/dist/overlay/styles.js +78 -7
  51. package/dist/overlay/styles.js.map +1 -1
  52. package/dist/picker/render.d.ts +26 -16
  53. package/dist/picker/render.d.ts.map +1 -1
  54. package/dist/picker/render.js +25 -36
  55. package/dist/picker/render.js.map +1 -1
  56. package/dist/picker/styles.d.ts +7 -7
  57. package/dist/picker/styles.d.ts.map +1 -1
  58. package/dist/picker/styles.js +7 -36
  59. package/dist/picker/styles.js.map +1 -1
  60. package/dist/picker/view.d.ts +8 -4
  61. package/dist/picker/view.d.ts.map +1 -1
  62. package/dist/picker/view.js +4 -3
  63. package/dist/picker/view.js.map +1 -1
  64. package/dist/picker/words.d.ts +12 -10
  65. package/dist/picker/words.d.ts.map +1 -1
  66. package/dist/picker/words.js +12 -8
  67. package/dist/picker/words.js.map +1 -1
  68. package/dist/reevaluate/parts.d.ts +130 -0
  69. package/dist/reevaluate/parts.d.ts.map +1 -0
  70. package/dist/reevaluate/parts.js +260 -0
  71. package/dist/reevaluate/parts.js.map +1 -0
  72. package/dist/reevaluate/render.d.ts +18 -11
  73. package/dist/reevaluate/render.d.ts.map +1 -1
  74. package/dist/reevaluate/render.js +21 -135
  75. package/dist/reevaluate/render.js.map +1 -1
  76. package/dist/reevaluate/styles.d.ts +1 -1
  77. package/dist/reevaluate/styles.d.ts.map +1 -1
  78. package/dist/reevaluate/styles.js +26 -0
  79. package/dist/reevaluate/styles.js.map +1 -1
  80. package/dist/reevaluate/view.d.ts +16 -1
  81. package/dist/reevaluate/view.d.ts.map +1 -1
  82. package/dist/reevaluate/view.js +21 -1
  83. package/dist/reevaluate/view.js.map +1 -1
  84. package/dist/reevaluate/words.d.ts +7 -0
  85. package/dist/reevaluate/words.d.ts.map +1 -1
  86. package/dist/scale/ladder.d.ts +62 -6
  87. package/dist/scale/ladder.d.ts.map +1 -1
  88. package/dist/scale/ladder.js +129 -11
  89. package/dist/scale/ladder.js.map +1 -1
  90. package/dist/scale/render.d.ts +44 -0
  91. package/dist/scale/render.d.ts.map +1 -1
  92. package/dist/scale/render.js +206 -28
  93. package/dist/scale/render.js.map +1 -1
  94. package/dist/scale/styles.d.ts +11 -5
  95. package/dist/scale/styles.d.ts.map +1 -1
  96. package/dist/scale/styles.js +133 -4
  97. package/dist/scale/styles.js.map +1 -1
  98. package/dist/workspace/chrome.d.ts +1 -1
  99. package/dist/workspace/chrome.d.ts.map +1 -1
  100. package/dist/workspace/chrome.js +48 -0
  101. package/dist/workspace/chrome.js.map +1 -1
  102. package/dist/workspace/firstpass.d.ts +166 -0
  103. package/dist/workspace/firstpass.d.ts.map +1 -0
  104. package/dist/workspace/firstpass.js +151 -0
  105. package/dist/workspace/firstpass.js.map +1 -0
  106. package/dist/workspace/host.d.ts +283 -11
  107. package/dist/workspace/host.d.ts.map +1 -1
  108. package/dist/workspace/host.js +614 -43
  109. package/dist/workspace/host.js.map +1 -1
  110. package/dist/workspace/inspector.d.ts +72 -2
  111. package/dist/workspace/inspector.d.ts.map +1 -1
  112. package/dist/workspace/inspector.js +26 -0
  113. package/dist/workspace/inspector.js.map +1 -1
  114. package/dist/workspace/mount.d.ts +75 -6
  115. package/dist/workspace/mount.d.ts.map +1 -1
  116. package/dist/workspace/mount.js +1851 -60
  117. package/dist/workspace/mount.js.map +1 -1
  118. package/dist/workspace/rail.d.ts +5 -2
  119. package/dist/workspace/rail.d.ts.map +1 -1
  120. package/dist/workspace/rail.js.map +1 -1
  121. package/dist/workspace/recovery.d.ts +155 -0
  122. package/dist/workspace/recovery.d.ts.map +1 -0
  123. package/dist/workspace/recovery.js +156 -0
  124. package/dist/workspace/recovery.js.map +1 -0
  125. package/dist/workspace/render.d.ts +779 -2
  126. package/dist/workspace/render.d.ts.map +1 -1
  127. package/dist/workspace/render.js +1727 -61
  128. package/dist/workspace/render.js.map +1 -1
  129. package/dist/workspace/selection.d.ts +11 -0
  130. package/dist/workspace/selection.d.ts.map +1 -1
  131. package/dist/workspace/selection.js +10 -0
  132. package/dist/workspace/selection.js.map +1 -1
  133. package/dist/workspace/styles.d.ts +1 -1
  134. package/dist/workspace/styles.d.ts.map +1 -1
  135. package/dist/workspace/styles.js +1405 -42
  136. package/dist/workspace/styles.js.map +1 -1
  137. package/package.json +4 -4
@@ -0,0 +1,129 @@
1
+ /**
2
+ * The one place a write state becomes a position.
3
+ *
4
+ * ## What this module is for
5
+ *
6
+ * `attachEdgeOverlays` draws everything an overlay can say by reusing the path's
7
+ * own position — a halo is the path stroked wider, a ghost is the path dashed
8
+ * differently. What it cannot draw is the half that needs a NEW position: a chip
9
+ * on the two nodes, a cross beside the terminal, a reason beside the line, and a
10
+ * conflict's second version on the line's perpendicular. Those travel as
11
+ * {@link EdgeOverlay.marks}, declared here rather than half-drawn there.
12
+ *
13
+ * Layer 1 places them, because it is the layer that computed the layout. This
14
+ * module is the translation that lets it do so without learning anything: it
15
+ * turns each declared mark into an {@link EdgeMark} whose vocabulary is
16
+ * POSITIONAL, so the viewer receives `companion` and never `conflict`.
17
+ *
18
+ * ## The mapping is the seam, so it lives on one table
19
+ *
20
+ * One entry per mark the grammar can declare, and the table is exhaustive over
21
+ * that union rather than a switch with a default — a fifth mark added to the
22
+ * grammar should fail to compile here, not silently stop being drawn. That is
23
+ * the failure this whole area has had twice: a channel declared in a table and
24
+ * rendered by nothing.
25
+ *
26
+ * ## The words stay on this side
27
+ *
28
+ * `writing…` and `✕` are this package's vocabulary — the same strings
29
+ * `renderOverlayMark` puts in the host-facing slot — and they are handed over as
30
+ * opaque content. A host that translates translates one vocabulary, and the
31
+ * viewer never holds a word it could be asked to translate.
32
+ *
33
+ * The hue travels as a token NAME, read from the treatment table rather than
34
+ * copied, so a retheme moves the mark and the stroke together. Where a state has
35
+ * no hue of its own this asks for NONE, and layer 1 fills in the relationship's.
36
+ *
37
+ * That last clause used to say the mark "inherits the relationship's — which is
38
+ * the same rule the dashed clone follows", and both halves were wrong. A mark is
39
+ * a SIBLING of the edge, so it inherits the viewer's body text and not the hue
40
+ * `.ig-edge[data-edge=…]` gives the line; and the dashed clone does not inherit
41
+ * either — `render.ts` states its stroke inline for exactly that reason, in a
42
+ * comment about exactly this trap. A `pending-write` chip therefore rendered
43
+ * grey beside the red line it belonged to.
44
+ *
45
+ * So "no tone" is a REQUEST for the kind's hue rather than a decision to have
46
+ * none, and the layer that owns the relationship vocabulary is the one that
47
+ * resolves it.
48
+ */
49
+ import { OVERLAY_TREATMENTS, overlayFor, } from "./grammar.js";
50
+ /**
51
+ * Where each declared mark goes, and what it says when it gets there.
52
+ *
53
+ * `glyph` is `null` for a mark whose whole form is the line — a companion is not
54
+ * a symbol, it is the relationship drawn a second time.
55
+ */
56
+ const MARK_PLACEMENTS = Object.freeze({
57
+ // §17b: "writing… chip on both nodes". Both, not one — an optimistic edit is
58
+ // in flight at both ends of what it joins, and a single chip reads as a
59
+ // property of whichever end happened to get it.
60
+ 'node-chip': { placement: 'both-ends', glyph: 'writing…' },
61
+ // A glyph rather than a word, for the reason the edge vocabulary uses glyphs:
62
+ // it is the non-colour channel, and it needs no translation. `marks.ts` steps
63
+ // it clear of the terminal marker rather than over it.
64
+ 'terminal-cross': { placement: 'terminal', glyph: '✕' },
65
+ // THE SENTENCE IS STILL THE HOST'S. What goes on the canvas is the symbol that
66
+ // says a reason exists and where it belongs; the reason itself is keyed off
67
+ // the store's `InvalidCode` in the panel, exactly as `renderOverlayMark`'s
68
+ // slot does. Putting prose on a canvas would also put it outside the rail that
69
+ // carries every readable thing about this document.
70
+ 'inline-reason': { placement: 'beside', glyph: '!' },
71
+ 'second-version': { placement: 'companion', glyph: null },
72
+ });
73
+ /**
74
+ * The marks one overlay asks layer 1 to draw.
75
+ *
76
+ * Empty for an overlay with no marks, which is most of them: `selected` declares
77
+ * none at all, and its halo is drawn from the path's own position.
78
+ */
79
+ export function marksFor(overlay) {
80
+ const marks = [];
81
+ for (const mark of overlay.marks) {
82
+ const spec = MARK_PLACEMENTS[mark];
83
+ // THE HUE OF THE STATE THAT DECLARED THIS MARK, not of the overlay as a
84
+ // whole. An edge can be `selected` and `conflict` at once, and the overlay's
85
+ // own `line` carries whichever won on precedence — so reading the tone from
86
+ // there would paint a conflict's companion in the focus colour the moment a
87
+ // reader clicked it.
88
+ const owner = overlay.states.find((state) => {
89
+ // Widened at the read, because each entry's `marks` is a literal tuple —
90
+ // `selected`'s is empty, so an unwidened `includes` takes `never` and the
91
+ // lookup does not compile.
92
+ const declared = OVERLAY_TREATMENTS[state].marks;
93
+ return declared.includes(mark);
94
+ });
95
+ const tone = owner === undefined ? null : OVERLAY_TREATMENTS[owner].hueToken;
96
+ // NO ACCESSIBLE NAME, and there is no longer a field for one. The canvas is
97
+ // `aria-hidden`, so nothing inside it can carry a name however it is marked
98
+ // up — and the state is already announced once, on the edge's own
99
+ // `aria-label`, by `attachEdgeOverlays`. Saying it twice is what the hidden
100
+ // canvas exists to prevent.
101
+ marks.push({ placement: spec.placement, glyph: spec.glyph, tone });
102
+ }
103
+ return marks;
104
+ }
105
+ /**
106
+ * Every overlay's marks, keyed the way layer 1 keys its edges.
107
+ *
108
+ * `ProjectedEdge.id` is `edgeIdentity(field, from, to)` — the same string the
109
+ * viewer publishes on `data-ig-group` — so the two sides agree with no
110
+ * reconstruction and nothing to keep in step.
111
+ *
112
+ * An overlay with no marks is left OUT rather than mapped to an empty list: the
113
+ * absence of a key and a key with nothing under it should not be two ways of
114
+ * saying the same thing to a reader of this map.
115
+ */
116
+ export function edgeMarkRequests(edges) {
117
+ const requests = new Map();
118
+ // Folded through `overlayFor`, the same function `attachEdgeOverlays` uses, so
119
+ // the marks drawn and the states announced cannot come from two readings of
120
+ // one projection.
121
+ for (const edge of edges) {
122
+ const marks = marksFor(overlayFor(edge));
123
+ if (marks.length === 0)
124
+ continue;
125
+ requests.set(edge.id, marks);
126
+ }
127
+ return requests;
128
+ }
129
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/overlay/request.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAKH,OAAO,EAGL,kBAAkB,EAClB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,eAAe,GAEjB,MAAM,CAAC,MAAM,CAAC;IAChB,6EAA6E;IAC7E,wEAAwE;IACxE,gDAAgD;IAChD,WAAW,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE;IAC1D,8EAA8E;IAC9E,8EAA8E;IAC9E,uDAAuD;IACvD,gBAAgB,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;IACvD,+EAA+E;IAC/E,4EAA4E;IAC5E,2EAA2E;IAC3E,+EAA+E;IAC/E,oDAAoD;IACpD,eAAe,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACpD,gBAAgB,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;CAC1D,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAoB;IAC3C,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,wEAAwE;QACxE,6EAA6E;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,qBAAqB;QACrB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1C,yEAAyE;YACzE,0EAA0E;YAC1E,2BAA2B;YAC3B,MAAM,QAAQ,GAA2B,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;YACzE,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,kEAAkE;QAClE,4EAA4E;QAC5E,4BAA4B;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IACxD,+EAA+E;IAC/E,4EAA4E;IAC5E,kBAAkB;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -37,5 +37,5 @@
37
37
  * and the dash pattern carry that on their own, so the movement is what drops
38
38
  * rather than the signal.
39
39
  */
40
- export declare const edgeOverlayStylesheet = "\n.ig-overlay {\n pointer-events: none;\n}\n\n.ig-overlay-halo {\n fill: none;\n stroke: var(--ig-focus);\n stroke-linecap: round;\n}\n\n/* The stroke is set per element from the treatment table \u2014 a state's own hue\n where it has one, the relationship's where it does not \u2014 for the same reason\n the viewer sets its dash per element: one source for a channel. */\n.ig-overlay-dash {\n fill: none;\n}\n\n.ig-overlay-marching {\n stroke-dasharray: 4 4;\n animation: ig-overlay-march 1s linear infinite;\n}\n\n.ig-overlay-dotted {\n stroke-dasharray: 1 3;\n}\n\n@keyframes ig-overlay-march {\n to {\n stroke-dashoffset: -8;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .ig-overlay-marching {\n animation: none;\n }\n}\n\n/* NOT prefixed with the edge class. A together-with relationship is drawn as a\n connector rather than an edge path, so an edge-anchored rule left one of the\n five relationships unstyled in every state. Only an overlaid element carries\n the attribute at all, so the bare selector reaches exactly the intended set.\n (No backticks in here: this is inside a template literal, and one ends it.) */\n[data-ig-state~='invalid'] {\n stroke: var(--ig-state-invalid);\n}\n\n[data-ig-state~='failed'] {\n stroke: var(--ig-state-failed);\n}\n\n[data-ig-state~='conflict'] {\n stroke: var(--ig-state-conflict);\n}\n\n.ig-overlay-chip {\n background: var(--ig-surface-2);\n color: var(--ig-text-muted);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-overlay-cross {\n color: var(--ig-state-failed);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n}\n\n.ig-overlay-reason {\n color: var(--ig-state-invalid);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-overlay-held {\n color: var(--ig-state-conflict);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n}\n";
40
+ export declare const edgeOverlayStylesheet = "\n.ig-overlay {\n pointer-events: none;\n}\n\n.ig-overlay-halo {\n fill: none;\n stroke: var(--ig-focus);\n stroke-linecap: round;\n}\n\n/* The stroke is set per element from the treatment table \u2014 a state's own hue\n where it has one, the relationship's where it does not \u2014 for the same reason\n the viewer sets its dash per element: one source for a channel. */\n.ig-overlay-dash {\n fill: none;\n}\n\n.ig-overlay-marching {\n stroke-dasharray: 4 4;\n animation: ig-overlay-march 1s linear infinite;\n}\n\n.ig-overlay-dotted {\n stroke-dasharray: 1 3;\n}\n\n@keyframes ig-overlay-march {\n to {\n stroke-dashoffset: -8;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .ig-overlay-marching {\n animation: none;\n }\n}\n\n/* QUALIFIED, AND THE QUALIFICATION IS THE WHOLE RULE \u2014 it is what makes these\n three declarations apply at all.\n\n They used to be bare, and the comment here explained why: a together-with was\n drawn as a CONNECTOR rather than an edge path, so an edge-anchored rule left\n one of the five relationships unstyled. Both halves of that have since stopped\n being true, and nothing noticed either.\n\n The connector is gone \u2014 layer 1's section-16 pass draws a together unit as ONE\n card with its members listed inside, so the relationship's whole drawn form is\n its badge, and the badge rules below are what reach it.\n\n And the bare selector never painted an edge. A drawn path carries BOTH the edge\n class with its kind attribute, which the viewer hues at specificity (0,2,0), and\n the state attribute, which at (0,1,0) loses to it \u2014 and specificity beats source\n order, so concatenating this sheet last changed nothing. Measured in a browser:\n a conflicted blocked-by edge computed the relationship's own red, never the\n state's gold.\n\n So the bare rules matched exactly two kinds of element and were dead on both.\n On a path they lost the cascade; on a badge they set a stroke, which a span has\n no use for.\n\n invalid was the only state that looked right, and by accident: it is the one\n settled state carrying a dash, so render.ts builds a CLONE for it, and a clone\n drops its class \u2014 which is precisely why that file sets the stroke inline on\n one. The states that build no clone had nothing to fall back on, which is why\n failed rendered identically to invalid, and conflict identically to a settled\n edge.\n\n The kind attribute is carried by every drawn path and by nothing else, so adding\n it reaches (0,3,0) and wins OUTRIGHT rather than by tying and being placed later.\n A tie would work today and would break the first time a host reordered the\n sheets \u2014 and this rule has already failed silently once.\n\n (No backticks in here: this is inside a template literal, and one ends it.) */\n.ig-edge[data-edge][data-ig-state~='invalid'] {\n stroke: var(--ig-state-invalid);\n}\n\n.ig-edge[data-edge][data-ig-state~='failed'] {\n stroke: var(--ig-state-failed);\n}\n\n.ig-edge[data-edge][data-ig-state~='conflict'] {\n stroke: var(--ig-state-conflict);\n}\n\n/* A BADGE IS NOT A STROKE, AND SOME RELATIONSHIPS ARE ONLY A BADGE.\n together-with is drawn as no line at all \u2014 it shares a rank rather than\n ordering anything, and layer 1 draws the unit as one card with its members\n listed inside \u2014 so the chip that names it is its entire representation. The\n marks this module clones from a stroke cannot be cloned from a span, and the\n stroke rules above paint a property a span does not have: an in-flight or\n refused together-edge therefore read exactly like a settled one, with the\n state visible only to a screen reader.\n\n So a chip states the state with what a chip HAS: its border and its ink.\n Every state the drawn edge distinguishes, distinguished here too \u2014 including\n the two that have no hue of their own, where a stroke uses a ghost or a halo\n and a chip uses a dash and the focus ring. */\n.ig-badge[data-ig-state~='invalid'] {\n border-color: var(--ig-state-invalid);\n color: var(--ig-state-invalid);\n}\n\n.ig-badge[data-ig-state~='failed'] {\n border-color: var(--ig-state-failed);\n color: var(--ig-state-failed);\n}\n\n.ig-badge[data-ig-state~='conflict'] {\n border-color: var(--ig-state-conflict);\n color: var(--ig-state-conflict);\n}\n\n/* Pending is the state with no hue: the drawn edge says it with a dashed ghost,\n and a chip says it with a dashed border of its own. */\n.ig-badge[data-ig-state~='pending-write'] {\n border-style: dashed;\n}\n\n/* Selected is the focus ring's meaning, and the theme says so where it declares\n the token \u2014 selected is deliberately not an edit-state hue. */\n.ig-badge[data-ig-state~='selected'] {\n box-shadow: 0 0 0 var(--ig-stroke) var(--ig-focus);\n}\n\n.ig-overlay-chip {\n background: var(--ig-surface-2);\n color: var(--ig-text-muted);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-overlay-cross {\n color: var(--ig-state-failed);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n}\n\n.ig-overlay-reason {\n color: var(--ig-state-invalid);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-overlay-held {\n color: var(--ig-state-conflict);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n}\n";
41
41
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/overlay/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,eAAO,MAAM,qBAAqB,6hEAmFjC,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/overlay/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,eAAO,MAAM,qBAAqB,k7KA0JjC,CAAC"}
@@ -76,23 +76,94 @@ export const edgeOverlayStylesheet = `
76
76
  }
77
77
  }
78
78
 
79
- /* NOT prefixed with the edge class. A together-with relationship is drawn as a
80
- connector rather than an edge path, so an edge-anchored rule left one of the
81
- five relationships unstyled in every state. Only an overlaid element carries
82
- the attribute at all, so the bare selector reaches exactly the intended set.
79
+ /* QUALIFIED, AND THE QUALIFICATION IS THE WHOLE RULE — it is what makes these
80
+ three declarations apply at all.
81
+
82
+ They used to be bare, and the comment here explained why: a together-with was
83
+ drawn as a CONNECTOR rather than an edge path, so an edge-anchored rule left
84
+ one of the five relationships unstyled. Both halves of that have since stopped
85
+ being true, and nothing noticed either.
86
+
87
+ The connector is gone — layer 1's section-16 pass draws a together unit as ONE
88
+ card with its members listed inside, so the relationship's whole drawn form is
89
+ its badge, and the badge rules below are what reach it.
90
+
91
+ And the bare selector never painted an edge. A drawn path carries BOTH the edge
92
+ class with its kind attribute, which the viewer hues at specificity (0,2,0), and
93
+ the state attribute, which at (0,1,0) loses to it — and specificity beats source
94
+ order, so concatenating this sheet last changed nothing. Measured in a browser:
95
+ a conflicted blocked-by edge computed the relationship's own red, never the
96
+ state's gold.
97
+
98
+ So the bare rules matched exactly two kinds of element and were dead on both.
99
+ On a path they lost the cascade; on a badge they set a stroke, which a span has
100
+ no use for.
101
+
102
+ invalid was the only state that looked right, and by accident: it is the one
103
+ settled state carrying a dash, so render.ts builds a CLONE for it, and a clone
104
+ drops its class — which is precisely why that file sets the stroke inline on
105
+ one. The states that build no clone had nothing to fall back on, which is why
106
+ failed rendered identically to invalid, and conflict identically to a settled
107
+ edge.
108
+
109
+ The kind attribute is carried by every drawn path and by nothing else, so adding
110
+ it reaches (0,3,0) and wins OUTRIGHT rather than by tying and being placed later.
111
+ A tie would work today and would break the first time a host reordered the
112
+ sheets — and this rule has already failed silently once.
113
+
83
114
  (No backticks in here: this is inside a template literal, and one ends it.) */
84
- [data-ig-state~='invalid'] {
115
+ .ig-edge[data-edge][data-ig-state~='invalid'] {
85
116
  stroke: var(--ig-state-invalid);
86
117
  }
87
118
 
88
- [data-ig-state~='failed'] {
119
+ .ig-edge[data-edge][data-ig-state~='failed'] {
89
120
  stroke: var(--ig-state-failed);
90
121
  }
91
122
 
92
- [data-ig-state~='conflict'] {
123
+ .ig-edge[data-edge][data-ig-state~='conflict'] {
93
124
  stroke: var(--ig-state-conflict);
94
125
  }
95
126
 
127
+ /* A BADGE IS NOT A STROKE, AND SOME RELATIONSHIPS ARE ONLY A BADGE.
128
+ together-with is drawn as no line at all — it shares a rank rather than
129
+ ordering anything, and layer 1 draws the unit as one card with its members
130
+ listed inside — so the chip that names it is its entire representation. The
131
+ marks this module clones from a stroke cannot be cloned from a span, and the
132
+ stroke rules above paint a property a span does not have: an in-flight or
133
+ refused together-edge therefore read exactly like a settled one, with the
134
+ state visible only to a screen reader.
135
+
136
+ So a chip states the state with what a chip HAS: its border and its ink.
137
+ Every state the drawn edge distinguishes, distinguished here too — including
138
+ the two that have no hue of their own, where a stroke uses a ghost or a halo
139
+ and a chip uses a dash and the focus ring. */
140
+ .ig-badge[data-ig-state~='invalid'] {
141
+ border-color: var(--ig-state-invalid);
142
+ color: var(--ig-state-invalid);
143
+ }
144
+
145
+ .ig-badge[data-ig-state~='failed'] {
146
+ border-color: var(--ig-state-failed);
147
+ color: var(--ig-state-failed);
148
+ }
149
+
150
+ .ig-badge[data-ig-state~='conflict'] {
151
+ border-color: var(--ig-state-conflict);
152
+ color: var(--ig-state-conflict);
153
+ }
154
+
155
+ /* Pending is the state with no hue: the drawn edge says it with a dashed ghost,
156
+ and a chip says it with a dashed border of its own. */
157
+ .ig-badge[data-ig-state~='pending-write'] {
158
+ border-style: dashed;
159
+ }
160
+
161
+ /* Selected is the focus ring's meaning, and the theme says so where it declares
162
+ the token — selected is deliberately not an edit-state hue. */
163
+ .ig-badge[data-ig-state~='selected'] {
164
+ box-shadow: 0 0 0 var(--ig-stroke) var(--ig-focus);
165
+ }
166
+
96
167
  .ig-overlay-chip {
97
168
  background: var(--ig-surface-2);
98
169
  color: var(--ig-text-muted);
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/overlay/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFpC,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/overlay/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0JpC,CAAC"}
@@ -1,5 +1,21 @@
1
1
  /**
2
- * The type picker, the direction statement and the flip control, as markup.
2
+ * The type picker — the five kinds an edge can be retyped to — as markup.
3
+ *
4
+ * ## The direction statement and the flip are NOT here, and once were
5
+ *
6
+ * §17b's direction card belongs to the panel that has an edge selected, and
7
+ * `renderWorkspace` draws it: the relationship row already states the pair and
8
+ * the kind, and the flip sits at the end of that row where frame 17b draws it.
9
+ * They lived here because this surface landed first, and a picker composed into
10
+ * that panel then drew a second statement and a second flip one element from
11
+ * the first — which is the encoding ambiguity §17b exists to remove, produced by
12
+ * the surface meant to remove it.
13
+ *
14
+ * {@link ./view.ts PickerView} still carries `direction` and `flip`: they are
15
+ * the MODEL, `reduceHost` builds its proposal from them, and a host that wants
16
+ * another arrangement renders them itself — `PickerView` carries the ordered
17
+ * pair and the kind and no word order beyond that, which is what makes such a
18
+ * host cheap. What moved is the drawing, not the answer.
3
19
  *
4
20
  * ## Every readable byte comes from the host or from the document
5
21
  *
@@ -9,24 +25,18 @@
9
25
  * being worded here is a RELATIONSHIP, so a phrase written in would be an
10
26
  * English clause in the one place the design says a reader most often gets the
11
27
  * encoding wrong. `render.test.ts` enforces it by asserting that every text node
12
- * is either a {@link ./words.ts PickerWords} entry or an issue reference — a
13
- * total claim rather than a spot check, so a word added later fails rather than
14
- * slipping in.
15
- *
16
- * ## The default word order is a DEFAULT
28
+ * is a {@link ./words.ts PickerWords} entry — a total claim rather than a spot
29
+ * check, so a word added later fails rather than slipping in.
17
30
  *
18
- * The statement is drawn subject · phrase · object, which is a word order and
19
- * therefore a presentation choice this layer is not entitled to impose. It is
20
- * offered as the ordinary case and bypassed the same way the re-evaluate
21
- * summary's is: {@link ./view.ts PickerView} carries the ordered pair and the
22
- * kind and no order beyond that, so a host that needs another arrangement
23
- * renders the view model. Nothing here is load-bearing for it.
31
+ * IT NO LONGER ADMITS AN ISSUE REFERENCE EITHER, and the tightening is the
32
+ * statement leaving rather than a decision: the two references this surface
33
+ * used to draw were the statement's. A list of KINDS naming an ISSUE would now
34
+ * itself be the finding.
24
35
  *
25
36
  * ## It publishes commands and wires nothing
26
37
  *
27
- * `data-ig-command="retype"` with a `data-ig-kind`, and
28
- * `data-ig-command="flip"`. Listener wiring, focus and dispatch belong to the
29
- * mount, exactly as the scale ladder and the re-evaluate surface already defer
38
+ * `data-ig-command="retype"` with a `data-ig-kind`. Listener wiring, focus and
39
+ * dispatch belong to the mount, exactly as the scale ladder and the re-evaluate surface already defer
30
40
  * them — and the proposal each command stands for is on the view model, so a
31
41
  * mount reads it rather than reconstructing it from attributes.
32
42
  *
@@ -54,7 +64,7 @@ export interface PickerOptions {
54
64
  }
55
65
  export interface PickerResult {
56
66
  readonly view: PickerView;
57
- /** The picker, the statement and the flip control, under one root. */
67
+ /** The kind list, under one root. */
58
68
  readonly markup: string;
59
69
  /**
60
70
  * The theme and this surface's own stylesheet. Install both.
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/picker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAEL,KAAK,KAAK,EAKX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAA4C,KAAK,UAAU,EAAc,MAAM,WAAW,CAAC;AAElG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACnC,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAiDD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,YAAY,CAiCd"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/picker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAEL,KAAK,KAAK,EAKX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAmB,KAAK,UAAU,EAAc,MAAM,WAAW,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACnC,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAkCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,YAAY,CAsBd"}
@@ -1,5 +1,21 @@
1
1
  /**
2
- * The type picker, the direction statement and the flip control, as markup.
2
+ * The type picker — the five kinds an edge can be retyped to — as markup.
3
+ *
4
+ * ## The direction statement and the flip are NOT here, and once were
5
+ *
6
+ * §17b's direction card belongs to the panel that has an edge selected, and
7
+ * `renderWorkspace` draws it: the relationship row already states the pair and
8
+ * the kind, and the flip sits at the end of that row where frame 17b draws it.
9
+ * They lived here because this surface landed first, and a picker composed into
10
+ * that panel then drew a second statement and a second flip one element from
11
+ * the first — which is the encoding ambiguity §17b exists to remove, produced by
12
+ * the surface meant to remove it.
13
+ *
14
+ * {@link ./view.ts PickerView} still carries `direction` and `flip`: they are
15
+ * the MODEL, `reduceHost` builds its proposal from them, and a host that wants
16
+ * another arrangement renders them itself — `PickerView` carries the ordered
17
+ * pair and the kind and no word order beyond that, which is what makes such a
18
+ * host cheap. What moved is the drawing, not the answer.
3
19
  *
4
20
  * ## Every readable byte comes from the host or from the document
5
21
  *
@@ -9,24 +25,18 @@
9
25
  * being worded here is a RELATIONSHIP, so a phrase written in would be an
10
26
  * English clause in the one place the design says a reader most often gets the
11
27
  * encoding wrong. `render.test.ts` enforces it by asserting that every text node
12
- * is either a {@link ./words.ts PickerWords} entry or an issue reference — a
13
- * total claim rather than a spot check, so a word added later fails rather than
14
- * slipping in.
28
+ * is a {@link ./words.ts PickerWords} entry — a total claim rather than a spot
29
+ * check, so a word added later fails rather than slipping in.
15
30
  *
16
- * ## The default word order is a DEFAULT
17
- *
18
- * The statement is drawn subject · phrase · object, which is a word order and
19
- * therefore a presentation choice this layer is not entitled to impose. It is
20
- * offered as the ordinary case and bypassed the same way the re-evaluate
21
- * summary's is: {@link ./view.ts PickerView} carries the ordered pair and the
22
- * kind and no order beyond that, so a host that needs another arrangement
23
- * renders the view model. Nothing here is load-bearing for it.
31
+ * IT NO LONGER ADMITS AN ISSUE REFERENCE EITHER, and the tightening is the
32
+ * statement leaving rather than a decision: the two references this surface
33
+ * used to draw were the statement's. A list of KINDS naming an ISSUE would now
34
+ * itself be the finding.
24
35
  *
25
36
  * ## It publishes commands and wires nothing
26
37
  *
27
- * `data-ig-command="retype"` with a `data-ig-kind`, and
28
- * `data-ig-command="flip"`. Listener wiring, focus and dispatch belong to the
29
- * mount, exactly as the scale ladder and the re-evaluate surface already defer
38
+ * `data-ig-command="retype"` with a `data-ig-kind`. Listener wiring, focus and
39
+ * dispatch belong to the mount, exactly as the scale ladder and the re-evaluate surface already defer
30
40
  * them — and the proposal each command stands for is on the view model, so a
31
41
  * mount reads it rather than reconstructing it from attributes.
32
42
  *
@@ -64,20 +74,6 @@ function optionSpec(option, words) {
64
74
  ]),
65
75
  ]);
66
76
  }
67
- /**
68
- * The direction statement.
69
- *
70
- * The two references are the DOCUMENT's, not this package's words, and each
71
- * carries the role it plays so a host can restyle or reorder them without
72
- * parsing the sentence back apart.
73
- */
74
- function directionSpec(direction, words) {
75
- return element('p', { class: 'ig-picker-direction', 'data-ig-kind': direction.kind }, [
76
- element('span', { class: 'ig-picker-ref', 'data-ig-role': 'from' }, [direction.from]),
77
- element('span', { class: 'ig-picker-phrase' }, [words.kinds[direction.kind]]),
78
- element('span', { class: 'ig-picker-ref', 'data-ig-role': 'to' }, [direction.to]),
79
- ]);
80
- }
81
77
  /**
82
78
  * The picker for one existing edge.
83
79
  *
@@ -94,13 +90,6 @@ export function renderPicker(document, edgeId, options) {
94
90
  view.options.length === 0
95
91
  ? null
96
92
  : element('ul', { class: 'ig-picker-kinds', 'aria-label': words.heading }, view.options.map((option) => optionSpec(option, words))),
97
- // Symmetric kinds render NEITHER of the next two. The absence is the
98
- // finding: a control to reverse a relationship that carries no direction
99
- // would claim the format says something it does not.
100
- view.direction === null ? null : directionSpec(view.direction, words),
101
- view.flip === null
102
- ? null
103
- : element('button', { type: 'button', class: 'ig-picker-flip', 'data-ig-command': 'flip' }, [words.flip]),
104
93
  ]);
105
94
  return {
106
95
  view,
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/picker/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/picker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAGL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAoC,UAAU,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgC/C,gFAAgF;AAChF,SAAS,UAAU,CAAC,MAAkB,EAAE,KAAkB;IACxD,OAAO,OAAO,CACZ,IAAI,EACJ;QACE,KAAK,EAAE,gBAAgB;QACvB,cAAc,EAAE,MAAM,CAAC,IAAI;QAC3B,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QACnD,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;KAClD,EACD;QACE,OAAO,CACL,QAAQ,EACR;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,kBAAkB;YACzB,iBAAiB,EAAE,QAAQ;YAC3B,cAAc,EAAE,MAAM,CAAC,IAAI;YAC3B,oEAAoE;YACpE,kEAAkE;YAClE,kEAAkE;YAClE,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;SAClD,EACD;YACE,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;SACzF,CACF;KACF,CACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAuB,EACvB,MAAc,EACd,OAAsB;IAEtB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;QACnF,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CACL,IAAI,EACJ,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,EACzD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CACxD;KACN,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,gBAAgB,EAAE;QACnF,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -10,17 +10,17 @@
10
10
  * IT ADDS SELECTORS RATHER THAN REDEFINING THEM. Nothing here reaches into the
11
11
  * viewer's own classes; this file styles only what the picker introduces.
12
12
  *
13
- * ## The statement is laid out as a FLEX ROW, and that is load-bearing
13
+ * ## §17b's direction statement is no longer styled here
14
14
  *
15
- * render.ts draws the statement subject, phrase, object, and calls that word
16
- * order a default a host may bypass. A flex row is what makes the bypass cheap:
17
- * the CSS order property reorders flex children, so a host whose language puts
18
- * the relationship elsewhere restyles rather than re-implements. Laying it out
19
- * as inline text would have made the claim in render.ts true only in principle.
15
+ * This sheet once laid the statement out as a flex row so a host could reorder
16
+ * it with the CSS order property. The statement is `renderWorkspace`'s
17
+ * relationship row now — see `picker/render.ts`'s header for why — and its
18
+ * layout went with it, to `workspace/styles.ts`. Nothing here draws a
19
+ * relationship any more; this sheet styles the kind list and nothing else.
20
20
  *
21
21
  * Shipped as a string for the same reason the viewer's is: an entry that
22
22
  * imports CSS cannot be loaded by a bare Node runtime, and a string needs no
23
23
  * bundler.
24
24
  */
25
- export declare const pickerStylesheet = "\n.ig-picker {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n line-height: var(--ig-line-height);\n color: var(--ig-text-body);\n}\n\n.ig-picker-heading {\n margin: 0;\n font-weight: normal;\n font-size: var(--ig-font-size-small);\n color: var(--ig-text-muted);\n}\n\n.ig-picker-kinds {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n}\n\n.ig-picker-choice {\n display: flex;\n align-items: baseline;\n gap: var(--ig-space-tight);\n width: 100%;\n text-align: left;\n background: var(--ig-surface);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n.ig-picker-choice:focus-visible,\n.ig-picker-flip:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-stroke);\n}\n\n/* The kind the edge already carries. Marked on the ROW rather than on the\n button, so a host restyling the control keeps the distinction. */\n.ig-picker-kind[data-current='true'] .ig-picker-choice {\n background: var(--ig-surface-2);\n border-color: var(--ig-accent);\n color: var(--ig-text);\n}\n\n.ig-picker-current {\n margin-left: auto;\n font-size: var(--ig-font-size-small);\n color: var(--ig-text-muted);\n}\n\n/* Wraps rather than truncates: a qualified reference is long, and a statement\n whose object is cut off says something other than what the format holds. */\n.ig-picker-direction {\n margin: 0;\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--ig-space-tight);\n color: var(--ig-text-body);\n}\n\n.ig-picker-ref {\n font-family: var(--ig-font-mono);\n color: var(--ig-accent);\n}\n\n.ig-picker-flip {\n align-self: flex-start;\n background: var(--ig-surface);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: inherit;\n font-size: var(--ig-font-size-small);\n line-height: inherit;\n}\n";
25
+ export declare const pickerStylesheet = "\n.ig-picker {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n line-height: var(--ig-line-height);\n color: var(--ig-text-body);\n}\n\n.ig-picker-heading {\n margin: 0;\n font-weight: normal;\n font-size: var(--ig-font-size-small);\n color: var(--ig-text-muted);\n}\n\n.ig-picker-kinds {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n}\n\n.ig-picker-choice {\n display: flex;\n align-items: baseline;\n gap: var(--ig-space-tight);\n width: 100%;\n text-align: left;\n background: var(--ig-surface);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n.ig-picker-choice:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-stroke);\n}\n\n/* The kind the edge already carries. Marked on the ROW rather than on the\n button, so a host restyling the control keeps the distinction. */\n.ig-picker-kind[data-current='true'] .ig-picker-choice {\n background: var(--ig-surface-2);\n border-color: var(--ig-accent);\n color: var(--ig-text);\n}\n\n.ig-picker-current {\n margin-left: auto;\n font-size: var(--ig-font-size-small);\n color: var(--ig-text-muted);\n}\n";
26
26
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/picker/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,eAAO,MAAM,gBAAgB,ktEA0F5B,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/picker/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,eAAO,MAAM,gBAAgB,y8CA6D5B,CAAC"}
@@ -10,13 +10,13 @@
10
10
  * IT ADDS SELECTORS RATHER THAN REDEFINING THEM. Nothing here reaches into the
11
11
  * viewer's own classes; this file styles only what the picker introduces.
12
12
  *
13
- * ## The statement is laid out as a FLEX ROW, and that is load-bearing
13
+ * ## §17b's direction statement is no longer styled here
14
14
  *
15
- * render.ts draws the statement subject, phrase, object, and calls that word
16
- * order a default a host may bypass. A flex row is what makes the bypass cheap:
17
- * the CSS order property reorders flex children, so a host whose language puts
18
- * the relationship elsewhere restyles rather than re-implements. Laying it out
19
- * as inline text would have made the claim in render.ts true only in principle.
15
+ * This sheet once laid the statement out as a flex row so a host could reorder
16
+ * it with the CSS order property. The statement is `renderWorkspace`'s
17
+ * relationship row now — see `picker/render.ts`'s header for why — and its
18
+ * layout went with it, to `workspace/styles.ts`. Nothing here draws a
19
+ * relationship any more; this sheet styles the kind list and nothing else.
20
20
  *
21
21
  * Shipped as a string for the same reason the viewer's is: an entry that
22
22
  * imports CSS cannot be loaded by a bare Node runtime, and a string needs no
@@ -65,8 +65,7 @@ export const pickerStylesheet = `
65
65
  line-height: inherit;
66
66
  }
67
67
 
68
- .ig-picker-choice:focus-visible,
69
- .ig-picker-flip:focus-visible {
68
+ .ig-picker-choice:focus-visible {
70
69
  outline: var(--ig-focus-ring) solid var(--ig-focus);
71
70
  outline-offset: var(--ig-stroke);
72
71
  }
@@ -84,33 +83,5 @@ export const pickerStylesheet = `
84
83
  font-size: var(--ig-font-size-small);
85
84
  color: var(--ig-text-muted);
86
85
  }
87
-
88
- /* Wraps rather than truncates: a qualified reference is long, and a statement
89
- whose object is cut off says something other than what the format holds. */
90
- .ig-picker-direction {
91
- margin: 0;
92
- display: flex;
93
- flex-wrap: wrap;
94
- align-items: baseline;
95
- gap: var(--ig-space-tight);
96
- color: var(--ig-text-body);
97
- }
98
-
99
- .ig-picker-ref {
100
- font-family: var(--ig-font-mono);
101
- color: var(--ig-accent);
102
- }
103
-
104
- .ig-picker-flip {
105
- align-self: flex-start;
106
- background: var(--ig-surface);
107
- color: var(--ig-text-body);
108
- border: var(--ig-stroke) solid var(--ig-line);
109
- border-radius: var(--ig-radius);
110
- padding: var(--ig-space-tight);
111
- font-family: inherit;
112
- font-size: var(--ig-font-size-small);
113
- line-height: inherit;
114
- }
115
86
  `;
116
87
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/picker/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F/B,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/picker/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6D/B,CAAC"}
@@ -50,11 +50,12 @@
50
50
  * The rejected shape was a per-option PREVIEW: every option carrying the
51
51
  * statement it would produce, so the direction is chosen at the same moment as
52
52
  * the kind. It was rejected because it doubles what the picker says in order to
53
- * pre-empt a case the surface already answers — the retype lands, the picker
53
+ * pre-empt a case the surface already answers — the retype lands, this model
54
54
  * re-derives from the new document, and the direction is then STATED with a
55
55
  * flip beside it, one act from correct. §17b's rule is that direction is stated
56
- * rather than inferred, and it is stated. Revisit this if the flip turns out to
57
- * be reached often enough to be the real cost.
56
+ * rather than inferred, and it is stated: on `renderWorkspace`'s relationship
57
+ * row, which is where both the statement and the flip are drawn. Revisit this
58
+ * if the flip turns out to be reached often enough to be the real cost.
58
59
  *
59
60
  * ## It writes no words and holds no state
60
61
  *
@@ -72,7 +73,10 @@ import { type EdgeId, type EdgeKind, type GraphDocument, type IssueRef, type Pro
72
73
  * The kind travels with them because a pair alone cannot be worded.
73
74
  *
74
75
  * There is deliberately no `text`. A host renders "#530 is blocked by #602" in
75
- * its own language and its own word order; see {@link ./words.ts PickerWords}.
76
+ * its own language and its own word order — and no shipped surface words one
77
+ * from this shape any more: `renderWorkspace`'s row states the direction from
78
+ * layer 1's `EDGE_TREATMENTS`, and this pair is here for the hosts that draw
79
+ * their own.
76
80
  */
77
81
  export interface DirectionStatement {
78
82
  readonly kind: EdgeKind;
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/picker/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAGH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,QAAQ,EAEd,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACvB;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAwB9E"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/picker/view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAGH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,QAAQ,EAEd,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACvB;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAwB9E"}
@@ -50,11 +50,12 @@
50
50
  * The rejected shape was a per-option PREVIEW: every option carrying the
51
51
  * statement it would produce, so the direction is chosen at the same moment as
52
52
  * the kind. It was rejected because it doubles what the picker says in order to
53
- * pre-empt a case the surface already answers — the retype lands, the picker
53
+ * pre-empt a case the surface already answers — the retype lands, this model
54
54
  * re-derives from the new document, and the direction is then STATED with a
55
55
  * flip beside it, one act from correct. §17b's rule is that direction is stated
56
- * rather than inferred, and it is stated. Revisit this if the flip turns out to
57
- * be reached often enough to be the real cost.
56
+ * rather than inferred, and it is stated: on `renderWorkspace`'s relationship
57
+ * row, which is where both the statement and the flip are drawn. Revisit this
58
+ * if the flip turns out to be reached often enough to be the real cost.
58
59
  *
59
60
  * ## It writes no words and holds no state
60
61
  *