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 0000000..4496978
Binary files /dev/null and b/bicorder-app/public/icon-maskable-192.png differ
diff --git a/bicorder-app/public/icon-maskable-512.png b/bicorder-app/public/icon-maskable-512.png
new file mode 100644
index 0000000..a9dd23c
Binary files /dev/null and b/bicorder-app/public/icon-maskable-512.png differ
diff --git a/bicorder-app/public/icon-maskable.svg b/bicorder-app/public/icon-maskable.svg
new file mode 100644
index 0000000..eca7674
--- /dev/null
+++ b/bicorder-app/public/icon-maskable.svg
@@ -0,0 +1,47 @@
+
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;
+ }
+
+