diff --git a/apps/nextjs/src/components/board/items/item-content.tsx b/apps/nextjs/src/components/board/items/item-content.tsx index 6db4bb9d4..dd853241b 100644 --- a/apps/nextjs/src/components/board/items/item-content.tsx +++ b/apps/nextjs/src/components/board/items/item-content.tsx @@ -35,8 +35,9 @@ export const BoardItemContent = ({ item }: BoardItemContentProps) => { styles={{ root: { "--opacity": board.opacity / 100, - containerType: "size", overflow: item.kind === "iframe" ? "hidden" : undefined, + "--custom-text-size-scale": item.advancedOptions.customTextSize, + "--custom-spacing-scale": item.advancedOptions.customSpacing, }, }} p={0} diff --git a/apps/nextjs/src/components/board/sections/item.module.css b/apps/nextjs/src/components/board/sections/item.module.css index f679c62ca..9c6d85f74 100644 --- a/apps/nextjs/src/components/board/sections/item.module.css +++ b/apps/nextjs/src/components/board/sections/item.module.css @@ -9,4 +9,22 @@ } background-color: var(--background-color) !important; border-color: var(--border-color) !important; + + container-type: size; + + --spacing-base: 0.5cqmin; + --mantine-spacing-xs: calc(1 * var(--spacing-base) * var(--custom-spacing-scale)); + --mantine-spacing-sm: calc(2 * var(--spacing-base) * var(--custom-spacing-scale)); + --mantine-spacing-md: calc(4 * var(--spacing-base) * var(--custom-spacing-scale)); + --mantine-spacing-lg: calc(8 * var(--spacing-base) * var(--custom-spacing-scale)); + --mantine-spacing-xl: calc(16 * var(--spacing-base) * var(--custom-spacing-scale)); + + --text-size-base: 5cqmin; + --mantine-font-size-xs: calc(1 * var(--text-size-base) * var(--custom-text-size-scale)); + --mantine-font-size-sm: calc(1.5 * var(--text-size-base) * var(--custom-text-size-scale)); + --mantine-font-size-md: calc(2.5 * var(--text-size-base) * var(--custom-text-size-scale)); + --mantine-font-size-lg: calc(4 * var(--text-size-base) * var(--custom-text-size-scale)); + --mantine-font-size-xl: calc(6 * var(--text-size-base) * var(--custom-text-size-scale)); + + --text-lh: 1.35; } diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 379fcd243..54a553756 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -1022,6 +1022,13 @@ }, "customCssClasses": { "label": "Custom css classes" + }, + "customTextSize":{ + "label": "Custom Font Size Scale" + }, + "customSpacing":{ + "label": "Custom Spacing Scale", + "description": "Space between and around elements of the widget" } } }, diff --git a/packages/validation/src/shared.ts b/packages/validation/src/shared.ts index af23810e8..745657a1f 100644 --- a/packages/validation/src/shared.ts +++ b/packages/validation/src/shared.ts @@ -15,6 +15,8 @@ export type BoardItemIntegration = z.infer; export const itemAdvancedOptionsSchema = z.object({ customCssClasses: z.array(z.string()).default([]), + customTextSize: z.number().min(0).max(10).default(1), + customSpacing: z.number().min(0).max(10).default(1), }); export type BoardItemAdvancedOptions = z.infer; diff --git a/packages/widgets/src/clock/component.tsx b/packages/widgets/src/clock/component.tsx index 95c5a2af2..93459492c 100644 --- a/packages/widgets/src/clock/component.tsx +++ b/packages/widgets/src/clock/component.tsx @@ -22,19 +22,19 @@ export default function ClockWidget({ options }: WidgetComponentProps<"clock">) const timezone = options.useCustomTimezone ? options.timezone : Intl.DateTimeFormat().resolvedOptions().timeZone; const time = useCurrentTime(options); return ( - + {options.customTitleToggle && ( - + {options.customTitle} )} - + {options.customTimeFormat ? dayjs(time).tz(timezone).format(customTimeFormat) : dayjs(time).tz(timezone).format(timeFormat)} {options.showDate && ( - + {options.customDateFormat ? dayjs(time).tz(timezone).format(customDateFormat) : dayjs(time).tz(timezone).format(dateFormat)} diff --git a/packages/widgets/src/modals/widget-advanced-options-modal.tsx b/packages/widgets/src/modals/widget-advanced-options-modal.tsx index 674bc8f9c..67c629dd3 100644 --- a/packages/widgets/src/modals/widget-advanced-options-modal.tsx +++ b/packages/widgets/src/modals/widget-advanced-options-modal.tsx @@ -1,6 +1,6 @@ "use client"; -import { Button, Group, Stack } from "@mantine/core"; +import { Button, Group, NumberInput, Stack } from "@mantine/core"; import { useForm } from "@homarr/form"; import { createModal } from "@homarr/modals"; @@ -30,6 +30,23 @@ export const WidgetAdvancedOptionsModal = createModal(({ actions, in label={t("item.edit.field.customCssClasses.label")} {...form.getInputProps("customCssClasses")} /> + +