From 912e209b80e4eeba8065b1bfa6cfd554a5c03631 Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Tue, 2 Dec 2025 22:28:15 -0700 Subject: [PATCH] Added contextual content to the web app, some aesthetic improvements --- bicorder-app/index.html | 4 +- bicorder-app/public/icon-maskable-192.png | Bin 0 -> 7342 bytes bicorder-app/public/icon-maskable-512.png | Bin 0 -> 5904 bytes bicorder-app/public/icon-maskable.svg | 47 ++++ .../bicorder-Learner profile-2025-11-24.json | 250 ------------------ bicorder-app/src/App.svelte | 101 ++++++- bicorder-app/src/components/HelpModal.svelte | 146 ++++++++++ bicorder-app/vite.config.ts | 14 +- 8 files changed, 305 insertions(+), 257 deletions(-) create mode 100644 bicorder-app/public/icon-maskable-192.png create mode 100644 bicorder-app/public/icon-maskable-512.png create mode 100644 bicorder-app/public/icon-maskable.svg delete mode 100644 bicorder-app/sample_outputs/bicorder-Learner profile-2025-11-24.json create mode 100644 bicorder-app/src/components/HelpModal.svelte diff --git a/bicorder-app/index.html b/bicorder-app/index.html index 0a00566..c3d144a 100644 --- a/bicorder-app/index.html +++ b/bicorder-app/index.html @@ -4,7 +4,9 @@ - + + + diff --git a/bicorder-app/public/icon-maskable-192.png b/bicorder-app/public/icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..4496978cd91db52d92f17013799b4d98d723c54c GIT binary patch literal 7342 zcmdT}XHb(tw@&E2Nt3Eb5s@ZRBE`@|rGwJJSZD&FhYq2mNE4)2X(9pUNw8vyVX1OVV+0Kn;07kmW(@RR@m)*t}DgH!;3%_Xy5U*T$i z?3Jd5+T}kUN|U3hs~&QXC)(=dt29Kcln=6qy-fiCPLn5U%FnzfH>Z94Sw;wLyM1Y# zmGKN88EWF=!vyZ?v&!DRv&DjVdi$+9qZ;GlGLez81(^A(sF;bm=$+i!kn4ZJ!%vED3Bi#asGc79-p(MWrWiT2K(;vS zlwUpeoAS&KhEY2gWBEr{-Ga)$=b`C=GqVIc7lii3MW$3f{n@M`K~98?n4p z@CUG!cbBn9A@X8tWiy+|VJ-67H1cld+>dUZaaQdUOKNiTs<;MP@rv&fKIhy+6*F{; zNd`=7iOit)IH@4d&HkePppE`CS$ZO`Boub~>=xaJd`fMM(YQKZ;7jLMM-x{zg&xA# z6pmzcM<7}?z^$E;6wK{DDc4Nz2>;PdXP-u=7BJ=VsvC>&AD{b8`XcnYt<~IN{+J{( z-62a--$ z;C>IoK@s6Gm7^j>*~}r%&&x7q*ReIe{m!ZZuy$^T>aq-{))GnHUo}Yl2@CHuN}+3V zAVpzxEBsSlPD;%rk0#b|s2At1Ut7H$Zf)qV-ZQV)x9*Ky(}eub*9mN?SxhVhuj;A$ zeIlA_-lJe^`$b5=?Ss$Ac_^2Qj{61k?Gm56o|-_t_6BX-V_D+8BB-2C3^^(BzR)r) z?cq1ISkc0OXhVE6=|rd!99lPB>pn!_KTg7v}1iL-aZD~-KGJ5W6DGpqY932%44 z6l_df&V||RP?qK@8+c=*K0)e1NKhXjeB(2|G0i+)g`>6*BND1UD@cB3EUKt7z4$C` zi6PMHCp?M*5>A=U3YJu79_1KIC1Jv3F?E;M1E(}X*F(p6TM0??=|teb^l%I3Aq?zD z$BkAmL_@fLf`39~)}R6g5+DKT&%g4RkzpmjTBP1n7Uuh8C+7zyl zW_ZFp0I{9a*z`Vj&u7#1KV>!PBvMj{I1_G{C53Ytf9#rUNOx7t++Pyl6w9GYIMJWa zw?rU!a|6iO(GpTjA(*dipR{K~m8;Hr(}{k(K1f)r@oAhtzNRRLTAQ;KN71)rLnVY8 zsQV*@HdWCOsO)^+tJgk92Gs7*Y@d$d9NK z%Lco3IzH(MbVt8Qjh@YTA7X^ffh)eIYIE+B_g5^A+qb{LI#^>()8T(zE8&Uk@`X$0 zNn3%OEvDSdi>4!pf~tKBXDT5uJk0>QcO^5n&(Js?W~pl*u|GO`Q-R<9h%^BdET+<3 z1=}*WX(F8hWS1AtiJsPPoqb*zZXJu67&`83Q;%oP@O_>!g3ib5M2v7izMDWkr}c7; zKX9L4Uw;VS6ScNYeiK$N!l&_9Oe&5k$F+h2{d04p4>eJoj@d`)jm@KQ7d|ci@n&zN z?=m_$EC%DLOtD0Et8@$GKOI(CG-Mv3JajE_OS^+;J3zi|-P{43z6!aA$=IrKO~E8* z$iU38OdH`i=yu;?GiW&+lvqO-h zj@jkhT4|h>Y>D&ax0>q=hU|Wx7LpSEc*LsoSr4GxmjBtCWN|SpiO*1#Mp>iGm5@$c znE`GVc8C5MJeyuB!z(L!k`*D`Q1Q8ibb<{JsECA)W}5dl2Qjv5AJ+*wS@AS~F$(o> z*SL9}lF+A)1L7<2EZL>fkc5fXEiW(2{A}5vaBkw7H;Ze7RG>$ zaH5(C(dxEC$+!pmkg@HWPtL-jjft=nmIn4UXw1p6`As(Ic}G&~q>z#eb?A|ZUs0Akb;Hr7CGHpck<~ZCUYjpI2k&X8AQbp= zF0l6IX?7_O4;khJLx-V+=oGQBg;@5!QVIvV&h8*H>qE# zOgrt$lfs8ZXfxV>IC=19204vt5a$FJ2-}Mcl8125dFEM{1-F(Wt&>~;Qx#KiEak=- zj=6$NRz{j|Z~de^f9J@m$nTOzECBzPvV^Tv(H3=`m%9I~^K z&N1((?r4pE*@4X`v7t2A=j|SP*zeC=jj;ypnY4?Ps2wRyD+9g7&sR#pnfj%?mXc&f zh*Z)%Xw7jp5qOP7z600&e3p)Gi-HW(^R<3Zl-T*>SgWQ|OYkM&!Ct7)h4U{4O|Eeo z^VLPL%c~J%+<@Q^(-$IN;ut!qBHvA3^M!y}?eN)4AOB+LtvM|PhV~N}>$qQomb3L2 z)Lpmut37y$Nhlb;;37sQ19KuHHG2+^BP;AB;GwFs8r^y2Yk@%*k!{h##8iM1<8D27 zA$qu!AcQDKbrz3E2quFV`Ald20>dR*;Nr)rN9Zn3jXG|0?04e{9GIW>UHNlF64QH3 z=Eet)qTv1HA@nLKd*-$U(ZH2m!YA;cA~+I<>TsgPgU;f)sl%=*zbV@#AJ=6}bH3D*|yiow{`t) zSr<{q5L2FA<0UyOB8)?cRd_K{H>>Bw5m6X`( zxIKCh1Q%VM069F25MLJMy4)p3H_}uS;1qoCi2RU^ZB{f1;`cW=1MXx>BaWyEGZBw8 z=jizFlleu&?A)PaA+`Nbg%*yO>OR~zwj}Rb5HB+aF>=Cw4n z4+FQXYhO;x(I8a6wwvDNNhK7O)d5(Q?pG{kmPzb~Xq0n5Z1(NW0epQ?5!B}1KvMR? zA!Y14k?+s!GxZ$$;O{nK;y~)nP&DQRvxdt~RvVoOV!7gpb8ke-(Zc~J1D+jFym2YC zM}`HS0bf^{woV8=kOzPSrMJ@>9#%8{q<1pwpVLBQY;@rQs>u%Sv1N4Kko*4DOd$TK zH==9w$3x#~BkrLY#~|VRZ?7F$pEKuXI6=HdIQns!zn|!hG*)UXCdQ*YEtj7MQG3d& zT}V+~Enb*8DweN$S1raal_P*|ynT}$`fb8lNdi>F{8R}W)Ys(pJ4hDU+D55Sf%R2K z^>Dl2;FI6WjL5<$Iq)L9hQFew`O_0$2339DZ@x~4jh1QtI3)ZRMf3GA1D@Bcrp~3kJX<~mvo!`g!1{)nH>H{ub+1yb_Ib!j?^8-lXX)E; zFz`QqUgp}PoqV0v&kDOcTO)u#^~9c^Cr5E5UIDb$JFZcL^}%X9(^yS|s!V@GuLsZ~ zgv6mOjd@?hmdg%?pxKx%FZiiscnKiC|}~tHMJUqC%L2j#$xxxzDVbib_mioV62jm zL^8|e&2FCeYwNa5F)V-mSkNP5V25O(dh_UV!3=#2r(id9lH0LHbe9h2D+z=r7fG)& z_~(B$ACVY;RxNX}zNJx-F)Y0qTtmj8$cDUi!JixFWJ?XVCqK#vUSiz}d4DOgu0P4` zW?ZgmAuaY-5%$ag1M$pwzps7~)I!riOY_UNJQhqXRm0P_h z@x%sR$EjsLlvX}VyVufK0eQLP_oBy#dauon=oIepJ{XY8Egq@_e}|v9kyK12EaZ#YtHt!(8B7o9JfPv#1a%g z`zkkYg)YZX5aXo%v`}mHQt1234&~vqv>1rXy@eOwOV%S~Z^k)}z6r1I;+rW1#QS3W zexIeW0k>etPiLA4eVkbab&~!odVuuU+~qf4R3s6d*s2~juNns9wm{Bc7xA8@&0MhN zQ?{UEy=i78qTI}TTfw~F#@+2ib4Fk#1oB$lI`U?BoYv6x`3cbwmWB-39aD0L$b3l@ zK@5DXQII{5g8s`VcwK2$?pCH(RvCjg|IV9PCxr5{q&YA$*|F+c!&Wvq&ZHvInCL$L zlDy`9@{-R~wZAQ(WU8~w%W=W4ARp5@WW1FPFhn}@ru{cY=+ zQv$RW;XA)X6j}!A>=2Xilx$e z2wsPxc4SqHVBrT&+{M`lc8d^I2SPT@enH|kzjENv)arzD%Pkf!86Fq_uQPG2d7a5+ zuBW)jb(7cx?RFzehYPSR>Kx`J2-ps*`!8+^U=aarK~Oa|@@ zcXHlxk>1JU{uO{O^q$glueG1IcrA$OW!rb|;3Nq*-mo%q5n_PI1u1w3vC%g*zBXBC zS<&T?4q4bAYIc0czS6BS2N$coig=(OKr>euZnXFasuf0H+g3y(*rO1wjy&GuBlyR> zn+MBjdPt)MmjeOButN+dKR>^qN_6o@@Y9N8IW?kcJM zx#hHn?TY+k_?b(%e-V=d=|tk>j#bbT_iXyx->S+1;ql_okC8 zbO_rkkS2zG&nkl`<)cYv(W3$MY@(r?S$nWWE;H?eEj=&w0_X}ieAvN0=7B;&9ZySr zcp211Nl)ebv~ktUH_5gq!2!Bk0gD+&kamK(;8M0{ScvH3o3w-Pr2?}~cu2%xtR!=A zqCKawehJYm;1cxqxrcFURv%`o5WC$KqIAe z6xzStCq-;_^fcq-IG;XZmK8g#tbc6u1$E0n_J9t&R+vicYB*nY!`^K@Zt@2?3gb5r zTPBUZ2?ne@((MgCKi9UbbPldWX$E@Do?m5+)XsbRHnOVw__ERBEn?Jw-vG|g0j&C2 z`xYc3t6T2(nL2D^l2}jO`nmPhCVU3Szg|lEQneIXrW;<1z4p-Ah*DY0n-38-~_AH~YnQ zmI1_KT@13EllgC2KuE_Y)?Z}m zd8sZmtIhx)HzxUE>Q_s9!-{jVT=1LG!Lc=o)7_ZrU>V?qmV|uXTxg|LAse_ith&bt z=X+2O$|?7;Q5RE4l>hTl-Yj&}8tWtOwv+rZ18$q<&;%b;B+s6_q*|CsN8LN)oR!Vn zih4Y4cm-NXieAr8EAjEuzARlABk&HIGki0f>%nDWY05jR%M=#(l-P(v49jy(kB{&(`5z77`#0Gt;W_Zz2q}QTpLBN1*-k?Y3!2~_11^V zG5QY|B|)3V#etodA3?R>WrnXYGA3M#2E4!hFYx4pX5fFBIUn$re=;qPQ#;SX5`=uhLg>-Uz5|9mS6*gNyf%l`EH zd*R6M1MnI0r34bm^$@l6eOQzfY>2u3L>|6+aSWFi6yDGD9T2Qj$gVj%df7~SGwcVG0@aiu=uS(^*y=k7= zaOq@%@;dn_kdJns`lBp5Ep#}Qw~kNL;BN3ADk9XDdQa6^RX`ZueAxIHj_ zWo3K0ukD0Y?RrS**kK_3QxMoSM=z(~cS6?Lx~9;J0Y)-;q)<#BKz4?k$1&(&-q9Qt z7YMO(olJcK7BRO=2_~e89wY-Zg1hx{rgv4ll*c67X|vpu2sng-u_38=LJ#p|HsPC zKUIYqz9fFX%%3s(X8qu*?1uJzX5!%vvwiT|*~!To>Hz>yq^ZX?QV~fqgq``l|D)Eg zfwjk=nSqE;Ooev|eB`CBi}bq11(TPTnh}Hk0(r!m=HHUWOEOoyRQai9&+iI( zzGJs@JMETM!MpFO1`7p=#2%ELqW);SB)_@vDYk+xRTz7iRggTWim cD}?-k0f+jbHF#5_tA7DJQP)u`SAm558v=k12LJ#7 literal 0 HcmV?d00001 diff --git a/bicorder-app/public/icon-maskable-512.png b/bicorder-app/public/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..a9dd23c332cb519fd116bc6134235476cca03140 GIT binary patch literal 5904 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 + + + + + + + + + + + + + + + + + + + + + | + + + # + + + | + + + + + + + + + + + + + + + + + + + diff --git a/bicorder-app/sample_outputs/bicorder-Learner profile-2025-11-24.json b/bicorder-app/sample_outputs/bicorder-Learner profile-2025-11-24.json deleted file mode 100644 index 324cff2..0000000 --- a/bicorder-app/sample_outputs/bicorder-Learner profile-2025-11-24.json +++ /dev/null @@ -1,250 +0,0 @@ -{ - "name": "Protocol Bicorder", - "schema": "bicorder.schema.json", - "version": "1.1.0", - "description": "A diagnostic tool for the study of protocols", - "author": "Nathan Schneider", - "date_modified": "2025-11-21", - "metadata": { - "protocol": "IB Learner Profile", - "analyst": "Kids at the school", - "standpoint": "Students at the school", - "timestamp": "2025-11-24T03:16:26.468Z" - }, - "diagnostic": [ - { - "set_name": "Design", - "set_description": "How the protocol is created and remembered", - "gradients": [ - { - "term_left": "explicit", - "term_left_description": "The design is stated explicitly somewhere that is accessible to participants", - "term_right": "implicit", - "term_right_description": "The design is not stated explicitly but is learned by participants in another way", - "value": 2, - "notes": null - }, - { - "term_left": "precise", - "term_left_description": "The design is specified with a high level of precision that eliminates ambiguity in implementation", - "term_right": "interpretive", - "term_right_description": "The design is ambiguous, allowing participants a wide range of interpretation", - "value": 4, - "notes": null - }, - { - "term_left": "institutional", - "term_left_description": "Design occurs through processes that involve powerful institutions and widespread recognition as normative", - "term_right": "vernacular", - "term_right_description": "Design occurs through evolving, peer-to-peer community interactions in order to suit participant-defined goals", - "value": 1, - "notes": null - }, - { - "term_left": "documenting", - "term_left_description": "The primary purpose is to document or validate activity that is occurring", - "term_right": "enabling", - "term_right_description": "The primary purpose is to enable activity that might not happen otherwise", - "value": 5, - "notes": null - }, - { - "term_left": "static", - "term_left_description": "Designed to be as fixed and unchanging as possible", - "term_right": "malleable", - "term_right_description": "Designed to be changed by participants according to evolving needs", - "value": 1, - "notes": null - }, - { - "term_left": "technical", - "term_left_description": "Primarily concerned with interactions among technologies", - "term_right": "social", - "term_right_description": "Primarily concerned with interactions among people or groups", - "value": 9, - "notes": null - }, - { - "term_left": "universal", - "term_left_description": "Addressed to a global audience", - "term_right": "particular", - "term_right_description": "Addressed to a specific community", - "value": 5, - "notes": null - }, - { - "term_left": "durable", - "term_left_description": "Designed to be persistently available", - "term_right": "ephemeral", - "term_right_description": "Designed to vanish when no longer needed", - "value": 1, - "notes": null - } - ] - }, - { - "set_name": "Entanglement", - "set_description": "How the protocol relates with participant agents", - "gradients": [ - { - "term_left": "macro", - "term_left_description": "Operates at large scales involving many participants or broad scope", - "term_right": "micro", - "term_right_description": "Operates at small scales with few participants or narrow scope", - "value": 3, - "notes": null - }, - { - "term_left": "sovereign", - "term_left_description": "A distinctive operating logic, not subject to any other entity", - "term_right": "subsidiary", - "term_right_description": "An operating logic under the control of a particular entity", - "value": 8, - "notes": null - }, - { - "term_left": "self-enforcing", - "term_left_description": "Rules are automatically enforced through its own mechanisms", - "term_right": "enforced", - "term_right_description": "Rules require external enforcement by authorities or institutions", - "value": 7, - "notes": null - }, - { - "term_left": "abstract", - "term_left_description": "Participants learn the protocol by studying it intellectually", - "term_right": "embodied", - "term_right_description": "Participants learn the protocol by physically practicing it", - "value": 2, - "notes": null - }, - { - "term_left": "obligatory", - "term_left_description": "Participation is compulsory for a certain class of agents", - "term_right": "voluntary", - "term_right_description": "Participation in the protocol is optional and not coerced", - "value": 2, - "notes": null - }, - { - "term_left": "flocking", - "term_left_description": "Coordination occurs through centralized direction or direct mimicry", - "term_right": "swarming", - "term_right_description": "Coordination occurs through distributed interactions without central direction", - "value": 8, - "notes": null - }, - { - "term_left": "defensible", - "term_left_description": "Strong boundaries and protections against external influence", - "term_right": "exposed", - "term_right_description": "Weak boundaries and vulnerable to external influence", - "value": null, - "notes": null - }, - { - "term_left": "exclusive", - "term_left_description": "Excludes the use of other protocols that might be available to adopt", - "term_right": "non-exclusive", - "term_right_description": "Does not exclude the use of any other protocols", - "value": 8, - "notes": null - } - ] - }, - { - "set_name": "Experience", - "set_description": "How the protocol is perceived in the context of its implementation", - "gradients": [ - { - "term_left": "sufficient", - "term_left_description": "Adequately meets the needs and goals of participants", - "term_right": "insufficient", - "term_right_description": "Does not, on its own, adequately meet the needs and goals of participants", - "value": 8, - "notes": null - }, - { - "term_left": "crystallized", - "term_left_description": "Content and meaning are settled and widely agreed upon", - "term_right": "contested", - "term_right_description": "Content and meaning are disputed or under debate", - "value": 1, - "notes": null - }, - { - "term_left": "trust-evading", - "term_left_description": "Minimizes the need for trust among participants", - "term_right": "trust-inducing", - "term_right_description": "Relies on or cultivates trust among participants", - "value": 9, - "notes": null - }, - { - "term_left": "predictable", - "term_left_description": "Produces expected and consistent outcomes", - "term_right": "emergent", - "term_right_description": "Produces unexpected or novel outcomes", - "value": 9, - "notes": null - }, - { - "term_left": "exclusion", - "term_left_description": "The protocol creates barriers or excludes certain participants", - "term_right": "inclusion", - "term_right_description": "The protocol reduces barriers and includes diverse participants", - "value": 9, - "notes": null - }, - { - "term_left": "Kafka", - "term_left_description": "Fosters experiences of absurd complexity, alienation, and powerlessness", - "term_right": "Whitehead", - "term_right_description": "Enables participants to carry out desired activities with less work or thought", - "value": 6, - "notes": null - }, - { - "term_left": "dead", - "term_left_description": "Not actively utilized by relevant participants", - "term_right": "alive", - "term_right_description": "Actively utilized by relevant participants", - "value": 8, - "notes": null - } - ] - } - ], - "analysis": [ - { - "term_left": "hardness", - "term_left_description": "The protocol tends toward properties characterized by hardness", - "term_right": "softness", - "term_right_description": "The protocol tends toward properties characterized by softness", - "instructions": "Take all the 'value' fields in the gradients above and determine a mean. Round it to the nearest integer. That is the 'value' here.", - "automated": true, - "value": 5, - "notes": null - }, - { - "term_left": "polarized", - "term_left_description": "The analyst tended toward more extreme high or low readings", - "term_right": "centrist", - "term_right_description": "The analyst tended toward readings at the middle of the gradients", - "instructions": "Take all the 'value' fields in the gradients above. Assess their degree of polarization. For instance, if all the values are either 1 or 9, the output would be 1, and if all of them are 5, the output would be 9.", - "automated": true, - "value": 3, - "notes": null - }, - { - "term_left": "not useful", - "term_left_description": "The bicorder was not useful or relevant for analyzing this protocol", - "term_right": "very useful", - "term_right_description": "The bicorder was very useful and relevant for analyzing this protocol", - "instructions": "Evaluate the usefulness of this bicorder as a tool for analyzing this protocol, considering whether the gradient terms seemed revealing or irrelevant.", - "automated": false, - "value": 7, - "notes": null - } - ] -} diff --git a/bicorder-app/src/App.svelte b/bicorder-app/src/App.svelte index 8daa13b..b49f698 100644 --- a/bicorder-app/src/App.svelte +++ b/bicorder-app/src/App.svelte @@ -5,6 +5,7 @@ import MetadataFields from './components/MetadataFields.svelte'; import AnalysisDisplay from './components/AnalysisDisplay.svelte'; import ExportControls from './components/ExportControls.svelte'; + import HelpModal from './components/HelpModal.svelte'; // Load bicorder data from build-time constant let data: BicorderState = JSON.parse(JSON.stringify(__BICORDER_DATA__)); @@ -19,6 +20,7 @@ let viewMode: ViewMode = 'focused'; // Focused is default let currentScreen = 0; let refreshKey = 0; // Used to force component refresh in focused mode + let isHelpOpen = false; // Screen types type Screen = @@ -212,10 +214,17 @@ location.reload(); } } + + function openHelp() { + isHelpOpen = true; + } + +
+
Protocol
BICORDER
diff --git a/bicorder-app/vite.config.ts b/bicorder-app/vite.config.ts index d04a5b6..a1da4b0 100644 --- a/bicorder-app/vite.config.ts +++ b/bicorder-app/vite.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ svelte(), VitePWA({ registerType: 'autoUpdate', - includeAssets: ['favicon.ico', 'favicon.svg', 'icon-192.png', 'icon-512.png'], + includeAssets: ['favicon.ico', 'favicon.svg', 'icon-192.png', 'icon-512.png', 'icon-maskable-192.png', 'icon-maskable-512.png'], manifest: { name: 'Protocol Bicorder', short_name: 'Bicorder', @@ -36,6 +36,18 @@ export default defineConfig({ type: 'image/png', purpose: 'any' }, + { + src: '/icon-maskable-192.png', + sizes: '192x192', + type: 'image/png', + purpose: 'maskable' + }, + { + src: '/icon-maskable-512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'maskable' + }, { src: '/icon.svg', sizes: 'any',