@bongos/core 1.21.10 → 1.21.11

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,5 +1,5 @@
1
1
  /* modules/hall-ui/public/street.css — THE STREET (task 1004525, goal 1000125,
2
- R03). The street branch of the <style> and template of
2
+ R03), and inside every building and district (task 1004526, R04). The street branch of the <style> and template of
3
3
  docs/design/mocks/governor-city/Street.dc.html: the same header strip, names
4
4
  and state lines, group brackets, pins with their labels, crates, doors, six
5
5
  readings and card, at the same sizes, and the same keyframes (ring, enter,
@@ -175,14 +175,143 @@ html:has(body[data-page="street"]) { height: 100%; }
175
175
  .street-card { left: 16px; right: 16px; width: auto; }
176
176
  }
177
177
 
178
+ /* ── INSIDE (task 1004526): a building in section, or a district's work ──
179
+ The isBuilding / isDistrict halves of the prototype's template, at the same
180
+ sizes on the same 1440 x 708 artboard (street.js scales it as it scales the
181
+ street). The drawing is SVG data from street-inside.js; everything here is
182
+ on the hall's tokens. Under 900 px the artboard gives way to a column: the
183
+ drawing in its own sideways strip, the panel below it. */
184
+ .inside { position: absolute; inset: 0; display: flex; overflow-x: auto; overflow-y: auto; background: var(--bg); }
185
+ .inside[hidden], .inside-annex[hidden], .inside-dhead[hidden], .inside-legend[hidden], .inside-table[hidden], .inside-open[hidden], .inside-note[hidden], .inside-panel[hidden], .inside-more[hidden] { display: none; }
186
+ .inside-sizer { position: relative; margin: auto; flex: none; overflow: hidden; }
187
+ .inside-board { position: absolute; left: 0; top: 0; width: 1440px; height: 708px; transform-origin: 0 0; transform: scale(var(--inside-scale, 1)); color: var(--ink); }
188
+ .inside-head { position: absolute; left: 32px; top: 16px; display: flex; align-items: center; gap: 16px; z-index: 2; }
189
+ .inside-back { display: inline-flex; align-items: center; min-height: 24px; padding: 6px 0; font-size: 14px; color: var(--street-accent-text); text-decoration: underline; text-underline-offset: 4px; }
190
+
191
+ /* the drawing: 800 wide for a building, the whole board for a district */
192
+ .inside-art { position: absolute; left: 0; top: 0; width: 800px; height: 708px; }
193
+ .inside[data-kind="district"] .inside-art { width: 1440px; }
194
+ .inside-art__span { display: block; width: 0; height: 0; }
195
+ .inside-art__box { position: absolute; left: 0; top: 0; width: 100%; height: 708px; transform-origin: 0 0; transform: scale(var(--inside-art-scale, 1)); }
196
+ .inside-svg { position: absolute; left: 0; top: 0; pointer-events: none; overflow: visible; }
197
+ .inside-svg .inside-sym { fill: none; vector-effect: non-scaling-stroke; stroke-linecap: round; stroke-linejoin: round; }
198
+ .inside-svg text { font-family: var(--font-body); font-variant-numeric: tabular-nums; }
199
+ .inside-svg text.inside-mono { font-family: var(--font-mono); }
200
+ .inside-layer { position: absolute; left: 0; top: 0; width: 100%; height: 708px; pointer-events: none; }
201
+ .inside-layer > * { pointer-events: auto; }
202
+ .inside-floor { position: absolute; background: transparent; border: 0; padding: 0; margin: 0; cursor: pointer; border-radius: 0; }
203
+ .inside-floor:hover { outline: 1px solid color-mix(in srgb, var(--accent) 55%, transparent); outline-offset: -3px; }
204
+
205
+ /* the lift: it slides to the chosen floor */
206
+ .inside-lift { position: absolute; width: 18px; border-radius: 3px; background: var(--accent); display: flex; align-items: center; justify-content: center; pointer-events: none; transition: transform 650ms cubic-bezier(.2,.7,.3,1); }
207
+ .inside-lift[hidden] { display: none; }
208
+ .inside-lift__bar { width: 8px; height: 2px; border-radius: 1px; background: var(--accent-on); }
209
+ .inside-annex { position: absolute; box-sizing: border-box; border: 1px dashed var(--street-rule-strong); display: flex; align-items: flex-end; justify-content: center; padding: 12px; text-align: center; font-size: 12.5px; line-height: 1.4; color: var(--ink-faint); }
210
+
211
+ /* a district: its name, its work labelled on the road, the two-line legend */
212
+ .inside-dhead { position: absolute; left: 32px; top: 58px; display: flex; flex-direction: column; gap: 6px; max-width: 1100px; }
213
+ .inside-dline { margin: 0; font-size: 15.5px; color: var(--ink-soft); }
214
+ .inside-item { position: absolute; display: flex; flex-direction: column; align-items: center; gap: 3px; text-align: center; color: var(--ink); text-decoration: none; border-radius: 8px; padding: 2px 0; }
215
+ .inside-item:hover .inside-item__name { text-decoration: underline; text-underline-offset: 3px; }
216
+ .inside-item__name { font-size: 13.5px; line-height: 1.3; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
217
+ .inside-item__meta { font-size: 12px; color: var(--ink-faint); }
218
+ .inside-item__stage { font-size: 12px; padding: 3px 9px; border-radius: 999px; border: 1px solid var(--street-rule-strong); color: var(--ink-soft); white-space: nowrap; }
219
+ .inside-item--shipped .inside-item__stage { color: var(--ink); }
220
+ .inside-legend { position: absolute; left: 32px; right: 32px; top: 642px; display: flex; gap: 26px; flex-wrap: wrap; }
221
+ .inside-legend span { font-size: 12.5px; color: var(--ink-soft); }
222
+ .inside-more { display: inline-flex; align-items: center; min-height: 24px; font-size: 12.5px; color: var(--street-accent-text); text-decoration: underline; text-underline-offset: 4px; }
223
+
224
+ /* the right panel */
225
+ .inside-panel { position: absolute; left: 840px; top: 58px; width: 568px; bottom: 8px; overflow-x: hidden; overflow-y: auto; display: flex; flex-direction: column; gap: 18px; }
226
+ .inside-title { display: flex; flex-direction: column; gap: 6px; }
227
+ .inside-name { margin: 0; font-size: 40px; font-weight: 300; letter-spacing: -0.04em; line-height: 1; }
228
+ .inside-holds { margin: 0; font-size: 15.5px; line-height: 1.5; color: var(--ink-soft); }
229
+ .inside-gov { display: flex; flex-direction: column; gap: 10px; padding: 14px 0; border-top: 1px solid var(--street-rule); border-bottom: 1px solid var(--street-rule); }
230
+ .inside-gov__row { display: flex; align-items: center; gap: 12px; }
231
+ .inside-gov__row + .inside-gov__row { gap: 10px; }
232
+ .inside-gov__text { font-size: 14.5px; }
233
+ .inside-gov__fill { flex-grow: 1; }
234
+ .inside-seats { display: flex; gap: 5px; flex: none; }
235
+ .inside-seat { width: 28px; height: 28px; border-radius: 999px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 500; background: var(--ink); color: var(--bg-card); }
236
+ .inside-seat--you { background: transparent; color: var(--street-accent-text); border: 2px solid var(--accent); }
237
+ .inside-seat--open { background: transparent; color: var(--ink-faint); border: 1px dashed color-mix(in srgb, var(--ink) 40%, transparent); }
238
+ .inside-glyph { display: block; flex-shrink: 0; }
239
+ .inside-glyph path { fill: var(--ink); }
240
+ .inside-glyph path + path { fill: none; stroke: var(--ink); stroke-width: 1.4; }
241
+ .inside-textbtn { background: none; border: 0; padding: 6px 0; min-height: 24px; text-decoration: underline; text-underline-offset: 4px; font-family: var(--font-body); font-size: 14px; cursor: pointer; text-align: left; color: var(--street-accent-text); flex: none; }
242
+ .inside-note { margin: 0; font-size: 13px; line-height: 1.45; color: var(--ink-soft); }
243
+ .inside-meter { display: flex; flex-direction: column; gap: 6px; }
244
+ .inside-meter__track { height: 6px; border-radius: 999px; background: var(--street-wash); overflow: hidden; }
245
+ .inside-meter__fill { height: 6px; width: 0; background: color-mix(in srgb, var(--ink) 30%, var(--bg)); }
246
+ .inside-meter__fill--full { background: var(--accent); }
247
+ .inside-meter__line { font-size: 13px; color: var(--ink-soft); line-height: 1.45; }
248
+ .inside-table { display: flex; flex-direction: column; gap: 8px; }
249
+ .inside-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; width: 100%; background: none; border: 0; border-top: 1px solid var(--street-rule); padding: 10px 0; cursor: pointer; font-family: var(--font-body); font-size: 15px; text-align: left; color: var(--ink); }
250
+ .inside-row--needs { color: var(--street-accent-text); }
251
+ .inside-row__status { font-size: 12.5px; color: var(--ink-faint); white-space: nowrap; }
252
+
253
+ /* the chosen floor, its sign large; the block re-enters on every pick */
254
+ .inside-open { display: flex; flex-direction: column; gap: 10px; }
255
+ .inside-open__head { display: flex; align-items: center; gap: 16px; }
256
+ .inside-plate { width: 64px; height: 64px; flex-shrink: 0; box-sizing: border-box; border-radius: 12px; border: 1px solid color-mix(in srgb, var(--accent) 55%, transparent); display: flex; align-items: center; justify-content: center; }
257
+ .inside-plate svg { display: block; }
258
+ .inside-plate path { fill: none; stroke: var(--accent); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
259
+ .inside-plate path + path { fill: var(--accent); stroke: none; }
260
+ .inside-open__words { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
261
+ .inside-open__kicker { font-size: 11.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--street-accent-text); }
262
+ .inside-open__title { margin: 0; font-size: 21px; font-weight: 300; letter-spacing: -0.02em; }
263
+ .inside-line { display: flex; justify-content: space-between; gap: 14px; padding: 9px 0; border-top: 1px solid var(--street-rule); font-size: 14.5px; line-height: 1.4; }
264
+ .inside-line__meta { color: var(--ink-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
265
+
266
+ /* the record: one filing drawer a month */
267
+ .inside-record { display: flex; flex-direction: column; gap: 10px; }
268
+ .inside-record__head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
269
+ .inside-record__onfile { font-size: 13px; color: var(--ink-soft); font-variant-numeric: tabular-nums; }
270
+ .inside-drawers { display: flex; gap: 8px; flex-wrap: wrap; }
271
+ .inside-drawer { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 10px 14px; border-radius: 8px; cursor: pointer; font-family: var(--font-body); min-width: 84px; background: transparent; border: 1px solid var(--street-rule-strong); color: var(--ink); }
272
+ .inside-drawer__handle { width: 22px; height: 3px; border-radius: 2px; background: var(--street-rule-strong); }
273
+ .inside-drawer__label { font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; }
274
+ .inside-drawer__count { font-size: 12px; color: var(--ink-faint); font-variant-numeric: tabular-nums; }
275
+ .inside-drawer[aria-pressed="true"] { background: var(--street-wash); border-color: var(--ink); }
276
+ .inside-drawer[aria-pressed="true"] .inside-drawer__handle { background: var(--ink); }
277
+ .inside-ditem { display: flex; justify-content: space-between; gap: 14px; padding: 8px 0; border-top: 1px solid var(--street-rule); font-size: 14px; line-height: 1.4; }
278
+ .inside-ditem__meta { color: var(--ink-faint); white-space: nowrap; }
279
+
280
+ .inside-back:focus-visible, .inside-textbtn:focus-visible, .inside-row:focus-visible, .inside-drawer:focus-visible, .inside-item:focus-visible, .inside-more:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
281
+ .inside-floor:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
282
+ .inside-name:focus { outline: none; }
283
+ .inside-name:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
284
+
285
+ /* narrow: the drawing in its own sideways strip, the panel below it */
286
+ @media (max-width: 899px) {
287
+ .inside { display: block; overflow-x: hidden; overflow-y: auto; }
288
+ .inside-sizer { width: auto !important; height: auto !important; margin: 0; overflow: visible; }
289
+ .inside-board { position: static; width: auto; height: auto; transform: none; display: flex; flex-direction: column; gap: 16px; padding: 8px 16px 24px; }
290
+ .inside-head { position: static; flex-wrap: wrap; row-gap: 0; }
291
+ .inside-art, .inside[data-kind="district"] .inside-art { position: relative; width: auto; height: var(--inside-art-h, 425px); overflow-x: auto; overflow-y: hidden; order: 2; }
292
+ .inside-art__box { width: 800px; }
293
+ .inside[data-kind="district"] .inside-art__box { width: 1440px; }
294
+ .inside-dhead, .inside-legend, .inside-panel { position: static; width: auto; max-width: none; }
295
+ .inside-dhead { order: 1; }
296
+ .inside-legend { order: 3; flex-direction: column; gap: 8px; }
297
+ .inside-panel { order: 3; overflow: visible; }
298
+ .inside-name { font-size: 32px; }
299
+ .inside-gov__row { flex-wrap: wrap; row-gap: 4px; }
300
+ }
301
+
178
302
  /* the prototype's motion, verbatim */
179
303
  @keyframes street-ring { 0% { transform: scale(.8); opacity: .9; } 100% { transform: scale(2.3); opacity: 0; } }
180
304
  @keyframes street-enter { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
181
305
  .street-pin__ring { animation: street-ring 2.8s cubic-bezier(.2,.7,.3,1) infinite; }
182
- .street-card, .street-evening { animation: street-enter 320ms cubic-bezier(.16,1,.3,1) both; }
306
+ .street-card, .street-evening, .inside-open { animation: street-enter 320ms cubic-bezier(.16,1,.3,1) both; }
307
+ /* the prototype's zoom on stepping inside, on the individual scale property so
308
+ it composes with the board's fit-to-window transform instead of fighting it */
309
+ @keyframes street-zoom { from { opacity: 0; scale: .97; } to { opacity: 1; scale: 1; } }
310
+ .inside-board { animation: street-zoom 420ms cubic-bezier(.16,1,.3,1) both; }
183
311
 
184
312
  /* The Kill Switch: under reduced motion nothing moves. The rest frame is the
185
- whole street with its pins standing still. */
313
+ whole street with its pins standing still, and inside a building the lift
314
+ standing at the chosen floor without travelling there. */
186
315
  @media (prefers-reduced-motion: reduce) {
187
316
  body[data-page="street"] *, body[data-page="street"] *::before, body[data-page="street"] *::after { animation: none !important; transition: none !important; }
188
317
  }
@@ -11,7 +11,7 @@
11
11
  links, injected into this head by the server like every hall page's
12
12
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet). -->
13
13
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
14
- <link rel="stylesheet" href="/builders/street.css?v=2026-10-02-street1">
14
+ <link rel="stylesheet" href="/builders/street.css?v=2026-10-02-inside1">
15
15
  </head>
16
16
  <!-- THE STREET (task 1004525, goal 1000125, R03). The street view of
17
17
  docs/design/mocks/governor-city/Street.dc.html (renderVals' street branch,
@@ -27,14 +27,16 @@
27
27
  the kicker, needs you, moving, your share, the light/dark switch), the
28
28
  street drawn on its 1440-wide artboard (street.js scales it to the
29
29
  window), and the six readings along the bottom. Every
30
- building and district is a door (an <a>) to where its interior lives —
31
- /builders/street#building=<key> and #district=<goal id> (README "Where the
32
- screens live"; task 1004526 builds them). A pin opens the matter's short
33
- card (task 1004528 makes it act).
30
+ building and district is a door (an <a>) to its interior, a view of this
31
+ page: /builders/street#building=<key> and #district=<goal id> (README
32
+ "Where the screens live"; task 1004526, #streetInside below). A pin, or a
33
+ row on a building's table, opens the matter's short card (task 1004528
34
+ makes it act).
34
35
 
35
36
  The drawing is street-draw.js (the prototype's front-on kit, verbatim, as
36
37
  pure data) over city-draw.js (the glyphs and the seeded random, shared with
37
- the city); street.js reads the feeds and builds the nodes; street.css is
38
+ the city); street-inside.js is the interiors as data (buildingView and
39
+ districtView, verbatim); street.js reads the feeds and builds the nodes; street.css is
38
40
  the template's <style> on the hall's tokens.
39
41
 
40
42
  The page is gated on board.vote.cast (src/bongos/serve-internal.js), the
@@ -89,6 +91,78 @@
89
91
  <div class="street-layer" id="streetPins"></div>
90
92
  </div>
91
93
  </div>
94
+
95
+ <!-- INSIDE (task 1004526): a building in section, or a district's work, when
96
+ the address names one (#building=<key> / #district=<goal id>). The
97
+ prototype's buildingView() and districtView() on the same 1440 x 708
98
+ artboard; street-inside.js draws them, street.js builds the nodes. -->
99
+ <section class="inside" id="streetInside" aria-labelledby="insideName" hidden>
100
+ <div class="inside-sizer" id="insideSizer">
101
+ <div class="inside-board" id="insideBoard">
102
+ <div class="inside-head">
103
+ <a class="inside-back" id="insideBack" href="/builders/street">back to the street</a>
104
+ <span class="street-label" id="insideKicker"></span>
105
+ </div>
106
+ <div class="inside-art" id="insideArt">
107
+ <span class="inside-art__span" id="insideArtSpan"></span>
108
+ <div class="inside-art__box" id="insideArtBox">
109
+ <svg class="inside-svg" id="insideSvg" width="800" height="708" viewBox="0 0 800 708" role="img" aria-label="">
110
+ <g id="insideShapes"></g>
111
+ <g id="insideSyms"></g>
112
+ <g id="insideTexts"></g>
113
+ </svg>
114
+ <div class="inside-layer" id="insideFloors"></div>
115
+ <div class="inside-lift" id="insideLift" aria-hidden="true"><span class="inside-lift__bar"></span></div>
116
+ <div class="inside-annex" id="insideAnnex" hidden><span id="insideAnnexText"></span></div>
117
+ <div class="inside-layer" id="insideItems"></div>
118
+ </div>
119
+ </div>
120
+ <div class="inside-dhead" id="insideDHead" hidden>
121
+ <h2 class="inside-name" id="insideDName"></h2>
122
+ <p class="inside-dline" id="insideDLine"></p>
123
+ </div>
124
+ <div class="inside-legend" id="insideLegend" hidden></div>
125
+
126
+ <div class="inside-panel" id="insidePanel">
127
+ <div class="inside-title">
128
+ <h2 class="inside-name" id="insideName" tabindex="-1"></h2>
129
+ <p class="inside-holds" id="insideHolds"></p>
130
+ </div>
131
+ <div class="inside-gov">
132
+ <div class="inside-gov__row">
133
+ <span class="inside-seats" id="insideSeats"></span>
134
+ <span class="inside-gov__text" id="insideWho"></span>
135
+ </div>
136
+ <div class="inside-gov__row">
137
+ <svg class="inside-glyph" width="18" height="18" aria-hidden="true" focusable="false"><path id="insideGlyphF" d=""></path><path id="insideGlyphL" d=""></path></svg>
138
+ <span class="inside-gov__text" id="insideHow"></span>
139
+ <span class="inside-gov__fill"></span>
140
+ <button type="button" class="inside-textbtn" id="insideAmend" aria-describedby="insideAmendNote">change how this works</button>
141
+ </div>
142
+ <p class="inside-note" id="insideAmendNote" role="status" hidden></p>
143
+ <div class="inside-meter">
144
+ <div class="inside-meter__track"><div class="inside-meter__fill" id="insideFill"></div></div>
145
+ <span class="inside-meter__line" id="insideGrowth"></span>
146
+ </div>
147
+ </div>
148
+ <div class="inside-table" id="insideTableWrap" hidden>
149
+ <span class="street-label">on the table here</span>
150
+ <div id="insideTable"></div>
151
+ </div>
152
+ <div class="inside-open" id="insideOpenA"></div>
153
+ <div class="inside-open" id="insideOpenB" hidden></div>
154
+ <div class="inside-record">
155
+ <div class="inside-record__head">
156
+ <span class="street-label">the record</span>
157
+ <span class="inside-record__onfile" id="insideOnFile"></span>
158
+ </div>
159
+ <div class="inside-drawers" id="insideDrawers"></div>
160
+ <div id="insideDrawerItems"></div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </section>
92
166
  </main>
93
167
 
94
168
  <nav class="street-signs" id="streetSigns" aria-label="The six readings"></nav>
@@ -113,6 +187,7 @@
113
187
 
114
188
  <script src="/builders/city-draw.js?v=2026-10-02-street1"></script>
115
189
  <script src="/builders/street-draw.js?v=2026-10-02-street1"></script>
116
- <script src="/builders/street.js?v=2026-10-02-street1"></script>
190
+ <script src="/builders/street-inside.js?v=2026-10-02-inside1"></script>
191
+ <script src="/builders/street.js?v=2026-10-02-inside1"></script>
117
192
  </body>
118
193
  </html>