@homefile/components-v2 2.17.4 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/components/homeAssistant/monitorAlerts/BackendAlert.js +13 -5
  2. package/dist/components/homeAssistant/monitorAlerts/BackendAlertCard.js +1 -1
  3. package/dist/components/homeAssistant/monitorAlerts/alertDetails/AlertFields.d.ts +2 -0
  4. package/dist/components/homeAssistant/monitorAlerts/alertDetails/AlertFields.js +17 -0
  5. package/dist/components/homeAssistant/monitorAlerts/alertDetails/VideoDetail.d.ts +2 -0
  6. package/dist/components/homeAssistant/monitorAlerts/alertDetails/VideoDetail.js +5 -0
  7. package/dist/components/homeAssistant/monitorAlerts/alertDetails/index.d.ts +2 -0
  8. package/dist/components/homeAssistant/monitorAlerts/alertDetails/index.js +2 -0
  9. package/dist/interfaces/forms/dynamicForm/DynamicForm.interface.d.ts +2 -2
  10. package/dist/interfaces/headers/TabsHeader.interface.d.ts +3 -4
  11. package/dist/interfaces/homeAssistant/BackendAlert.interface.d.ts +1 -1
  12. package/dist/mocks/forms/dynamicForm.mock.js +46 -1
  13. package/package.json +1 -1
  14. package/src/components/homeAssistant/monitorAlerts/BackendAlert.tsx +19 -7
  15. package/src/components/homeAssistant/monitorAlerts/BackendAlertCard.tsx +1 -3
  16. package/src/components/homeAssistant/monitorAlerts/alertDetails/AlertFields.tsx +31 -0
  17. package/src/components/homeAssistant/monitorAlerts/alertDetails/VideoDetail.tsx +20 -0
  18. package/src/components/homeAssistant/monitorAlerts/alertDetails/index.ts +2 -0
  19. package/src/interfaces/forms/dynamicForm/DynamicForm.interface.ts +3 -0
  20. package/src/interfaces/headers/TabsHeader.interface.ts +3 -3
  21. package/src/interfaces/homeAssistant/BackendAlert.interface.ts +1 -6
  22. package/src/mocks/forms/dynamicForm.mock.ts +47 -1
@@ -1,9 +1,17 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { BackendAlertCard } from '../..';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AlertFields, BackendAlertCard, TabsHeader } from '../..';
3
3
  import { getCategoryStyles } from '../../../utils/Alerts.utils';
4
+ import { Divider } from '@chakra-ui/react';
4
5
  export const BackendAlert = ({ category, form }) => {
5
- var _a, _b, _c;
6
+ var _a, _b, _c, _d, _e;
6
7
  const { headerBg, alertIcon, alertIconBg, alertTitle } = getCategoryStyles(category);
7
- const alertHeader = form === null || form === void 0 ? void 0 : form.find((item) => item.type === 'alertHeader');
8
- return (_jsx(BackendAlertCard, { alertBg: headerBg, alertIcon: alertIcon, alertTitle: alertTitle, bg: alertIconBg, icon: (_a = alertHeader === null || alertHeader === void 0 ? void 0 : alertHeader.icon) !== null && _a !== void 0 ? _a : '', title: (_b = alertHeader === null || alertHeader === void 0 ? void 0 : alertHeader.label) !== null && _b !== void 0 ? _b : '', description: (_c = alertHeader === null || alertHeader === void 0 ? void 0 : alertHeader.description) !== null && _c !== void 0 ? _c : '', children: "content" }));
8
+ const alert = form === null || form === void 0 ? void 0 : form.find((item) => item.type === 'alert');
9
+ const tabs = (_b = (_a = alert === null || alert === void 0 ? void 0 : alert.children) === null || _a === void 0 ? void 0 : _a.map((tab) => {
10
+ var _a;
11
+ return ({
12
+ label: tab.name,
13
+ component: _jsx(AlertFields, { fields: (_a = tab.children) !== null && _a !== void 0 ? _a : [] }),
14
+ });
15
+ })) !== null && _b !== void 0 ? _b : [];
16
+ return (_jsxs(BackendAlertCard, { alertBg: headerBg, alertIcon: alertIcon, alertTitle: alertTitle, bg: alertIconBg, icon: (_c = alert === null || alert === void 0 ? void 0 : alert.icon) !== null && _c !== void 0 ? _c : '', title: (_d = alert === null || alert === void 0 ? void 0 : alert.label) !== null && _d !== void 0 ? _d : '', description: (_e = alert === null || alert === void 0 ? void 0 : alert.description) !== null && _e !== void 0 ? _e : '', children: [_jsx(Divider, {}), _jsx(TabsHeader, { tabList: tabs })] }));
9
17
  };
@@ -18,5 +18,5 @@ import { fieldIcons } from '../../../helpers';
18
18
  export const BackendAlertCard = (_a) => {
19
19
  var { alertBg = 'error.2', alertIcon = Warranty, alertTitle = t('homeAssistant.monitorAlerts.protection'), children, icon = 'warning' } = _a, props = __rest(_a, ["alertBg", "alertIcon", "alertTitle", "children", "icon"]);
20
20
  const { isOpen, onToggle } = useDisclosure();
21
- return (_jsxs(Box, { display: "flex", flexDir: "column", bg: "neutral.white", boxShadow: "lg", borderRadius: "lg", overflow: "hidden", maxW: "420px", children: [_jsx(AlertHeader, { bg: alertBg }), _jsx(AlertTitle, { alertIcon: alertIcon, alertTitle: alertTitle }), _jsx(AlertTemplate, Object.assign({}, props, { icon: fieldIcons[icon] })), _jsx(Collapse, { in: isOpen, animateOpacity: true, children: _jsx(Box, { p: "base", bg: "lightBlue.1", children: children }) }), _jsx(Flex, { py: "base", bg: "lightBlue.1", justify: "flex-end", children: _jsx(Button, { variant: "leftRounded", w: "fit-content", px: "8", fontSize: "sm", fontWeight: "medium", onClick: onToggle, bg: isOpen ? 'blue.8' : 'blue.2', children: t(`homeAssistant.monitorAlerts.${isOpen ? 'collapse' : 'review'}`) }) })] }));
21
+ return (_jsxs(Box, { display: "flex", flexDir: "column", bg: "neutral.white", boxShadow: "lg", borderRadius: "lg", overflow: "hidden", maxW: "420px", children: [_jsx(AlertHeader, { bg: alertBg }), _jsx(AlertTitle, { alertIcon: alertIcon, alertTitle: alertTitle }), _jsx(AlertTemplate, Object.assign({}, props, { icon: fieldIcons[icon] })), _jsx(Collapse, { in: isOpen, animateOpacity: true, children: _jsx(Box, { bg: "lightBlue.1", children: children }) }), _jsx(Flex, { py: "base", bg: "lightBlue.1", justify: "flex-end", children: _jsx(Button, { variant: "leftRounded", w: "fit-content", px: "8", fontSize: "sm", fontWeight: "medium", onClick: onToggle, bg: isOpen ? 'blue.8' : 'blue.2', children: t(`homeAssistant.monitorAlerts.${isOpen ? 'collapse' : 'review'}`) }) })] }));
22
22
  };
@@ -0,0 +1,2 @@
1
+ import { FieldTypesI } from '../../../../interfaces';
2
+ export declare const AlertFields: ({ fields }: FieldTypesI) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { createElement as _createElement } from "react";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Stack, Text } from '@chakra-ui/react';
4
+ import { VideoDetail } from './VideoDetail';
5
+ export const AlertFields = ({ fields }) => {
6
+ return (_jsx(Stack, { spacing: "base", p: "base", children: fields === null || fields === void 0 ? void 0 : fields.map((field) => {
7
+ const { id, type, value } = field;
8
+ switch (type) {
9
+ case 'text':
10
+ return (_jsx(Text, { fontSize: "sm", fontFamily: "secondary", lineHeight: "1.2", whiteSpace: "pre-line", children: String(value) }, id));
11
+ case 'video':
12
+ return _createElement(VideoDetail, Object.assign({}, field, { key: id }));
13
+ default:
14
+ return null;
15
+ }
16
+ }) }));
17
+ };
@@ -0,0 +1,2 @@
1
+ import { ReportI } from '../../../../interfaces';
2
+ export declare const VideoDetail: ({ name, label, link, description }: ReportI) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AspectRatio, Box, Container, Flex, Text } from '@chakra-ui/react';
3
+ export const VideoDetail = ({ name, label, link, description }) => {
4
+ return (_jsx(Container, { p: "base", children: _jsxs(Flex, { gap: "base", children: [_jsx(AspectRatio, { w: "140px", ratio: 16 / 9, children: _jsx("iframe", { title: name, src: link, allowFullScreen: true }) }), _jsxs(Box, { children: [_jsx(Text, { fontWeight: "semibold", children: name }), _jsx(Text, { fontSize: "sm", fontFamily: "secondary", children: `${label} | ${description}` })] })] }) }));
5
+ };
@@ -1,4 +1,6 @@
1
+ export * from './AlertFields';
1
2
  export * from './ChangeAirFilter';
2
3
  export * from './CustomDivider';
3
4
  export * from './SmokeDetectorBattery';
4
5
  export * from './SmokeDetectorExpired';
6
+ export * from './VideoDetail';
@@ -1,4 +1,6 @@
1
+ export * from './AlertFields';
1
2
  export * from './ChangeAirFilter';
2
3
  export * from './CustomDivider';
3
4
  export * from './SmokeDetectorBattery';
4
5
  export * from './SmokeDetectorExpired';
6
+ export * from './VideoDetail';
@@ -1,5 +1,5 @@
1
- import { AIGridFieldI, AlertFieldType, FolderFileI, MenuItemI, PartnerFooterI, TileCtaI } from '../..';
2
- export type KindTypes = 'ai-image' | 'ai-grid' | 'checkbox' | 'checkbox-agreement' | 'checkbox-group' | 'currency' | 'date' | 'email' | 'file' | 'grid' | 'group' | 'hidden' | 'notes' | 'number' | 'radio' | 'rating' | 'select' | 'string' | 'switch' | 'telephone' | 'text' | 'textarea' | 'default' | UIKindTypes | HomeItemTypes | AlertFieldType;
1
+ import { AIGridFieldI, AlertFieldType, AlertTabType, FolderFileI, MenuItemI, PartnerFooterI, TileCtaI } from '../..';
2
+ export type KindTypes = 'ai-image' | 'ai-grid' | 'checkbox' | 'checkbox-agreement' | 'checkbox-group' | 'currency' | 'date' | 'email' | 'file' | 'grid' | 'group' | 'hidden' | 'notes' | 'number' | 'radio' | 'rating' | 'select' | 'string' | 'switch' | 'telephone' | 'text' | 'textarea' | 'default' | 'video' | UIKindTypes | HomeItemTypes | AlertTabType | AlertFieldType;
3
3
  export type UIKindTypes = 'tile-body' | 'tile-body-logo' | 'tile-body-header' | 'tile-body-section' | 'tile-body-section-grid' | 'tile-body-partner-image' | 'tile-body-description' | 'tile-form' | 'tile-body-action' | 'vertical-icon' | 'primary-cta' | 'secondary-cta';
4
4
  export type HomeItemTypes = 'appliances' | 'images' | 'guidelines' | 'item-related' | 'item-icon-btn';
5
5
  export type IconTypes = 'barcode' | 'battery' | 'billing' | 'book' | 'book-opened' | 'calc' | 'calendar' | 'check' | 'co2' | 'contact' | 'date' | 'default' | 'detector' | 'electricity' | 'goldbars' | 'heart' | 'image' | 'notes' | 'palette' | 'people' | 'price' | 'rating' | 'receipt' | 'registry' | 'sprinkler' | 'tools' | 'wind' | '68' | 'calendar2' | 'water' | 'calendar-drop' | 'umbrella' | 'heater' | 'roof' | 'foundation' | 'solar-panel' | 'pool' | 'drop' | 'mobile-drop' | 'light' | 'plate' | 'pressure-washer' | 'house' | 'target' | 'title' | 'company' | UIIconTypes;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- interface Tab {
2
+ export interface TabI {
3
3
  label: string;
4
4
  component: ReactNode | null;
5
5
  }
@@ -7,8 +7,7 @@ export interface TabsHeaderI {
7
7
  defaultIndex?: number;
8
8
  onChange?: (index: number) => void;
9
9
  rightButton?: ReactNode;
10
- rightTabList?: Tab[];
10
+ rightTabList?: TabI[];
11
11
  tabIndex?: number;
12
- tabList: Tab[];
12
+ tabList: TabI[];
13
13
  }
14
- export {};
@@ -1,7 +1,7 @@
1
1
  import { DynamicFormI } from '..';
2
2
  export type AlertCategory = 'safeguard' | 'maintain' | 'budget' | 'improve';
3
3
  export type AlertTabType = 'details' | 'filter-size' | 'purchase' | 'hire-out';
4
- export type AlertFieldType = 'alertHeader' | 'text' | 'iconSection' | 'tabList' | 'list';
4
+ export type AlertFieldType = 'alert' | 'iconSection' | 'tabList' | 'list';
5
5
  export interface BackendAlertI extends DynamicFormI {
6
6
  category: AlertCategory;
7
7
  }
@@ -847,6 +847,51 @@ export const alertFieldsMock = [
847
847
  description: 'Changing your air filter every 30 days ensures efficient system performance and improves indoor air quality by trapping dust and allergens.',
848
848
  icon: 'wind',
849
849
  value: false,
850
- type: 'alertHeader',
850
+ type: 'alert',
851
+ children: [
852
+ {
853
+ id: faker.database.mongodbObjectId(),
854
+ name: 'Details',
855
+ label: 'Model or Serial',
856
+ description: faker.lorem.sentence(),
857
+ comments: faker.lorem.sentence(),
858
+ value: '',
859
+ type: 'details',
860
+ visible: true,
861
+ children: [
862
+ {
863
+ id: faker.database.mongodbObjectId(),
864
+ name: '',
865
+ label: '',
866
+ description: '',
867
+ comments: '',
868
+ value: 'Changing your air filter is critical for maintaining your home’s HVAC system efficiency and ensuring good air quality. A clogged filter forces your system to work harder, leading to higher energy bills and potential damage to components. \n\nNeglecting this simple maintenance can result in costly repairs or even a full system replacement, which can run into thousands of dollars. Regularly replacing your air filter not only saves money but also extends the lifespan of your HVAC system, keeping your home comfortable and your expenses in check.',
869
+ type: 'text',
870
+ visible: true,
871
+ },
872
+ {
873
+ id: faker.database.mongodbObjectId(),
874
+ name: 'Where to find and change the Air Filter',
875
+ label: 'Dec 5, 2024',
876
+ description: '1:39',
877
+ comments: '',
878
+ value: '',
879
+ link: 'https://www.youtube.com/embed/qCNIc1y18pA?si=oC1NmAjuh0JZTYcr',
880
+ type: 'video',
881
+ visible: true,
882
+ },
883
+ ],
884
+ },
885
+ {
886
+ id: faker.database.mongodbObjectId(),
887
+ name: 'Filter Size',
888
+ label: 'Upload Image',
889
+ description: faker.lorem.sentence(),
890
+ comments: faker.lorem.sentence(),
891
+ value: faker.image.urlPicsumPhotos(),
892
+ type: 'filter-size',
893
+ visible: true,
894
+ },
895
+ ],
851
896
  },
852
897
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homefile/components-v2",
3
- "version": "2.17.4",
3
+ "version": "2.18.0",
4
4
  "author": "Homefile",
5
5
  "license": "UNLICENSED",
6
6
  "typings": "dist/index.d.ts",
@@ -1,22 +1,34 @@
1
- import { BackendAlertCard } from '@/components'
2
- import { BackendAlertI } from '@/interfaces'
1
+ import { AlertFields, BackendAlertCard, TabsHeader } from '@/components'
2
+ import { BackendAlertI, TabI } from '@/interfaces'
3
3
  import { getCategoryStyles } from '@/utils/Alerts.utils'
4
+ import { Divider } from '@chakra-ui/react'
4
5
 
5
6
  export const BackendAlert = ({ category, form }: BackendAlertI) => {
6
7
  const { headerBg, alertIcon, alertIconBg, alertTitle } =
7
8
  getCategoryStyles(category)
8
- const alertHeader = form?.find((item) => item.type === 'alertHeader')
9
+ const alert = form?.find((item) => item.type === 'alert')
10
+
11
+ const tabs =
12
+ alert?.children?.map(
13
+ (tab) =>
14
+ ({
15
+ label: tab.name,
16
+ component: <AlertFields fields={tab.children ?? []} />,
17
+ } as TabI)
18
+ ) ?? []
19
+
9
20
  return (
10
21
  <BackendAlertCard
11
22
  alertBg={headerBg}
12
23
  alertIcon={alertIcon}
13
24
  alertTitle={alertTitle}
14
25
  bg={alertIconBg}
15
- icon={alertHeader?.icon ?? ''}
16
- title={alertHeader?.label ?? ''}
17
- description={alertHeader?.description ?? ''}
26
+ icon={alert?.icon ?? ''}
27
+ title={alert?.label ?? ''}
28
+ description={alert?.description ?? ''}
18
29
  >
19
- content
30
+ <Divider />
31
+ <TabsHeader tabList={tabs} />
20
32
  </BackendAlertCard>
21
33
  )
22
34
  }
@@ -29,9 +29,7 @@ export const BackendAlertCard = ({
29
29
  <AlertTitle alertIcon={alertIcon} alertTitle={alertTitle} />
30
30
  <AlertTemplate {...props} icon={fieldIcons[icon as IconTypes]} />
31
31
  <Collapse in={isOpen} animateOpacity>
32
- <Box p="base" bg="lightBlue.1">
33
- {children}
34
- </Box>
32
+ <Box bg="lightBlue.1">{children}</Box>
35
33
  </Collapse>
36
34
  <Flex py="base" bg="lightBlue.1" justify="flex-end">
37
35
  <Button
@@ -0,0 +1,31 @@
1
+ import { FieldTypesI } from '@/interfaces'
2
+ import { Box, Stack, Text } from '@chakra-ui/react'
3
+ import { VideoDetail } from './VideoDetail'
4
+
5
+ export const AlertFields = ({ fields }: FieldTypesI) => {
6
+ return (
7
+ <Stack spacing="base" p="base">
8
+ {fields?.map((field) => {
9
+ const { id, type, value } = field
10
+ switch (type) {
11
+ case 'text':
12
+ return (
13
+ <Text
14
+ key={id}
15
+ fontSize="sm"
16
+ fontFamily="secondary"
17
+ lineHeight="1.2"
18
+ whiteSpace="pre-line"
19
+ >
20
+ {String(value)}
21
+ </Text>
22
+ )
23
+ case 'video':
24
+ return <VideoDetail {...field} key={id} />
25
+ default:
26
+ return null
27
+ }
28
+ })}
29
+ </Stack>
30
+ )
31
+ }
@@ -0,0 +1,20 @@
1
+ import { ReportI } from '@/interfaces'
2
+ import { AspectRatio, Box, Container, Flex, Text } from '@chakra-ui/react'
3
+
4
+ export const VideoDetail = ({ name, label, link, description }: ReportI) => {
5
+ return (
6
+ <Container p="base">
7
+ <Flex gap="base">
8
+ <AspectRatio w="140px" ratio={16 / 9}>
9
+ <iframe title={name} src={link} allowFullScreen />
10
+ </AspectRatio>
11
+ <Box>
12
+ <Text fontWeight="semibold">{name}</Text>
13
+ <Text fontSize="sm" fontFamily="secondary">
14
+ {`${label} | ${description}`}
15
+ </Text>
16
+ </Box>
17
+ </Flex>
18
+ </Container>
19
+ )
20
+ }
@@ -1,4 +1,6 @@
1
+ export * from './AlertFields'
1
2
  export * from './ChangeAirFilter'
2
3
  export * from './CustomDivider'
3
4
  export * from './SmokeDetectorBattery'
4
5
  export * from './SmokeDetectorExpired'
6
+ export * from './VideoDetail'
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AIGridFieldI,
3
3
  AlertFieldType,
4
+ AlertTabType,
4
5
  FolderFileI,
5
6
  MenuItemI,
6
7
  PartnerFooterI,
@@ -31,8 +32,10 @@ export type KindTypes =
31
32
  | 'text'
32
33
  | 'textarea'
33
34
  | 'default'
35
+ | 'video'
34
36
  | UIKindTypes
35
37
  | HomeItemTypes
38
+ | AlertTabType
36
39
  | AlertFieldType
37
40
 
38
41
  export type UIKindTypes =
@@ -1,6 +1,6 @@
1
1
  import { ReactNode } from 'react'
2
2
 
3
- interface Tab {
3
+ export interface TabI {
4
4
  label: string
5
5
  component: ReactNode | null
6
6
  }
@@ -8,7 +8,7 @@ export interface TabsHeaderI {
8
8
  defaultIndex?: number
9
9
  onChange?: (index: number) => void
10
10
  rightButton?: ReactNode
11
- rightTabList?: Tab[]
11
+ rightTabList?: TabI[]
12
12
  tabIndex?: number
13
- tabList: Tab[]
13
+ tabList: TabI[]
14
14
  }
@@ -4,12 +4,7 @@ export type AlertCategory = 'safeguard' | 'maintain' | 'budget' | 'improve'
4
4
 
5
5
  export type AlertTabType = 'details' | 'filter-size' | 'purchase' | 'hire-out'
6
6
 
7
- export type AlertFieldType =
8
- | 'alertHeader'
9
- | 'text'
10
- | 'iconSection'
11
- | 'tabList'
12
- | 'list'
7
+ export type AlertFieldType = 'alert' | 'iconSection' | 'tabList' | 'list'
13
8
 
14
9
  export interface BackendAlertI extends DynamicFormI {
15
10
  category: AlertCategory
@@ -863,6 +863,52 @@ export const alertFieldsMock: ReportI[] = [
863
863
  'Changing your air filter every 30 days ensures efficient system performance and improves indoor air quality by trapping dust and allergens.',
864
864
  icon: 'wind',
865
865
  value: false,
866
- type: 'alertHeader',
866
+ type: 'alert',
867
+ children: [
868
+ {
869
+ id: faker.database.mongodbObjectId(),
870
+ name: 'Details',
871
+ label: 'Model or Serial',
872
+ description: faker.lorem.sentence(),
873
+ comments: faker.lorem.sentence(),
874
+ value: '',
875
+ type: 'details',
876
+ visible: true,
877
+ children: [
878
+ {
879
+ id: faker.database.mongodbObjectId(),
880
+ name: '',
881
+ label: '',
882
+ description: '',
883
+ comments: '',
884
+ value:
885
+ 'Changing your air filter is critical for maintaining your home’s HVAC system efficiency and ensuring good air quality. A clogged filter forces your system to work harder, leading to higher energy bills and potential damage to components. \n\nNeglecting this simple maintenance can result in costly repairs or even a full system replacement, which can run into thousands of dollars. Regularly replacing your air filter not only saves money but also extends the lifespan of your HVAC system, keeping your home comfortable and your expenses in check.',
886
+ type: 'text',
887
+ visible: true,
888
+ },
889
+ {
890
+ id: faker.database.mongodbObjectId(),
891
+ name: 'Where to find and change the Air Filter',
892
+ label: 'Dec 5, 2024',
893
+ description: '1:39',
894
+ comments: '',
895
+ value: '',
896
+ link: 'https://www.youtube.com/embed/qCNIc1y18pA?si=oC1NmAjuh0JZTYcr',
897
+ type: 'video',
898
+ visible: true,
899
+ },
900
+ ],
901
+ },
902
+ {
903
+ id: faker.database.mongodbObjectId(),
904
+ name: 'Filter Size',
905
+ label: 'Upload Image',
906
+ description: faker.lorem.sentence(),
907
+ comments: faker.lorem.sentence(),
908
+ value: faker.image.urlPicsumPhotos(),
909
+ type: 'filter-size',
910
+ visible: true,
911
+ },
912
+ ],
867
913
  },
868
914
  ]