diff --git a/app/lish/[did]/[publication]/[rkey]/PostContent.tsx b/app/lish/[did]/[publication]/[rkey]/PostContent.tsx
index 0437110e..51da42a0 100644
--- a/app/lish/[did]/[publication]/[rkey]/PostContent.tsx
+++ b/app/lish/[did]/[publication]/[rkey]/PostContent.tsx
@@ -97,7 +97,10 @@ let Block = ({
? "text-right justify-end"
: b.alignment === "lex:pub.leaflet.pages.linearDocument#textAlignCenter"
? "text-center justify-center"
- : "";
+ : b.alignment ===
+ "lex:pub.leaflet.pages.linearDocument#textAlignJustify"
+ ? "text-justify justify-start"
+ : "";
if (!alignment && PubLeafletBlocksImage.isMain(b.block))
alignment = "text-center justify-center";
diff --git a/components/Blocks/Block.tsx b/components/Blocks/Block.tsx
index eacb9aa9..72cc1b11 100644
--- a/components/Blocks/Block.tsx
+++ b/components/Blocks/Block.tsx
@@ -247,6 +247,7 @@ export const BaseBlock = (
left: "justify-start",
right: "justify-end",
center: "justify-center",
+ justify: "justify-start",
}[alignment];
if (!BlockTypeComponent) return
unknown block
;
diff --git a/components/Blocks/TextBlock/index.tsx b/components/Blocks/TextBlock/index.tsx
index 343ab7bc..aab71a3f 100644
--- a/components/Blocks/TextBlock/index.tsx
+++ b/components/Blocks/TextBlock/index.tsx
@@ -133,6 +133,7 @@ export function RenderedTextBlock(props: {
left: "text-left",
right: "text-right",
center: "text-center",
+ justify: "text-justify",
}[alignment];
let { permissions } = useEntitySetContext();
@@ -198,6 +199,7 @@ export function BaseTextBlock(props: BlockProps & { className?: string }) {
left: "text-left",
right: "text-right",
center: "text-center",
+ justify: "text-justify",
}[alignment];
let value = useYJSValue(props.entityID);
diff --git a/components/Toolbar/TextAlignmentToolbar.tsx b/components/Toolbar/TextAlignmentToolbar.tsx
index 41172c26..77efb599 100644
--- a/components/Toolbar/TextAlignmentToolbar.tsx
+++ b/components/Toolbar/TextAlignmentToolbar.tsx
@@ -1,14 +1,14 @@
import { useUIState } from "src/useUIState";
import { ToolbarButton } from ".";
import { useCallback } from "react";
-import { useEntity, useReplicache } from "src/replicache";
+import { Fact, useEntity, useReplicache } from "src/replicache";
import { Props } from "components/Icons/Props";
export function TextAlignmentToolbar() {
let focusedBlock = useUIState((s) => s.focusedEntity);
let { rep } = useReplicache();
let setAlignment = useCallback(
- (alignment: "right" | "center" | "left") => {
+ (alignment: Fact<"block/text-alignment">["data"]["value"]) => {
let blocks = useUIState.getState().selectedBlocks;
if (focusedBlock?.entityType === "page" || !focusedBlock) return null;
rep?.mutate.assertFact(
@@ -41,6 +41,13 @@ export function TextAlignmentToolbar() {
>
+
+ setAlignment("justify")}
+ tooltipContent="Align Justified"
+ >
+
+
>
);
}
@@ -66,6 +73,8 @@ export function TextAlignmentButton(props: {
) : alignment === "center" ? (
+ ) : alignment === "justify" ? (
+
) : (
)}
@@ -130,3 +139,23 @@ export const AlignRightSmall = (props: Props) => {
);
};
+
+export const AlignJustifiedSmall = (props: Props) => {
+ return (
+
+ );
+};
diff --git a/lexicons/api/lexicons.ts b/lexicons/api/lexicons.ts
index 166488dd..ed01a3ee 100644
--- a/lexicons/api/lexicons.ts
+++ b/lexicons/api/lexicons.ts
@@ -557,6 +557,7 @@ export const schemaDict = {
'lex:pub.leaflet.pages.linearDocument#textAlignLeft',
'lex:pub.leaflet.pages.linearDocument#textAlignCenter',
'lex:pub.leaflet.pages.linearDocument#textAlignRight',
+ 'lex:pub.leaflet.pages.linearDocument#textAlignJustify',
],
},
},
diff --git a/lexicons/api/types/pub/leaflet/pages/linearDocument.ts b/lexicons/api/types/pub/leaflet/pages/linearDocument.ts
index 55cea45b..9c181f6e 100644
--- a/lexicons/api/types/pub/leaflet/pages/linearDocument.ts
+++ b/lexicons/api/types/pub/leaflet/pages/linearDocument.ts
@@ -55,6 +55,7 @@ export interface Block {
| 'lex:pub.leaflet.pages.linearDocument#textAlignLeft'
| 'lex:pub.leaflet.pages.linearDocument#textAlignCenter'
| 'lex:pub.leaflet.pages.linearDocument#textAlignRight'
+ | 'lex:pub.leaflet.pages.linearDocument#textAlignJustify'
| (string & {})
}
diff --git a/lexicons/pub/leaflet/pages/linearDocument.json b/lexicons/pub/leaflet/pages/linearDocument.json
index 41905c30..9bb60800 100644
--- a/lexicons/pub/leaflet/pages/linearDocument.json
+++ b/lexicons/pub/leaflet/pages/linearDocument.json
@@ -41,7 +41,8 @@
"knownValues": [
"#textAlignLeft",
"#textAlignCenter",
- "#textAlignRight"
+ "#textAlignRight",
+ "#textAlignJustify"
]
}
}
diff --git a/lexicons/src/pages/LinearDocument.ts b/lexicons/src/pages/LinearDocument.ts
index 8bad6139..9d699407 100644
--- a/lexicons/src/pages/LinearDocument.ts
+++ b/lexicons/src/pages/LinearDocument.ts
@@ -22,6 +22,7 @@ export const PubLeafletPagesLinearDocument: LexiconDoc = {
"#textAlignLeft",
"#textAlignCenter",
"#textAlignRight",
+ "#textAlignJustify",
],
},
},
diff --git a/src/replicache/attributes.ts b/src/replicache/attributes.ts
index df31d318..a902d078 100644
--- a/src/replicache/attributes.ts
+++ b/src/replicache/attributes.ts
@@ -183,6 +183,10 @@ const PollBlockAttributes = {
} as const;
export const ThemeAttributes = {
+ "theme/font": {
+ type: "string",
+ cardinality: "one",
+ },
"theme/page-leaflet-watermark": {
type: "boolean",
cardinality: "one",
@@ -312,7 +316,7 @@ export type Data = {
reference: { type: "reference"; value: string };
"text-alignment-type-union": {
type: "text-alignment-type-union";
- value: "right" | "left" | "center";
+ value: "right" | "left" | "center" | "justify";
};
"page-type-union": { type: "page-type-union"; value: "doc" | "canvas" };
"block-type-union": {