privateboard 0.1.6 → 0.1.8

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/public/home.html CHANGED
@@ -30,6 +30,11 @@
30
30
  --amber: #B59560;
31
31
  --red: #B5706A;
32
32
  --cyan: #6A9B97;
33
+ /* Cool steel-blue accent · used for the research-room mode card.
34
+ Stays in the same low-saturation, warm-leaning palette as the
35
+ other accents so the four modes read as a coherent quartet. */
36
+ --steel: #8B97A8;
37
+ --steel-dim: #354048;
33
38
 
34
39
  --mono: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", system-ui, sans-serif;
35
40
  }
@@ -913,6 +918,265 @@
913
918
  color: var(--text-soft);
914
919
  }
915
920
 
921
+ /* ─────────── MODE CARDS · brainstorm / debate / critique ───────
922
+ Three figure cards, each carries: mono kicker, big numeric
923
+ headline, unit caption, deck, viz frame, ghost-button CTA.
924
+ Per-card accent (`--accent`) colours the headline numeral,
925
+ bracketed corners, viz strokes, and CTA hover state in one
926
+ unified shade.
927
+ Note · these styles are scoped under `.section #modes` so they
928
+ can't leak into the existing `.how-card` blocks two sections
929
+ above (which still use the older flat-card vocabulary for
930
+ "convene · sharpen · adjourn"). */
931
+ /* Four modes side-by-side at desktop, 2×2 at tablet, stacked on
932
+ mobile. Card padding is slightly tighter than the 3-up version
933
+ used to be (24 vs 28) so the four cards still breathe at
934
+ 1280px max-width without the headline crowding the deck. */
935
+ #modes .modes-grid {
936
+ display: grid;
937
+ grid-template-columns: repeat(4, minmax(0, 1fr));
938
+ gap: 14px;
939
+ }
940
+ @media (max-width: 1100px) {
941
+ #modes .modes-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
942
+ }
943
+ @media (max-width: 640px) {
944
+ #modes .modes-grid { grid-template-columns: 1fr; }
945
+ }
946
+ #modes .mode-card {
947
+ background: var(--panel-2);
948
+ border: 1px solid var(--line-bright);
949
+ padding: 24px;
950
+ display: flex;
951
+ flex-direction: column;
952
+ color: var(--text);
953
+ min-height: 520px;
954
+ position: relative;
955
+ /* Bracketed corners use `currentColor`, so set the card's color
956
+ to its accent up-front. The body text below resets to the
957
+ neutral palette via explicit declarations. */
958
+ }
959
+ /* Bracketed L-corners · echoes the `.bracketed` decoration on the
960
+ section wrapper, but at card scale and tinted to the card accent. */
961
+ #modes .mode-card::before,
962
+ #modes .mode-card::after {
963
+ content: "";
964
+ position: absolute;
965
+ width: 10px; height: 10px;
966
+ border: 1px solid currentColor;
967
+ pointer-events: none;
968
+ opacity: 0.7;
969
+ }
970
+ #modes .mode-card::before { top: -1px; left: -1px; border-right: none; border-bottom: none; }
971
+ #modes .mode-card::after { bottom: -1px; right: -1px; border-left: none; border-top: none; }
972
+
973
+ #modes .mode-card.lime { --accent: var(--lime); --accent-dim: var(--lime-dim); color: var(--lime); }
974
+ #modes .mode-card.cyan { --accent: var(--cyan); --accent-dim: #2E4A47; color: var(--cyan); }
975
+ #modes .mode-card.amber { --accent: var(--amber); --accent-dim: #5A4730; color: var(--amber); }
976
+ #modes .mode-card.steel { --accent: var(--steel); --accent-dim: var(--steel-dim); color: var(--steel); }
977
+
978
+ #modes .mode-kicker {
979
+ font-size: 10px;
980
+ font-weight: 700;
981
+ letter-spacing: 0.18em;
982
+ text-transform: uppercase;
983
+ color: var(--accent);
984
+ margin-bottom: 18px;
985
+ white-space: nowrap;
986
+ }
987
+ #modes .mode-kicker::before { content: "// "; opacity: 0.6; }
988
+
989
+ #modes .mode-headline {
990
+ font-family: var(--mono);
991
+ font-weight: 700;
992
+ font-size: 52px;
993
+ line-height: 1;
994
+ letter-spacing: -0.03em;
995
+ color: var(--text);
996
+ white-space: nowrap;
997
+ }
998
+ #modes .mode-headline em {
999
+ font-style: normal;
1000
+ color: var(--accent);
1001
+ }
1002
+ #modes .mode-unit {
1003
+ font-size: 11px;
1004
+ font-weight: 600;
1005
+ letter-spacing: 0.16em;
1006
+ text-transform: uppercase;
1007
+ color: var(--text-dim);
1008
+ margin-top: 10px;
1009
+ margin-bottom: 16px;
1010
+ }
1011
+ #modes .mode-deck {
1012
+ font-size: 13px;
1013
+ line-height: 1.55;
1014
+ color: var(--text-soft);
1015
+ margin-bottom: 22px;
1016
+ }
1017
+
1018
+ /* Viz frame · pinned 168px so all three figures land on the same
1019
+ vertical baseline; the CTA below them therefore lines up across
1020
+ the row regardless of how many lines the deck wrapped to. */
1021
+ #modes .mode-viz {
1022
+ height: 168px;
1023
+ flex-shrink: 0;
1024
+ border: 1px solid var(--line);
1025
+ background: var(--panel);
1026
+ padding: 22px 14px 14px;
1027
+ margin-bottom: 22px;
1028
+ position: relative;
1029
+ overflow: hidden;
1030
+ }
1031
+ #modes .mode-viz::before {
1032
+ content: attr(data-cap);
1033
+ position: absolute;
1034
+ top: 7px;
1035
+ left: 12px;
1036
+ font-size: 9px;
1037
+ font-weight: 700;
1038
+ letter-spacing: 0.16em;
1039
+ text-transform: uppercase;
1040
+ color: var(--text-dim);
1041
+ }
1042
+
1043
+ /* Bars (lime) · 7 vertical columns + 3 hairline gridlines via
1044
+ repeating-linear-gradient. Two "spike" bars take full accent;
1045
+ the rest sit in `--accent-dim`. */
1046
+ #modes .mode-bars {
1047
+ width: 100%;
1048
+ height: 100%;
1049
+ display: flex;
1050
+ align-items: flex-end;
1051
+ gap: 8px;
1052
+ background:
1053
+ linear-gradient(to bottom,
1054
+ transparent 0,
1055
+ transparent calc(33% - 0.5px),
1056
+ var(--line) calc(33% - 0.5px),
1057
+ var(--line) calc(33% + 0.5px),
1058
+ transparent calc(33% + 0.5px),
1059
+ transparent calc(66% - 0.5px),
1060
+ var(--line) calc(66% - 0.5px),
1061
+ var(--line) calc(66% + 0.5px),
1062
+ transparent calc(66% + 0.5px),
1063
+ transparent 100%);
1064
+ }
1065
+ #modes .mode-bars span {
1066
+ flex: 1;
1067
+ background: var(--accent-dim);
1068
+ min-width: 0;
1069
+ }
1070
+ #modes .mode-bars span.tall { background: var(--accent); }
1071
+
1072
+ /* Heatmap (cyan) · 6×6 director × lens. Fixed 140×140 square,
1073
+ centred horizontally inside the viz frame. */
1074
+ #modes .mode-grid {
1075
+ width: 140px;
1076
+ height: 140px;
1077
+ margin: 0 auto;
1078
+ display: grid;
1079
+ grid-template-columns: repeat(6, 1fr);
1080
+ grid-template-rows: repeat(6, 1fr);
1081
+ gap: 3px;
1082
+ }
1083
+ #modes .mode-grid i {
1084
+ background: var(--line);
1085
+ }
1086
+ #modes .mode-grid i.m { background: var(--accent-dim); }
1087
+ #modes .mode-grid i.d { background: var(--accent); }
1088
+
1089
+ /* Severity × likelihood (amber) · the actual 3×3 matrix the
1090
+ critique reports render. Axis labels live in their own fixed
1091
+ `36px` left column so the cells stay square. */
1092
+ #modes .mode-matrix {
1093
+ display: grid;
1094
+ grid-template-columns: 36px repeat(3, 1fr);
1095
+ grid-template-rows: 14px repeat(3, 1fr);
1096
+ gap: 4px;
1097
+ width: 100%;
1098
+ height: 100%;
1099
+ font-size: 8px;
1100
+ font-weight: 700;
1101
+ letter-spacing: 0.14em;
1102
+ text-transform: uppercase;
1103
+ }
1104
+ #modes .mode-matrix .ax {
1105
+ color: var(--text-dim);
1106
+ display: flex;
1107
+ align-items: center;
1108
+ overflow: hidden;
1109
+ }
1110
+ #modes .mode-matrix .ax-row { justify-content: flex-end; padding-right: 4px; }
1111
+ #modes .mode-matrix .cell {
1112
+ border: 1px solid var(--line);
1113
+ background: var(--panel-2);
1114
+ min-width: 0;
1115
+ min-height: 0;
1116
+ }
1117
+ #modes .mode-matrix .cell.minor { background: var(--accent-dim); border-color: var(--accent-dim); opacity: 0.55; }
1118
+ #modes .mode-matrix .cell.major { background: var(--accent-dim); border-color: var(--accent); }
1119
+ #modes .mode-matrix .cell.block { background: var(--accent); border-color: var(--accent); }
1120
+
1121
+ /* Citation network (steel) · the research card's viz. A center
1122
+ "claim" node connected by hairline edges to five "source" dots
1123
+ scattered around it. SVG is the right tool for the job — pure
1124
+ CSS makes the connecting lines fragile. The center node uses
1125
+ full accent fill, satellites use a hollow ring (accent stroke,
1126
+ panel-2 fill) so the eye reads "one claim, many sources." */
1127
+ #modes .mode-network {
1128
+ width: 100%;
1129
+ height: 100%;
1130
+ display: flex;
1131
+ align-items: center;
1132
+ justify-content: center;
1133
+ }
1134
+ #modes .mode-network svg {
1135
+ width: 100%;
1136
+ height: 100%;
1137
+ max-width: 220px;
1138
+ overflow: visible;
1139
+ }
1140
+ #modes .mode-network .net-edge {
1141
+ stroke: var(--accent-dim);
1142
+ stroke-width: 0.7;
1143
+ fill: none;
1144
+ }
1145
+ #modes .mode-network .net-claim {
1146
+ fill: var(--accent);
1147
+ stroke: var(--accent);
1148
+ }
1149
+ #modes .mode-network .net-source {
1150
+ fill: var(--panel);
1151
+ stroke: var(--accent);
1152
+ stroke-width: 1.2;
1153
+ }
1154
+
1155
+ /* CTA · `[ → label ]` ghost-button vocabulary. Border lifts to
1156
+ accent on hover, no fill change. */
1157
+ #modes .mode-cta {
1158
+ align-self: flex-start;
1159
+ margin-top: auto;
1160
+ display: inline-flex;
1161
+ align-items: center;
1162
+ gap: 8px;
1163
+ padding: 8px 14px;
1164
+ background: transparent;
1165
+ border: 1px solid var(--line-bright);
1166
+ color: var(--text);
1167
+ font-size: 11px;
1168
+ font-weight: 700;
1169
+ letter-spacing: 0.14em;
1170
+ text-transform: uppercase;
1171
+ text-decoration: none;
1172
+ transition: border-color 0.12s, color 0.12s;
1173
+ white-space: nowrap;
1174
+ }
1175
+ #modes .mode-cta:hover { border-color: var(--accent); color: var(--accent); }
1176
+ #modes .mode-cta-arrow { color: var(--accent); }
1177
+ #modes .mode-cta::before { content: "["; color: var(--text-dim); margin-right: 4px; }
1178
+ #modes .mode-cta::after { content: "]"; color: var(--text-dim); margin-left: 4px; }
1179
+
916
1180
  /* ─────────── REPORT GRID · 4 cards, each with cover art ──────
917
1181
  Each report is a card: a bordered cover at the top holding
918
1182
  a single piece of abstract SVG artwork (concentric target /
@@ -1509,28 +1773,136 @@
1509
1773
  <div class="section-tag">Modes</div>
1510
1774
  <h2 class="section-title">Same room. <span class="accent">Different temperature.</span></h2>
1511
1775
  <p class="section-deck">
1512
- A brainstorm room and a debate room aren't the same room with different cast lists they're the same cast playing different roles. Pick the mode that fits the question; the chair enforces the rhythm.
1776
+ Four rooms, one cast. Brainstorm to open the surface area, debate to test the obvious answer, critique to break what's already committed, research to chase what you don't yet know. The chair enforces the rhythm so the same six directors play four different games.
1513
1777
  </p>
1514
1778
  </div>
1515
1779
 
1516
- <div class="how-grid modes-grid">
1517
- <div class="how-card">
1518
- <span class="how-step">brainstorm</span>
1519
- <h3>Yes-and the wild ideas first.</h3>
1520
- <p>Generative tone. Directors build on each other instead of tearing down. Use this when you don't know the question yet — let the surface area open.</p>
1521
- </div>
1780
+ <div class="modes-grid">
1781
+
1782
+ <!-- ─── Brainstorm · lime ─── -->
1783
+ <article class="mode-card lime">
1784
+ <div class="mode-kicker">brainstorm room</div>
1785
+ <h3 class="mode-headline"><em>3–6</em></h3>
1786
+ <div class="mode-unit">ideas per turn</div>
1787
+ <p class="mode-deck">Generative tone. Each director throws three to six ideas per turn — yes-and the wild ones first, prune later. Use this when you don't know the question yet.</p>
1788
+
1789
+ <div class="mode-viz" data-cap="ideas / turn">
1790
+ <div class="mode-bars" aria-hidden="true">
1791
+ <span style="height: 38%"></span>
1792
+ <span class="tall" style="height: 78%"></span>
1793
+ <span style="height: 22%"></span>
1794
+ <span style="height: 34%"></span>
1795
+ <span class="tall" style="height: 92%"></span>
1796
+ <span style="height: 64%"></span>
1797
+ <span style="height: 41%"></span>
1798
+ </div>
1799
+ </div>
1522
1800
 
1523
- <div class="how-card">
1524
- <span class="how-step">debate</span>
1525
- <h3>Force opposing positions, in writing.</h3>
1526
- <p>Each director takes a side and defends it with logic, not flattery. Use this when the answer feels too obvious or you've been alone with it too long.</p>
1527
- </div>
1801
+ <a href="#install" class="mode-cta">
1802
+ <span class="mode-cta-arrow">→</span>
1803
+ Try Brainstorm
1804
+ </a>
1805
+ </article>
1806
+
1807
+ <!-- ─── Debate · cyan ─── -->
1808
+ <article class="mode-card cyan">
1809
+ <div class="mode-kicker">debate room</div>
1810
+ <h3 class="mode-headline"><em>6×6</em></h3>
1811
+ <div class="mode-unit">lens × director</div>
1812
+ <p class="mode-deck">Six standing directors, six lenses each. Steelman before challenge — every claim survives a triangulation through philosophy, finance, design, history.</p>
1813
+
1814
+ <div class="mode-viz" data-cap="lens coverage">
1815
+ <div class="mode-grid" aria-hidden="true">
1816
+ <!-- 6×6 = 36 cells, mostly populated. The shape is the
1817
+ pitch: lens × director matrix is dense, not sparse. -->
1818
+ <i class="m"></i><i class="d"></i><i class="m"></i><i class="m"></i><i class="d"></i><i class="m"></i>
1819
+ <i class="d"></i><i class="m"></i><i class="m"></i><i class="d"></i><i class="m"></i><i class="m"></i>
1820
+ <i class="m"></i><i class="m"></i><i class="d"></i><i class="m"></i><i class="m"></i><i class="d"></i>
1821
+ <i class="m"></i><i class="d"></i><i class="m"></i><i class="m"></i><i class="d"></i><i class="m"></i>
1822
+ <i class="d"></i><i class="m"></i><i class="m"></i><i class="d"></i><i class="m"></i><i class="m"></i>
1823
+ <i class="m"></i><i class="m"></i><i class="d"></i><i class="m"></i><i class="m"></i><i class="d"></i>
1824
+ </div>
1825
+ </div>
1826
+
1827
+ <a href="#install" class="mode-cta">
1828
+ <span class="mode-cta-arrow">→</span>
1829
+ Try Debate
1830
+ </a>
1831
+ </article>
1832
+
1833
+ <!-- ─── Critique · amber ─── -->
1834
+ <article class="mode-card amber">
1835
+ <div class="mode-kicker">critique room</div>
1836
+ <h3 class="mode-headline"><em>3×3</em></h3>
1837
+ <div class="mode-unit">severity × likelihood</div>
1838
+ <p class="mode-deck">Severity × likelihood matrix surfaces what's load-bearing. Strength preservation per blocker — every objection ships with what to keep.</p>
1839
+
1840
+ <div class="mode-viz" data-cap="risk register">
1841
+ <div class="mode-matrix" aria-hidden="true">
1842
+ <span class="ax"></span>
1843
+ <span class="ax">edge</span>
1844
+ <span class="ax">plaus.</span>
1845
+ <span class="ax">likely</span>
1846
+
1847
+ <span class="ax ax-row">block</span>
1848
+ <span class="cell major"></span>
1849
+ <span class="cell block"></span>
1850
+ <span class="cell block"></span>
1851
+
1852
+ <span class="ax ax-row">major</span>
1853
+ <span class="cell minor"></span>
1854
+ <span class="cell major"></span>
1855
+ <span class="cell block"></span>
1856
+
1857
+ <span class="ax ax-row">minor</span>
1858
+ <span class="cell minor"></span>
1859
+ <span class="cell minor"></span>
1860
+ <span class="cell major"></span>
1861
+ </div>
1862
+ </div>
1863
+
1864
+ <a href="#install" class="mode-cta">
1865
+ <span class="mode-cta-arrow">→</span>
1866
+ Try Critique
1867
+ </a>
1868
+ </article>
1869
+
1870
+ <!-- ─── Research · steel ─── -->
1871
+ <article class="mode-card steel">
1872
+ <div class="mode-kicker">research room</div>
1873
+ <h3 class="mode-headline"><em>5+</em></h3>
1874
+ <div class="mode-unit">sources per claim</div>
1875
+ <p class="mode-deck">Claims demand evidence. Each director cross-references their assertions; the chair flags weak chains. Use this when the question hinges on facts you don't yet have.</p>
1876
+
1877
+ <div class="mode-viz" data-cap="citation graph">
1878
+ <div class="mode-network" aria-hidden="true">
1879
+ <!-- Center "claim" node + 5 satellite "source" nodes,
1880
+ wired with hairline edges. Coordinates picked so the
1881
+ layout reads as a star with one slightly-asymmetric
1882
+ outlier (top-right) — a research figure, not a
1883
+ perfect symmetric mandala. -->
1884
+ <svg viewBox="0 0 200 130" preserveAspectRatio="xMidYMid meet">
1885
+ <line class="net-edge" x1="100" y1="65" x2="38" y2="28" />
1886
+ <line class="net-edge" x1="100" y1="65" x2="160" y2="22" />
1887
+ <line class="net-edge" x1="100" y1="65" x2="178" y2="78" />
1888
+ <line class="net-edge" x1="100" y1="65" x2="125" y2="115" />
1889
+ <line class="net-edge" x1="100" y1="65" x2="36" y2="100" />
1890
+ <circle class="net-source" cx="38" cy="28" r="4.5" />
1891
+ <circle class="net-source" cx="160" cy="22" r="4.5" />
1892
+ <circle class="net-source" cx="178" cy="78" r="4.5" />
1893
+ <circle class="net-source" cx="125" cy="115" r="4.5" />
1894
+ <circle class="net-source" cx="36" cy="100" r="4.5" />
1895
+ <circle class="net-claim" cx="100" cy="65" r="7" />
1896
+ </svg>
1897
+ </div>
1898
+ </div>
1899
+
1900
+ <a href="#install" class="mode-cta">
1901
+ <span class="mode-cta-arrow">→</span>
1902
+ Try Research
1903
+ </a>
1904
+ </article>
1528
1905
 
1529
- <div class="how-card">
1530
- <span class="how-step">critique</span>
1531
- <h3>Find every weakness, mercilessly.</h3>
1532
- <p>You're already committed to the idea — you want it tested. The cast goes after structure, assumptions, and second-order effects until what's left is load-bearing.</p>
1533
- </div>
1534
1906
  </div>
1535
1907
  </section>
1536
1908