@caring-dev/react-notion-x 7.7.2
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.
- package/build/context--HOSgWjH.d.ts +133 -0
- package/build/context-z-0zUcFf.d.ts +136 -0
- package/build/index.d.ts +94 -0
- package/build/index.js +3302 -0
- package/build/index.js.map +1 -0
- package/build/third-party/code.d.ts +10 -0
- package/build/third-party/code.js +2364 -0
- package/build/third-party/code.js.map +1 -0
- package/build/third-party/collection.d.ts +25 -0
- package/build/third-party/collection.js +7221 -0
- package/build/third-party/collection.js.map +1 -0
- package/build/third-party/equation.d.ts +11 -0
- package/build/third-party/equation.js +2234 -0
- package/build/third-party/equation.js.map +1 -0
- package/build/third-party/modal.d.ts +1 -0
- package/build/third-party/modal.js +8 -0
- package/build/third-party/modal.js.map +1 -0
- package/build/third-party/pdf.d.ts +7 -0
- package/build/third-party/pdf.js +16 -0
- package/build/third-party/pdf.js.map +1 -0
- package/package.json +91 -0
- package/readme.md +19 -0
- package/src/styles.css +3603 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as types from 'notion-types';
|
|
3
|
+
import { ExtendedRecordMap } from 'notion-types';
|
|
4
|
+
import React__default from 'react';
|
|
5
|
+
|
|
6
|
+
type MapPageUrlFn = (pageId: string, recordMap?: types.ExtendedRecordMap | undefined) => string;
|
|
7
|
+
type MapImageUrlFn = (url: string | undefined, block: types.Block) => string | undefined;
|
|
8
|
+
type SearchNotionFn = (params: types.SearchParams) => Promise<types.SearchResults>;
|
|
9
|
+
type ComponentOverrideFn = (props: any, defaultValueFn: () => React__default.ReactNode) => any;
|
|
10
|
+
interface NotionComponents {
|
|
11
|
+
Image: any;
|
|
12
|
+
Link: any;
|
|
13
|
+
PageLink: any;
|
|
14
|
+
Checkbox: React__default.FC<{
|
|
15
|
+
isChecked: boolean;
|
|
16
|
+
blockId?: string;
|
|
17
|
+
}>;
|
|
18
|
+
Code: any;
|
|
19
|
+
Equation: any;
|
|
20
|
+
Callout?: any;
|
|
21
|
+
Collection: any;
|
|
22
|
+
Property?: any;
|
|
23
|
+
propertyTextValue: ComponentOverrideFn;
|
|
24
|
+
propertySelectValue: ComponentOverrideFn;
|
|
25
|
+
propertyRelationValue: ComponentOverrideFn;
|
|
26
|
+
propertyFormulaValue: ComponentOverrideFn;
|
|
27
|
+
propertyTitleValue: ComponentOverrideFn;
|
|
28
|
+
propertyPersonValue: ComponentOverrideFn;
|
|
29
|
+
propertyFileValue: ComponentOverrideFn;
|
|
30
|
+
propertyCheckboxValue: ComponentOverrideFn;
|
|
31
|
+
propertyUrlValue: ComponentOverrideFn;
|
|
32
|
+
propertyEmailValue: ComponentOverrideFn;
|
|
33
|
+
propertyPhoneNumberValue: ComponentOverrideFn;
|
|
34
|
+
propertyNumberValue: ComponentOverrideFn;
|
|
35
|
+
propertyLastEditedTimeValue: ComponentOverrideFn;
|
|
36
|
+
propertyCreatedTimeValue: ComponentOverrideFn;
|
|
37
|
+
propertyDateValue: ComponentOverrideFn;
|
|
38
|
+
propertyAutoIncrementIdValue: ComponentOverrideFn;
|
|
39
|
+
Pdf: any;
|
|
40
|
+
Tweet: any;
|
|
41
|
+
Modal: any;
|
|
42
|
+
Embed: any;
|
|
43
|
+
Header: any;
|
|
44
|
+
nextImage?: any;
|
|
45
|
+
nextLegacyImage?: any;
|
|
46
|
+
nextLink?: any;
|
|
47
|
+
}
|
|
48
|
+
interface CollectionViewProps {
|
|
49
|
+
collection: types.Collection;
|
|
50
|
+
collectionView: types.CollectionView;
|
|
51
|
+
collectionData: types.CollectionQueryResult;
|
|
52
|
+
padding?: number;
|
|
53
|
+
width?: number;
|
|
54
|
+
}
|
|
55
|
+
interface CollectionCardProps {
|
|
56
|
+
collection: types.Collection;
|
|
57
|
+
block: types.PageBlock;
|
|
58
|
+
cover: types.CollectionCardCover;
|
|
59
|
+
coverSize: types.CollectionCardCoverSize;
|
|
60
|
+
coverAspect: types.CollectionCardCoverAspect;
|
|
61
|
+
properties?: Array<{
|
|
62
|
+
property: types.PropertyID;
|
|
63
|
+
visible: boolean;
|
|
64
|
+
}>;
|
|
65
|
+
className?: string;
|
|
66
|
+
}
|
|
67
|
+
interface CollectionGroupProps {
|
|
68
|
+
collection: types.Collection;
|
|
69
|
+
collectionViewComponent: React__default.ElementType;
|
|
70
|
+
collectionGroup: any;
|
|
71
|
+
hidden: boolean;
|
|
72
|
+
schema: any;
|
|
73
|
+
value: any;
|
|
74
|
+
summaryProps: any;
|
|
75
|
+
detailsProps: any;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
interface NotionContext {
|
|
79
|
+
recordMap: ExtendedRecordMap;
|
|
80
|
+
components: NotionComponents;
|
|
81
|
+
mapPageUrl: MapPageUrlFn;
|
|
82
|
+
mapImageUrl: MapImageUrlFn;
|
|
83
|
+
searchNotion?: SearchNotionFn;
|
|
84
|
+
isShowingSearch?: boolean;
|
|
85
|
+
onHideSearch?: () => void;
|
|
86
|
+
rootPageId?: string;
|
|
87
|
+
rootDomain?: string;
|
|
88
|
+
fullPage: boolean;
|
|
89
|
+
darkMode: boolean;
|
|
90
|
+
previewImages: boolean;
|
|
91
|
+
forceCustomImages: boolean;
|
|
92
|
+
showCollectionViewDropdown: boolean;
|
|
93
|
+
showTableOfContents: boolean;
|
|
94
|
+
minTableOfContentsItems: number;
|
|
95
|
+
linkTableTitleProperties: boolean;
|
|
96
|
+
isLinkCollectionToUrlProperty: boolean;
|
|
97
|
+
defaultPageIcon?: string | null;
|
|
98
|
+
defaultPageCover?: string | null;
|
|
99
|
+
defaultPageCoverPosition?: number;
|
|
100
|
+
zoom: any;
|
|
101
|
+
}
|
|
102
|
+
interface PartialNotionContext {
|
|
103
|
+
recordMap?: ExtendedRecordMap;
|
|
104
|
+
components?: Partial<NotionComponents>;
|
|
105
|
+
mapPageUrl?: MapPageUrlFn;
|
|
106
|
+
mapImageUrl?: MapImageUrlFn;
|
|
107
|
+
searchNotion?: SearchNotionFn;
|
|
108
|
+
isShowingSearch?: boolean;
|
|
109
|
+
onHideSearch?: () => void;
|
|
110
|
+
rootPageId?: string;
|
|
111
|
+
rootDomain?: string;
|
|
112
|
+
fullPage?: boolean;
|
|
113
|
+
darkMode?: boolean;
|
|
114
|
+
previewImages?: boolean;
|
|
115
|
+
forceCustomImages?: boolean;
|
|
116
|
+
showCollectionViewDropdown?: boolean;
|
|
117
|
+
linkTableTitleProperties?: boolean;
|
|
118
|
+
isLinkCollectionToUrlProperty?: boolean;
|
|
119
|
+
showTableOfContents?: boolean;
|
|
120
|
+
minTableOfContentsItems?: number;
|
|
121
|
+
defaultPageIcon?: string | null;
|
|
122
|
+
defaultPageCover?: string | null;
|
|
123
|
+
defaultPageCoverPosition?: number;
|
|
124
|
+
zoom?: any;
|
|
125
|
+
}
|
|
126
|
+
declare function dummyLink({ href, rel, target, title, ...rest }: any): react_jsx_runtime.JSX.Element;
|
|
127
|
+
declare function NotionContextProvider({ components: themeComponents, children, mapPageUrl, mapImageUrl, rootPageId, ...rest }: PartialNotionContext & {
|
|
128
|
+
children?: React__default.ReactNode;
|
|
129
|
+
}): react_jsx_runtime.JSX.Element;
|
|
130
|
+
declare const NotionContextConsumer: React__default.Consumer<NotionContext>;
|
|
131
|
+
declare const useNotionContext: () => NotionContext;
|
|
132
|
+
|
|
133
|
+
export { type ComponentOverrideFn as C, type MapPageUrlFn as M, type NotionContext as N, type PartialNotionContext as P, type SearchNotionFn as S, type NotionComponents as a, type MapImageUrlFn as b, NotionContextProvider as c, dummyLink as d, NotionContextConsumer as e, type CollectionViewProps as f, type CollectionCardProps as g, type CollectionGroupProps as h, useNotionContext as u };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as types from 'notion-types';
|
|
3
|
+
import { ExtendedRecordMap } from 'notion-types';
|
|
4
|
+
import React__default from 'react';
|
|
5
|
+
import { Locale } from 'date-fns';
|
|
6
|
+
|
|
7
|
+
type MapPageUrlFn = (pageId: string, recordMap?: types.ExtendedRecordMap | undefined) => string;
|
|
8
|
+
type MapImageUrlFn = (url: string | undefined, block: types.Block) => string | undefined;
|
|
9
|
+
type SearchNotionFn = (params: types.SearchParams) => Promise<types.SearchResults>;
|
|
10
|
+
type ComponentOverrideFn = (props: any, defaultValueFn: () => React__default.ReactNode) => any;
|
|
11
|
+
interface NotionComponents {
|
|
12
|
+
Image: any;
|
|
13
|
+
Link: any;
|
|
14
|
+
PageLink: any;
|
|
15
|
+
Checkbox: React__default.FC<{
|
|
16
|
+
isChecked: boolean;
|
|
17
|
+
blockId?: string;
|
|
18
|
+
}>;
|
|
19
|
+
Code: any;
|
|
20
|
+
Equation: any;
|
|
21
|
+
Callout?: any;
|
|
22
|
+
Collection: any;
|
|
23
|
+
Property?: any;
|
|
24
|
+
propertyTextValue: ComponentOverrideFn;
|
|
25
|
+
propertySelectValue: ComponentOverrideFn;
|
|
26
|
+
propertyRelationValue: ComponentOverrideFn;
|
|
27
|
+
propertyFormulaValue: ComponentOverrideFn;
|
|
28
|
+
propertyTitleValue: ComponentOverrideFn;
|
|
29
|
+
propertyPersonValue: ComponentOverrideFn;
|
|
30
|
+
propertyFileValue: ComponentOverrideFn;
|
|
31
|
+
propertyCheckboxValue: ComponentOverrideFn;
|
|
32
|
+
propertyUrlValue: ComponentOverrideFn;
|
|
33
|
+
propertyEmailValue: ComponentOverrideFn;
|
|
34
|
+
propertyPhoneNumberValue: ComponentOverrideFn;
|
|
35
|
+
propertyNumberValue: ComponentOverrideFn;
|
|
36
|
+
propertyLastEditedTimeValue: ComponentOverrideFn;
|
|
37
|
+
propertyCreatedTimeValue: ComponentOverrideFn;
|
|
38
|
+
propertyDateValue: ComponentOverrideFn;
|
|
39
|
+
propertyAutoIncrementIdValue: ComponentOverrideFn;
|
|
40
|
+
Pdf: any;
|
|
41
|
+
Tweet: any;
|
|
42
|
+
Modal: any;
|
|
43
|
+
Embed: any;
|
|
44
|
+
Header: any;
|
|
45
|
+
nextImage?: any;
|
|
46
|
+
nextLegacyImage?: any;
|
|
47
|
+
nextLink?: any;
|
|
48
|
+
}
|
|
49
|
+
interface CollectionViewProps {
|
|
50
|
+
collection: types.Collection;
|
|
51
|
+
collectionView: types.CollectionView;
|
|
52
|
+
collectionData: types.CollectionQueryResult;
|
|
53
|
+
padding?: number;
|
|
54
|
+
width?: number;
|
|
55
|
+
}
|
|
56
|
+
interface CollectionCardProps {
|
|
57
|
+
collection: types.Collection;
|
|
58
|
+
block: types.PageBlock;
|
|
59
|
+
cover: types.CollectionCardCover;
|
|
60
|
+
coverSize: types.CollectionCardCoverSize;
|
|
61
|
+
coverAspect: types.CollectionCardCoverAspect;
|
|
62
|
+
properties?: Array<{
|
|
63
|
+
property: types.PropertyID;
|
|
64
|
+
visible: boolean;
|
|
65
|
+
}>;
|
|
66
|
+
className?: string;
|
|
67
|
+
}
|
|
68
|
+
interface CollectionGroupProps {
|
|
69
|
+
collection: types.Collection;
|
|
70
|
+
collectionViewComponent: React__default.ElementType;
|
|
71
|
+
collectionGroup: any;
|
|
72
|
+
hidden: boolean;
|
|
73
|
+
schema: any;
|
|
74
|
+
value: any;
|
|
75
|
+
summaryProps: any;
|
|
76
|
+
detailsProps: any;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface NotionContext {
|
|
80
|
+
recordMap: ExtendedRecordMap;
|
|
81
|
+
components: NotionComponents;
|
|
82
|
+
mapPageUrl: MapPageUrlFn;
|
|
83
|
+
mapImageUrl: MapImageUrlFn;
|
|
84
|
+
searchNotion?: SearchNotionFn;
|
|
85
|
+
isShowingSearch?: boolean;
|
|
86
|
+
onHideSearch?: () => void;
|
|
87
|
+
rootPageId?: string;
|
|
88
|
+
rootDomain?: string;
|
|
89
|
+
fullPage: boolean;
|
|
90
|
+
darkMode: boolean;
|
|
91
|
+
previewImages: boolean;
|
|
92
|
+
forceCustomImages: boolean;
|
|
93
|
+
showCollectionViewDropdown: boolean;
|
|
94
|
+
showTableOfContents: boolean;
|
|
95
|
+
minTableOfContentsItems: number;
|
|
96
|
+
linkTableTitleProperties: boolean;
|
|
97
|
+
isLinkCollectionToUrlProperty: boolean;
|
|
98
|
+
defaultPageIcon?: string | null;
|
|
99
|
+
defaultPageCover?: string | null;
|
|
100
|
+
defaultPageCoverPosition?: number;
|
|
101
|
+
zoom: any;
|
|
102
|
+
locale?: Locale;
|
|
103
|
+
}
|
|
104
|
+
interface PartialNotionContext {
|
|
105
|
+
recordMap?: ExtendedRecordMap;
|
|
106
|
+
components?: Partial<NotionComponents>;
|
|
107
|
+
mapPageUrl?: MapPageUrlFn;
|
|
108
|
+
mapImageUrl?: MapImageUrlFn;
|
|
109
|
+
searchNotion?: SearchNotionFn;
|
|
110
|
+
isShowingSearch?: boolean;
|
|
111
|
+
onHideSearch?: () => void;
|
|
112
|
+
rootPageId?: string;
|
|
113
|
+
rootDomain?: string;
|
|
114
|
+
fullPage?: boolean;
|
|
115
|
+
darkMode?: boolean;
|
|
116
|
+
previewImages?: boolean;
|
|
117
|
+
forceCustomImages?: boolean;
|
|
118
|
+
showCollectionViewDropdown?: boolean;
|
|
119
|
+
linkTableTitleProperties?: boolean;
|
|
120
|
+
isLinkCollectionToUrlProperty?: boolean;
|
|
121
|
+
showTableOfContents?: boolean;
|
|
122
|
+
minTableOfContentsItems?: number;
|
|
123
|
+
defaultPageIcon?: string | null;
|
|
124
|
+
defaultPageCover?: string | null;
|
|
125
|
+
defaultPageCoverPosition?: number;
|
|
126
|
+
zoom?: any;
|
|
127
|
+
locale?: Locale;
|
|
128
|
+
}
|
|
129
|
+
declare function dummyLink({ href, rel, target, title, ...rest }: any): react_jsx_runtime.JSX.Element;
|
|
130
|
+
declare function NotionContextProvider({ components: themeComponents, children, mapPageUrl, mapImageUrl, rootPageId, ...rest }: PartialNotionContext & {
|
|
131
|
+
children?: React__default.ReactNode;
|
|
132
|
+
}): react_jsx_runtime.JSX.Element;
|
|
133
|
+
declare const NotionContextConsumer: React__default.Consumer<NotionContext>;
|
|
134
|
+
declare const useNotionContext: () => NotionContext;
|
|
135
|
+
|
|
136
|
+
export { type ComponentOverrideFn as C, type MapPageUrlFn as M, type NotionContext as N, type PartialNotionContext as P, type SearchNotionFn as S, type NotionComponents as a, type MapImageUrlFn as b, NotionContextProvider as c, dummyLink as d, NotionContextConsumer as e, type CollectionViewProps as f, type CollectionCardProps as g, type CollectionGroupProps as h, useNotionContext as u };
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as types from 'notion-types';
|
|
3
|
+
import { Block, Decoration, ExtendedRecordMap, BlockMap } from 'notion-types';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import React__default from 'react';
|
|
6
|
+
import { S as SearchNotionFn, a as NotionComponents, M as MapPageUrlFn, b as MapImageUrlFn } from './context--HOSgWjH.js';
|
|
7
|
+
export { g as CollectionCardProps, h as CollectionGroupProps, f as CollectionViewProps, C as ComponentOverrideFn, N as NotionContext, e as NotionContextConsumer, c as NotionContextProvider, P as PartialNotionContext, d as dummyLink, u as useNotionContext } from './context--HOSgWjH.js';
|
|
8
|
+
export { formatDate, formatNotionDateTime, isUrl } from 'notion-utils';
|
|
9
|
+
|
|
10
|
+
declare function Header({ block }: {
|
|
11
|
+
block: types.CollectionViewPageBlock | types.PageBlock;
|
|
12
|
+
}): react_jsx_runtime.JSX.Element;
|
|
13
|
+
declare function Breadcrumbs({ block, rootOnly }: {
|
|
14
|
+
block: types.Block;
|
|
15
|
+
rootOnly?: boolean;
|
|
16
|
+
}): react_jsx_runtime.JSX.Element;
|
|
17
|
+
declare function Search({ block, search, title }: {
|
|
18
|
+
block: types.Block;
|
|
19
|
+
search?: SearchNotionFn;
|
|
20
|
+
title?: React__default.ReactNode;
|
|
21
|
+
}): react_jsx_runtime.JSX.Element;
|
|
22
|
+
|
|
23
|
+
declare function PageIconImpl({ block, className, inline, hideDefaultIcon, defaultIcon }: {
|
|
24
|
+
block: Block;
|
|
25
|
+
className?: string;
|
|
26
|
+
inline?: boolean;
|
|
27
|
+
hideDefaultIcon?: boolean;
|
|
28
|
+
defaultIcon?: string | null;
|
|
29
|
+
}): react_jsx_runtime.JSX.Element | null;
|
|
30
|
+
declare const PageIcon: React__default.MemoExoticComponent<typeof PageIconImpl>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Renders a single piece of Notion text, including basic rich text formatting.
|
|
34
|
+
*
|
|
35
|
+
* These represent the innermost leaf nodes of a Notion subtree.
|
|
36
|
+
*
|
|
37
|
+
* TODO: I think this implementation would be more correct if the reduce just added
|
|
38
|
+
* attributes to the final element's style.
|
|
39
|
+
*/
|
|
40
|
+
declare function Text({ value, block, linkProps, linkProtocol }: {
|
|
41
|
+
value?: Decoration[];
|
|
42
|
+
block: Block;
|
|
43
|
+
linkProps?: any;
|
|
44
|
+
linkProtocol?: string;
|
|
45
|
+
inline?: boolean;
|
|
46
|
+
}): react_jsx_runtime.JSX.Element;
|
|
47
|
+
|
|
48
|
+
declare function NotionRenderer({ components, recordMap, mapPageUrl, mapImageUrl, searchNotion, isShowingSearch, onHideSearch, fullPage, rootPageId, rootDomain, darkMode, previewImages, forceCustomImages, showCollectionViewDropdown, linkTableTitleProperties, isLinkCollectionToUrlProperty, isImageZoomable, showTableOfContents, minTableOfContentsItems, defaultPageIcon, defaultPageCover, defaultPageCoverPosition, ...rest }: {
|
|
49
|
+
recordMap: ExtendedRecordMap;
|
|
50
|
+
components?: Partial<NotionComponents>;
|
|
51
|
+
mapPageUrl?: MapPageUrlFn;
|
|
52
|
+
mapImageUrl?: MapImageUrlFn;
|
|
53
|
+
searchNotion?: SearchNotionFn;
|
|
54
|
+
isShowingSearch?: boolean;
|
|
55
|
+
onHideSearch?: () => void;
|
|
56
|
+
rootPageId?: string;
|
|
57
|
+
rootDomain?: string;
|
|
58
|
+
fullPage?: boolean;
|
|
59
|
+
darkMode?: boolean;
|
|
60
|
+
previewImages?: boolean;
|
|
61
|
+
forceCustomImages?: boolean;
|
|
62
|
+
showCollectionViewDropdown?: boolean;
|
|
63
|
+
linkTableTitleProperties?: boolean;
|
|
64
|
+
isLinkCollectionToUrlProperty?: boolean;
|
|
65
|
+
isImageZoomable?: boolean;
|
|
66
|
+
showTableOfContents?: boolean;
|
|
67
|
+
minTableOfContentsItems?: number;
|
|
68
|
+
defaultPageIcon?: string;
|
|
69
|
+
defaultPageCover?: string;
|
|
70
|
+
defaultPageCoverPosition?: number;
|
|
71
|
+
className?: string;
|
|
72
|
+
bodyClassName?: string;
|
|
73
|
+
header?: React.ReactNode;
|
|
74
|
+
footer?: React.ReactNode;
|
|
75
|
+
pageHeader?: React.ReactNode;
|
|
76
|
+
pageFooter?: React.ReactNode;
|
|
77
|
+
pageTitle?: React.ReactNode;
|
|
78
|
+
pageAside?: React.ReactNode;
|
|
79
|
+
pageCover?: React.ReactNode;
|
|
80
|
+
blockId?: string;
|
|
81
|
+
hideBlockId?: boolean;
|
|
82
|
+
disableHeader?: boolean;
|
|
83
|
+
}): react_jsx_runtime.JSX.Element;
|
|
84
|
+
|
|
85
|
+
declare const cs: (...classes: Array<string | undefined | false>) => string;
|
|
86
|
+
declare const getListNumber: (blockId: string, blockMap: BlockMap) => any;
|
|
87
|
+
declare const getListNestingLevel: (blockId: string, blockMap: BlockMap) => number;
|
|
88
|
+
declare const getListStyle: (level: number) => string;
|
|
89
|
+
declare const getHashFragmentValue: (url: string) => string;
|
|
90
|
+
declare const isBrowser = true;
|
|
91
|
+
declare const getYoutubeId: (url: string) => string | null;
|
|
92
|
+
declare const getUrlParams: (url: string) => Record<string, string> | undefined;
|
|
93
|
+
|
|
94
|
+
export { Breadcrumbs, Header, MapImageUrlFn, MapPageUrlFn, NotionComponents, NotionRenderer, PageIcon, PageIconImpl, Search, SearchNotionFn, Text, cs, getHashFragmentValue, getListNestingLevel, getListNumber, getListStyle, getUrlParams, getYoutubeId, isBrowser };
|