diff --git a/src/components/OfflineBanner.tsx b/src/components/OfflineBanner.tsx
index 90e2193..d366677 100644
--- a/src/components/OfflineBanner.tsx
+++ b/src/components/OfflineBanner.tsx
@@ -1,4 +1,3 @@
-import React from "react";
import { View, Text } from "react-native";
import { Ionicons } from "@expo/vector-icons";
diff --git a/src/lib/renderXML.tsx b/src/lib/renderXML.tsx
index 1a13c77..4dfe62a 100644
--- a/src/lib/renderXML.tsx
+++ b/src/lib/renderXML.tsx
@@ -330,6 +330,7 @@ const LIST_BLOCK_TAGS = new Set([
"snippet",
"image",
"spoiler",
+ "callout",
]);
/**
@@ -648,6 +649,51 @@ export function renderXmlNode(
case "figure": {
return {children()};
}
+ case "callout": {
+ let containerClass: string;
+ let textClass: string;
+
+ switch (node.attrs.type) {
+ case "success":
+ containerClass =
+ "border-emerald-600 bg-emerald-50 dark:border-emerald-400 dark:bg-emerald-950";
+ textClass = "text-emerald-950 dark:text-emerald-50";
+ break;
+ case "warning":
+ containerClass =
+ "border-amber-600 bg-amber-50 dark:border-amber-400 dark:bg-amber-950";
+ textClass = "text-amber-950 dark:text-amber-50";
+ break;
+ case "error":
+ containerClass =
+ "border-red-600 bg-red-50 dark:border-red-400 dark:bg-red-950";
+ textClass = "text-red-950 dark:text-red-50";
+ break;
+ case "info":
+ default:
+ containerClass =
+ "border-blue-600 bg-blue-50 dark:border-blue-400 dark:bg-blue-950";
+ textClass = "text-blue-950 dark:text-blue-50";
+ }
+
+ const runs = collectInlineRuns(node.children);
+
+ return (
+
+
+
+ {node.attrs.type.toUpperCase()}
+
+
+
+ {renderInlineRuns(runs, keyPrefix)}
+
+
+ );
+ }
case "link": {
return (
@@ -679,7 +725,6 @@ export function renderXmlNode(
/>
);
}
-
default: {
console.log("Unhandled Node Tag:", node.tag);
return {children()};
diff --git a/todo.md b/todo.md
index 6f3eb3c..c40a4c5 100644
--- a/todo.md
+++ b/todo.md
@@ -12,4 +12,5 @@
## Known Bugs
- Diagnose bug that occasionally shows no threads
+- Offline banner lacks refresh
- Fix login + logout too quick db bug