@salesforcedevs/docs-components 1.2.22-alpha → 1.3.4-alpha

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 (73) hide show
  1. package/lwc.config.json +10 -2
  2. package/package.json +12 -12
  3. package/src/modules/doc/{amfReference/utils.ts → amfModelParser/amfModelParser.ts} +10 -5
  4. package/src/modules/doc/amfReference/amfReference.css +23 -3
  5. package/src/modules/doc/amfReference/amfReference.html +34 -21
  6. package/src/modules/doc/amfReference/amfReference.ts +225 -92
  7. package/src/modules/doc/amfReference/types.ts +3 -11
  8. package/src/modules/doc/amfTopic/amfTopic.css +20 -0
  9. package/src/modules/doc/amfTopic/amfTopic.ts +35 -18
  10. package/src/modules/doc/amfTopic/types.ts +15 -13
  11. package/src/modules/doc/amfTopic/utils.ts +12 -6
  12. package/src/modules/doc/breadcrumbItem/breadcrumbItem.ts +17 -10
  13. package/src/modules/doc/breadcrumbs/breadcrumbs.html +7 -9
  14. package/src/modules/doc/breadcrumbs/breadcrumbs.ts +30 -34
  15. package/src/modules/doc/componentPlayground/componentPlayground.css +22 -0
  16. package/src/modules/doc/componentPlayground/componentPlayground.html +15 -0
  17. package/src/modules/doc/componentPlayground/componentPlayground.ts +20 -0
  18. package/src/modules/doc/content/content.css +70 -76
  19. package/src/modules/doc/content/content.ts +18 -14
  20. package/src/modules/doc/contentCallout/contentCallout.css +12 -1
  21. package/src/modules/doc/contentCallout/contentCallout.html +11 -4
  22. package/src/modules/doc/contentCallout/contentCallout.ts +8 -1
  23. package/src/modules/doc/contentLayout/contentLayout.css +1 -98
  24. package/src/modules/doc/contentLayout/contentLayout.html +25 -11
  25. package/src/modules/doc/contentLayout/contentLayout.ts +296 -89
  26. package/src/modules/doc/doDont/doDont.css +47 -0
  27. package/src/modules/doc/doDont/doDont.html +27 -0
  28. package/src/modules/doc/doDont/doDont.ts +17 -0
  29. package/src/modules/doc/header/header.css +65 -36
  30. package/src/modules/doc/header/header.html +40 -139
  31. package/src/modules/doc/header/header.ts +32 -77
  32. package/src/modules/doc/heading/heading.css +16 -37
  33. package/src/modules/doc/heading/heading.html +4 -4
  34. package/src/modules/doc/heading/heading.ts +12 -10
  35. package/src/modules/doc/headingAnchor/headingAnchor.css +2 -2
  36. package/src/modules/doc/headingAnchor/headingAnchor.ts +2 -2
  37. package/src/modules/doc/headingContent/headingContent.css +1 -1
  38. package/src/modules/doc/headingContent/headingContent.html +2 -2
  39. package/src/modules/doc/headingContent/headingContent.ts +2 -2
  40. package/src/modules/doc/lwcContentLayout/lwcContentLayout.css +1 -0
  41. package/src/modules/doc/lwcContentLayout/lwcContentLayout.html +64 -0
  42. package/src/modules/doc/lwcContentLayout/lwcContentLayout.ts +168 -0
  43. package/src/modules/doc/overview/overview.css +40 -0
  44. package/src/modules/doc/overview/overview.html +34 -0
  45. package/src/modules/doc/overview/overview.ts +12 -0
  46. package/src/modules/doc/phase/phase.css +18 -3
  47. package/src/modules/doc/phase/phase.html +12 -2
  48. package/src/modules/doc/phase/phase.ts +44 -8
  49. package/src/modules/doc/specificationContent/specificationContent.css +31 -0
  50. package/src/modules/doc/specificationContent/specificationContent.html +164 -0
  51. package/src/modules/doc/specificationContent/specificationContent.ts +114 -0
  52. package/src/modules/doc/sprigSurvey/sprigSurvey.html +20 -0
  53. package/src/modules/doc/sprigSurvey/sprigSurvey.scoped.css +16 -0
  54. package/src/modules/doc/sprigSurvey/sprigSurvey.ts +16 -0
  55. package/src/modules/doc/toc/toc.html +1 -3
  56. package/src/modules/doc/toc/toc.ts +1 -1
  57. package/src/modules/doc/toolbar/toolbar.ts +6 -6
  58. package/src/modules/doc/versionPicker/versionPicker.css +64 -0
  59. package/src/modules/doc/versionPicker/versionPicker.html +38 -0
  60. package/src/modules/doc/versionPicker/versionPicker.ts +65 -0
  61. package/src/modules/doc/xmlContent/types.ts +9 -3
  62. package/src/modules/doc/xmlContent/utils.ts +3 -1
  63. package/src/modules/doc/xmlContent/xmlContent.css +25 -3
  64. package/src/modules/doc/xmlContent/xmlContent.html +29 -17
  65. package/src/modules/doc/xmlContent/xmlContent.ts +186 -74
  66. package/src/modules/docHelpers/amfStyle/amfStyle.css +6 -6
  67. package/src/modules/docHelpers/contentLayoutStyle/contentLayoutStyle.css +131 -0
  68. package/src/modules/docHelpers/imgStyle/imgStyle.css +59 -0
  69. package/src/modules/docHelpers/status/status.css +1 -1
  70. package/src/modules/docUtils/{SearchSyncer/SearchSyncer.ts → searchSyncer/searchSyncer.ts} +1 -0
  71. package/src/modules/docUtils/utils/utils.ts +32 -0
  72. package/src/modules/docBaseElements/lightningElementWithState/lightningElementWithState.ts +0 -93
  73. package/src/modules/docHelpers/phaseContentLayout/phaseContentLayout.css +0 -39
@@ -6,7 +6,7 @@ export default class HeadingAnchor extends LightningElement {
6
6
  @api iconSize?: IconSize = "override";
7
7
  @api iconSprite?: IconSprite = "utility";
8
8
  @api iconSymbol?: IconSymbol;
9
- @api title: string = "";
9
+ @api header: string = "";
10
10
  @api urlText: string = "";
11
11
 
12
12
  label: string = "Copy link to clipboard";
@@ -22,7 +22,7 @@ export default class HeadingAnchor extends LightningElement {
22
22
  }, 2000);
23
23
 
24
24
  try {
25
- if (this.title && this.urlText) {
25
+ if (this.header && this.urlText) {
26
26
  const [hostUrl] = window.location.href.split("#");
27
27
  const url = `${hostUrl}#${this.urlText}`;
28
28
  await navigator.clipboard.writeText(url);
@@ -23,7 +23,7 @@ button {
23
23
  bottom: var(--doc-c-heading-anchor-button-bottom);
24
24
  left: 0;
25
25
  opacity: 0;
26
- color: rgb(11, 92, 171);
26
+ color: rgb(11 92 171);
27
27
  display: flex;
28
28
  justify-content: center;
29
29
  align-items: center;
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <template if:false={hash}>{title}</template>
2
+ <template if:false={hash}>{header}</template>
3
3
  <template if:true={hash}>
4
- <span class="title">{title}&nbsp;</span>
4
+ <span class="title">{header}&nbsp;</span>
5
5
  <dx-tooltip placement="top" label={label}>
6
6
  <span class="button-container">
7
7
  <button onclick={copy} aria-label="copy">
@@ -1,7 +1,7 @@
1
1
  import { LightningElement, api } from "lwc";
2
2
 
3
3
  export default class HeadingContent extends LightningElement {
4
- @api title: string = "";
4
+ @api header: string = "";
5
5
  @api hash: string | null = null;
6
6
 
7
7
  label: string = "Copy link to clipboard";
@@ -18,7 +18,7 @@ export default class HeadingContent extends LightningElement {
18
18
  }, 2000);
19
19
 
20
20
  try {
21
- if (this.title && this.hash) {
21
+ if (this.header && this.hash) {
22
22
  const [hostUrl] = window.location.href.split("#");
23
23
  const url = `${hostUrl}#${this.hash}`;
24
24
  await navigator.clipboard.writeText(url);
@@ -0,0 +1 @@
1
+ @import "docHelpers/contentLayoutStyle";
@@ -0,0 +1,64 @@
1
+ <template>
2
+ <div class="content">
3
+ <template lwc:if={useOldSidebar}>
4
+ <dx-sidebar-old
5
+ class="is-sticky left-nav-bar"
6
+ trees={sidebarContent}
7
+ value={sidebarValue}
8
+ header={sidebarHeader}
9
+ ontogglesidebar={onToggleSidebar}
10
+ languages={languages}
11
+ language={language}
12
+ bail-href={bailHref}
13
+ bail-label={bailLabel}
14
+ >
15
+ <slot name="sidebar-header" slot="version-picker"></slot>
16
+ </dx-sidebar-old>
17
+ </template>
18
+ <template lwc:else>
19
+ <dx-sidebar
20
+ class="is-sticky left-nav-bar"
21
+ trees={sidebarContent}
22
+ value={sidebarValue}
23
+ header={sidebarHeader}
24
+ coveo-organization-id={coveoOrganizationId}
25
+ coveo-public-access-token={coveoPublicAccessToken}
26
+ coveo-search-hub={coveoSearchHub}
27
+ coveo-advanced-query-config={coveoAdvancedQueryConfig}
28
+ ontogglesidebar={onToggleSidebar}
29
+ languages={languages}
30
+ language={language}
31
+ bail-href={bailHref}
32
+ bail-label={bailLabel}
33
+ >
34
+ <slot name="sidebar-header" slot="version-picker"></slot>
35
+ </dx-sidebar>
36
+ </template>
37
+ <div class="content-body-doc-phase-container">
38
+ <slot name="doc-phase"></slot>
39
+ <slot name="version-banner"></slot>
40
+ <div class="content-body-container">
41
+ <div class="content-body">
42
+ <doc-breadcrumbs
43
+ lwc:if={showBreadcrumbs}
44
+ breadcrumbs={breadcrumbs}
45
+ ></doc-breadcrumbs>
46
+ <slot onslotchange={onSlotChange}></slot>
47
+ <doc-sprig-survey
48
+ lwc:if={shouldDisplayFeedback}
49
+ ></doc-sprig-survey>
50
+ </div>
51
+ <div lwc:if={showToc} class="right-nav-bar is-sticky">
52
+ <dx-toc
53
+ header={tocTitle}
54
+ options={tocOptions}
55
+ value={tocValue}
56
+ ></dx-toc>
57
+ </div>
58
+ </div>
59
+ <div lwc:if={showFooter} class="footer-container">
60
+ <dx-footer variant="no-signup"></dx-footer>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </template>
@@ -0,0 +1,168 @@
1
+ import ContentLayout from "doc/contentLayout";
2
+
3
+ const TOC_HEADER_TAG = "doc-heading";
4
+ const RNB_BY_TAB = "docs-tab";
5
+ const SPECIFICATION_TAB_TITLE = "Specification";
6
+ export const OBSERVER_ATTACH_WAIT_TIME = 500;
7
+
8
+ export default class LwcContentLayout extends ContentLayout {
9
+ private rnbByTab: boolean = false;
10
+
11
+ private setRNBByTab() {
12
+ const tabPanelListItem: any = this.getTabPanelList();
13
+ this.rnbByTab = tabPanelListItem?.id === RNB_BY_TAB ? true : false;
14
+ }
15
+
16
+ get showTabBasedRNB() {
17
+ return this.rnbByTab;
18
+ }
19
+
20
+ onRNBClick = (event: CustomEvent) => {
21
+ event.stopPropagation();
22
+ const currentTab = this.getSelectedTabId();
23
+ if (currentTab === SPECIFICATION_TAB_TITLE) {
24
+ this.didScrollToSelectedHash = false;
25
+ }
26
+ };
27
+
28
+ onTabChanged = () => {
29
+ this.updateRNB();
30
+ };
31
+
32
+ private getTabPanelList() {
33
+ // eslint-disable-next-line @lwc/lwc/no-document-query
34
+ return document.querySelector("dx-tab-panel-list");
35
+ }
36
+
37
+ protected getHeadingElements() {
38
+ let headingElements = super.getHeadingElements();
39
+ if (this.showTabBasedRNB) {
40
+ const tabPanelListItem: any = this.getTabPanelList();
41
+ const tabPanels =
42
+ tabPanelListItem?.querySelectorAll("dx-tab-panel");
43
+ for (const tabPanelItem of tabPanels) {
44
+ if (tabPanelItem.active) {
45
+ // This is needed for Specification tab content
46
+ const specificationElement = tabPanelItem.querySelector(
47
+ "doc-specification-content"
48
+ );
49
+ if (specificationElement) {
50
+ headingElements =
51
+ specificationElement.shadowRoot.querySelectorAll(
52
+ TOC_HEADER_TAG
53
+ );
54
+ } else {
55
+ headingElements =
56
+ tabPanelItem.querySelectorAll(TOC_HEADER_TAG);
57
+ }
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ return headingElements;
63
+ }
64
+
65
+ private updateURL() {
66
+ const tabs = this.getAllTabs();
67
+ const selectedTabId = this.getSelectedTabId();
68
+ tabs.forEach((tab: any) => {
69
+ if (tab.getAttribute("aria-selected") === "true") {
70
+ const tabID = tab.getAttribute("aria-label");
71
+ const url = new URL(window.location.href);
72
+ if (selectedTabId !== tabID) {
73
+ url.searchParams.set("type", tabID);
74
+ url.hash = "";
75
+ window.history.pushState({}, "", url.toString());
76
+ }
77
+ }
78
+ });
79
+ }
80
+
81
+ // This event gets triggered when navigating back/forward
82
+ handlePopState = (): void => {
83
+ if (this.showTabBasedRNB) {
84
+ this.restoreTabSelection();
85
+ }
86
+ };
87
+
88
+ connectedCallback(): void {
89
+ super.connectedCallback();
90
+ window.addEventListener("popstate", this.handlePopState);
91
+ }
92
+
93
+ private getSelectedTabId() {
94
+ const urlParams = new URLSearchParams(window.location.search);
95
+ const selectedTabId = urlParams.get("type");
96
+ return selectedTabId;
97
+ }
98
+
99
+ private restoreTabSelection() {
100
+ requestAnimationFrame(() => {
101
+ const selectedTabId = this.getSelectedTabId();
102
+ if (selectedTabId) {
103
+ this.selectTabById(selectedTabId);
104
+ }
105
+ });
106
+ }
107
+
108
+ private getAllTabs(): any[] {
109
+ const tabPanelListItem: any = this.getTabPanelList();
110
+ if (tabPanelListItem?.shadowRoot) {
111
+ return Array.from(
112
+ tabPanelListItem.shadowRoot.querySelectorAll(
113
+ "dx-tab-panel-item"
114
+ )
115
+ ).map((tabPanelItem: any) =>
116
+ tabPanelItem.shadowRoot.querySelector("button")
117
+ );
118
+ }
119
+ return [];
120
+ }
121
+
122
+ private selectTabById(tabId: string) {
123
+ const tabs = this.getAllTabs();
124
+ tabs.forEach((tab: any) => {
125
+ if (tab.getAttribute("aria-label") === tabId) {
126
+ tab.click();
127
+ }
128
+ });
129
+ }
130
+
131
+ postRenderedCallback(): void {
132
+ this.setRNBByTab();
133
+ if (this.showTabBasedRNB) {
134
+ window.addEventListener("tabchanged", this.onTabChanged);
135
+ window.addEventListener(
136
+ "specificationdatarendered",
137
+ this.onTabChanged
138
+ );
139
+ window.addEventListener("selectedcontent", (event) =>
140
+ this.onRNBClick(event as CustomEvent)
141
+ );
142
+ this.restoreTabSelection();
143
+ }
144
+ }
145
+
146
+ disconnectedCallback(): void {
147
+ super.disconnectedCallback();
148
+ if (this.showTabBasedRNB) {
149
+ window.removeEventListener("tabchanged", this.onTabChanged);
150
+ window.removeEventListener(
151
+ "specificationdatarendered",
152
+ this.onTabChanged
153
+ );
154
+ window.removeEventListener("selectedcontent", (event) =>
155
+ this.onRNBClick(event as CustomEvent)
156
+ );
157
+ window.removeEventListener("popstate", this.handlePopState);
158
+ }
159
+ }
160
+
161
+ updateHeadingForRNB(): void {
162
+ // We only need to update URL in case of /docs and ignore if tabs are used anywhere else in DSC
163
+ if (this.showTabBasedRNB) {
164
+ this.updateURL();
165
+ }
166
+ super.updateHeadingForRNB();
167
+ }
168
+ }
@@ -0,0 +1,40 @@
1
+ doc-phase {
2
+ --doc-c-phase-top: calc(
3
+ var(--dx-g-global-header-height) + var(--dx-g-doc-header-height)
4
+ );
5
+ }
6
+
7
+ dx-section {
8
+ --dx-c-section-padding-top: 0;
9
+ --dx-c-section-padding-bottom: var(--dx-g-spacing-2xl);
10
+ }
11
+
12
+ dx-section::part(content) {
13
+ max-width: 1280px;
14
+ margin: auto;
15
+ }
16
+
17
+ dx-group-text:first-of-type {
18
+ margin-top: var(--dx-g-spacing-2xl);
19
+ }
20
+
21
+ dx-group-text.features {
22
+ margin-top: var(--dx-g-spacing-xl);
23
+ margin-bottom: var(--dx-g-spacing-xl);
24
+ }
25
+
26
+ .content {
27
+ padding-right: var(--dx-g-spacing-xl);
28
+ }
29
+
30
+ @media (max-width: 1024px) {
31
+ .content {
32
+ padding-right: 0;
33
+ }
34
+ }
35
+
36
+ @media (max-width: 800px) {
37
+ dx-group-text.description {
38
+ margin-top: var(--dx-g-spacing-lg);
39
+ }
40
+ }
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <div class="container">
3
+ <doc-phase
4
+ if:true={docPhaseInfo}
5
+ doc-phase-info={docPhaseInfo}
6
+ ></doc-phase>
7
+
8
+ <dx-section>
9
+ <dx-grid columns="two-slim-right">
10
+ <div class="content">
11
+ <dx-group-text
12
+ class="description"
13
+ header={header}
14
+ body={description}
15
+ size="large"
16
+ title-aria-level="1"
17
+ primary-link={primaryLink}
18
+ secondary-link={secondaryLink}
19
+ ></dx-group-text>
20
+ </div>
21
+ <div>
22
+ <dx-group-text
23
+ header={featuresListTitle}
24
+ size="medium"
25
+ class="features"
26
+ ></dx-group-text>
27
+ <dx-features-list
28
+ options={featuresListOptions}
29
+ ></dx-features-list>
30
+ </div>
31
+ </dx-grid>
32
+ </dx-section>
33
+ </div>
34
+ </template>
@@ -0,0 +1,12 @@
1
+ import { LightningElement, api } from "lwc";
2
+ import { DocPhaseInfo, FeatureItem, Link } from "typings/custom";
3
+
4
+ export default class Overview extends LightningElement {
5
+ @api docPhaseInfo!: DocPhaseInfo;
6
+ @api header!: string;
7
+ @api description!: string;
8
+ @api primaryLink!: Link;
9
+ @api secondaryLink!: Link;
10
+ @api featuresListTitle!: string;
11
+ @api featuresListOptions!: FeatureItem[];
12
+ }
@@ -2,25 +2,39 @@
2
2
  @import "dxHelpers/text";
3
3
  @import "docHelpers/status";
4
4
 
5
+ :host {
6
+ --doc-c-phase-top: 0;
7
+ --doc-c-phase-container-align-items: flex-start;
8
+
9
+ position: sticky;
10
+ top: var(--doc-c-phase-top);
11
+
12
+ /* NOTE: If you are changing z-index value here, ensure it's less than z-index of dx-sidebar in contentLayout.css */
13
+ z-index: var(--dx-g-z-index-100);
14
+ }
15
+
5
16
  .doc-phase-container {
6
17
  display: flex;
7
18
  flex-direction: column;
8
- padding-left: var(--dx-g-spacing-3xl);
9
- padding-right: var(--dx-g-spacing-3xl);
19
+ align-items: var(--doc-c-phase-container-align-items);
20
+ padding-left: var(--dx-g-global-header-padding-horizontal);
21
+ padding-right: var(--dx-g-global-header-padding-horizontal);
10
22
  width: 100%;
23
+ border: none;
11
24
  }
12
25
 
13
26
  .doc-phase-title-container {
14
27
  display: flex;
15
28
  flex-direction: row;
16
29
  align-items: center;
30
+ width: 100%;
17
31
  }
18
32
 
19
33
  dx-button {
20
34
  margin-left: auto;
21
35
  }
22
36
 
23
- /*
37
+ /*
24
38
  NOTE: Here we are assuming that indicator height won't go beyond 1000px.
25
39
 
26
40
  It's one of the suggested way to achieve the expand/collapse animation
@@ -31,6 +45,7 @@ dx-button {
31
45
  */
32
46
 
33
47
  .doc-phase-body {
48
+ display: block;
34
49
  max-height: 1000px;
35
50
  overflow: hidden;
36
51
  padding-top: var(--dx-g-spacing-smd);
@@ -3,7 +3,7 @@
3
3
  <div class="doc-phase-title-container">
4
4
  <dx-icon
5
5
  class="doc-status-icon doc-phase-icon"
6
- symbol="recipe"
6
+ symbol={iconName}
7
7
  size="large"
8
8
  color="status-icon-color"
9
9
  ></dx-icon>
@@ -11,8 +11,18 @@
11
11
  {docPhaseTitle}
12
12
  </p>
13
13
  <dx-button
14
+ lwc:if={dismissible}
15
+ aria-label="Dismiss"
16
+ icon-color="status-icon-color"
17
+ icon-size="large"
18
+ icon-symbol="close"
19
+ variant="icon-only"
20
+ onclick={onDismiss}
21
+ ></dx-button>
22
+ <dx-button
23
+ lwc:else
14
24
  variant="inline"
15
- onclick={onButtonClick}
25
+ onclick={onShowHide}
16
26
  aria-label={hideBodyText}
17
27
  >
18
28
  {hideBodyText}
@@ -2,16 +2,12 @@ import { LightningElement, api } from "lwc";
2
2
  import cx from "classnames";
3
3
 
4
4
  import { DocPhaseInfo } from "typings/custom";
5
- import { toJson } from "dxUtils/normalizers";
5
+ import { toJson, normalizeBoolean } from "dxUtils/normalizers";
6
6
 
7
7
  export default class Phase extends LightningElement {
8
8
  _docPhaseInfo: DocPhaseInfo | null = null;
9
-
10
- isBodyHidden = false;
11
-
12
- get docPhaseTitle() {
13
- return this.docPhaseInfo?.title;
14
- }
9
+ _dismissible = false;
10
+ _iconName = "recipe";
15
11
 
16
12
  @api
17
13
  get docPhaseInfo(): DocPhaseInfo | null {
@@ -22,6 +18,34 @@ export default class Phase extends LightningElement {
22
18
  this._docPhaseInfo = toJson(value);
23
19
  }
24
20
 
21
+ @api
22
+ get dismissible(): boolean {
23
+ return this._dismissible;
24
+ }
25
+
26
+ set dismissible(value) {
27
+ if (value) {
28
+ this._dismissible = normalizeBoolean(value);
29
+ }
30
+ }
31
+
32
+ @api
33
+ get iconName(): string {
34
+ return this._iconName;
35
+ }
36
+
37
+ set iconName(value) {
38
+ if (value) {
39
+ this._iconName = value;
40
+ }
41
+ }
42
+
43
+ isBodyHidden = false;
44
+
45
+ get docPhaseTitle() {
46
+ return this.docPhaseInfo?.title;
47
+ }
48
+
25
49
  get hideBodyText() {
26
50
  return this.isBodyHidden ? "Show" : "Hide";
27
51
  }
@@ -51,7 +75,19 @@ export default class Phase extends LightningElement {
51
75
  }
52
76
  }
53
77
 
54
- onButtonClick() {
78
+ onShowHide() {
55
79
  this.isBodyHidden = !this.isBodyHidden;
56
80
  }
81
+
82
+ onDismiss() {
83
+ this.dispatchEvent(
84
+ new CustomEvent("dismissphase", {
85
+ detail: {
86
+ docPhaseInfo: this.docPhaseInfo
87
+ },
88
+ composed: true,
89
+ bubbles: true
90
+ })
91
+ );
92
+ }
57
93
  }
@@ -0,0 +1,31 @@
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
+ @import "dxHelpers/table";
4
+
5
+ .code {
6
+ color: #181818;
7
+ font-family: Courier, var(--dx-g-font-mono);
8
+ font-size: var(--dx-g-text-sm);
9
+ line-height: 150%;
10
+ background-color: #f4f4f4;
11
+ }
12
+
13
+ table {
14
+ width: 100%;
15
+ }
16
+
17
+ .specification-properties table {
18
+ display: table;
19
+ }
20
+
21
+ .left-border {
22
+ border-left: 1px solid var(--dx-g-gray-90);
23
+ }
24
+
25
+ .icon-cell {
26
+ text-align: center;
27
+ }
28
+
29
+ .icon {
30
+ display: inline-block;
31
+ }