@bongos/core 1.24.55 → 1.24.57
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/.bongos-core.json +67 -37
- package/docs/copy-inventory.md +16 -16
- package/docs/copy-registry.json +17 -17
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +18 -18
- package/modules/hall-ui/public/approval-queue.css +9 -9
- package/modules/hall-ui/public/atlas.css +5 -1
- package/modules/hall-ui/public/atlas.js +14 -11
- package/modules/hall-ui/public/city-draw.js +14 -14
- package/modules/hall-ui/public/sky-draw.js +24 -6
- package/modules/hall-ui/public/sky-interaction.js +1 -1
- package/modules/hall-ui/public/sky-panel.js +1 -1
- package/modules/hall-ui/public/studio.css +22 -22
- package/modules/hall-ui/public/thinking.css +46 -48
- package/modules/hall-ui/public/tweak-editor.css +18 -18
- package/modules/hall-ui/public/welcome-boot.css +5 -8
- package/modules/hall-ui/public/welcome-boot.js +11 -15
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/bongos/css-literal-scan.js +144 -0
- package/scripts/bongos/design-generators-fresh.js +32 -0
- package/scripts/bongos/fitness-ratchets.js +70 -3
- package/scripts/bongos/fitness.js +3 -2
- package/scripts/gds/css-literal-scan.js +7 -0
- package/scripts/gds/design-generators-fresh.js +6 -0
- package/src/bongos/module-scope-map.js +1 -1
- package/src/module-api.js +1 -1
- package/tests/design_counts_ratchet.mjs +134 -0
- package/tests/hall_catalog_world.mjs +7 -2
- package/tests/hall_city.mjs +5 -4
- package/tests/hall_private_palettes.mjs +148 -0
- package/tests/hall_sky.mjs +29 -32
- package/tests/hall_street.mjs +3 -2
- package/tests/helpers.mjs +25 -1
- package/tests/welcome_boot.mjs +1 -1
- package/tests/welcome_boot_browser.mjs +1 -1
package/docs/page-readings.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"surface": "builders",
|
|
13
13
|
"title": "Studio",
|
|
14
14
|
"states_read": ["pick","describe","make","waiting","result","result-own","failed","balance","balance-all","out"],
|
|
15
|
-
"files_hash": "
|
|
15
|
+
"files_hash": "59bae8d59c4ef244",
|
|
16
16
|
"reading_hash": "e381a3141dc6b9cb",
|
|
17
17
|
"counts": {"lines":105,"placed":38,"shared":9,"unplaced":58},
|
|
18
18
|
"omitted": {"data":15},
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"surface": "builders",
|
|
131
131
|
"title": "Repo Atlas",
|
|
132
132
|
"states_read": ["map","truth","detail","index","out"],
|
|
133
|
-
"files_hash": "
|
|
133
|
+
"files_hash": "383ff2c1143f8de3",
|
|
134
134
|
"reading_hash": "94058beb635218ba",
|
|
135
135
|
"counts": {"lines":24,"placed":11,"shared":9,"unplaced":4},
|
|
136
136
|
"omitted": {"data":3},
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
{"key":"L0009","section":"The map","text":"The map","placement":"placed","file":"modules/hall-ui/public/atlas.html","line":43,"string_id":"a02d386fbc13"},
|
|
148
148
|
{"key":"L0010","section":"The map","text":"Context layer","placement":"placed","file":"modules/hall-ui/public/atlas.html","line":45,"string_id":"999e1955bb1c"},
|
|
149
149
|
{"key":"L0011","section":"The map","text":"Module truth","placement":"placed","file":"modules/hall-ui/public/atlas.html","line":46,"string_id":"9af4b7a3a36f"},
|
|
150
|
-
{"key":"L0012","section":"The map","text":"The map has not been generated on this deploy yet.","placement":"placed","file":"modules/hall-ui/public/atlas.js","line":
|
|
150
|
+
{"key":"L0012","section":"The map","text":"The map has not been generated on this deploy yet.","placement":"placed","file":"modules/hall-ui/public/atlas.js","line":419,"string_id":"e1ce3766c6fe"},
|
|
151
151
|
{"key":"L0013","section":"The map","text":"The map is being drawn.","placement":"placed","file":"modules/hall-ui/public/atlas.html","line":61,"string_id":"689a13ba5bd6"},
|
|
152
152
|
{"key":"L0014","section":"The map","text":"It redraws itself each time code ships. Check back after the next deploy.","placement":"placed","file":"modules/hall-ui/public/atlas.html","line":61,"string_id":"2f920fe23b1f"},
|
|
153
153
|
{"key":"L0015","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":533,"string_id":"1883ad7f07fc"},
|
|
@@ -279,7 +279,7 @@
|
|
|
279
279
|
"surface": "builders",
|
|
280
280
|
"title": "The city",
|
|
281
281
|
"states_read": ["city","fullscreen","switched","focus","pins","living","card","card-ask"],
|
|
282
|
-
"files_hash": "
|
|
282
|
+
"files_hash": "761cde542c92b4e5",
|
|
283
283
|
"reading_hash": "11234462e18a0037",
|
|
284
284
|
"counts": {"lines":44,"placed":10,"shared":9,"unplaced":25},
|
|
285
285
|
"omitted": {"data":18},
|
|
@@ -636,7 +636,7 @@
|
|
|
636
636
|
"surface": "builders",
|
|
637
637
|
"title": "The sky",
|
|
638
638
|
"states_read": ["tour","sky","wells","ledger","full","full-back","out"],
|
|
639
|
-
"files_hash": "
|
|
639
|
+
"files_hash": "c12fafe7a894d009",
|
|
640
640
|
"reading_hash": "2ae796b3e72c6d26",
|
|
641
641
|
"counts": {"lines":49,"placed":22,"shared":8,"unplaced":19},
|
|
642
642
|
"omitted": {"data":8},
|
|
@@ -974,8 +974,8 @@
|
|
|
974
974
|
"surface": "builders",
|
|
975
975
|
"title": "Builders' Hall",
|
|
976
976
|
"states_read": ["home","out","founding","genesis","decide","demo"],
|
|
977
|
-
"files_hash": "
|
|
978
|
-
"reading_hash": "
|
|
977
|
+
"files_hash": "bc5ca534bc9785be",
|
|
978
|
+
"reading_hash": "425272d48d62ec92",
|
|
979
979
|
"counts": {"lines":28,"placed":9,"shared":10,"unplaced":9},
|
|
980
980
|
"omitted": {"data":4},
|
|
981
981
|
"notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
|
|
@@ -999,15 +999,15 @@
|
|
|
999
999
|
{"key":"L0017","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":320,"string_id":"e181637c5a5e"},
|
|
1000
1000
|
{"key":"L0018","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
|
|
1001
1001
|
{"key":"L0019","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":533,"string_id":"1883ad7f07fc"},
|
|
1002
|
-
{"key":"L0020","section":"Needs your attention13","text":"core 1.24.
|
|
1002
|
+
{"key":"L0020","section":"Needs your attention13","text":"core 1.24.53","placement":"unplaced"},
|
|
1003
1003
|
{"key":"L0021","section":"Needs your attention13","text":"Skip","placement":"unplaced"},
|
|
1004
|
-
{"key":"L0022","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":
|
|
1004
|
+
{"key":"L0022","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":181,"string_id":"fef59346ffee"},
|
|
1005
1005
|
{"key":"L0023","section":"Needs your attention13","text":"cloudbongos.com","placement":"unplaced"},
|
|
1006
|
-
{"key":"L0024","section":"Good morning, {…}","text":"Where do you want to start the day?","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":
|
|
1007
|
-
{"key":"L0025","section":"Good morning, {…}","text":"Start with your role","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":
|
|
1008
|
-
{"key":"L0026","section":"Good morning, {…}","text":"Pick today’s craft and go straight to its room.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":
|
|
1009
|
-
{"key":"L0027","section":"Good morning, {…}","text":"Your home page","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":
|
|
1010
|
-
{"key":"L0028","section":"Good morning, {…}","text":"Your work, what needs you, and what shipped.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":
|
|
1006
|
+
{"key":"L0024","section":"Good morning, {…}","text":"Where do you want to start the day?","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":186,"string_id":"0ec8d133f878","state":"founding"},
|
|
1007
|
+
{"key":"L0025","section":"Good morning, {…}","text":"Start with your role","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":188,"string_id":"58cef7963b6c","state":"founding"},
|
|
1008
|
+
{"key":"L0026","section":"Good morning, {…}","text":"Pick today’s craft and go straight to its room.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":188,"string_id":"100e4665514d","state":"founding"},
|
|
1009
|
+
{"key":"L0027","section":"Good morning, {…}","text":"Your home page","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":189,"string_id":"2e6866532113","state":"founding"},
|
|
1010
|
+
{"key":"L0028","section":"Good morning, {…}","text":"Your work, what needs you, and what shipped.","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":189,"string_id":"e8d92c773db0","state":"founding"}
|
|
1011
1011
|
]
|
|
1012
1012
|
},
|
|
1013
1013
|
{
|
|
@@ -2599,7 +2599,7 @@
|
|
|
2599
2599
|
"surface": "builders",
|
|
2600
2600
|
"title": "The street",
|
|
2601
2601
|
"states_read": ["street","fullscreen","card","switched","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district","desk","desk-facts","desk-quiet","desk-people-builders","desk-people-tier","desk-disputes","desk-automation-goals","desk-release-core","desk-rules","desk-rules-category","desk-planning-priorities","desk-planning-ideas","desk-planning-blockers","pins","pins-pager","living","deck","deck-treasury","sitting","object","voted","admission","settled","blocker","blocker-more","report","report-more","core","core-more","recheck","recheck-more","idea","idea-more","queue","queue-more","automation","automation-more"],
|
|
2602
|
-
"files_hash": "
|
|
2602
|
+
"files_hash": "b0825a67698a6133",
|
|
2603
2603
|
"reading_hash": "8e9e3422f6b72884",
|
|
2604
2604
|
"counts": {"lines":460,"placed":65,"shared":9,"unplaced":386},
|
|
2605
2605
|
"omitted": {"data":433},
|
|
@@ -3072,7 +3072,7 @@
|
|
|
3072
3072
|
"surface": "builders",
|
|
3073
3073
|
"title": "Studio",
|
|
3074
3074
|
"states_read": ["home","out","flow","flow-pick","status","words-offer","words-edit","reviews","full","full-back","approvals","approvals-before","approvals-phone","approvals-note","approved","sent-back","approvals-page"],
|
|
3075
|
-
"files_hash": "
|
|
3075
|
+
"files_hash": "123b87d23d62d9f0",
|
|
3076
3076
|
"reading_hash": "99e3725589540c63",
|
|
3077
3077
|
"counts": {"lines":51,"placed":27,"shared":9,"unplaced":15},
|
|
3078
3078
|
"omitted": {"data":21},
|
|
@@ -3299,7 +3299,7 @@
|
|
|
3299
3299
|
"surface": "builders",
|
|
3300
3300
|
"title": "Your thinking",
|
|
3301
3301
|
"states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
|
|
3302
|
-
"files_hash": "
|
|
3302
|
+
"files_hash": "d2d57052b0aa1b42",
|
|
3303
3303
|
"reading_hash": "8113aa9e50ec5600",
|
|
3304
3304
|
"counts": {"lines":49,"placed":22,"shared":8,"unplaced":19},
|
|
3305
3305
|
"omitted": {"data":8},
|
|
@@ -3361,7 +3361,7 @@
|
|
|
3361
3361
|
"surface": "builders",
|
|
3362
3362
|
"title": "Tweak a page",
|
|
3363
3363
|
"states_read": ["doc","typed","chrome","submitted","picking","out"],
|
|
3364
|
-
"files_hash": "
|
|
3364
|
+
"files_hash": "4ce43a078dc70592",
|
|
3365
3365
|
"reading_hash": "711c540ebc7ef977",
|
|
3366
3366
|
"counts": {"lines":23,"placed":15,"shared":1,"unplaced":7},
|
|
3367
3367
|
"omitted": {"data":35},
|
|
@@ -27,22 +27,22 @@
|
|
|
27
27
|
--aq-glass-edge: rgba(255, 255, 255, .18);
|
|
28
28
|
--aq-glass-rim: rgba(255, 255, 255, .22);
|
|
29
29
|
--aq-ink: #ffffff;
|
|
30
|
-
--aq-ink-soft:
|
|
31
|
-
--aq-ink-faint:
|
|
30
|
+
--aq-ink-soft: rgba(255, 255, 255, .75);
|
|
31
|
+
--aq-ink-faint: rgba(255, 255, 255, .66);
|
|
32
32
|
--aq-ink-dim: #8a8a90;
|
|
33
33
|
--aq-well: rgba(0, 0, 0, .25);
|
|
34
34
|
--aq-pill-on: rgba(255, 255, 255, .16);
|
|
35
35
|
--aq-close: rgba(255, 255, 255, .08);
|
|
36
36
|
--aq-ghost-edge: rgba(255, 255, 255, .24);
|
|
37
|
-
--aq-accent:
|
|
37
|
+
--aq-accent: var(--accent);
|
|
38
38
|
--aq-on-accent: #000000;
|
|
39
|
-
--aq-link: #
|
|
40
|
-
--aq-mark:
|
|
41
|
-
--aq-paper:
|
|
42
|
-
--aq-paper-ink:
|
|
39
|
+
--aq-link: color-mix(in srgb, var(--accent) 55%, #ffffff);
|
|
40
|
+
--aq-mark: color-mix(in srgb, var(--accent) 35%, transparent);
|
|
41
|
+
--aq-paper: var(--bg);
|
|
42
|
+
--aq-paper-ink: var(--ink);
|
|
43
43
|
--aq-rule: rgba(255, 255, 255, .12);
|
|
44
|
-
--aq-face: var(--font-body
|
|
45
|
-
--aq-mono: var(--font-mono
|
|
44
|
+
--aq-face: var(--font-body);
|
|
45
|
+
--aq-mono: var(--font-mono);
|
|
46
46
|
/* the layer, the placement and the gutter are the shared .hall-scrim's
|
|
47
47
|
(controls.css, task 1005085); only the artboard's tint is its own */
|
|
48
48
|
background: var(--aq-scrim);
|
|
@@ -22,7 +22,11 @@
|
|
|
22
22
|
purpose and are not the Fifteen Rule's business. Everything BELOW them is
|
|
23
23
|
chrome, and chrome is the world's (task 1003307). */
|
|
24
24
|
--ab-sun:#6366f1; --ab-sky:#0ea5e9; --ab-coral:#f43f5e; --ab-paper:#b3a284;
|
|
25
|
-
--ab-
|
|
25
|
+
--ab-ghost:#94a3b8;
|
|
26
|
+
/* the four STATE colours are the hall's status vocabulary (task 1005087), so a
|
|
27
|
+
clean module, the core, the database and a violation read as the hall's
|
|
28
|
+
ok / warn / danger everywhere, and atlas.js reads them off the page */
|
|
29
|
+
--ab-good:var(--ok); --ab-core:var(--warn); --ab-db:var(--danger); --ab-danger:var(--danger);
|
|
26
30
|
/* theme-dependent, non-semantic scene values (read by atlas.js) */
|
|
27
31
|
--ab-label-ink: var(--ink);
|
|
28
32
|
--ab-label-halo: var(--bg-card);
|
|
@@ -20,14 +20,16 @@
|
|
|
20
20
|
|
|
21
21
|
var TOKENS = {
|
|
22
22
|
sun: '#6366f1', sky: '#0ea5e9', coral: '#f43f5e', paper: '#b3a284',
|
|
23
|
-
|
|
23
|
+
ghost: '#94a3b8',
|
|
24
|
+
// good / core / db / danger are the hall's status colours, read off the page by readTheme() (task 1005087)
|
|
25
|
+
good: '', core: '', db: '', danger: '',
|
|
24
26
|
};
|
|
25
27
|
var EDGE_STYLE = {
|
|
26
|
-
drill: { c:
|
|
27
|
-
live: { c:
|
|
28
|
-
clean: { c:
|
|
29
|
-
monolith: { c:
|
|
30
|
-
seam: { c:
|
|
28
|
+
drill: { c: 'sky', w: 2.2, dash: 0 }, gov: { c: 'sun', w: 2, dash: 0 },
|
|
29
|
+
live: { c: 'coral', w: 2.4, dash: 0 }, drift: { c: 'danger', w: 2, dash: '5 5' },
|
|
30
|
+
clean: { c: 'good', w: 2.4, dash: 0 }, violation: { c: 'danger', w: 3, dash: '5 5' },
|
|
31
|
+
monolith: { c: 'db', w: 3, dash: 0 }, ghost: { c: 'ghost', w: 1.8, dash: '5 5' },
|
|
32
|
+
seam: { c: 'sun', w: 2, dash: 0 },
|
|
31
33
|
};
|
|
32
34
|
// The in-scene badge kinds map onto the shell's status pills in the HTML
|
|
33
35
|
// detail (good → ok, the rest by name), so a badge reads the same on the
|
|
@@ -44,14 +46,15 @@
|
|
|
44
46
|
var val = cs ? cs.getPropertyValue(name).trim() : '';
|
|
45
47
|
return val || fallback;
|
|
46
48
|
};
|
|
49
|
+
['good', 'core', 'db', 'danger'].forEach(function (k) { TOKENS[k] = v('--ab-' + k, TOKENS.ghost); });
|
|
47
50
|
THEME = {
|
|
48
51
|
ambient: v('--ab-ambient', 'rgba(255,255,255,.5)'),
|
|
49
52
|
glow: v('--ab-glow', '#c7cdf7'),
|
|
50
53
|
badge: {
|
|
51
|
-
good: [v('--ab-b-good-bg', '
|
|
52
|
-
warn: [v('--ab-b-warn-bg', '
|
|
53
|
-
danger: [v('--ab-b-danger-bg', '
|
|
54
|
-
info: [v('--ab-b-info-bg', '
|
|
54
|
+
good: [v('--ab-b-good-bg', ''), v('--ab-b-good-fg', '')],
|
|
55
|
+
warn: [v('--ab-b-warn-bg', ''), v('--ab-b-warn-fg', '')],
|
|
56
|
+
danger: [v('--ab-b-danger-bg', ''), v('--ab-b-danger-fg', '')],
|
|
57
|
+
info: [v('--ab-b-info-bg', ''), v('--ab-b-info-fg', '')],
|
|
55
58
|
},
|
|
56
59
|
halo: v('--ab-label-halo', '#ffffff'),
|
|
57
60
|
};
|
|
@@ -216,7 +219,7 @@
|
|
|
216
219
|
var A = topCenter(na), B = topCenter(nb);
|
|
217
220
|
var st = EDGE_STYLE[e.kind] || EDGE_STYLE.clean;
|
|
218
221
|
var mid = { x: (A.x + B.x) / 2, y: (A.y + B.y) / 2 - Math.hypot(B.x - A.x, B.y - A.y) * 0.16 - 14 };
|
|
219
|
-
var path = el('path', { d: 'M' + r1(A.x) + ',' + r1(A.y) + ' Q' + r1(mid.x) + ',' + r1(mid.y) + ' ' + r1(B.x) + ',' + r1(B.y), stroke: st.c, 'stroke-width': st.w, 'stroke-linecap': 'round', fill: 'none', 'class': 'ab-edge' }, edgeLayer);
|
|
222
|
+
var path = el('path', { d: 'M' + r1(A.x) + ',' + r1(A.y) + ' Q' + r1(mid.x) + ',' + r1(mid.y) + ' ' + r1(B.x) + ',' + r1(B.y), stroke: TOKENS[st.c], 'stroke-width': st.w, 'stroke-linecap': 'round', fill: 'none', 'class': 'ab-edge' }, edgeLayer);
|
|
220
223
|
if (st.dash) path.setAttribute('stroke-dasharray', st.dash);
|
|
221
224
|
edgeEls.push({ el: path, a: e.a, b: e.b });
|
|
222
225
|
});
|
|
@@ -55,18 +55,18 @@
|
|
|
55
55
|
function isoTheme(mode) {
|
|
56
56
|
if (mode === 'light') {
|
|
57
57
|
return {
|
|
58
|
-
civic: { t: '
|
|
59
|
-
work: { t: '#f4f3f6', l: '#e6e5e9', r: '#d4d3d8', s: '
|
|
60
|
-
plinth: { t: '#efeef1', l: '#e2e1e5', r: '#cfced3', s: '
|
|
61
|
-
roof: { t: '#e9e8ec', l: '#dddce1', r: '#cbcad0', s: '
|
|
62
|
-
glass: { t: '
|
|
63
|
-
scaffold: { t: '
|
|
64
|
-
crate: { t: '
|
|
65
|
-
sign: { t: '#e2e1e5', l: '#e2e1e5', r: '#cfced3', s: '
|
|
66
|
-
ground: '
|
|
67
|
-
plaza: '
|
|
68
|
-
detail: '
|
|
69
|
-
vacantFill: '
|
|
58
|
+
civic: { t: 'var(--bg-card)', l: '#ecebee', r: '#d9d8dd', s: 'color-mix(in srgb, var(--ink) 34%, transparent)' },
|
|
59
|
+
work: { t: '#f4f3f6', l: '#e6e5e9', r: '#d4d3d8', s: 'color-mix(in srgb, var(--ink) 24%, transparent)' },
|
|
60
|
+
plinth: { t: '#efeef1', l: '#e2e1e5', r: '#cfced3', s: 'color-mix(in srgb, var(--ink) 28%, transparent)' },
|
|
61
|
+
roof: { t: '#e9e8ec', l: '#dddce1', r: '#cbcad0', s: 'color-mix(in srgb, var(--ink) 34%, transparent)' },
|
|
62
|
+
glass: { t: 'color-mix(in srgb, var(--sea) 10%, transparent)', l: 'color-mix(in srgb, var(--sea) 14%, transparent)', r: 'color-mix(in srgb, var(--sea) 22%, transparent)', s: 'rgba(60,80,180,0.50)' },
|
|
63
|
+
scaffold: { t: 'color-mix(in srgb, var(--ink) 3%, transparent)', l: 'color-mix(in srgb, var(--ink) 2%, transparent)', r: 'color-mix(in srgb, var(--ink) 2%, transparent)', s: 'color-mix(in srgb, var(--ink) 45%, transparent)', dash: '3 3' },
|
|
64
|
+
crate: { t: 'color-mix(in srgb, var(--ink) 6%, transparent)', l: 'color-mix(in srgb, var(--ink) 4%, transparent)', r: 'color-mix(in srgb, var(--ink) 7%, transparent)', s: 'color-mix(in srgb, var(--ink) 55%, transparent)', dash: '3 2' },
|
|
65
|
+
sign: { t: '#e2e1e5', l: '#e2e1e5', r: '#cfced3', s: 'color-mix(in srgb, var(--ink) 45%, transparent)' },
|
|
66
|
+
ground: 'color-mix(in srgb, var(--ink) 2.5%, transparent)', groundLine: 'color-mix(in srgb, var(--ink) 10%, transparent)', road: 'color-mix(in srgb, var(--ink) 5%, transparent)', lane: 'color-mix(in srgb, var(--ink) 22%, transparent)',
|
|
67
|
+
plaza: 'color-mix(in srgb, var(--ink) 5%, transparent)', plazaLine: 'color-mix(in srgb, var(--ink) 16%, transparent)', plot: 'color-mix(in srgb, var(--ink) 3.5%, transparent)', plotLine: 'color-mix(in srgb, var(--ink) 14%, transparent)', grid: 'color-mix(in srgb, var(--ink) 6%, transparent)',
|
|
68
|
+
detail: 'color-mix(in srgb, var(--ink) 18%, transparent)', wc: 'color-mix(in srgb, var(--ink) 16%, transparent)', wcLit: 'rgba(214,140,80,0.60)', door: '#cfced3', beacon: 'var(--accent)',
|
|
69
|
+
vacantFill: 'color-mix(in srgb, var(--ink) 2%, transparent)', vacantLine: 'color-mix(in srgb, var(--ink) 45%, transparent)', tree: 'color-mix(in srgb, var(--sea) 22%, transparent)', treeLine: 'rgba(60,80,180,0.45)',
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
72
|
return {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
ground: 'rgba(255,255,255,0.012)', groundLine: 'rgba(255,255,255,0.05)', road: 'rgba(255,255,255,0.025)', lane: 'rgba(255,255,255,0.12)',
|
|
82
82
|
plaza: 'rgba(255,255,255,0.045)', plazaLine: 'rgba(255,255,255,0.16)', plot: 'rgba(255,255,255,0.03)', plotLine: 'rgba(255,255,255,0.13)', grid: 'rgba(255,255,255,0.045)',
|
|
83
83
|
detail: 'rgba(255,255,255,0.10)', wc: 'rgba(255,255,255,0.10)', wcLit: 'rgba(255,214,170,0.80)', door: '#050506', beacon: '#fff4e6',
|
|
84
|
-
vacantFill: 'rgba(255,255,255,0.02)', vacantLine: 'rgba(255,255,255,0.4)', tree: '
|
|
84
|
+
vacantFill: 'rgba(255,255,255,0.02)', vacantLine: 'rgba(255,255,255,0.4)', tree: 'color-mix(in srgb, var(--sea) 32%, transparent)', treeLine: 'rgba(140,155,230,0.45)',
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
|
|
155
155
|
function isoLight(out, k, x, y, z, r) {
|
|
156
156
|
const c = k.P(x, y, z);
|
|
157
|
-
push(out, ellipse(Math.round(c[0]), Math.round(c[1]), r * 2.6, r * 2.6), '
|
|
157
|
+
push(out, ellipse(Math.round(c[0]), Math.round(c[1]), r * 2.6, r * 2.6), 'color-mix(in srgb, var(--accent) 10%, transparent)', 'none');
|
|
158
158
|
push(out, ellipse(Math.round(c[0]), Math.round(c[1]), r, r), k.I.beacon, 'none');
|
|
159
159
|
}
|
|
160
160
|
|
|
@@ -18,10 +18,12 @@
|
|
|
18
18
|
const { $, TAU, reduce, NOW, hash, clamp, lerp, smooth, ease, short, ringR, taskAt, diameter, shown, seen, present, toScreen, toWorld, curve, pointOn, reveal, bandAt, cv } = SKY;
|
|
19
19
|
const ctx = cv.getContext('2d');
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
// Filled from the stage's --accent / --chart by readPalette() before the first frame.
|
|
22
|
+
const ACC = [128, 128, 128], CHART = [128, 128, 128];
|
|
23
|
+
let FACE = 'system-ui, sans-serif', MONO = 'monospace';
|
|
22
24
|
const rgba = (c, a) => `rgba(${c[0]},${c[1]},${c[2]},${a})`;
|
|
23
25
|
// THE PALETTE (task 1004500). The template's white-on-void, read off the stage's
|
|
24
|
-
//
|
|
26
|
+
// colour tokens (thinking.css; channels until task 1005087) so the light theme paints ink on paper.
|
|
25
27
|
// The arrays are filled IN PLACE: SKY.ACC / SKY.CHART stay the same objects.
|
|
26
28
|
// Re-read only when the theme flips (shell.js writes html[data-theme]).
|
|
27
29
|
const INK = [255, 255, 255], VOID = [0, 0, 0], COLD = [20, 20, 24]; let TEMP = 1;
|
|
@@ -34,8 +36,24 @@
|
|
|
34
36
|
const st = typeof document.querySelector === 'function' && document.querySelector('.sky-stage');
|
|
35
37
|
if (!st || typeof getComputedStyle !== 'function') return;
|
|
36
38
|
const cs = getComputedStyle(st); if (!cs || typeof cs.getPropertyValue !== 'function') return;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
// Each is a COLOUR token on the stage (thinking.css: the hall's own, task 1005087), resolved by
|
|
40
|
+
// letting the browser compute it on a probe: "rgb(r, g, b)" or, for a color-mix, "color(srgb r g b)".
|
|
41
|
+
const probe = typeof document.createElement === 'function' ? document.createElement('i') : null;
|
|
42
|
+
if (probe && probe.style) { probe.hidden = true; st.appendChild(probe); }
|
|
43
|
+
const fill = (name, into) => {
|
|
44
|
+
if (!probe || !probe.style) return;
|
|
45
|
+
probe.style.color = ''; probe.style.color = `var(${name})`;
|
|
46
|
+
const c = String(getComputedStyle(probe).color || '');
|
|
47
|
+
let v = null; let m = c.match(/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/);
|
|
48
|
+
if (m) v = [+m[1], +m[2], +m[3]];
|
|
49
|
+
else if ((m = c.match(/^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/))) v = [+m[1], +m[2], +m[3]].map((n) => Math.round(n * 255));
|
|
50
|
+
if (v && v.every((n) => Number.isFinite(n))) into.splice(0, 3, ...v);
|
|
51
|
+
};
|
|
52
|
+
// the canvas's two faces are the pack's stacks too (task 1005087)
|
|
53
|
+
const face = String(cs.getPropertyValue('--font-body') || '').trim(); if (face) FACE = face;
|
|
54
|
+
const mono = String(cs.getPropertyValue('--font-mono') || '').trim(); if (mono) MONO = mono;
|
|
55
|
+
fill('--ink', INK); fill('--void', VOID); fill('--sky-cold', COLD); fill('--accent', ACC); fill('--chart', CHART);
|
|
56
|
+
if (probe && typeof probe.remove === 'function') probe.remove();
|
|
39
57
|
const t = Number(String(cs.getPropertyValue('--sky-temp') || '').trim()); TEMP = Number.isFinite(t) && t > 0 ? t : 1;
|
|
40
58
|
}
|
|
41
59
|
const tone = (c) => (TEMP === 1 ? c : c.map((v) => Math.round(v * TEMP)));
|
|
@@ -216,7 +234,7 @@
|
|
|
216
234
|
const collides = (r) => placed.some((p) => r.x0 < p.x1 && r.x1 > p.x0 && r.y0 < p.y1 && r.y1 > p.y0);
|
|
217
235
|
for (const l of labels) {
|
|
218
236
|
if (l.alpha != null && l.alpha < 0.5 && !l.hot) continue;
|
|
219
|
-
ctx.font = (l.big ? '300 15px' : l.small ? '400 11px' : '400 12px') + '
|
|
237
|
+
ctx.font = (l.big ? '300 15px' : l.small ? '400 11px' : '400 12px') + ' ' + FACE;
|
|
220
238
|
const text = l.text.length > 46 && !l.big ? l.text.slice(0, 44).trimEnd() + '…' : l.text;
|
|
221
239
|
const w = ctx.measureText(text).width + 12, h = l.small ? 14 : 30;
|
|
222
240
|
let y = l.y; let rect = { x0: l.x - w / 2, x1: l.x + w / 2, y0: y - h, y1: y };
|
|
@@ -224,7 +242,7 @@
|
|
|
224
242
|
placed.push(rect);
|
|
225
243
|
ctx.fillStyle = l.hot ? ink(.95) : l.small ? ink(.4) : ink(.6);
|
|
226
244
|
ctx.fillText(text, l.x, y - (l.small ? 0 : 14));
|
|
227
|
-
if (!l.small && l.sub) { ctx.font = '400 10px
|
|
245
|
+
if (!l.small && l.sub) { ctx.font = '400 10px ' + MONO; ctx.fillStyle = l.hot ? ink(.6) : ink(.3); ctx.fillText(l.sub.toUpperCase(), l.x, y); }
|
|
228
246
|
}
|
|
229
247
|
}
|
|
230
248
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
if (!h || h.kind === 'shuttle') { card.classList.remove('on'); card.setAttribute('aria-hidden', 'true'); return; }
|
|
32
32
|
const { goalById } = S; let html = '';
|
|
33
33
|
if (h.kind === 'idea') { const i = h.ref; const o = OBJ[i.st] || { noun: i.st, word: i.st }; const wellG = i.well && goalById.get(i.well); const r = reach(i).length; html = `<div class="k">${glyphHtml(i)}<span class="lbl${i.st === 'star' ? ' hot' : ''}">${o.noun} · ${o.word}${i.origin === 'claude' ? ' · filed by a session' : ''}</span></div><div class="t">${esc(i.title)}</div><div class="m">${i.shaped ? `<b>${i.shaped.kind === 'goal' ? 'became this goal' : 'became a ring'}</b> · ` : ''}${wellG ? `caught by <b>${esc(short(wellG.title))}</b>` : `open space · ${Math.round(i.age)} days adrift`} · ${esc(became(i))}${i.size && i.size.credits ? ` · size <b>${i.size.credits}</b>` : ''}${i.lit < 1 ? ` · <b>${Math.round(i.lit * 100)}%</b> alive` : ''}${r ? ' · its reach is drawn' : ''}</div>`; }
|
|
34
|
-
else if (h.kind === 'ring') { const c = h.ref; const g = h.goal; html = `<div class="k"><span class="mk well" style="${c.satisfied ? 'border-style:solid;border-color:
|
|
34
|
+
else if (h.kind === 'ring') { const c = h.ref; const g = h.goal; html = `<div class="k"><span class="mk well" style="${c.satisfied ? 'border-style:solid;border-color:color-mix(in srgb, var(--ink) 70%, transparent)' : ''}"></span><span class="lbl">ring ${h.index + 1} of ${g.crit.length} · ${c.satisfied ? 'closed' : 'open'}</span></div><div class="t">${esc(SKY.plain(c.text).slice(0, 180))}${SKY.plain(c.text).length > 180 ? '…' : ''}</div><div class="m">${c.tasks.length ? `<b>${c.tasks.length}</b> task${c.tasks.length === 1 ? '' : 's'} on this ring · <b>${c.credits}</b> credits` : 'no task gates it yet'}${c.uatLabel ? ` · ${esc(c.uatLabel)}` : (c.pendingReview && !c.uat ? ' · awaiting review' : '')}${c.backendOnly ? ' · backend-only' : ''}${c.bornOf ? ` · <b style="color:var(--accent)">born of a thought</b>: ${esc(ideaTitle(c.bornOf))}` : ''}</div>`; }
|
|
35
35
|
else if (h.kind === 'goal') { const g = h.ref; if (!seen(g)) html = `<div class="k"><span class="mk unseen"></span><span class="lbl">unexplored</span></div><div class="t">Something is here.</div><div class="m">Follow a route from a goal you know to reach it — or turn explore off to see everything.</div>`; else { const met = g.crit.filter((c) => c.satisfied).length; const state = g.status === 'open' ? (g.live > 0 ? 'gravity well · alive' : 'gravity well') : g.status === 'achieved' ? 'settled system' : 'collapsed'; html = `<div class="k"><span class="mk ${g.status === 'open' ? (g.live > 0 ? 'alive' : 'well') : g.status === 'achieved' ? 'settled' : 'collapsed'}"></span><span class="lbl${g.live > 0 ? ' hot' : ''}">${state} · ${esc(g.band.label)}</span></div><div class="t">${esc(g.title)}</div><div class="m"><b>${g.taskDone}</b> of <b>${g.taskTotal}</b> tasks${g.credits ? ` · <b>${g.credits}</b> credits` : ''} · ${g.crit.length ? `<b>${met}</b> of <b>${g.crit.length}</b> rings closed` : 'no rings written'}${g.live > 0 ? ` · <b>${g.active}</b> held now, <b>${g.recent}</b> landed this week` : ''}${g.thoughts.filter(inLayer).length ? ` · <b>${g.thoughts.filter(inLayer).length}</b> of your thoughts` : ''}${g.bornOf ? ` · <b style="color:var(--accent)">born of a thought</b>` : ''}${edgesOf(g).length ? ` · <b>${edgesOf(g).length}</b> route${edgesOf(g).length === 1 ? '' : 's'}` : ''}</div>`; } }
|
|
36
36
|
else if (h.kind === 'task' || h.kind === 'ltask') { const t = h.ref; const kin = t.goal && t.kin ? t.goal.tasks.filter((x) => x.kin === t.kin && x !== t).length : 0; html = `<div class="k"><span class="mk task${t.status === 'active' ? ' live' : ''}"></span><span class="lbl${t.status === 'active' ? ' hot' : ''}">task · ${esc(t.status)}</span></div><div class="t">${esc(t.title)}</div><div class="m">${t.credits != null ? `<b>${t.credits}</b> credits · ` : ''}${t.ci >= 0 ? `ring ${t.ci + 1}` : 'outer orbit'}${t.sourceRef ? ' · born of a thought' : ''}${kin ? ` · lines up with <b>${kin}</b> kin` : ''}${t.drift ? ' · in motion' : ''}</div>`; }
|
|
37
37
|
else if (h.kind === 'stub') { const e = h.edge; const waits = e.a === h.goal; html = `<div class="k"><span class="mk route"></span><span class="lbl chart">route · ${waits ? 'waits on' : 'waited on by'}</span></div><div class="t">${seen(h.other) ? esc(h.other.title) : 'an unexplored goal'}</div><div class="m"><b>${e.count}</b> task dependenc${e.count === 1 ? 'y' : 'ies'} · click to chart it · double-click to chart every route from here</div>`; }
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
${rch.length ? fact('lives on in', rch.map((g) => `<a href="#" data-goal="${esc(g.id)}">${esc(short(g.title))}</a>`).join(', ')) : ''}
|
|
40
40
|
${fact('size — credits', i.size ? `${i.size.credits}${i.size.historical ? ' <span class="lbl">hist.</span>' : ''}` : 'unknown', true)}
|
|
41
41
|
${i.size ? fact('of which', esc(sizeWords(i))) : ''}
|
|
42
|
-
${bright ? fact('brightness — still alive', `<span class="bar" style="width:${Math.max(4, Math.round(i.lit * 70))}px;${i.lit > 0 ? '' : 'background:
|
|
42
|
+
${bright ? fact('brightness — still alive', `<span class="bar" style="width:${Math.max(4, Math.round(i.lit * 70))}px;${i.lit > 0 ? '' : 'background:color-mix(in srgb, var(--ink) 20%, transparent)'}"></span>${esc(bright)}`) : ''}
|
|
43
43
|
${pos ? fact('position', esc(pos)) : ''}
|
|
44
44
|
${fact('filed', esc(fmtDate(i.capturedAt)) + (i.kind ? ` · ${esc(i.kind)}` : '') + (i.grade === 'full' ? ' · full idea' : '') + ' · ' + esc(SKY.viaWord(i.filedVia)) + (i.origin === 'claude' ? ' · by a session, under your name' : ''))}
|
|
45
45
|
</div>
|
|
@@ -43,8 +43,8 @@ body[data-page="studio"] {
|
|
|
43
43
|
--st-tower-3: #080a14;
|
|
44
44
|
--st-floor: #0d0d12;
|
|
45
45
|
--st-floor-edge: rgba(255, 255, 255, .06);
|
|
46
|
-
--st-glow:
|
|
47
|
-
--st-glow-out:
|
|
46
|
+
--st-glow: color-mix(in srgb, var(--accent) 22%, transparent);
|
|
47
|
+
--st-glow-out: color-mix(in srgb, var(--accent) 0%, transparent);
|
|
48
48
|
--st-stem: #1c1c24;
|
|
49
49
|
--st-shade: #22222b;
|
|
50
50
|
--st-mug: #1a1a22;
|
|
@@ -52,23 +52,23 @@ body[data-page="studio"] {
|
|
|
52
52
|
--st-leaf-2: #173022;
|
|
53
53
|
--st-ink: #ffffff;
|
|
54
54
|
--st-ink-sub: #c9c9ce;
|
|
55
|
-
--st-ink-soft:
|
|
56
|
-
--st-ink-faint:
|
|
55
|
+
--st-ink-soft: rgba(255, 255, 255, .75);
|
|
56
|
+
--st-ink-faint: rgba(255, 255, 255, .66);
|
|
57
57
|
--st-ink-dim: #8a8a90;
|
|
58
58
|
--st-ink-hint: #85858c;
|
|
59
59
|
--st-glass: rgba(255, 255, 255, .06);
|
|
60
60
|
--st-glass-edge: rgba(255, 255, 255, .14);
|
|
61
61
|
--st-rule: rgba(255, 255, 255, .16);
|
|
62
|
-
--st-accent:
|
|
62
|
+
--st-accent: var(--accent);
|
|
63
63
|
--st-on-accent: #000000;
|
|
64
|
-
--st-link: #
|
|
65
|
-
--st-pane:
|
|
66
|
-
--st-credits:
|
|
67
|
-
--st-focus:
|
|
68
|
-
--st-resume:
|
|
69
|
-
--st-resume-edge:
|
|
64
|
+
--st-link: color-mix(in srgb, var(--accent) 55%, #ffffff);
|
|
65
|
+
--st-pane: var(--accent);
|
|
66
|
+
--st-credits: var(--accent);
|
|
67
|
+
--st-focus: var(--accent);
|
|
68
|
+
--st-resume: color-mix(in srgb, var(--accent) 16%, transparent);
|
|
69
|
+
--st-resume-edge: color-mix(in srgb, var(--accent) 55%, transparent);
|
|
70
70
|
--st-word-hover: rgba(255, 255, 255, .28);
|
|
71
|
-
--st-word-ring:
|
|
71
|
+
--st-word-ring: color-mix(in srgb, var(--accent) 45%, transparent);
|
|
72
72
|
--st-scrim: rgba(4, 5, 9, .94);
|
|
73
73
|
--st-panel: rgba(255, 255, 255, .075);
|
|
74
74
|
--st-panel-edge: rgba(255, 255, 255, .18);
|
|
@@ -77,8 +77,8 @@ body[data-page="studio"] {
|
|
|
77
77
|
--st-chip-edge: rgba(255, 255, 255, .16);
|
|
78
78
|
--st-track: rgba(255, 255, 255, .1);
|
|
79
79
|
--st-danger: #ff9b8a;
|
|
80
|
-
--st-face: var(--font-body
|
|
81
|
-
--st-mono: var(--font-mono
|
|
80
|
+
--st-face: var(--font-body);
|
|
81
|
+
--st-mono: var(--font-mono);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
/* The day room: the mockup's [data-sky="day"] tokens, on the same names. Three
|
|
@@ -115,20 +115,20 @@ body[data-page="studio"][data-sky="day"] {
|
|
|
115
115
|
--st-glass: rgba(255, 255, 255, .52);
|
|
116
116
|
--st-glass-edge: rgba(60, 40, 20, .16);
|
|
117
117
|
--st-rule: rgba(60, 40, 20, .14);
|
|
118
|
-
--st-link:
|
|
119
|
-
--st-credits:
|
|
120
|
-
--st-focus:
|
|
121
|
-
--st-resume:
|
|
122
|
-
--st-resume-edge:
|
|
118
|
+
--st-link: var(--accent-deep);
|
|
119
|
+
--st-credits: var(--accent-deep);
|
|
120
|
+
--st-focus: var(--accent-deep);
|
|
121
|
+
--st-resume: color-mix(in srgb, var(--accent) 22%, transparent);
|
|
122
|
+
--st-resume-edge: color-mix(in srgb, var(--accent-deep) 60%, transparent);
|
|
123
123
|
--st-word-hover: rgba(60, 40, 20, .28);
|
|
124
|
-
--st-word-ring:
|
|
124
|
+
--st-word-ring: color-mix(in srgb, var(--accent-deep) 60%, transparent);
|
|
125
125
|
--st-panel: rgba(255, 255, 255, .75);
|
|
126
126
|
--st-panel-edge: rgba(60, 40, 20, .16);
|
|
127
127
|
--st-panel-rim: rgba(255, 255, 255, .9);
|
|
128
128
|
--st-close: rgba(60, 40, 20, .08);
|
|
129
129
|
--st-chip-edge: rgba(60, 40, 20, .2);
|
|
130
130
|
--st-track: rgba(60, 40, 20, .12);
|
|
131
|
-
--st-danger:
|
|
131
|
+
--st-danger: var(--danger);
|
|
132
132
|
}
|
|
133
133
|
/* The panels' scrim is the day wall's own tint, whatever the hall's theme, set
|
|
134
134
|
on the overlay so it outranks the theme's .42 and the phone's .88. */
|
|
@@ -156,7 +156,7 @@ body[data-page="studio"][data-sky="day"] .aq-overlay {
|
|
|
156
156
|
--aq-pill-on: rgba(255, 255, 255, .9);
|
|
157
157
|
--aq-close: rgba(60, 40, 20, .08);
|
|
158
158
|
--aq-ghost-edge: rgba(60, 40, 20, .3);
|
|
159
|
-
--aq-link:
|
|
159
|
+
--aq-link: var(--accent-deep);
|
|
160
160
|
--aq-rule: rgba(60, 40, 20, .12);
|
|
161
161
|
}
|
|
162
162
|
body[data-page="studio"][data-sky="day"] .aq-overlay :focus-visible { outline-color: var(--st-focus); }
|