@node-core/ui-components 0.0.1 → 1.0.1-1b9af3ec9e0268bfc734b2489cbc584fa3edf026

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 (134) hide show
  1. package/Common/AlertBox/index.js +5 -0
  2. package/Common/AlertBox/index.module.css +77 -0
  3. package/Common/AvatarGroup/Avatar/index.js +11 -0
  4. package/Common/AvatarGroup/Avatar/index.module.css +60 -0
  5. package/Common/AvatarGroup/Overlay/index.js +6 -0
  6. package/Common/AvatarGroup/Overlay/index.module.css +38 -0
  7. package/Common/AvatarGroup/index.js +21 -0
  8. package/Common/AvatarGroup/index.module.css +22 -0
  9. package/Common/Badge/index.js +7 -0
  10. package/Common/Badge/index.module.css +46 -0
  11. package/Common/BadgeGroup/index.js +6 -0
  12. package/Common/BadgeGroup/index.module.css +101 -0
  13. package/Common/Banner/index.js +4 -0
  14. package/Common/Banner/index.module.css +45 -0
  15. package/Common/BaseActiveLink/index.js +14 -0
  16. package/Common/BaseButton/index.js +10 -0
  17. package/Common/BaseButton/index.module.css +372 -0
  18. package/Common/BaseCodeBox/index.js +50 -0
  19. package/Common/BaseCodeBox/index.module.css +96 -0
  20. package/Common/BaseCrossLink/index.js +12 -0
  21. package/Common/BaseCrossLink/index.module.css +69 -0
  22. package/Common/BaseLinkTabs/index.js +5 -0
  23. package/Common/BaseLinkTabs/index.module.css +77 -0
  24. package/Common/BasePagination/Ellipsis/index.js +4 -0
  25. package/Common/BasePagination/Ellipsis/index.module.css +16 -0
  26. package/Common/BasePagination/PaginationListItem/index.js +6 -0
  27. package/Common/BasePagination/PaginationListItem/index.module.css +42 -0
  28. package/Common/BasePagination/PrevNextArrow.js +7 -0
  29. package/Common/BasePagination/index.js +10 -0
  30. package/Common/BasePagination/index.module.css +40 -0
  31. package/Common/BasePagination/useGetPageElements.js +77 -0
  32. package/Common/Blockquote/index.js +4 -0
  33. package/Common/Blockquote/index.module.css +50 -0
  34. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.js +9 -0
  35. package/Common/Breadcrumbs/BreadcrumbHomeLink/index.module.css +5 -0
  36. package/Common/Breadcrumbs/BreadcrumbItem/index.js +6 -0
  37. package/Common/Breadcrumbs/BreadcrumbItem/index.module.css +52 -0
  38. package/Common/Breadcrumbs/BreadcrumbLink/index.js +5 -0
  39. package/Common/Breadcrumbs/BreadcrumbLink/index.module.css +32 -0
  40. package/Common/Breadcrumbs/BreadcrumbRoot/index.js +4 -0
  41. package/Common/Breadcrumbs/BreadcrumbRoot/index.module.css +10 -0
  42. package/Common/Breadcrumbs/BreadcrumbTruncatedItem/index.js +4 -0
  43. package/Common/Breadcrumbs/index.js +22 -0
  44. package/Common/ChangeHistory/index.js +9 -0
  45. package/Common/ChangeHistory/index.module.css +198 -0
  46. package/Common/CodeTabs/index.js +5 -0
  47. package/Common/CodeTabs/index.module.css +67 -0
  48. package/Common/DataTag/index.js +18 -0
  49. package/Common/DataTag/index.module.css +54 -0
  50. package/Common/GlowingBackdrop/index.js +5 -0
  51. package/Common/GlowingBackdrop/index.module.css +130 -0
  52. package/Common/LanguageDropDown/index.js +11 -0
  53. package/Common/LanguageDropDown/index.module.css +151 -0
  54. package/Common/Modal/index.js +10 -0
  55. package/Common/Modal/index.module.css +234 -0
  56. package/Common/NodejsLogo/index.js +7 -0
  57. package/Common/NodejsLogo/index.module.css +5 -0
  58. package/Common/Notification/index.js +6 -0
  59. package/Common/Notification/index.module.css +104 -0
  60. package/Common/Preview/index.js +7 -0
  61. package/Common/Preview/index.module.css +283 -0
  62. package/Common/Select/index.js +46 -0
  63. package/Common/Select/index.module.css +328 -0
  64. package/Common/Separator/index.js +7 -0
  65. package/Common/Separator/index.module.css +13 -0
  66. package/Common/Skeleton/index.js +18 -0
  67. package/Common/Skeleton/index.module.css +127 -0
  68. package/Common/Tabs/index.js +6 -0
  69. package/Common/Tabs/index.module.css +72 -0
  70. package/Common/ThemeToggle/index.js +7 -0
  71. package/Common/ThemeToggle/index.module.css +22 -0
  72. package/Common/Tooltip/index.js +8 -0
  73. package/Common/Tooltip/index.module.css +133 -0
  74. package/Containers/Article/index.js +4 -0
  75. package/Containers/Article/index.module.css +139 -0
  76. package/Containers/DocSideBar/index.js +1 -0
  77. package/Containers/Footer/index.js +22 -0
  78. package/Containers/Footer/index.module.css +61 -0
  79. package/Containers/MetaBar/index.js +12 -0
  80. package/Containers/MetaBar/index.module.css +123 -0
  81. package/Containers/NavBar/NavItem/index.js +7 -0
  82. package/Containers/NavBar/NavItem/index.module.css +74 -0
  83. package/Containers/NavBar/index.js +18 -0
  84. package/Containers/NavBar/index.module.css +205 -0
  85. package/Containers/Sidebar/ProgressionIcon/index.js +3 -0
  86. package/Containers/Sidebar/SidebarGroup/index.js +9 -0
  87. package/Containers/Sidebar/SidebarGroup/index.module.css +192 -0
  88. package/Containers/Sidebar/SidebarItem/index.js +11 -0
  89. package/Containers/Sidebar/SidebarItem/index.module.css +67 -0
  90. package/Containers/Sidebar/index.js +15 -0
  91. package/Containers/Sidebar/index.module.css +48 -0
  92. package/Icons/HexagonGrid.js +3 -0
  93. package/Icons/InstallationMethod/Choco.js +3 -0
  94. package/Icons/InstallationMethod/Devbox.js +3 -0
  95. package/Icons/InstallationMethod/Docker.js +3 -0
  96. package/Icons/InstallationMethod/FNM.js +3 -0
  97. package/Icons/InstallationMethod/Homebrew.js +3 -0
  98. package/Icons/InstallationMethod/N.js +5 -0
  99. package/Icons/InstallationMethod/NVM.js +3 -0
  100. package/Icons/InstallationMethod/Volta.js +3 -0
  101. package/Icons/InstallationMethod/index.js +9 -0
  102. package/Icons/Logos/JsGreen.js +3 -0
  103. package/Icons/Logos/JsWhite.js +3 -0
  104. package/Icons/Logos/Nodejs.js +6 -0
  105. package/Icons/Logos/NodejsStackedBlack.js +3 -0
  106. package/Icons/Logos/NodejsStackedDark.js +3 -0
  107. package/Icons/Logos/NodejsStackedLight.js +3 -0
  108. package/Icons/Logos/NodejsStackedWhite.js +3 -0
  109. package/Icons/Logos/index.js +8 -0
  110. package/Icons/OperatingSystem/AIX.js +3 -0
  111. package/Icons/OperatingSystem/Apple.js +3 -0
  112. package/Icons/OperatingSystem/Linux.js +3 -0
  113. package/Icons/OperatingSystem/Microsoft.js +3 -0
  114. package/Icons/OperatingSystem/index.js +5 -0
  115. package/Icons/PackageManager/Npm.js +3 -0
  116. package/Icons/PackageManager/Pnpm.js +3 -0
  117. package/Icons/PackageManager/Yarn.js +3 -0
  118. package/Icons/PackageManager/index.js +4 -0
  119. package/Icons/Social/Bluesky.js +3 -0
  120. package/Icons/Social/Discord.js +3 -0
  121. package/Icons/Social/GitHub.js +3 -0
  122. package/Icons/Social/LinkedIn.js +3 -0
  123. package/Icons/Social/Mastodon.js +3 -0
  124. package/Icons/Social/Slack.js +3 -0
  125. package/Icons/Social/X.js +3 -0
  126. package/Icons/Social/index.js +8 -0
  127. package/LICENSE +21 -0
  128. package/MDX/CodeTabs.js +16 -0
  129. package/package.json +39 -5
  130. package/stylelint/one-utility-class-per-line.mjs +48 -0
  131. package/stylelint/utils.mjs +47 -0
  132. package/styles/index.css +1139 -0
  133. package/types.js +1 -0
  134. package/README.md +0 -1
@@ -0,0 +1,16 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .ellipsis {
3
+ width: calc(var(--spacing, 0.25rem)*10);
4
+ padding-inline: calc(var(--spacing, 0.25rem)*3);
5
+ padding-block: calc(var(--spacing, 0.25rem)*2.5);
6
+ --tw-leading: 1;
7
+ line-height: 1;
8
+ color: var(--color-neutral-800, #556066);
9
+ &:where([data-theme=dark], [data-theme=dark] *) {
10
+ color: var(--color-neutral-200, #e9edf0);
11
+ }
12
+ }
13
+ @property --tw-leading {
14
+ syntax: "*";
15
+ inherits: false;
16
+ }
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import styles from './index.module.css';
3
+ const PaginationListItem = ({ url, pageNumber, currentPage, totalPages, as: Component = 'a', label, }) => {
4
+ return (_jsx("li", { "aria-setsize": totalPages, "aria-posinset": pageNumber, children: _jsx(Component, { href: url, "aria-label": label, className: styles.listItem, ...(pageNumber === currentPage && { 'aria-current': 'page' }), children: _jsx("span", { children: pageNumber }) }) }, pageNumber));
5
+ };
6
+ export default PaginationListItem;
@@ -0,0 +1,42 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .listItem,
3
+ .listItem:link,
4
+ .listItem:active {
5
+ display: flex;
6
+ width: calc(var(--spacing, 0.25rem)*10);
7
+ height: calc(var(--spacing, 0.25rem)*10);
8
+ cursor: pointer;
9
+ align-items: center;
10
+ justify-content: center;
11
+ border-radius: var(--radius-sm, 0.25rem);
12
+ padding-inline: calc(var(--spacing, 0.25rem)*3);
13
+ padding-block: calc(var(--spacing, 0.25rem)*2.5);
14
+ color: var(--color-neutral-800, #556066);
15
+ @media (prefers-reduced-motion: no-preference) {
16
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
17
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
18
+ transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
19
+ }
20
+ &:where([data-theme=dark], [data-theme=dark] *) {
21
+ color: var(--color-neutral-200, #e9edf0);
22
+ }
23
+ &[aria-current="page"] {
24
+ cursor: default;
25
+ }
26
+ &[aria-current="page"] {
27
+ background-color: var(--color-green-600, #417e38);
28
+ }
29
+ &[aria-current="page"] {
30
+ color: var(--color-white, #fff);
31
+ }
32
+ &:hover:not([aria-current='page']) {
33
+ background-color: var(--color-neutral-100, #f6f7f9);
34
+ color: var(--color-neutral-800, #556066);
35
+ &:where([data-theme=dark], [data-theme=dark] *) {
36
+ background-color: var(--color-neutral-900, #2c3437);
37
+ }
38
+ &:where([data-theme=dark], [data-theme=dark] *) {
39
+ color: var(--color-neutral-200, #e9edf0);
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/24/solid';
3
+ const PrevNextArrow = ({ type, ...extra }) => {
4
+ const ChevronComponent = type === 'previous' ? ChevronLeftIcon : ChevronRightIcon;
5
+ return _jsx(ChevronComponent, { ...extra });
6
+ };
7
+ export default PrevNextArrow;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowRightIcon, ArrowLeftIcon } from '@heroicons/react/20/solid';
3
+ import Button from '#ui/Common/BaseButton';
4
+ import { useGetPageElements } from '#ui/Common/BasePagination/useGetPageElements';
5
+ import styles from './index.module.css';
6
+ const BasePagination = ({ currentPage, pages, as = 'a', currentPageSiblingsCount = 1, labels, getPageLabel, }) => {
7
+ const parsedPages = useGetPageElements(currentPage, pages, currentPageSiblingsCount, as, getPageLabel);
8
+ return (_jsxs("nav", { "aria-label": labels.aria, className: styles.pagination, children: [_jsxs(Button, { as: as, "aria-label": labels.prevAria, disabled: currentPage === 1, kind: "secondary", className: styles.previousButton, href: pages[currentPage - 2]?.url, children: [_jsx(ArrowLeftIcon, { className: styles.arrowIcon }), _jsx("span", { children: labels.prev })] }), _jsx("ol", { className: styles.list, children: parsedPages }), _jsxs(Button, { as: as, "aria-label": labels.nextAria, disabled: currentPage === pages.length, kind: "secondary", className: styles.nextButton, href: pages[currentPage]?.url, children: [_jsx("span", { children: labels.next }), _jsx(ArrowRightIcon, { className: styles.arrowIcon })] })] }));
9
+ };
10
+ export default BasePagination;
@@ -0,0 +1,40 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .pagination {
3
+ display: grid;
4
+ align-items: center;
5
+ justify-content: space-between;
6
+ row-gap: calc(var(--spacing, 0.25rem)*5);
7
+ grid-template-areas: 'pages pages pages''prev . next';
8
+ @media (width >= 48rem) {
9
+ row-gap: calc(var(--spacing, 0.25rem)*0);
10
+ }
11
+ @media (width >= 48rem) {
12
+ grid-template-areas: 'prev pages next';
13
+ }
14
+ }
15
+ .previousButton,
16
+ .nextButton {
17
+ font-size: var(--text-sm, 0.875rem);
18
+ line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
19
+ }
20
+ .previousButton {
21
+ grid-area: prev;
22
+ }
23
+ .nextButton {
24
+ grid-area: next;
25
+ }
26
+ .arrowIcon {
27
+ height: calc(var(--spacing, 0.25rem)*5);
28
+ flex-shrink: 0;
29
+ color: var(--color-neutral-600, #929fa5);
30
+ &:where([data-theme=dark], [data-theme=dark] *) {
31
+ color: var(--color-neutral-400, #cbd4d9);
32
+ }
33
+ }
34
+ .list {
35
+ display: flex;
36
+ list-style-type: none;
37
+ justify-content: center;
38
+ gap: calc(var(--spacing, 0.25rem)*1);
39
+ grid-area: pages;
40
+ }
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import Ellipsis from '#ui/Common/BasePagination/Ellipsis';
3
+ import PaginationListItem from '#ui/Common/BasePagination/PaginationListItem';
4
+ const parsePages = (pages, currentPage, totalPages, as, getLabel) => pages.map(({ url }, index) => ({
5
+ url,
6
+ pageNumber: index + 1,
7
+ currentPage,
8
+ totalPages,
9
+ label: getLabel(index + 1),
10
+ as,
11
+ }));
12
+ const createPaginationListItems = (parsedPages) => parsedPages.map(page => _jsx(PaginationListItem, { ...page }, page.url));
13
+ // The minimum amount of elements are first page, current page, and last page
14
+ const MINIMUM_AMOUNT_OF_ELEMENTS = 3;
15
+ // Not more than two ellipses will be shown at the same time
16
+ const MAXIMUM_AMOUNT_OF_ELLIPSES = 2;
17
+ // The logic of this custom hook has taken the internal logic of
18
+ // React MUI's Pagination component as reference. More info here:
19
+ // https://github.com/mui/material-ui/blob/master/packages/mui-material/src/usePagination/usePagination.js
20
+ export const useGetPageElements = (currentPage, pages, currentPageSiblingsCount, as, getLabel) => {
21
+ const totalPages = pages.length;
22
+ const parsedPages = parsePages(pages, currentPage, totalPages, as, getLabel);
23
+ const currentPageIndex = currentPage - 1;
24
+ // We multiply it by two (2) as siblings are located on both left and right sides
25
+ // of the current page
26
+ const totalSiblingsCount = 2 * currentPageSiblingsCount;
27
+ const visiblePages = totalSiblingsCount +
28
+ MINIMUM_AMOUNT_OF_ELEMENTS +
29
+ MAXIMUM_AMOUNT_OF_ELLIPSES;
30
+ // When there are more pages than the visible pages to be shown
31
+ // we do not need to perform any calculations
32
+ if (totalPages <= visiblePages) {
33
+ return createPaginationListItems(parsedPages);
34
+ }
35
+ // The index of the far-left sibling of the current page
36
+ const leftSiblingsFirstIndex = Math.max(currentPageIndex - currentPageSiblingsCount, 1);
37
+ // The index of the far-right sibling of the current page
38
+ const rightSiblingsLastIndex = Math.min(currentPageIndex + currentPageSiblingsCount + 1, totalPages);
39
+ const firstIndex = 0;
40
+ const lastIndex = totalPages - 1;
41
+ // If there are at least two (2) elements between the far-left sibling of
42
+ // the current page, and the first page, we should show left ellipsis
43
+ // between them
44
+ const hasLeftEllipsis = leftSiblingsFirstIndex > firstIndex + 2;
45
+ // If there are at least two (2) elements between the far-right sibling of
46
+ // the current page, and the last page, we should show right ellipsis
47
+ // between them
48
+ const hasRightEllipsis = rightSiblingsLastIndex < lastIndex - 1;
49
+ if (!hasLeftEllipsis && hasRightEllipsis) {
50
+ const leftPagesLastIndex = MINIMUM_AMOUNT_OF_ELEMENTS + totalSiblingsCount;
51
+ const leftPages = parsedPages.slice(firstIndex, leftPagesLastIndex);
52
+ return [
53
+ ...createPaginationListItems(leftPages),
54
+ _jsx(Ellipsis, {}, "ellipsis"),
55
+ ...createPaginationListItems(parsedPages.slice(lastIndex)),
56
+ ];
57
+ }
58
+ if (hasLeftEllipsis && !hasRightEllipsis) {
59
+ const rightPagesFirstIndex = MINIMUM_AMOUNT_OF_ELEMENTS + totalSiblingsCount;
60
+ const rightPages = parsedPages.slice(totalPages - rightPagesFirstIndex);
61
+ return [
62
+ ...createPaginationListItems(parsedPages.slice(firstIndex, firstIndex + 1)),
63
+ _jsx(Ellipsis, {}, "ellipsis"),
64
+ ...createPaginationListItems(rightPages),
65
+ ];
66
+ }
67
+ if (hasLeftEllipsis && hasRightEllipsis) {
68
+ const middlePages = parsedPages.slice(leftSiblingsFirstIndex, rightSiblingsLastIndex);
69
+ return [
70
+ ...createPaginationListItems(parsedPages.slice(firstIndex, firstIndex + 1)),
71
+ _jsx(Ellipsis, {}, "ellipsis-1"),
72
+ ...createPaginationListItems(middlePages),
73
+ _jsx(Ellipsis, {}, "ellipsis-2"),
74
+ ...createPaginationListItems(parsedPages.slice(lastIndex)),
75
+ ];
76
+ }
77
+ };
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import styles from './index.module.css';
3
+ const Blockquote = ({ children }) => (_jsx("blockquote", { className: styles.wrapper, children: children }));
4
+ export default Blockquote;
@@ -0,0 +1,50 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .wrapper {
3
+ display: flex;
4
+ max-width: var(--container-2xl, 42rem);
5
+ flex-direction: column;
6
+ align-items: flex-start;
7
+ gap: calc(var(--spacing, 0.25rem)*4);
8
+ align-self: stretch;
9
+ border-left-style: var(--tw-border-style);
10
+ border-left-width: 2px;
11
+ border-color: var(--color-green-600, #417e38);
12
+ padding-block: calc(var(--spacing, 0.25rem)*2);
13
+ padding-left: calc(var(--spacing, 0.25rem)*5);
14
+ font-size: var(--text-lg, 1.125rem);
15
+ line-height: var(--tw-leading, var(--text-lg--line-height, 1.55556));
16
+ --tw-font-weight: var(--font-weight-semibold, 600);
17
+ font-weight: var(--font-weight-semibold, 600);
18
+ color: var(--color-neutral-900, #2c3437);
19
+ &:where([data-theme=dark], [data-theme=dark] *) {
20
+ border-color: var(--color-green-400, #84ba64);
21
+ }
22
+ &:where([data-theme=dark], [data-theme=dark] *) {
23
+ color: var(--color-white, #fff);
24
+ }
25
+ & cite {
26
+ font-size: var(--text-base, 1rem);
27
+ line-height: var(--tw-leading, var(--text-base--line-height, 1.5));
28
+ --tw-font-weight: var(--font-weight-regular, 400);
29
+ font-weight: var(--font-weight-regular, 400);
30
+ font-style: normal;
31
+ &::before {
32
+ --tw-content: '— ';
33
+ content: var(--tw-content);
34
+ }
35
+ }
36
+ }
37
+ @property --tw-border-style {
38
+ syntax: "*";
39
+ inherits: false;
40
+ initial-value: solid;
41
+ }
42
+ @property --tw-font-weight {
43
+ syntax: "*";
44
+ inherits: false;
45
+ }
46
+ @property --tw-content {
47
+ syntax: "*";
48
+ inherits: false;
49
+ initial-value: "";
50
+ }
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import HomeIcon from '@heroicons/react/24/outline/HomeIcon';
3
+ import BreadcrumbLink from '#ui/Common/Breadcrumbs/BreadcrumbLink';
4
+ import styles from './index.module.css';
5
+ const BreadcrumbHomeLink = ({ href = '/', ...props }) => {
6
+ const ariaLabel = props['aria-label'];
7
+ return (_jsx(BreadcrumbLink, { href: href, ...props, children: _jsx(HomeIcon, { title: ariaLabel, "aria-label": ariaLabel, className: styles.icon }) }));
8
+ };
9
+ export default BreadcrumbHomeLink;
@@ -0,0 +1,5 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .icon {
3
+ width: calc(var(--spacing, 0.25rem)*4);
4
+ height: calc(var(--spacing, 0.25rem)*4);
5
+ }
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon';
3
+ import classNames from 'classnames';
4
+ import styles from './index.module.css';
5
+ const BreadcrumbItem = ({ disableMicrodata, children, hidden = false, hideSeparator = false, position, ...props }) => (_jsxs("li", { ...props, itemProp: !disableMicrodata ? 'itemListElement' : undefined, itemScope: !disableMicrodata ? true : undefined, itemType: !disableMicrodata ? 'https://schema.org/ListItem' : undefined, className: classNames(styles.item, { [styles.visuallyHidden]: hidden }, props.className), "aria-hidden": hidden ? 'true' : undefined, children: [children, position && _jsx("meta", { itemProp: "position", content: `${position}` }), !hideSeparator && (_jsx(ChevronRightIcon, { "aria-hidden": "true", className: styles.separator }))] }));
6
+ export default BreadcrumbItem;
@@ -0,0 +1,52 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .item {
3
+ display: flex;
4
+ max-width: fit-content;
5
+ align-items: center;
6
+ gap: calc(var(--spacing, 0.25rem)*5);
7
+ overflow: hidden;
8
+ text-overflow: ellipsis;
9
+ white-space: nowrap;
10
+ font-size: var(--text-sm, 0.875rem);
11
+ line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
12
+ --tw-font-weight: var(--font-weight-medium, 500);
13
+ font-weight: var(--font-weight-medium, 500);
14
+ &:last-child {
15
+ width: 100%;
16
+ }
17
+ a {
18
+ flex-shrink: 1;
19
+ flex-grow: 1;
20
+ }
21
+ &,
22
+ > a,
23
+ > a:hover {
24
+ color: var(--color-neutral-800, #556066);
25
+ @media (prefers-reduced-motion: no-preference) {
26
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
27
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
28
+ transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
29
+ }
30
+ &:where([data-theme=dark], [data-theme=dark] *) {
31
+ color: var(--color-neutral-200, #e9edf0);
32
+ }
33
+ }
34
+ &.visuallyHidden {
35
+ display: none;
36
+ }
37
+ .separator {
38
+ width: calc(var(--spacing, 0.25rem)*4);
39
+ height: calc(var(--spacing, 0.25rem)*4);
40
+ max-width: fit-content;
41
+ flex-shrink: 0;
42
+ flex-grow: 1;
43
+ color: var(--color-neutral-600, #929fa5);
44
+ &:where([data-theme=dark], [data-theme=dark] *) {
45
+ color: var(--color-neutral-400, #cbd4d9);
46
+ }
47
+ }
48
+ }
49
+ @property --tw-font-weight {
50
+ syntax: "*";
51
+ inherits: false;
52
+ }
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ import styles from './index.module.css';
4
+ const BreadcrumbLink = ({ href, active, as: Component = 'a', ...props }) => (_jsx(Component, { itemScope: true, itemType: "http://schema.org/Thing", itemProp: "item", itemID: href?.toString(), href: href, className: classNames(styles.link, { [styles.active]: active }, props.className), "aria-current": active ? 'page' : undefined, ...props, children: _jsx("span", { itemProp: "name", children: props.children }) }));
5
+ export default BreadcrumbLink;
@@ -0,0 +1,32 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .link {
3
+ max-width: fit-content;
4
+ overflow: hidden;
5
+ text-overflow: ellipsis;
6
+ white-space: nowrap;
7
+ &.active {
8
+ border-radius: 0.25rem;
9
+ background-color: var(--color-green-600, #417e38);
10
+ padding-inline: calc(var(--spacing, 0.25rem)*2);
11
+ padding-block: calc(var(--spacing, 0.25rem)*1);
12
+ --tw-font-weight: var(--font-weight-semibold, 600);
13
+ font-weight: var(--font-weight-semibold, 600);
14
+ color: var(--color-white, #fff);
15
+ @media (prefers-reduced-motion: no-preference) {
16
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
17
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
18
+ transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
19
+ }
20
+ &:where([data-theme=dark], [data-theme=dark] *) {
21
+ color: var(--color-white, #fff);
22
+ }
23
+ &:hover {
24
+ background-color: var(--color-green-700, #2c682c);
25
+ color: var(--color-white, #fff);
26
+ }
27
+ }
28
+ }
29
+ @property --tw-font-weight {
30
+ syntax: "*";
31
+ inherits: false;
32
+ }
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import styles from './index.module.css';
3
+ const BreadcrumbRoot = ({ children, ...props }) => (_jsx("nav", { "aria-label": "breadcrumb", ...props, children: _jsx("ol", { itemScope: true, itemType: "https://schema.org/BreadcrumbList", className: styles.list, children: children }) }));
4
+ export default BreadcrumbRoot;
@@ -0,0 +1,10 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .list {
3
+ display: flex;
4
+ width: 100vw;
5
+ gap: calc(var(--spacing, 0.25rem)*5);
6
+ padding-inline: calc(var(--spacing, 0.25rem)*6);
7
+ @media (width >= 670px) {
8
+ width: 100%;
9
+ }
10
+ }
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import BreadcrumbItem from '#ui/Common/Breadcrumbs/BreadcrumbItem';
3
+ const BreadcrumbTruncatedItem = () => (_jsx(BreadcrumbItem, { disableMicrodata: true, children: _jsx("button", { disabled: true, children: "\u2026" }) }));
4
+ export default BreadcrumbTruncatedItem;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import BreadcrumbHomeLink from '#ui/Common/Breadcrumbs/BreadcrumbHomeLink';
4
+ import BreadcrumbItem from '#ui/Common/Breadcrumbs/BreadcrumbItem';
5
+ import BreadcrumbLink from '#ui/Common/Breadcrumbs/BreadcrumbLink';
6
+ import BreadcrumbRoot from '#ui/Common/Breadcrumbs/BreadcrumbRoot';
7
+ import BreadcrumbTruncatedItem from '#ui/Common/Breadcrumbs/BreadcrumbTruncatedItem';
8
+ const Breadcrumbs = ({ links = [], maxLength = 5, hideHome = false, as = 'a', homeLinkAriaLabel, }) => {
9
+ const totalLength = links.length + +!hideHome;
10
+ const lengthOffset = maxLength - totalLength;
11
+ const isOverflow = lengthOffset < 0;
12
+ const items = useMemo(() => links.map((link, index, items) => {
13
+ const position = index + 1;
14
+ const isLastItem = index === items.length - 1;
15
+ const hidden =
16
+ // We add 1 here to take into account of the truncated breadcrumb.
17
+ position <= Math.abs(lengthOffset) + 1 && isOverflow && !isLastItem;
18
+ return (_jsx(BreadcrumbItem, { hidden: hidden, hideSeparator: isLastItem, position: position + +!hideHome, children: link.href || isLastItem ? (_jsx(BreadcrumbLink, { as: as, href: link.href || undefined, active: isLastItem, children: link.label })) : (_jsx("span", { className: "opacity-70", children: link.label })) }, link.label.toString()));
19
+ }), [hideHome, isOverflow, lengthOffset, links]);
20
+ return (_jsxs(BreadcrumbRoot, { children: [!hideHome && (_jsx(BreadcrumbItem, { position: 1, children: _jsx(BreadcrumbHomeLink, { as: as, "aria-label": homeLinkAriaLabel }) })), isOverflow && _jsx(BreadcrumbTruncatedItem, {}), items] }));
21
+ };
22
+ export default Breadcrumbs;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChevronDownIcon, ClockIcon } from '@heroicons/react/24/outline';
3
+ import classNames from 'classnames';
4
+ import styles from './index.module.css';
5
+ const ChangeHistory = ({ label = 'History', changes = [], className, as: As = 'a', 'aria-label': ariaLabel = label, ...props }) => (_jsx("div", { className: classNames('relative', 'inline-block', className), ...props, children: _jsxs("details", { className: "group", children: [_jsxs("summary", { className: styles.summary, role: "button", "aria-haspopup": "menu", children: [_jsx(ClockIcon, { className: "size-4" }), _jsx("span", { children: label }), _jsx(ChevronDownIcon, { className: "size-3 group-open:rotate-180 motion-safe:transition-transform" })] }), _jsx("div", { className: styles.dropdownContentWrapper, role: "menu", "aria-label": ariaLabel, children: _jsx("div", { className: styles.dropdownContentInner, children: changes.map((change, index) => {
6
+ const MenuItem = change.url ? As : 'div';
7
+ return (_jsxs(MenuItem, { className: styles.dropdownItem, role: "menuitem", tabIndex: 0, "aria-label": `${change.label}: ${change.versions.join(', ')}`, href: change.url, children: [_jsx("div", { className: styles.dropdownLabel, children: change.label }), _jsx("div", { className: styles.dropdownVersions, children: change.versions.join(', ') })] }, index));
8
+ }) }) })] }) }));
9
+ export default ChangeHistory;
@@ -0,0 +1,198 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
2
+ .summary {
3
+ display: flex;
4
+ height: calc(var(--spacing, 0.25rem)*9);
5
+ cursor: pointer;
6
+ align-items: center;
7
+ gap: calc(var(--spacing, 0.25rem)*2);
8
+ border-radius: var(--radius-md, 0.375rem);
9
+ border-style: var(--tw-border-style);
10
+ border-width: 1px;
11
+ border-color: var(--color-neutral-200, #e9edf0);
12
+ padding: calc(var(--spacing, 0.25rem)*2);
13
+ font-size: var(--text-sm, 0.875rem);
14
+ line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
15
+ color: var(--color-neutral-700, #6e7b83);
16
+ --tw-outline-style: none;
17
+ outline-style: none;
18
+ @media (forced-colors: active) {
19
+ outline: 2px solid transparent;
20
+ outline-offset: 2px;
21
+ }
22
+ -webkit-user-select: none;
23
+ user-select: none;
24
+ @media (prefers-reduced-motion: no-preference) {
25
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
26
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
27
+ transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
28
+ }
29
+ &:where([data-theme=dark], [data-theme=dark] *) {
30
+ border-color: var(--color-neutral-900, #2c3437);
31
+ }
32
+ &:where([data-theme=dark], [data-theme=dark] *) {
33
+ color: var(--color-neutral-300, #d9e1e4);
34
+ }
35
+ &:hover,
36
+ &:focus-visible {
37
+ background-color: var(--color-neutral-100, #f6f7f9);
38
+ &:where([data-theme=dark], [data-theme=dark] *) {
39
+ background-color: var(--color-neutral-900, #2c3437);
40
+ }
41
+ }
42
+ }
43
+ .dropdownContentWrapper {
44
+ position: absolute;
45
+ top: 100%;
46
+ right: calc(var(--spacing, 0.25rem)*0);
47
+ z-index: 50;
48
+ margin-top: calc(var(--spacing, 0.25rem)*1);
49
+ max-height: calc(var(--spacing, 0.25rem)*80);
50
+ width: calc(var(--spacing, 0.25rem)*52);
51
+ overflow: hidden;
52
+ border-radius: var(--radius-sm, 0.25rem);
53
+ border-style: var(--tw-border-style);
54
+ border-width: 1px;
55
+ border-color: var(--color-neutral-200, #e9edf0);
56
+ background-color: var(--color-white, #fff);
57
+ --tw-shadow: 0px 4px 6px -2px var(--tw-shadow-color, color-mix(in srgb, #101828 3%, transparent)), 0px 12px 16px -4px var(--tw-shadow-color, color-mix(in srgb, #101828 8%, transparent));
58
+ @supports (color: color-mix(in lab, red, red)) {
59
+ --tw-shadow: 0px 4px 6px -2px var(--tw-shadow-color, color-mix(in oklab, var(--color-shadow, #101828) 3%, transparent)), 0px 12px 16px -4px var(--tw-shadow-color, color-mix(in oklab, var(--color-shadow, #101828) 8%, transparent));
60
+ }
61
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
62
+ &:where([data-theme=dark], [data-theme=dark] *) {
63
+ border-color: var(--color-neutral-900, #2c3437);
64
+ }
65
+ &:where([data-theme=dark], [data-theme=dark] *) {
66
+ background-color: var(--color-neutral-950, #0d121c);
67
+ }
68
+ }
69
+ .dropdownContentInner {
70
+ max-height: calc(var(--spacing, 0.25rem)*80);
71
+ width: calc(var(--spacing, 0.25rem)*52);
72
+ overflow-y: auto;
73
+ }
74
+ .dropdownItem {
75
+ display: block;
76
+ padding-inline: calc(var(--spacing, 0.25rem)*2.5);
77
+ padding-block: calc(var(--spacing, 0.25rem)*1.5);
78
+ font-size: var(--text-sm, 0.875rem);
79
+ line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
80
+ --tw-font-weight: var(--font-weight-medium, 500);
81
+ font-weight: var(--font-weight-medium, 500);
82
+ color: var(--color-neutral-800, #556066);
83
+ text-decoration-line: none;
84
+ --tw-outline-style: none;
85
+ outline-style: none;
86
+ @media (forced-colors: active) {
87
+ outline: 2px solid transparent;
88
+ outline-offset: 2px;
89
+ }
90
+ @media (prefers-reduced-motion: no-preference) {
91
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
92
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(0.4, 0, 0.2, 1)));
93
+ transition-duration: var(--tw-duration, var(--default-transition-duration, 150ms));
94
+ }
95
+ &:where([data-theme=dark], [data-theme=dark] *) {
96
+ color: var(--color-white, #fff);
97
+ }
98
+ &:hover,
99
+ &:focus-visible {
100
+ background-color: var(--color-green-600, #417e38);
101
+ color: var(--color-white, #fff);
102
+ }
103
+ }
104
+ .dropdownLabel {
105
+ display: block;
106
+ font-size: var(--text-sm, 0.875rem);
107
+ line-height: var(--tw-leading, var(--text-sm--line-height, 1.42857));
108
+ --tw-leading: var(--leading-tight, 1.25);
109
+ line-height: var(--leading-tight, 1.25);
110
+ --tw-font-weight: var(--font-weight-medium, 500);
111
+ font-weight: var(--font-weight-medium, 500);
112
+ }
113
+ .dropdownVersions {
114
+ display: block;
115
+ font-size: var(--text-xs, 0.75rem);
116
+ line-height: var(--tw-leading, var(--text-xs--line-height, 1.33333));
117
+ --tw-leading: var(--leading-tight, 1.25);
118
+ line-height: var(--leading-tight, 1.25);
119
+ opacity: 75%;
120
+ }
121
+ @property --tw-border-style {
122
+ syntax: "*";
123
+ inherits: false;
124
+ initial-value: solid;
125
+ }
126
+ @property --tw-shadow {
127
+ syntax: "*";
128
+ inherits: false;
129
+ initial-value: 0 0 #0000;
130
+ }
131
+ @property --tw-shadow-color {
132
+ syntax: "*";
133
+ inherits: false;
134
+ }
135
+ @property --tw-shadow-alpha {
136
+ syntax: "<percentage>";
137
+ inherits: false;
138
+ initial-value: 100%;
139
+ }
140
+ @property --tw-inset-shadow {
141
+ syntax: "*";
142
+ inherits: false;
143
+ initial-value: 0 0 #0000;
144
+ }
145
+ @property --tw-inset-shadow-color {
146
+ syntax: "*";
147
+ inherits: false;
148
+ }
149
+ @property --tw-inset-shadow-alpha {
150
+ syntax: "<percentage>";
151
+ inherits: false;
152
+ initial-value: 100%;
153
+ }
154
+ @property --tw-ring-color {
155
+ syntax: "*";
156
+ inherits: false;
157
+ }
158
+ @property --tw-ring-shadow {
159
+ syntax: "*";
160
+ inherits: false;
161
+ initial-value: 0 0 #0000;
162
+ }
163
+ @property --tw-inset-ring-color {
164
+ syntax: "*";
165
+ inherits: false;
166
+ }
167
+ @property --tw-inset-ring-shadow {
168
+ syntax: "*";
169
+ inherits: false;
170
+ initial-value: 0 0 #0000;
171
+ }
172
+ @property --tw-ring-inset {
173
+ syntax: "*";
174
+ inherits: false;
175
+ }
176
+ @property --tw-ring-offset-width {
177
+ syntax: "<length>";
178
+ inherits: false;
179
+ initial-value: 0px;
180
+ }
181
+ @property --tw-ring-offset-color {
182
+ syntax: "*";
183
+ inherits: false;
184
+ initial-value: #fff;
185
+ }
186
+ @property --tw-ring-offset-shadow {
187
+ syntax: "*";
188
+ inherits: false;
189
+ initial-value: 0 0 #0000;
190
+ }
191
+ @property --tw-font-weight {
192
+ syntax: "*";
193
+ inherits: false;
194
+ }
195
+ @property --tw-leading {
196
+ syntax: "*";
197
+ inherits: false;
198
+ }
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import Tabs from '#ui/Common/Tabs';
3
+ import styles from './index.module.css';
4
+ const CodeTabs = ({ ...props }) => (_jsx(Tabs, { ...props, className: styles.root, triggerClassName: styles.trigger }));
5
+ export default CodeTabs;