@salesforcedevs/dx-components 1.3.53-alpha → 1.3.53

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 (66) hide show
  1. package/lwc.config.json +2 -0
  2. package/package.json +7 -3
  3. package/src/assets/icons/salesforcebrand-sprite/svg/symbols.svg +125 -7
  4. package/src/assets/svg/privacyicon.png +0 -0
  5. package/src/modules/dx/banner/banner.ts +1 -1
  6. package/src/modules/dx/cardBlogPost/cardBlogPost.html +1 -3
  7. package/src/modules/dx/cardBlogPost/cardBlogPost.ts +1 -3
  8. package/src/modules/dx/cardContent/cardContent.css +5 -0
  9. package/src/modules/dx/cardContent/cardContent.html +10 -6
  10. package/src/modules/dx/cardContent/cardContent.ts +22 -7
  11. package/src/modules/dx/cardExpanded/cardExpanded.css +15 -5
  12. package/src/modules/dx/cardExpanded/cardExpanded.html +9 -5
  13. package/src/modules/dx/cardExpanded/cardExpanded.ts +24 -8
  14. package/src/modules/dx/cardNews/cardNews.css +14 -0
  15. package/src/modules/dx/cardNews/cardNews.ts +2 -1
  16. package/src/modules/dx/cardTrial/cardTrial.html +2 -0
  17. package/src/modules/dx/cardTrial/cardTrial.ts +32 -1
  18. package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.css +5 -0
  19. package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.html +1 -0
  20. package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.ts +13 -0
  21. package/src/modules/dx/codeBlock/codeBlock.ts +6 -1
  22. package/src/modules/dx/codeBlock/darkTheme.css +8 -1
  23. package/src/modules/dx/codeBlock/lightTheme.css +8 -2
  24. package/src/modules/dx/dropdownOption/dropdownOption.html +2 -2
  25. package/src/modules/dx/featuredContentHeader/featuredContentHeader.css +18 -10
  26. package/src/modules/dx/featuredContentHeader/featuredContentHeader.html +109 -107
  27. package/src/modules/dx/featuredContentHeader/featuredContentHeader.ts +17 -9
  28. package/src/modules/dx/footer/footer.css +9 -0
  29. package/src/modules/dx/footer/footer.html +6 -0
  30. package/src/modules/dx/footer/footer.ts +5 -2
  31. package/src/modules/dx/footer/links.ts +11 -0
  32. package/src/modules/dx/formattedDateTime/formattedDateTime.ts +3 -3
  33. package/src/modules/dx/header/header.html +2 -2
  34. package/src/modules/dx/header/header.ts +4 -0
  35. package/src/modules/dx/headerSearch/headerSearch.html +0 -2
  36. package/src/modules/dx/headerSearch/headerSearch.ts +0 -1
  37. package/src/modules/dx/hr/hr.css +0 -3
  38. package/src/modules/dx/hr/hr.ts +7 -1
  39. package/src/modules/dx/input/input.ts +0 -2
  40. package/src/modules/dx/mainContentHeader/mainContentHeader.css +102 -0
  41. package/src/modules/dx/mainContentHeader/mainContentHeader.html +23 -0
  42. package/src/modules/dx/mainContentHeader/mainContentHeader.ts +35 -0
  43. package/src/modules/dx/scrollManager/scrollManager.html +1 -0
  44. package/src/modules/dx/scrollManager/scrollManager.ts +110 -0
  45. package/src/modules/dx/searchResults/searchResults.css +2 -2
  46. package/src/modules/dx/section/section.css +9 -0
  47. package/src/modules/dx/section/section.html +10 -0
  48. package/src/modules/dx/section/section.ts +5 -0
  49. package/src/modules/dx/sidebar/sidebar.css +4 -0
  50. package/src/modules/dx/sidebar/sidebar.html +1 -0
  51. package/src/modules/dx/sidebar/sidebar.ts +8 -0
  52. package/src/modules/dx/sidebarOld/sidebarOld.ts +2 -0
  53. package/src/modules/dx/sidebarSearch/sidebarSearch.html +0 -1
  54. package/src/modules/dx/sidebarSearch/sidebarSearch.ts +5 -1
  55. package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.css +2 -2
  56. package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.ts +3 -2
  57. package/src/modules/dx/toc/toc.ts +13 -0
  58. package/src/modules/dx/treeItem/treeItem.html +3 -2
  59. package/src/modules/dx/treeItem/treeItem.ts +18 -8
  60. package/src/modules/dx/typeBadge/typeBadge.ts +2 -2
  61. package/src/modules/dxBaseElements/headerBase/headerBase.ts +18 -8
  62. package/src/modules/dxHelpers/card/card.css +4 -0
  63. package/src/modules/dxHelpers/table/table.css +1 -10
  64. package/src/modules/dxUtils/dates/dates.ts +22 -1
  65. package/src/modules/dxUtils/normalizers/normalizers.ts +1 -3
  66. package/src/modules/dxUtils/prismjs/prismjs.ts +132 -14
@@ -1,7 +1,6 @@
1
1
  import { LightningElement, api } from "lwc";
2
2
  import { InternalTreeNode } from "typings/custom";
3
3
  import { track } from "dxUtils/analytics";
4
- import { SidebarGtmAction } from "typings/custom";
5
4
  import { isInViewport } from "dxUtils/browser";
6
5
 
7
6
  const DEFAULT_TARGET = "_self";
@@ -9,6 +8,7 @@ const DEFAULT_TARGET = "_self";
9
8
  export default class TreeItem extends LightningElement {
10
9
  @api selectedKey?: string;
11
10
  @api isRoot: boolean = false;
11
+ @api parentName?: string = "";
12
12
 
13
13
  @api
14
14
  public get treeNode() {
@@ -94,20 +94,28 @@ export default class TreeItem extends LightningElement {
94
94
  private onIconClick(event: CustomEvent): void {
95
95
  const isSelectAction = false;
96
96
  this.doExpand(isSelectAction);
97
- this.sendGtm(event, this.isExpanded ? "expand" : "collapse");
97
+ this.sendGtm(event);
98
98
  }
99
99
 
100
- private onLinkClick(event: Event): void {
101
- if (!(this._treeNode.link && this._treeNode.link.href)) {
100
+ private preventDefaultLinkBehavior(event: Event) {
101
+ // prevent page refresh if href isn't present or link is already active
102
+ if (
103
+ !this._treeNode.link?.href ||
104
+ this._treeNode.link?.href === window.location.pathname
105
+ ) {
102
106
  event.preventDefault();
103
107
  }
108
+ }
109
+
110
+ private onLinkClick(event: Event): void {
111
+ this.preventDefaultLinkBehavior(event);
104
112
 
105
113
  if (this.isParent) {
106
114
  const isSelectAction = true;
107
115
  this.doExpand(isSelectAction);
108
116
  }
109
117
 
110
- this.sendGtm(event, "click");
118
+ this.sendGtm(event);
111
119
  this.fireEvent("tileselected", { name: this._treeNode.name });
112
120
  }
113
121
 
@@ -137,10 +145,12 @@ export default class TreeItem extends LightningElement {
137
145
  this.isExpanded = value;
138
146
  }
139
147
 
140
- private sendGtm(event: Event, sideNavAction: SidebarGtmAction) {
141
- track(event.currentTarget!, "custEv_leftNavLinkClick", {
148
+ private sendGtm(event: Event) {
149
+ track(event.currentTarget!, "custEv_leftNavClick", {
150
+ navType: "left nav bar",
142
151
  clickText: this._treeNode.label,
143
- sideNavAction
152
+ clickUrl: this.href,
153
+ navItem: this.parentName
144
154
  });
145
155
  }
146
156
  }
@@ -149,8 +149,8 @@ export default class TypeBadge extends LightningElement {
149
149
  private get style(): string {
150
150
  if (this.dark) {
151
151
  return buildStyleColorVariables({
152
- background: `--dx-g-${this.variantColorScope}-${this.variant}-color`,
153
- color: `--dx-g-brand-default-color-background`
152
+ background: "--dx-g-purple-vibrant-40",
153
+ color: "--dx-g-brand-default-color-background"
154
154
  });
155
155
  }
156
156
  if (this.variantColorScope) {
@@ -1,7 +1,7 @@
1
1
  import { LightningElement, api } from "lwc";
2
2
  import cx from "classnames";
3
3
  import { Brand, OptionWithLink, OptionWithNested } from "typings/custom";
4
- import { toJson } from "dxUtils/normalizers";
4
+ import { toJson, normalizeBoolean } from "dxUtils/normalizers";
5
5
  import { track } from "dxUtils/analytics";
6
6
 
7
7
  const VALID_BRANDS = [
@@ -21,11 +21,11 @@ const VALID_BRANDS = [
21
21
  ];
22
22
 
23
23
  export const ANALYTICS_INFO = {
24
- clickText: "Sign Up",
25
- itemTitle: "Sign Up Header Button",
24
+ click_text: "Sign Up",
25
+ element_title: "Sign Up Header Button",
26
26
  elementType: "button",
27
- destinationType: "internal",
28
- ctaClick: true
27
+ element_type: "internal",
28
+ content_category: "cta"
29
29
  };
30
30
 
31
31
  export abstract class HeaderBase extends LightningElement {
@@ -42,7 +42,7 @@ export abstract class HeaderBase extends LightningElement {
42
42
  @api title: string = "Salesforce";
43
43
  @api version?: string | null = null;
44
44
  @api bannerMarkup =
45
- 'Thank you for visiting the Salesforce Developers website! <span><a href="https://forms.gle/oWYTbH9RvGyt9uxx7" target="blank">We value your feedback</a></span>';
45
+ '<span><a href="https://forms.gle/oWYTbH9RvGyt9uxx7" target="blank">Share your feedback</a>about our new site.</span>';
46
46
 
47
47
  @api
48
48
  get navItems() {
@@ -61,6 +61,15 @@ export abstract class HeaderBase extends LightningElement {
61
61
  this._versions = toJson(value);
62
62
  }
63
63
 
64
+ @api
65
+ get showBanner() {
66
+ return this._showBanner && this.bannerMarkup;
67
+ }
68
+
69
+ set showBanner(value) {
70
+ this._showBanner = normalizeBoolean(value);
71
+ }
72
+
64
73
  private _navItems!: OptionWithNested[];
65
74
  private _versions!: OptionWithLink[];
66
75
  private matchMedia!: MediaQueryList;
@@ -69,6 +78,7 @@ export abstract class HeaderBase extends LightningElement {
69
78
  private showMobileNavMenu: boolean = false;
70
79
  private showNavScrollShadow: boolean = false;
71
80
  protected isSearchOpen: boolean = false;
81
+ private _showBanner?: boolean = false;
72
82
 
73
83
  get url() {
74
84
  return this.href ? new URL(this.href!) : window.location;
@@ -191,9 +201,9 @@ export abstract class HeaderBase extends LightningElement {
191
201
  };
192
202
 
193
203
  private handleSignUpClick(e: PointerEvent) {
194
- track(e.currentTarget!, "custEv_signupStart", {
204
+ track(e.currentTarget!, "custEv_browseTrialsClick", {
195
205
  ...ANALYTICS_INFO,
196
- clickUrl: this.signupLink
206
+ click_url: this.signupLink
197
207
  });
198
208
  }
199
209
 
@@ -12,6 +12,10 @@
12
12
  --dx-c-body-max-lines: 6;
13
13
  }
14
14
 
15
+ span {
16
+ word-break: break-word;
17
+ }
18
+
15
19
  .dx-card-base {
16
20
  height: 100%;
17
21
  }
@@ -28,17 +28,13 @@ th {
28
28
  border-bottom: 3px solid var(--dx-g-indigo-vibrant-30);
29
29
  }
30
30
 
31
- td {
32
- vertical-align: top;
33
- }
34
-
35
31
  tr th,
36
32
  tr td {
37
33
  text-align: left;
34
+ vertical-align: top;
38
35
  }
39
36
 
40
37
  table tbody tr td {
41
- vertical-align: middle;
42
38
  border-bottom: 1px solid var(--dx-g-gray-90);
43
39
  }
44
40
 
@@ -96,11 +92,6 @@ td :is(.li, p, .p, dd) {
96
92
  font-size: var(--table-cell-text-base);
97
93
  }
98
94
 
99
- td :is(ul) {
100
- font-size: var(--table-cell-text-base) !important;
101
- margin-left: 0 !important;
102
- }
103
-
104
95
  td doc-content-callout :is(.li, p, .p, dd) {
105
96
  /* Override/reset for callouts -- see https://gus.lightning.force.com/lightning/r/ADM_Work__c/a07EE0000081MGTYA2/view */
106
97
  font-size: var(--dx-g-text-base);
@@ -1,3 +1,5 @@
1
+ import { DateTime } from "luxon";
2
+
1
3
  const MONTHS = {
2
4
  January: 0,
3
5
  February: 1,
@@ -20,7 +22,6 @@ const MONTHS = {
20
22
  "January 2022": [ *array of dates for this month* ],
21
23
  }
22
24
  */
23
-
24
25
  export function sortSplittedPostsByMonth(postsByMonth: any) {
25
26
  const sortedPostsByMonth: { [key: string]: Array<{}> } = {};
26
27
 
@@ -58,3 +59,23 @@ export function sortSplittedPostsByMonth(postsByMonth: any) {
58
59
 
59
60
  return sortedPostsByMonth;
60
61
  }
62
+
63
+ export function convertForDaylightSavings(
64
+ date: string,
65
+ zone: string = "local"
66
+ ) {
67
+ if (!hasDST(zone)) {
68
+ return DateTime.fromISO(date).setZone(zone);
69
+ }
70
+
71
+ return DateTime.fromISO(date).setZone(zone).isInDST
72
+ ? DateTime.fromISO(date).setZone(zone)
73
+ : DateTime.fromISO(date).setZone(zone).plus({ hour: 1 });
74
+ }
75
+
76
+ export function hasDST(zone: string = "local") {
77
+ return (
78
+ DateTime.fromISO("2022-01-01").setZone(zone).isInDST !==
79
+ DateTime.fromISO("2022-06-01").setZone(zone).isInDST
80
+ );
81
+ }
@@ -58,9 +58,7 @@ export const normalizePost = ({
58
58
  body: description,
59
59
  datetime: date,
60
60
  href: url,
61
- authorHref: get(authors, "[0].link"),
62
- authorImgSrc: get(authors, "[0].avatar_urls.48"),
63
- authorName: get(authors, "[0].name"),
61
+ authors: authors,
64
62
  imgAlt: "Blogpost image",
65
63
  imgSrc: featuredImage,
66
64
  id,
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable */
2
+ /* prettier-ignore */
2
3
  var commonjsGlobal =
3
4
  typeof globalThis !== "undefined"
4
5
  ? globalThis
@@ -32,11 +33,10 @@ function commonjsRequire() {
32
33
  "Dynamic requires are not currently supported by @rollup/plugin-commonjs"
33
34
  );
34
35
  }
35
- /* eslint-disable */
36
36
  //Start autogenerated code
37
37
  var prism = createCommonjsModule(function (module) {
38
- /* PrismJS 1.28.0
39
- https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+apex+aspnet+bash+basic+c+csharp+cpp+css-extras+java+javadoc+javadoclike+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+kotlin+markdown+markup-templating+php+phpdoc+php-extras+plsql+python+regex+sql+swift+typescript+typoscript+uri+vbnet+yaml&plugins=line-numbers+unescaped-markup+match-braces */
38
+ /* PrismJS 1.29.0
39
+ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+apex+aspnet+bash+basic+c+csharp+cpp+css-extras+java+javadoc+javadoclike+jsdoc+js-extras+json+json5+jsonp+jsstacktrace+kotlin+markdown+markup-templating+php+phpdoc+php-extras+plsql+python+jsx+regex+sql+swift+typescript+typoscript+uri+vbnet+yaml&plugins=line-numbers+unescaped-markup+match-braces */
40
40
  var _self =
41
41
  "undefined" != typeof window
42
42
  ? window
@@ -1332,14 +1332,14 @@ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javasc
1332
1332
  !(function (e) {
1333
1333
  var t =
1334
1334
  "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",
1335
- n = {
1335
+ a = {
1336
1336
  pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
1337
1337
  lookbehind: !0,
1338
1338
  alias: "punctuation",
1339
1339
  inside: null
1340
1340
  },
1341
- a = {
1342
- bash: n,
1341
+ n = {
1342
+ bash: a,
1343
1343
  environment: { pattern: RegExp("\\$" + t), alias: "constant" },
1344
1344
  variable: [
1345
1345
  {
@@ -1419,31 +1419,31 @@ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javasc
1419
1419
  pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,
1420
1420
  lookbehind: !0,
1421
1421
  greedy: !0,
1422
- inside: a
1422
+ inside: n
1423
1423
  },
1424
1424
  {
1425
1425
  pattern:
1426
1426
  /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,
1427
1427
  lookbehind: !0,
1428
1428
  greedy: !0,
1429
- inside: { bash: n }
1429
+ inside: { bash: a }
1430
1430
  },
1431
1431
  {
1432
1432
  pattern:
1433
1433
  /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,
1434
1434
  lookbehind: !0,
1435
1435
  greedy: !0,
1436
- inside: a
1436
+ inside: n
1437
1437
  },
1438
1438
  { pattern: /(^|[^$\\])'[^']*'/, lookbehind: !0, greedy: !0 },
1439
1439
  {
1440
1440
  pattern: /\$'(?:[^'\\]|\\[\s\S])*'/,
1441
1441
  greedy: !0,
1442
- inside: { entity: a.entity }
1442
+ inside: { entity: n.entity }
1443
1443
  }
1444
1444
  ],
1445
1445
  environment: { pattern: RegExp("\\$?" + t), alias: "constant" },
1446
- variable: a.variable,
1446
+ variable: n.variable,
1447
1447
  function: {
1448
1448
  pattern:
1449
1449
  /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,
@@ -1478,7 +1478,7 @@ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javasc
1478
1478
  lookbehind: !0
1479
1479
  }
1480
1480
  }),
1481
- (n.inside = e.languages.bash);
1481
+ (a.inside = e.languages.bash);
1482
1482
  for (
1483
1483
  var s = [
1484
1484
  "comment",
@@ -1497,13 +1497,14 @@ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javasc
1497
1497
  "punctuation",
1498
1498
  "number"
1499
1499
  ],
1500
- o = a.variable[1].inside,
1500
+ o = n.variable[1].inside,
1501
1501
  i = 0;
1502
1502
  i < s.length;
1503
1503
  i++
1504
1504
  )
1505
1505
  o[s[i]] = e.languages.bash[s[i]];
1506
- e.languages.shell = e.languages.bash;
1506
+ (e.languages.sh = e.languages.bash),
1507
+ (e.languages.shell = e.languages.bash);
1507
1508
  })(Prism);
1508
1509
  Prism.languages.basic = {
1509
1510
  comment: { pattern: /(?:!|REM\b).+/i, inside: { keyword: /^REM/i } },
@@ -3205,6 +3206,123 @@ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javasc
3205
3206
  "string-interpolation"
3206
3207
  ].inside.interpolation.inside.rest = Prism.languages.python),
3207
3208
  (Prism.languages.py = Prism.languages.python);
3209
+ !(function (t) {
3210
+ var n = t.util.clone(t.languages.javascript),
3211
+ e = "(?:\\{<S>*\\.{3}(?:[^{}]|<BRACES>)*\\})";
3212
+ function a(t, n) {
3213
+ return (
3214
+ (t = t
3215
+ .replace(/<S>/g, function () {
3216
+ return "(?:\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))\\*/)";
3217
+ })
3218
+ .replace(/<BRACES>/g, function () {
3219
+ return "(?:\\{(?:\\{(?:\\{[^{}]*\\}|[^{}])*\\}|[^{}])*\\})";
3220
+ })
3221
+ .replace(/<SPREAD>/g, function () {
3222
+ return e;
3223
+ })),
3224
+ RegExp(t, n)
3225
+ );
3226
+ }
3227
+ (e = a(e).source),
3228
+ (t.languages.jsx = t.languages.extend("markup", n)),
3229
+ (t.languages.jsx.tag.pattern = a(
3230
+ "</?(?:[\\w.:-]+(?:<S>+(?:[\\w.:$-]+(?:=(?:\"(?:\\\\[^]|[^\\\\\"])*\"|'(?:\\\\[^]|[^\\\\'])*'|[^\\s{'\"/>=]+|<BRACES>))?|<SPREAD>))*<S>*/?)?>"
3231
+ )),
3232
+ (t.languages.jsx.tag.inside.tag.pattern = /^<\/?[^\s>\/]*/),
3233
+ (t.languages.jsx.tag.inside["attr-value"].pattern =
3234
+ /=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/),
3235
+ (t.languages.jsx.tag.inside.tag.inside["class-name"] =
3236
+ /^[A-Z]\w*(?:\.[A-Z]\w*)*$/),
3237
+ (t.languages.jsx.tag.inside.comment = n.comment),
3238
+ t.languages.insertBefore(
3239
+ "inside",
3240
+ "attr-name",
3241
+ { spread: { pattern: a("<SPREAD>"), inside: t.languages.jsx } },
3242
+ t.languages.jsx.tag
3243
+ ),
3244
+ t.languages.insertBefore(
3245
+ "inside",
3246
+ "special-attr",
3247
+ {
3248
+ script: {
3249
+ pattern: a("=<BRACES>"),
3250
+ alias: "language-javascript",
3251
+ inside: {
3252
+ "script-punctuation": {
3253
+ pattern: /^=(?=\{)/,
3254
+ alias: "punctuation"
3255
+ },
3256
+ rest: t.languages.jsx
3257
+ }
3258
+ }
3259
+ },
3260
+ t.languages.jsx.tag
3261
+ );
3262
+ var s = function (t) {
3263
+ return t
3264
+ ? "string" == typeof t
3265
+ ? t
3266
+ : "string" == typeof t.content
3267
+ ? t.content
3268
+ : t.content.map(s).join("")
3269
+ : "";
3270
+ },
3271
+ g = function (n) {
3272
+ for (var e = [], a = 0; a < n.length; a++) {
3273
+ var o = n[a],
3274
+ i = !1;
3275
+ if (
3276
+ ("string" != typeof o &&
3277
+ ("tag" === o.type &&
3278
+ o.content[0] &&
3279
+ "tag" === o.content[0].type
3280
+ ? "</" === o.content[0].content[0].content
3281
+ ? e.length > 0 &&
3282
+ e[e.length - 1].tagName ===
3283
+ s(o.content[0].content[1]) &&
3284
+ e.pop()
3285
+ : "/>" ===
3286
+ o.content[o.content.length - 1]
3287
+ .content ||
3288
+ e.push({
3289
+ tagName: s(o.content[0].content[1]),
3290
+ openedBraces: 0
3291
+ })
3292
+ : e.length > 0 &&
3293
+ "punctuation" === o.type &&
3294
+ "{" === o.content
3295
+ ? e[e.length - 1].openedBraces++
3296
+ : e.length > 0 &&
3297
+ e[e.length - 1].openedBraces > 0 &&
3298
+ "punctuation" === o.type &&
3299
+ "}" === o.content
3300
+ ? e[e.length - 1].openedBraces--
3301
+ : (i = !0)),
3302
+ (i || "string" == typeof o) &&
3303
+ e.length > 0 &&
3304
+ 0 === e[e.length - 1].openedBraces)
3305
+ ) {
3306
+ var r = s(o);
3307
+ a < n.length - 1 &&
3308
+ ("string" == typeof n[a + 1] ||
3309
+ "plain-text" === n[a + 1].type) &&
3310
+ ((r += s(n[a + 1])), n.splice(a + 1, 1)),
3311
+ a > 0 &&
3312
+ ("string" == typeof n[a - 1] ||
3313
+ "plain-text" === n[a - 1].type) &&
3314
+ ((r = s(n[a - 1]) + r),
3315
+ n.splice(a - 1, 1),
3316
+ a--),
3317
+ (n[a] = new t.Token("plain-text", r, null, r));
3318
+ }
3319
+ o.content && "string" != typeof o.content && g(o.content);
3320
+ }
3321
+ };
3322
+ t.hooks.add("after-tokenize", function (t) {
3323
+ ("jsx" !== t.language && "tsx" !== t.language) || g(t.tokens);
3324
+ });
3325
+ })(Prism);
3208
3326
  !(function (a) {
3209
3327
  var e = { pattern: /\\[\\(){}[\]^$+*?|.]/, alias: "escape" },
3210
3328
  n =