@cntrl-site/sdk-nextjs 0.15.3 → 0.15.5-1

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.
@@ -15,6 +15,7 @@ const useCurrentLayout = () => {
15
15
  ...acc,
16
16
  {
17
17
  layoutId: layout.id,
18
+ exemplary: layout.exemplary,
18
19
  start: layout.startsWith,
19
20
  end: next ? next.startsWith : Number.MAX_SAFE_INTEGER
20
21
  }
@@ -22,18 +23,21 @@ const useCurrentLayout = () => {
22
23
  }, []);
23
24
  }, [layouts]);
24
25
  const getCurrentLayout = (0, react_1.useCallback)((articleWidth) => {
25
- var _a;
26
- return (_a = layoutRanges.find(l => articleWidth >= l.start && articleWidth < l.end)) === null || _a === void 0 ? void 0 : _a.layoutId;
26
+ const range = layoutRanges.find(l => articleWidth >= l.start && articleWidth < l.end);
27
+ return range;
27
28
  }, [layoutRanges]);
28
29
  const [layoutId, setLayoutId] = (0, react_1.useState)(undefined);
30
+ const [deviation, setDeviation] = (0, react_1.useState)(1);
29
31
  (0, react_1.useEffect)(() => {
30
32
  if (!articleRectObserver)
31
33
  return;
32
34
  return articleRectObserver.on('resize', () => {
33
35
  const articleWidth = articleRectObserver.width;
34
- setLayoutId(getCurrentLayout(articleWidth));
36
+ const { layoutId, exemplary } = getCurrentLayout(articleWidth);
37
+ setLayoutId(layoutId);
38
+ setDeviation(articleWidth / exemplary);
35
39
  });
36
40
  }, [articleRectObserver, getCurrentLayout]);
37
- return layoutId;
41
+ return { layoutId, layoutDeviation: deviation };
38
42
  };
39
43
  exports.useCurrentLayout = useCurrentLayout;
@@ -12,20 +12,21 @@ const LayoutContext_1 = require("../provider/LayoutContext");
12
12
  const ArticleWrapper = ({ children }) => {
13
13
  const id = (0, react_1.useId)();
14
14
  const [isPageLoaded, setIsPageLoaded] = (0, react_1.useState)(false);
15
- const layoutId = (0, useCurrentLayout_1.useCurrentLayout)();
15
+ const { layoutId, layoutDeviation } = (0, useCurrentLayout_1.useCurrentLayout)();
16
16
  (0, react_1.useEffect)(() => {
17
17
  const onPageLoad = () => {
18
18
  setIsPageLoaded(true);
19
19
  };
20
- if (document.readyState === 'complete') {
21
- onPageLoad();
20
+ if (document.readyState === 'loading') {
21
+ window.addEventListener('DOMContentLoaded', onPageLoad);
22
+ return () => window.removeEventListener('DOMContentLoaded', onPageLoad);
22
23
  }
23
24
  else {
24
- window.addEventListener('load', onPageLoad);
25
- return () => window.removeEventListener('load', onPageLoad);
25
+ onPageLoad();
26
26
  }
27
27
  }, []);
28
- return ((0, jsx_runtime_1.jsxs)(LayoutContext_1.LayoutContext.Provider, Object.assign({ value: layoutId }, { children: [(0, jsx_runtime_1.jsx)("div", Object.assign({ className: "article-wrapper", style: { opacity: layoutId && isPageLoaded ? 1 : 0 } }, { children: children })), (0, jsx_runtime_1.jsx)(style_1.default, Object.assign({ id: id }, { children: `
28
+ const layoutDeviationStyle = { '--layout-deviation': layoutDeviation };
29
+ return ((0, jsx_runtime_1.jsxs)(LayoutContext_1.LayoutContext.Provider, Object.assign({ value: layoutId }, { children: [(0, jsx_runtime_1.jsx)("div", Object.assign({ className: "article-wrapper", style: Object.assign({ opacity: layoutId && isPageLoaded ? 1 : 0 }, layoutDeviationStyle) }, { children: children })), (0, jsx_runtime_1.jsx)(style_1.default, Object.assign({ id: id }, { children: `
29
30
  .article-wrapper {
30
31
  opacity: 1;
31
32
  transition: opacity 0.2s ease;
@@ -37,9 +37,11 @@ const itemsMap = {
37
37
  };
38
38
  const noop = () => null;
39
39
  const Item = ({ item, sectionId }) => {
40
+ var _a, _b;
40
41
  const id = (0, react_1.useId)();
41
42
  const { layouts } = (0, useCntrlContext_1.useCntrlContext)();
42
43
  const layout = (0, useLayoutContext_1.useLayoutContext)();
44
+ const exemplary = (_b = (_a = layouts.find(l => l.id === layout)) === null || _a === void 0 ? void 0 : _a.exemplary) !== null && _b !== void 0 ? _b : 1;
43
45
  const [wrapperHeight, setWrapperHeight] = (0, react_1.useState)(undefined);
44
46
  const { scale, scaleAnchor } = (0, useItemScale_1.useItemScale)(item, sectionId);
45
47
  const { top, left } = (0, useItemPosition_1.useItemPosition)(item, sectionId);
@@ -72,14 +74,21 @@ const Item = ({ item, sectionId }) => {
72
74
  (0, react_1.useEffect)(() => {
73
75
  isInitialRef.current = false;
74
76
  }, []);
75
- const styles = {
76
- transform: `scale(${scale})`,
77
- transformOrigin: ScaleAnchorMap_1.ScaleAnchorMap[scaleAnchor],
78
- width: `${sizingAxis.x === sdk_1.ArticleItemSizingType.Manual ? `${width * 100}vw` : 'max-content'}`,
79
- height: `${sizingAxis.y === sdk_1.ArticleItemSizingType.Manual ? `${height * 100}vw` : 'unset'}`,
80
- top: stickyTop
81
- };
82
- return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: `item-wrapper-${item.id}`, style: isInitialRef.current ? {} : Object.assign({ top, left }, (wrapperHeight ? { height: `${wrapperHeight * 100}vw` } : {})) }, { children: [(0, jsx_runtime_1.jsx)("div", Object.assign({ suppressHydrationWarning: true, className: `item-${item.id}`, style: isInitialRef.current ? {} : styles }, { children: (0, jsx_runtime_1.jsx)(ItemComponent, { item: item, sectionId: sectionId, onResize: handleItemResize }) })), (0, jsx_runtime_1.jsx)(style_1.default, Object.assign({ id: id }, { children: `
77
+ const isRichText = isItemType(item, sdk_1.ArticleItemType.RichText);
78
+ const scaleIfRichText = isRichText
79
+ ? { transformOrigin: 'top left', transform: 'scale(var(--layout-deviation))' }
80
+ : {};
81
+ const styles = Object.assign(Object.assign({}, scaleIfRichText), { top: stickyTop });
82
+ return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: `item-wrapper-${item.id}`, style: isInitialRef.current ? {} : Object.assign({ top, left }, (wrapperHeight ? { height: `${wrapperHeight * 100}vw` } : {})) }, { children: [(0, jsx_runtime_1.jsx)("div", Object.assign({ suppressHydrationWarning: true, className: `item-${item.id}`, style: isInitialRef.current ? {} : styles }, { children: (0, jsx_runtime_1.jsx)("div", Object.assign({ style: {
83
+ width: `${sizingAxis.x === sdk_1.ArticleItemSizingType.Manual
84
+ ? isRichText
85
+ ? `${width * exemplary}px`
86
+ : `${width * 100}vw`
87
+ : 'max-content'}`,
88
+ height: `${sizingAxis.y === sdk_1.ArticleItemSizingType.Manual ? `${height * 100}vw` : 'unset'}`,
89
+ transform: `scale(${scale})`,
90
+ transformOrigin: ScaleAnchorMap_1.ScaleAnchorMap[scaleAnchor]
91
+ } }, { children: (0, jsx_runtime_1.jsx)(ItemComponent, { item: item, sectionId: sectionId, onResize: handleItemResize }) })) })), (0, jsx_runtime_1.jsx)(style_1.default, Object.assign({ id: id }, { children: `
83
92
  ${(0, sdk_1.getLayoutStyles)(layouts, layoutValues, ([area, hidden, hoverParams, sticky, sectionHeight, layoutParams]) => {
84
93
  const sizingAxis = parseSizing(layoutParams.sizing);
85
94
  return (`
@@ -13,7 +13,7 @@ const useRichTextItem = (item) => {
13
13
  const preset = presetId
14
14
  ? (_a = typePresets === null || typePresets === void 0 ? void 0 : typePresets.presets.find(p => p.id === presetId)) !== null && _a !== void 0 ? _a : null
15
15
  : null;
16
- const [content, styles] = richTextConv.toHtml(item, layouts, !!preset);
16
+ const [content, styles] = richTextConv.toHtml(item, layouts);
17
17
  return [content, styles, preset];
18
18
  };
19
19
  exports.useRichTextItem = useRichTextItem;
@@ -10,7 +10,7 @@ exports.FontStyles = {
10
10
  'italic': { 'font-style': 'italic' }
11
11
  };
12
12
  class RichTextConverter {
13
- toHtml(richText, layouts, hasPreset) {
13
+ toHtml(richText, layouts) {
14
14
  var _a, _b, _c;
15
15
  const { text, blocks = [] } = richText.commonParams;
16
16
  const root = [];
@@ -34,7 +34,7 @@ class RichTextConverter {
34
34
  const lh = RichTextConverter.fromDraftToInline({
35
35
  name: 'LINEHEIGHT',
36
36
  value: currentLineHeight[l.id]
37
- });
37
+ }, l.exemplary);
38
38
  styleRules[l.id].push(`.rt_${richText.id}_br_${blockIndex} {${lh}}`);
39
39
  });
40
40
  continue;
@@ -62,7 +62,7 @@ class RichTextConverter {
62
62
  text-align: ${ta};
63
63
  white-space: ${whiteSpace};
64
64
  overflow-wrap: break-word;
65
- ${!hasPreset ? 'line-height: 0;' : ''}
65
+ line-height: 0;
66
66
  }
67
67
  `);
68
68
  });
@@ -96,6 +96,7 @@ class RichTextConverter {
96
96
  kids.push(sliceSymbols(content, offset));
97
97
  }
98
98
  for (const item of group) {
99
+ const { exemplary } = layouts.find(l => l.id === item.layout);
99
100
  const entitiesGroups = (_c = this.groupEntities(entities, item.styles)) !== null && _c !== void 0 ? _c : [];
100
101
  for (const entitiesGroup of entitiesGroups) {
101
102
  if (!entitiesGroup.stylesGroup)
@@ -108,7 +109,7 @@ class RichTextConverter {
108
109
  }
109
110
  styleRules[item.layout].push(`
110
111
  .${blockClass} .s-${styleGroup.start}-${styleGroup.end} {
111
- ${styleGroup.styles.map(s => RichTextConverter.fromDraftToInline(s)).join('\n')}
112
+ ${styleGroup.styles.map(s => RichTextConverter.fromDraftToInline(s, exemplary)).join('\n')}
112
113
  }
113
114
  `);
114
115
  if (color) {
@@ -192,17 +193,17 @@ class RichTextConverter {
192
193
  }
193
194
  return entitiesGroups;
194
195
  }
195
- static fromDraftToInline(draftStyle) {
196
+ static fromDraftToInline(draftStyle, exemplary) {
196
197
  const { value, name } = draftStyle;
197
198
  const map = {
198
199
  'COLOR': { 'color': getResolvedValue(value, name) },
199
200
  'TYPEFACE': { 'font-family': `${value}` },
200
201
  'FONTSTYLE': value ? Object.assign({}, exports.FontStyles[value]) : {},
201
202
  'FONTWEIGHT': { 'font-weight': value },
202
- 'FONTSIZE': { 'font-size': `${parseFloat(value) * 100}vw` },
203
- 'LINEHEIGHT': { 'line-height': `${parseFloat(value) * 100}vw` },
204
- 'LETTERSPACING': { 'letter-spacing': `${parseFloat(value) * 100}vw` },
205
- 'WORDSPACING': { 'word-spacing': `${parseFloat(value) * 100}vw` },
203
+ 'FONTSIZE': { 'font-size': `${parseFloat(value) * exemplary}px` },
204
+ 'LINEHEIGHT': { 'line-height': `${parseFloat(value) * exemplary}px` },
205
+ 'LETTERSPACING': { 'letter-spacing': `${parseFloat(value) * exemplary}px` },
206
+ 'WORDSPACING': { 'word-spacing': `${parseFloat(value) * exemplary}px` },
206
207
  'TEXTTRANSFORM': value ? { 'text-transform': value } : { 'text-transform': sdk_1.TextTransform.None },
207
208
  'VERTICALALIGN': value ? { 'vertical-align': value } : { 'vertical-align': sdk_1.VerticalAlign.Unset },
208
209
  'TEXTDECORATION': { 'text-decoration': value }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cntrl-site/sdk-nextjs",
3
- "version": "0.15.3",
3
+ "version": "0.15.5-1",
4
4
  "description": "SDK for Next.js",
5
5
  "main": "lib/index.js",
6
6
  "types": "src/index.ts",
@@ -4,11 +4,17 @@ import { ArticleRectContext } from '../provider/ArticleRectContext';
4
4
 
5
5
  interface LayoutData {
6
6
  layoutId: string;
7
+ exemplary: number;
7
8
  start: number;
8
9
  end: number;
9
10
  }
10
11
 
11
- export const useCurrentLayout = (): string | undefined => {
12
+ type UseCurrentLayoutReturn = {
13
+ layoutId: string | undefined;
14
+ layoutDeviation: number;
15
+ };
16
+
17
+ export const useCurrentLayout = (): UseCurrentLayoutReturn => {
12
18
  const { layouts } = useCntrlContext();
13
19
  const articleRectObserver = useContext(ArticleRectContext);
14
20
  const layoutRanges = useMemo(() => {
@@ -19,6 +25,7 @@ export const useCurrentLayout = (): string | undefined => {
19
25
  ...acc,
20
26
  {
21
27
  layoutId: layout.id,
28
+ exemplary: layout.exemplary,
22
29
  start: layout.startsWith,
23
30
  end: next ? next.startsWith : Number.MAX_SAFE_INTEGER
24
31
  }
@@ -26,16 +33,20 @@ export const useCurrentLayout = (): string | undefined => {
26
33
  }, []);
27
34
  }, [layouts]);
28
35
  const getCurrentLayout = useCallback((articleWidth: number) => {
29
- return layoutRanges.find(l => articleWidth >= l.start && articleWidth < l.end)?.layoutId;
36
+ const range = layoutRanges.find(l => articleWidth >= l.start && articleWidth < l.end);
37
+ return range;
30
38
  }, [layoutRanges]);
31
39
  const [layoutId, setLayoutId] = useState<string | undefined>(undefined);
40
+ const [deviation, setDeviation] = useState(1);
32
41
  useEffect(() => {
33
42
  if (!articleRectObserver) return;
34
43
  return articleRectObserver.on('resize', () => {
35
44
  const articleWidth = articleRectObserver.width;
36
- setLayoutId(getCurrentLayout(articleWidth));
45
+ const { layoutId, exemplary } = getCurrentLayout(articleWidth)!;
46
+ setLayoutId(layoutId);
47
+ setDeviation(articleWidth / exemplary);
37
48
  });
38
49
  }, [articleRectObserver, getCurrentLayout]);
39
50
 
40
- return layoutId;
51
+ return { layoutId, layoutDeviation: deviation };
41
52
  };
@@ -1,4 +1,4 @@
1
- import React, { FC, PropsWithChildren, useEffect, useId, useState } from 'react';
1
+ import React, { CSSProperties, FC, PropsWithChildren, useEffect, useId, useState } from 'react';
2
2
  import JSXStyle from 'styled-jsx/style';
3
3
  import { useCurrentLayout } from '../common/useCurrentLayout';
4
4
  import { LayoutContext } from '../provider/LayoutContext';
@@ -6,23 +6,30 @@ import { LayoutContext } from '../provider/LayoutContext';
6
6
  export const ArticleWrapper: FC<PropsWithChildren<{}>> = ({ children }) => {
7
7
  const id = useId();
8
8
  const [isPageLoaded, setIsPageLoaded] = useState(false);
9
- const layoutId = useCurrentLayout();
9
+ const { layoutId, layoutDeviation } = useCurrentLayout();
10
10
 
11
11
  useEffect(() => {
12
12
  const onPageLoad = () => {
13
13
  setIsPageLoaded(true);
14
14
  };
15
- if (document.readyState === 'complete') {
16
- onPageLoad();
15
+ if (document.readyState === 'loading') {
16
+ window.addEventListener('DOMContentLoaded', onPageLoad);
17
+ return () => window.removeEventListener('DOMContentLoaded', onPageLoad);
17
18
  } else {
18
- window.addEventListener('load', onPageLoad);
19
- return () => window.removeEventListener('load', onPageLoad);
19
+ onPageLoad();
20
20
  }
21
21
  }, []);
22
+ const layoutDeviationStyle = {'--layout-deviation': layoutDeviation} as CSSProperties;
22
23
 
23
24
  return (
24
25
  <LayoutContext.Provider value={layoutId}>
25
- <div className="article-wrapper" style={{ opacity: layoutId && isPageLoaded ? 1 : 0 }}>
26
+ <div
27
+ className="article-wrapper"
28
+ style={{
29
+ opacity: layoutId && isPageLoaded ? 1 : 0,
30
+ ...layoutDeviationStyle
31
+ }}
32
+ >
26
33
  {children}
27
34
  </div>
28
35
  <JSXStyle id={id}>{`
@@ -51,6 +51,7 @@ export const Item: FC<ItemProps<TArticleItemAny>> = ({ item, sectionId}) => {
51
51
  const id = useId();
52
52
  const { layouts } = useCntrlContext();
53
53
  const layout = useLayoutContext();
54
+ const exemplary = layouts.find(l => l.id === layout)?.exemplary ?? 1;
54
55
  const [wrapperHeight, setWrapperHeight] = useState<undefined | number>(undefined);
55
56
  const { scale, scaleAnchor } = useItemScale(item, sectionId);
56
57
  const { top, left } = useItemPosition(item, sectionId);
@@ -86,11 +87,13 @@ export const Item: FC<ItemProps<TArticleItemAny>> = ({ item, sectionId}) => {
86
87
  isInitialRef.current = false;
87
88
  }, []);
88
89
 
90
+ const isRichText = isItemType(item, ArticleItemType.RichText);
91
+ const scaleIfRichText = isRichText
92
+ ? { transformOrigin: 'top left', transform: 'scale(var(--layout-deviation))' }
93
+ : {};
94
+
89
95
  const styles = {
90
- transform: `scale(${scale})`,
91
- transformOrigin: ScaleAnchorMap[scaleAnchor],
92
- width: `${sizingAxis.x === SizingType.Manual ? `${width * 100}vw` : 'max-content'}`,
93
- height: `${sizingAxis.y === SizingType.Manual ? `${height * 100}vw` : 'unset'}`,
96
+ ...scaleIfRichText,
94
97
  top: stickyTop
95
98
  };
96
99
 
@@ -104,7 +107,18 @@ export const Item: FC<ItemProps<TArticleItemAny>> = ({ item, sectionId}) => {
104
107
  className={`item-${item.id}`}
105
108
  style={isInitialRef.current ? {} : styles }
106
109
  >
107
- <ItemComponent item={item} sectionId={sectionId} onResize={handleItemResize} />
110
+ <div style={{
111
+ width: `${sizingAxis.x === SizingType.Manual
112
+ ? isRichText
113
+ ? `${width * exemplary}px`
114
+ : `${width * 100}vw`
115
+ : 'max-content'}`,
116
+ height: `${sizingAxis.y === SizingType.Manual ? `${height * 100}vw` : 'unset'}`,
117
+ transform: `scale(${scale})`,
118
+ transformOrigin: ScaleAnchorMap[scaleAnchor]
119
+ }}>
120
+ <ItemComponent item={item} sectionId={sectionId} onResize={handleItemResize} />
121
+ </div>
108
122
  </div>
109
123
  <JSXStyle id={id}>{`
110
124
  ${getLayoutStyles(layouts, layoutValues, ([area, hidden, hoverParams, sticky, sectionHeight, layoutParams]) => {
@@ -13,6 +13,6 @@ export const useRichTextItem = (item: TRichTextItem): [ReactNode[], string, TTyp
13
13
  const preset = presetId
14
14
  ? typePresets?.presets.find(p => p.id === presetId) ?? null
15
15
  : null;
16
- const [content, styles] = richTextConv.toHtml(item, layouts, !!preset);
16
+ const [content, styles] = richTextConv.toHtml(item, layouts);
17
17
  return [content, styles, preset];
18
18
  };
@@ -38,8 +38,7 @@ export const FontStyles: Record<string, Record<string, string>> = {
38
38
  export class RichTextConverter {
39
39
  toHtml(
40
40
  richText: TRichTextItem,
41
- layouts: TLayout[],
42
- hasPreset: boolean
41
+ layouts: TLayout[]
43
42
  ): [ReactNode[], string] {
44
43
  const { text, blocks = [] } = richText.commonParams;
45
44
  const root: ReactElement[] = [];
@@ -63,7 +62,7 @@ export class RichTextConverter {
63
62
  const lh = RichTextConverter.fromDraftToInline({
64
63
  name: 'LINEHEIGHT',
65
64
  value: currentLineHeight[l.id]
66
- });
65
+ }, l.exemplary);
67
66
  styleRules[l.id].push(`.rt_${richText.id}_br_${blockIndex} {${lh}}`);
68
67
  });
69
68
  continue;
@@ -91,7 +90,7 @@ export class RichTextConverter {
91
90
  text-align: ${ta};
92
91
  white-space: ${whiteSpace};
93
92
  overflow-wrap: break-word;
94
- ${!hasPreset ? 'line-height: 0;' : ''}
93
+ line-height: 0;
95
94
  }
96
95
  `);
97
96
  });
@@ -129,6 +128,7 @@ export class RichTextConverter {
129
128
  kids.push(sliceSymbols(content, offset));
130
129
  }
131
130
  for (const item of group) {
131
+ const { exemplary } = layouts.find(l => l.id === item.layout)!;
132
132
  const entitiesGroups = this.groupEntities(entities, item.styles) ?? [];
133
133
  for (const entitiesGroup of entitiesGroups) {
134
134
  if (!entitiesGroup.stylesGroup) continue;
@@ -140,7 +140,7 @@ export class RichTextConverter {
140
140
  }
141
141
  styleRules[item.layout].push(`
142
142
  .${blockClass} .s-${styleGroup.start}-${styleGroup.end} {
143
- ${styleGroup.styles.map(s => RichTextConverter.fromDraftToInline(s)).join('\n')}
143
+ ${styleGroup.styles.map(s => RichTextConverter.fromDraftToInline(s, exemplary)).join('\n')}
144
144
  }
145
145
  `);
146
146
  if (color) {
@@ -232,17 +232,17 @@ export class RichTextConverter {
232
232
  return entitiesGroups;
233
233
  }
234
234
 
235
- private static fromDraftToInline(draftStyle: Style): string {
235
+ private static fromDraftToInline(draftStyle: Style, exemplary: number): string {
236
236
  const { value, name } = draftStyle;
237
237
  const map: Record<string, Record<string, string | undefined>> = {
238
238
  'COLOR': { 'color': getResolvedValue(value, name) },
239
239
  'TYPEFACE': { 'font-family': `${value}` },
240
240
  'FONTSTYLE': value ? { ...FontStyles[value] } : {},
241
241
  'FONTWEIGHT': { 'font-weight': value },
242
- 'FONTSIZE': { 'font-size': `${parseFloat(value!) * 100}vw` },
243
- 'LINEHEIGHT': { 'line-height': `${parseFloat(value!) * 100}vw` },
244
- 'LETTERSPACING': { 'letter-spacing': `${parseFloat(value!) * 100}vw` },
245
- 'WORDSPACING': { 'word-spacing': `${parseFloat(value!) * 100}vw` },
242
+ 'FONTSIZE': { 'font-size': `${parseFloat(value!) * exemplary}px` },
243
+ 'LINEHEIGHT': { 'line-height': `${parseFloat(value!) * exemplary}px` },
244
+ 'LETTERSPACING': { 'letter-spacing': `${parseFloat(value!) * exemplary}px` },
245
+ 'WORDSPACING': { 'word-spacing': `${parseFloat(value!) * exemplary}px` },
246
246
  'TEXTTRANSFORM': value ? { 'text-transform': value as TextTransform } : { 'text-transform': TextTransform.None },
247
247
  'VERTICALALIGN': value ? { 'vertical-align': value as VerticalAlign } : { 'vertical-align': VerticalAlign.Unset },
248
248
  'TEXTDECORATION': { 'text-decoration': value }
Binary file
Binary file