+ {isStackable && edit && (
+
handleCheckboxChange(clue.id, e.target.value)}
+ />
+ )}
+ {!isStackable && edit && (
+
handleCheckboxChange(clue.id)}
+ />
+ )}
+
+ {clue.points} {clue.rule && `(${clue.rule.key})`}
+
+
{clue.description}
+
+ {clue.tags
+ .filter((tag) => !ancestorTags.includes(tag))
+ .map((tag: string, index) => (
+
+ {tag}
+
+ ))}
+
+
+ );
+}
diff --git a/frontend/cluesheet-web/src/components/viewer/LineItem/page.module.scss b/frontend/cluesheet-web/src/components/viewer/LineItem/page.module.scss
new file mode 100644
index 0000000..9cd4f86
--- /dev/null
+++ b/frontend/cluesheet-web/src/components/viewer/LineItem/page.module.scss
@@ -0,0 +1,40 @@
+.clueBody {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ margin: 10px;
+
+ border: 1px solid #ccc; /* Optional border */
+ padding: 10px; /* Optional padding */
+ border-radius: 8px; /* Optional rounded corners */
+}
+
+.lineItem {
+ display: flex;
+ flex-direction: row;
+}
+
+.points {
+ padding: 0 5px;
+ font-size: 1.5em;
+ font-weight: 700;
+}
+
+.description {
+ font-size: 1.5em;
+ font-weight: 400;
+}
+
+.tags {
+ display: flex;
+ flex: 1;
+ flex-direction: row;
+ justify-content: right;
+}
+
+.tag {
+ border: 1px solid #ccc; /* Border color */
+ border-radius: 5px;
+ padding: 0 2px;
+ margin: 0 5px;
+}
diff --git a/frontend/cluesheet-web/src/components/viewer/counter/PointCounter.tsx b/frontend/cluesheet-web/src/components/viewer/counter/PointCounter.tsx
new file mode 100644
index 0000000..364a66d
--- /dev/null
+++ b/frontend/cluesheet-web/src/components/viewer/counter/PointCounter.tsx
@@ -0,0 +1,24 @@
+"use client";
+import FlipNumbers from "react-flip-numbers";
+import styles from "./page.module.scss";
+
+interface PointCounterProps {
+ points: number;
+}
+
+export default function PointCounter({ points }: PointCounterProps) {
+ return (
+