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": {