@treeseed/core 0.10.21 → 0.11.0

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 (111) hide show
  1. package/README.md +69 -125
  2. package/dist/content.js +1 -0
  3. package/dist/dev-watch.js +2 -1
  4. package/dist/dev.d.ts +1 -1
  5. package/dist/dev.js +51 -35
  6. package/dist/pages/404.astro +1 -1
  7. package/dist/pages/[slug].astro +4 -4
  8. package/dist/pages/agents/[slug].astro +3 -3
  9. package/dist/pages/agents/index.astro +3 -3
  10. package/dist/pages/books/[slug].astro +3 -3
  11. package/dist/pages/books/index.astro +3 -3
  12. package/dist/pages/contact.astro +2 -2
  13. package/dist/pages/decisions/[slug].astro +3 -3
  14. package/dist/pages/decisions/index.astro +3 -3
  15. package/dist/pages/docs-runtime/[...slug].astro +3 -3
  16. package/dist/pages/docs-runtime/index.astro +3 -3
  17. package/dist/pages/index.astro +11 -11
  18. package/dist/pages/notes/[slug].astro +3 -3
  19. package/dist/pages/notes/index.astro +3 -3
  20. package/dist/pages/objectives/[slug].astro +3 -3
  21. package/dist/pages/objectives/index.astro +3 -3
  22. package/dist/pages/people/[slug].astro +3 -3
  23. package/dist/pages/people/index.astro +3 -3
  24. package/dist/pages/proposals/[slug].astro +3 -3
  25. package/dist/pages/proposals/index.astro +3 -3
  26. package/dist/pages/questions/[slug].astro +3 -3
  27. package/dist/pages/questions/index.astro +3 -3
  28. package/dist/pages/ui/index.astro +23 -23
  29. package/dist/platform-resources.js +5 -1
  30. package/dist/scripts/build-dist.js +2 -0
  31. package/dist/scripts/release-verify.js +24 -2
  32. package/dist/scripts/workspace-bootstrap.js +3 -0
  33. package/dist/site.js +49 -11
  34. package/dist/styles/global.css +5 -5
  35. package/dist/templates.d.ts +2 -0
  36. package/dist/templates.js +8 -6
  37. package/package.json +3 -45
  38. package/templates/github/deploy-web.workflow.yml +36 -2
  39. package/dist/components/DevWatchReload.astro +0 -45
  40. package/dist/components/SiteTitle.astro +0 -51
  41. package/dist/components/content/ContentStatusLegend.astro +0 -18
  42. package/dist/components/content/StatusBadge.astro +0 -11
  43. package/dist/components/docs/BookFontControls.astro +0 -180
  44. package/dist/components/docs/DesktopSidebarToggle.astro +0 -88
  45. package/dist/components/docs/DownloadBook.astro +0 -34
  46. package/dist/components/docs/Footer.astro +0 -112
  47. package/dist/components/docs/Header.astro +0 -157
  48. package/dist/components/docs/PageFrame.astro +0 -260
  49. package/dist/components/docs/PageSidebar.astro +0 -63
  50. package/dist/components/docs/PageTitle.astro +0 -39
  51. package/dist/components/docs/Sidebar.astro +0 -41
  52. package/dist/components/docs/ThemeSelect.astro +0 -5
  53. package/dist/components/forms/ContactForm.astro +0 -233
  54. package/dist/components/forms/FooterSubscribeForm.astro +0 -188
  55. package/dist/components/site/BookList.astro +0 -27
  56. package/dist/components/site/CTASection.astro +0 -24
  57. package/dist/components/site/ChronicleList.astro +0 -33
  58. package/dist/components/site/Hero.astro +0 -18
  59. package/dist/components/site/NotesList.astro +0 -29
  60. package/dist/components/site/PathCard.astro +0 -16
  61. package/dist/components/site/ProfileList.astro +0 -30
  62. package/dist/components/site/PublishedContentBody.astro +0 -5
  63. package/dist/components/site/RouteNotFound.astro +0 -25
  64. package/dist/components/site/SectionIntro.astro +0 -9
  65. package/dist/components/site/StageBanner.astro +0 -8
  66. package/dist/components/site/TrustCallout.astro +0 -9
  67. package/dist/components/starlight.js +0 -6
  68. package/dist/components/ui/data/ActionList.astro +0 -51
  69. package/dist/components/ui/data/Badge.astro +0 -19
  70. package/dist/components/ui/data/DataTable.astro +0 -51
  71. package/dist/components/ui/data/KeyValueList.astro +0 -28
  72. package/dist/components/ui/data/MetricCard.astro +0 -25
  73. package/dist/components/ui/data/MetricGrid.astro +0 -27
  74. package/dist/components/ui/data/StatusPill.astro +0 -20
  75. package/dist/components/ui/forms/Button.astro +0 -59
  76. package/dist/components/ui/forms/Field.astro +0 -39
  77. package/dist/components/ui/forms/FormActions.astro +0 -12
  78. package/dist/components/ui/forms/PasswordMeter.astro +0 -80
  79. package/dist/components/ui/forms/RadioGroup.astro +0 -55
  80. package/dist/components/ui/forms/Select.astro +0 -47
  81. package/dist/components/ui/forms/TextInput.astro +0 -58
  82. package/dist/components/ui/forms/Textarea.astro +0 -45
  83. package/dist/components/ui/layout/PageHeader.astro +0 -45
  84. package/dist/components/ui/shell/AppShell.astro +0 -130
  85. package/dist/components/ui/shell/BottomNav.astro +0 -42
  86. package/dist/components/ui/shell/ProjectHeader.astro +0 -66
  87. package/dist/components/ui/shell/PublicFooter.astro +0 -39
  88. package/dist/components/ui/shell/PublicShell.astro +0 -184
  89. package/dist/components/ui/shell/RailNav.astro +0 -42
  90. package/dist/components/ui/shell/ShellIconLink.astro +0 -30
  91. package/dist/components/ui/shell/TopBar.astro +0 -52
  92. package/dist/components/ui/surface/Card.astro +0 -46
  93. package/dist/components/ui/surface/EmptyState.astro +0 -45
  94. package/dist/components/ui/surface/Panel.astro +0 -54
  95. package/dist/components/ui/theme/ThemeMenu.astro +0 -58
  96. package/dist/components/ui/theme/ThemePreviewSwatch.astro +0 -18
  97. package/dist/components/ui/theme/ThemeScript.astro +0 -112
  98. package/dist/components/ui/theme/ThemeSelector.astro +0 -202
  99. package/dist/components/ui/types.js +0 -0
  100. package/dist/layouts/AuthoredEntryLayout.astro +0 -195
  101. package/dist/layouts/BookLayout.astro +0 -35
  102. package/dist/layouts/BridgeLayout.astro +0 -11
  103. package/dist/layouts/ContentLayout.astro +0 -24
  104. package/dist/layouts/MainLayout.astro +0 -76
  105. package/dist/layouts/NoteLayout.astro +0 -26
  106. package/dist/layouts/ProfileLayout.astro +0 -85
  107. package/dist/styles/app-shell.css +0 -626
  108. package/dist/styles/forms.css +0 -274
  109. package/dist/styles/theme.css +0 -198
  110. package/dist/styles/tokens.css +0 -65
  111. package/dist/styles/ui.css +0 -551
@@ -93,14 +93,48 @@ __WORKING_DIRECTORY_BLOCK__ web:
93
93
  shell: bash
94
94
  run: |
95
95
  set -euo pipefail
96
- node -e "const fs = require('fs'); for (const file of ['packages/sdk/package.json', 'packages/agent/package.json', 'packages/core/package.json', 'packages/cli/package.json']) { if (!fs.existsSync(file)) continue; const p = JSON.parse(fs.readFileSync(file, 'utf8')); if (p.scripts) delete p.scripts.prepare; fs.writeFileSync(file, JSON.stringify(p, null, '\t') + '\n'); }"
96
+ node <<'NODE'
97
+ const fs = require('fs');
98
+ const path = require('path');
99
+ const packageRoot = 'packages';
100
+ if (fs.existsSync(packageRoot)) {
101
+ const localPackageNames = new Set();
102
+ for (const entry of fs.readdirSync(packageRoot, { withFileTypes: true })) {
103
+ if (!entry.isDirectory()) continue;
104
+ const file = path.join(packageRoot, entry.name, 'package.json');
105
+ if (!fs.existsSync(file)) continue;
106
+ const manifest = JSON.parse(fs.readFileSync(file, 'utf8'));
107
+ if (typeof manifest.name === 'string') localPackageNames.add(manifest.name);
108
+ }
109
+ for (const entry of fs.readdirSync(packageRoot, { withFileTypes: true })) {
110
+ if (!entry.isDirectory()) continue;
111
+ const file = path.join(packageRoot, entry.name, 'package.json');
112
+ if (!fs.existsSync(file)) continue;
113
+ const manifest = JSON.parse(fs.readFileSync(file, 'utf8'));
114
+ let changed = false;
115
+ if (manifest.scripts?.prepare) {
116
+ delete manifest.scripts.prepare;
117
+ changed = true;
118
+ }
119
+ for (const section of ['dependencies', 'devDependencies', 'optionalDependencies']) {
120
+ for (const dependencyName of Object.keys(manifest[section] ?? {})) {
121
+ if (dependencyName !== manifest.name && localPackageNames.has(dependencyName)) {
122
+ delete manifest[section][dependencyName];
123
+ changed = true;
124
+ }
125
+ }
126
+ }
127
+ if (changed) fs.writeFileSync(file, `${JSON.stringify(manifest, null, '\t')}\n`);
128
+ }
129
+ }
130
+ NODE
97
131
  npm ci --ignore-scripts
98
132
 
99
133
  - name: Build package artifacts
100
134
  shell: bash
101
135
  run: |
102
136
  set -euo pipefail
103
- for dir in packages/sdk packages/core packages/cli; do
137
+ for dir in packages/sdk packages/ui packages/core packages/cli; do
104
138
  if test -f "${dir}/package.json"; then npm --prefix "${dir}" run build:dist; fi
105
139
  done
106
140
 
@@ -1,45 +0,0 @@
1
- ---
2
- const enabled = import.meta.env.TREESEED_PUBLIC_DEV_WATCH_RELOAD;
3
- ---
4
-
5
- {
6
- enabled && (
7
- <script is:inline>
8
- (() => {
9
- const endpoint = '/__treeseed/dev-reload.json';
10
- let currentBuildId = null;
11
-
12
- async function poll() {
13
- try {
14
- const response = await fetch(`${endpoint}?t=${Date.now()}`, {
15
- cache: 'no-store',
16
- credentials: 'same-origin',
17
- });
18
- if (!response.ok) {
19
- return;
20
- }
21
-
22
- const payload = await response.json();
23
- if (!payload || typeof payload.buildId !== 'string') {
24
- return;
25
- }
26
-
27
- if (!currentBuildId) {
28
- currentBuildId = payload.buildId;
29
- return;
30
- }
31
-
32
- if (payload.buildId !== currentBuildId) {
33
- window.location.reload();
34
- }
35
- } catch {
36
- // Ignore transient polling failures while the local worker rebuilds.
37
- }
38
- }
39
-
40
- poll();
41
- window.setInterval(poll, 1200);
42
- })();
43
- </script>
44
- )
45
- }
@@ -1,51 +0,0 @@
1
- ---
2
- import { SITE } from '../utils/seo';
3
-
4
- const { siteTitleHref } = Astro.locals.starlightRoute;
5
- ---
6
-
7
- <a href={siteTitleHref} class="site-header-custom sl-flex" aria-label={SITE.name}>
8
- <img src={SITE.logo.src} alt={SITE.logo.alt} class="site-header-logo" />
9
- <span class="site-header-copy">
10
- <span class="site-header-name" translate="no">{SITE.name}</span>
11
- <span class="site-header-statement">{SITE.statement}</span>
12
- </span>
13
- </a>
14
-
15
- <style>
16
- @layer starlight.core {
17
- .site-header-custom {
18
- align-items: center;
19
- gap: 0.85rem;
20
- color: var(--sl-color-white);
21
- text-decoration: none;
22
- min-width: 0;
23
- }
24
-
25
- .site-header-logo {
26
- width: 3.75rem;
27
- height: 3.75rem;
28
- object-fit: contain;
29
- flex: 0 0 auto;
30
- }
31
-
32
- .site-header-copy {
33
- display: grid;
34
- min-width: 0;
35
- }
36
-
37
- .site-header-name {
38
- font-size: var(--sl-text-h4);
39
- font-weight: 600;
40
- line-height: 1.1;
41
- }
42
-
43
- .site-header-statement {
44
- font-size: var(--sl-text-xs);
45
- color: var(--sl-color-gray-3);
46
- white-space: nowrap;
47
- overflow: hidden;
48
- text-overflow: ellipsis;
49
- }
50
- }
51
- </style>
@@ -1,18 +0,0 @@
1
- ---
2
- import { CONTENT_STATUSES, CONTENT_STATUS_META } from '../../utils/content-status';
3
- ---
4
-
5
- <section class="border-t border-[color:var(--ts-color-border-strong)] pt-8">
6
- <p class="text-sm font-semibold uppercase tracking-[0.18em] text-[color:var(--ts-color-accent-strong)]">Content status legend</p>
7
- <div class="mt-5 grid gap-3 md:grid-cols-2 xl:grid-cols-5">
8
- {CONTENT_STATUSES.map((status) => {
9
- const meta = CONTENT_STATUS_META[status];
10
- return (
11
- <div class:list={['border-l-4 bg-[color:var(--ts-color-canvas-subtle)] px-4 py-4', meta.tone]}>
12
- <p class="font-semibold">{meta.label}</p>
13
- <p class="mt-2 text-sm leading-7 text-[color:var(--ts-color-text-muted)]">{meta.description}</p>
14
- </div>
15
- );
16
- })}
17
- </div>
18
- </section>
@@ -1,11 +0,0 @@
1
- ---
2
- import type { ContentStatus } from '../../utils/content-status';
3
- import { CONTENT_STATUS_META } from '../../utils/content-status';
4
-
5
- const { status } = Astro.props as { status: ContentStatus };
6
- const meta = CONTENT_STATUS_META[status];
7
- ---
8
-
9
- <span class:list={['inline-flex items-center rounded-sm border px-3 py-1 text-[0.72rem] font-bold uppercase tracking-[0.18em]', meta.tone]}>
10
- {meta.label}
11
- </span>
@@ -1,180 +0,0 @@
1
- ---
2
- import { getBookForPath } from '../../utils/starlight-nav';
3
-
4
- const isBookPage = Boolean(getBookForPath(Astro.url.pathname));
5
- ---
6
-
7
- {
8
- isBookPage && (
9
- <div class="book-font-controls print:hidden" data-book-font-controls>
10
- <div class="book-font-controls__buttons" role="group" aria-label="Book text size">
11
- <button
12
- type="button"
13
- class="book-font-controls__button"
14
- data-book-font-action="decrease"
15
- data-book-font-tooltip="Text size"
16
- aria-label="Decrease book text size"
17
- >
18
- -
19
- </button>
20
- <button
21
- type="button"
22
- class="book-font-controls__button"
23
- data-book-font-action="increase"
24
- data-book-font-tooltip="Text size"
25
- aria-label="Increase book text size"
26
- >
27
- +
28
- </button>
29
- </div>
30
- </div>
31
- )
32
- }
33
-
34
- <script is:inline>
35
- const storageKey = 'docs.book-font-scale';
36
- const cssVariableName = '--docs-book-font-scale';
37
- const defaultScale = 1;
38
- const step = 0.1;
39
- const minScale = 0.85;
40
- const maxScale = 1.35;
41
-
42
- const clampScale = (value) => Math.min(maxScale, Math.max(minScale, value));
43
-
44
- const readScale = () => {
45
- try {
46
- const rawValue = localStorage.getItem(storageKey);
47
- const parsedValue = rawValue === null ? defaultScale : Number(rawValue);
48
- return Number.isFinite(parsedValue) ? clampScale(parsedValue) : defaultScale;
49
- } catch {
50
- return defaultScale;
51
- }
52
- };
53
-
54
- const writeScale = (value) => {
55
- try {
56
- localStorage.setItem(storageKey, String(value));
57
- } catch {
58
- // Ignore storage failures and keep the reader controls functional.
59
- }
60
- };
61
-
62
- const updateButtons = (controls, value) => {
63
- const decreaseButton = controls.querySelector('[data-book-font-action="decrease"]');
64
- const increaseButton = controls.querySelector('[data-book-font-action="increase"]');
65
-
66
- if (decreaseButton instanceof HTMLButtonElement) {
67
- decreaseButton.disabled = value <= minScale;
68
- }
69
-
70
- if (increaseButton instanceof HTMLButtonElement) {
71
- increaseButton.disabled = value >= maxScale;
72
- }
73
- };
74
-
75
- const applyScale = (controls, value) => {
76
- const normalizedValue = clampScale(value);
77
- document.documentElement.style.setProperty(cssVariableName, String(normalizedValue));
78
- updateButtons(controls, normalizedValue);
79
- return normalizedValue;
80
- };
81
-
82
- const bindControls = () => {
83
- for (const controls of document.querySelectorAll('[data-book-font-controls]')) {
84
- if (!(controls instanceof HTMLElement) || controls.dataset.bookFontBound === 'true') continue;
85
- controls.dataset.bookFontBound = 'true';
86
-
87
- const currentValue = applyScale(controls, readScale());
88
- controls.dataset.bookFontScale = String(currentValue);
89
-
90
- for (const button of controls.querySelectorAll('[data-book-font-action]')) {
91
- if (!(button instanceof HTMLButtonElement)) continue;
92
- button.addEventListener('click', () => {
93
- const direction = button.dataset.bookFontAction === 'decrease' ? -1 : 1;
94
- const nextValue = applyScale(controls, readScale() + direction * step);
95
- writeScale(nextValue);
96
- controls.dataset.bookFontScale = String(nextValue);
97
- });
98
- }
99
- }
100
- };
101
-
102
- bindControls();
103
- document.addEventListener('astro:page-load', bindControls);
104
- </script>
105
-
106
- <style>
107
- .book-font-controls {
108
- display: inline-flex;
109
- align-items: center;
110
- color: var(--sl-color-text);
111
- }
112
-
113
- .book-font-controls__buttons {
114
- display: inline-flex;
115
- align-items: center;
116
- border: 1px solid var(--ts-color-border-strong);
117
- border-radius: 999px;
118
- background: color-mix(in srgb, var(--ts-color-canvas-subtle) 78%, white 22%);
119
- }
120
-
121
- .book-font-controls__button {
122
- display: inline-flex;
123
- align-items: center;
124
- justify-content: center;
125
- width: 2rem;
126
- height: 2rem;
127
- border: 0;
128
- background: transparent;
129
- color: var(--ts-color-text);
130
- font-size: 1rem;
131
- font-weight: 700;
132
- line-height: 1;
133
- cursor: pointer;
134
- position: relative;
135
- }
136
-
137
- .book-font-controls__button + .book-font-controls__button {
138
- border-inline-start: 1px solid var(--ts-color-border-strong);
139
- }
140
-
141
- .book-font-controls__button:hover,
142
- .book-font-controls__button:focus-visible {
143
- background: color-mix(in srgb, var(--ts-color-info-soft) 66%, white 34%);
144
- color: var(--ts-color-info-text);
145
- }
146
-
147
- .book-font-controls__button::after {
148
- content: attr(data-book-font-tooltip);
149
- position: absolute;
150
- inset-inline-start: 50%;
151
- inset-block-start: calc(100% + 0.45rem);
152
- transform: translateX(-50%) translateY(-0.2rem);
153
- padding: 0.3rem 0.5rem;
154
- border: 1px solid var(--ts-color-border-strong);
155
- border-radius: 0.45rem;
156
- background: color-mix(in srgb, var(--ts-color-canvas-subtle) 88%, white 12%);
157
- color: var(--ts-color-text);
158
- font-size: 0.76rem;
159
- font-weight: 700;
160
- letter-spacing: 0.04em;
161
- text-transform: uppercase;
162
- white-space: nowrap;
163
- opacity: 0;
164
- pointer-events: none;
165
- transition:
166
- opacity 140ms ease,
167
- transform 140ms ease;
168
- }
169
-
170
- .book-font-controls__button:hover::after,
171
- .book-font-controls__button:focus-visible::after {
172
- opacity: 1;
173
- transform: translateX(-50%) translateY(0);
174
- }
175
-
176
- .book-font-controls__button:disabled {
177
- opacity: 0.45;
178
- cursor: not-allowed;
179
- }
180
- </style>
@@ -1,88 +0,0 @@
1
- ---
2
- interface Props {
3
- side: 'left' | 'right';
4
- label: string;
5
- }
6
-
7
- const { side, label } = Astro.props;
8
-
9
- const sidebarId = side === 'left' ? 'starlight__sidebar' : 'starlight__page-toc';
10
- const iconPath =
11
- side === 'left'
12
- ? 'M15.75 19.5 8.25 12l7.5-7.5'
13
- : 'M8.25 4.5 15.75 12l-7.5 7.5';
14
- ---
15
-
16
- <button
17
- type="button"
18
- class="desktop-sidebar-toggle"
19
- data-docs-sidebar-toggle={side}
20
- data-label={label}
21
- aria-controls={sidebarId}
22
- aria-expanded="false"
23
- >
24
- <span class="desktop-sidebar-toggle__icon" aria-hidden="true">
25
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
26
- <path d={iconPath} />
27
- </svg>
28
- </span>
29
- <span class="desktop-sidebar-toggle__text">{label}</span>
30
- </button>
31
-
32
- <style>
33
- @layer starlight.components {
34
- .desktop-sidebar-toggle {
35
- display: none;
36
- }
37
-
38
- @media (min-width: 72rem) {
39
- .desktop-sidebar-toggle {
40
- display: inline-flex;
41
- align-items: center;
42
- gap: 0.45rem;
43
- border: 1px solid var(--sl-color-hairline);
44
- border-radius: 999px;
45
- padding: 0.45rem 0.8rem;
46
- background: color-mix(in srgb, var(--ts-color-canvas-subtle) 84%, white 16%);
47
- color: var(--ts-color-text-muted);
48
- font-size: 0.85rem;
49
- line-height: 1;
50
- transition:
51
- background-color 160ms ease,
52
- border-color 160ms ease,
53
- color 160ms ease;
54
- }
55
-
56
- .desktop-sidebar-toggle:hover,
57
- .desktop-sidebar-toggle:focus-visible {
58
- background: color-mix(in srgb, var(--ts-color-info-soft) 52%, white 48%);
59
- border-color: var(--ts-color-info);
60
- color: var(--ts-color-text);
61
- }
62
-
63
- .desktop-sidebar-toggle[aria-expanded='true'] {
64
- background: color-mix(in srgb, var(--ts-color-info-soft) 68%, white 32%);
65
- border-color: var(--ts-color-info);
66
- color: var(--ts-color-text);
67
- }
68
-
69
- .desktop-sidebar-toggle__icon {
70
- display: inline-flex;
71
- align-items: center;
72
- justify-content: center;
73
- width: 1rem;
74
- height: 1rem;
75
- }
76
-
77
- .desktop-sidebar-toggle__icon svg {
78
- width: 1rem;
79
- height: 1rem;
80
- fill: none;
81
- stroke: currentColor;
82
- stroke-width: 1.8;
83
- stroke-linecap: round;
84
- stroke-linejoin: round;
85
- }
86
- }
87
- }
88
- </style>
@@ -1,34 +0,0 @@
1
- ---
2
- import { getDocsDownloadForPath } from '../../utils/starlight-nav';
3
-
4
- const download = getDocsDownloadForPath(Astro.url.pathname);
5
- ---
6
-
7
- {
8
- download && (
9
- <a
10
- href={download.downloadHref}
11
- download={download.downloadFileName}
12
- aria-label={download.downloadTitle}
13
- class="download-button docs-download-button print:hidden"
14
- >
15
- <svg
16
- xmlns="http://www.w3.org/2000/svg"
17
- width="16"
18
- height="16"
19
- viewBox="0 0 24 24"
20
- fill="none"
21
- stroke="currentColor"
22
- stroke-width="2"
23
- stroke-linecap="round"
24
- stroke-linejoin="round"
25
- aria-hidden="true"
26
- >
27
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
28
- <polyline points="7 10 12 15 17 10" />
29
- <line x1="12" x2="12" y1="15" y2="3" />
30
- </svg>
31
- <span>Download Book</span>
32
- </a>
33
- )
34
- }
@@ -1,112 +0,0 @@
1
- ---
2
- import EditLink from '../../vendor/starlight/components/EditLink.astro';
3
- import LastUpdated from '../../vendor/starlight/components/LastUpdated.astro';
4
- import Pagination from '../../vendor/starlight/components/Pagination.astro';
5
- import config from 'virtual:starlight/user-config';
6
- import PublicFooter from '../ui/shell/PublicFooter.astro';
7
- import DevWatchReload from '../DevWatchReload.astro';
8
- ---
9
-
10
- <div class="docs-footer-shell">
11
- <div class="docs-footer-page-band">
12
- <div class="docs-footer-page-inner">
13
- <div class="docs-footer-page-meta">
14
- <EditLink />
15
- <LastUpdated />
16
- </div>
17
- <Pagination />
18
- {
19
- config.credits && (
20
- <p class="docs-footer-credits">
21
- Built with <a href="https://starlight.astro.build">Starlight</a>
22
- </p>
23
- )
24
- }
25
- </div>
26
- </div>
27
-
28
- <PublicFooter currentPath={Astro.url.pathname} />
29
- <DevWatchReload />
30
- </div>
31
-
32
- <style>
33
- @layer starlight.core {
34
- .docs-footer-shell {
35
- margin-top: 4rem;
36
- width: 100%;
37
- }
38
-
39
- .docs-footer-page-inner,
40
- .docs-footer-shell :global(.ts-public-footer__inner) {
41
- width: min(100%, var(--ts-content-width));
42
- margin-inline: auto;
43
- padding-inline: 1rem;
44
- }
45
-
46
- .docs-footer-page-band {
47
- padding-bottom: 2.5rem;
48
- }
49
-
50
- .docs-footer-page-inner {
51
- display: grid;
52
- gap: 1.5rem;
53
- }
54
-
55
- :global(:root[data-docs-book-page='true']) .docs-footer-page-inner {
56
- max-width: var(--docs-book-panel-width);
57
- }
58
-
59
- :global(:root[data-docs-book-page='true']) .docs-footer-page-inner .pagination-links > :only-child {
60
- max-width: min(28rem, 100%);
61
- margin-inline: auto;
62
- }
63
-
64
- .docs-footer-page-meta {
65
- display: flex;
66
- flex-wrap: wrap;
67
- gap: 0.75rem 3rem;
68
- justify-content: space-between;
69
- margin-top: 3rem;
70
- font-size: var(--sl-text-sm);
71
- color: var(--sl-color-gray-3);
72
- }
73
-
74
- .docs-footer-page-meta :global(p:only-child) {
75
- margin-inline-start: auto;
76
- }
77
-
78
- .docs-footer-credits {
79
- margin: 0 auto;
80
- font-size: var(--sl-text-xs);
81
- color: var(--sl-color-gray-3);
82
- }
83
-
84
- .docs-footer-credits a {
85
- color: inherit;
86
- text-decoration: none;
87
- }
88
-
89
- .docs-footer-credits a:hover,
90
- .docs-footer-credits a:focus-visible {
91
- color: var(--sl-color-white);
92
- }
93
-
94
- .docs-footer-shell :global(.ts-public-footer) {
95
- margin-top: 0;
96
- }
97
-
98
- @media (min-width: 40rem) {
99
- .docs-footer-page-inner,
100
- .docs-footer-shell :global(.ts-public-footer__inner) {
101
- padding-inline: 1.5rem;
102
- }
103
- }
104
-
105
- @media (min-width: 64rem) {
106
- .docs-footer-page-inner,
107
- .docs-footer-shell :global(.ts-public-footer__inner) {
108
- padding-inline: 2rem;
109
- }
110
- }
111
- }
112
- </style>