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; + } + +
+
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',