@knitli/docs-components 1.1.1 → 1.1.3

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 (75) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +6 -6
  3. package/dist/assets/logos/Thread_vector_mono_aubergine.svg +41 -0
  4. package/dist/assets/logos/Thread_vector_mono_copper.svg +41 -0
  5. package/dist/assets/logos/Thread_vector_mono_parchment.svg +41 -0
  6. package/dist/assets/logos/codeweaver-primary.svg +103 -0
  7. package/dist/assets/logos/codeweaver-reverse.svg +103 -0
  8. package/dist/assets/logos/headline_logo.webp +0 -0
  9. package/dist/assets/logos/headline_logo_dark.png +0 -0
  10. package/dist/assets/logos/headline_logo_dark.webp +0 -0
  11. package/dist/assets/logos/index.d.ts +36 -0
  12. package/dist/assets/logos/index.d.ts.map +1 -0
  13. package/dist/assets/logos/index.js +27 -0
  14. package/dist/assets/logos/knitli_logo.svg +143 -0
  15. package/dist/assets/logos/knitli_wordmark.svg +118 -0
  16. package/dist/assets/logos/recoco-med.webp +0 -0
  17. package/dist/assets/logos/recoco-sm.webp +0 -0
  18. package/dist/assets/logos/recoco-xl.webp +0 -0
  19. package/dist/assets/styles/codeweaver-theme.css +570 -0
  20. package/dist/assets/styles/global.css +166 -0
  21. package/dist/assets/styles/index.d.ts +15 -0
  22. package/dist/assets/styles/index.d.ts.map +1 -0
  23. package/dist/assets/styles/index.js +14 -0
  24. package/dist/assets/styles/knitli-theme.css +215 -0
  25. package/dist/assets/styles/textures.css +668 -0
  26. package/dist/assets/styles/typography.css +262 -0
  27. package/dist/assets/styles/variables.css +238 -0
  28. package/dist/index.d.ts +40 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +36 -0
  31. package/dist/styles/index.d.ts +2 -0
  32. package/dist/styles/index.d.ts.map +1 -0
  33. package/dist/styles/index.js +2 -0
  34. package/dist/types/index.d.ts +35 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +7 -0
  37. package/package.json +49 -49
  38. package/scripts/copy-assets.mjs +37 -0
  39. package/scripts/copy-dist-assets.mjs +30 -0
  40. package/src/assets/asset-types.d.ts +29 -0
  41. package/src/assets/logos/Thread_vector_mono_aubergine.svg +41 -0
  42. package/src/assets/logos/Thread_vector_mono_copper.svg +41 -0
  43. package/src/assets/logos/Thread_vector_mono_parchment.svg +41 -0
  44. package/src/assets/logos/codeweaver-primary.svg +103 -0
  45. package/src/assets/logos/codeweaver-reverse.svg +103 -0
  46. package/src/assets/logos/headline_logo.webp +0 -0
  47. package/src/assets/logos/headline_logo_dark.png +0 -0
  48. package/src/assets/logos/headline_logo_dark.webp +0 -0
  49. package/src/assets/logos/index.ts +43 -0
  50. package/src/assets/logos/knitli_logo.svg +143 -0
  51. package/src/assets/logos/knitli_wordmark.svg +118 -0
  52. package/src/assets/logos/recoco-med.webp +0 -0
  53. package/src/assets/logos/recoco-sm.webp +0 -0
  54. package/src/assets/logos/recoco-xl.webp +0 -0
  55. package/src/assets/styles/codeweaver-theme.css +570 -0
  56. package/src/assets/styles/global.css +166 -0
  57. package/src/assets/styles/index.ts +26 -0
  58. package/src/assets/styles/knitli-theme.css +215 -0
  59. package/src/assets/styles/textures.css +668 -0
  60. package/src/assets/styles/typography.css +262 -0
  61. package/src/assets/styles/variables.css +238 -0
  62. package/src/components/DocsBreadcrumb.astro +74 -74
  63. package/src/components/Footer.astro +252 -214
  64. package/src/components/PageFrame.astro +118 -111
  65. package/src/index.d.ts +32 -0
  66. package/src/index.ts +46 -6
  67. package/src/styles/custom.css +73 -0
  68. package/src/styles/custom.d.css.ts +8 -0
  69. package/src/styles/index.ts +3 -0
  70. package/src/types/index.ts +2 -45
  71. package/src/assets/logos/README.md +0 -180
  72. package/src/components/DocsFooter.astro +0 -8
  73. package/src/components/DocsHeader.astro +0 -8
  74. package/src/styles/docs-theme.css +0 -682
  75. package/src/styles/variables.css +0 -200
@@ -10,32 +10,31 @@
10
10
  // Usage in astro.config.mjs:
11
11
  // starlight({ components: { PageFrame: '@knitli/docs-components/PageFrame.astro' } })
12
12
  //
13
- // Required env variable: PUBLIC_DOCS_PRODUCT = 'ReCoco' | 'CodeWeaver' | 'Thread'
13
+ // Required env variable: PUBLIC_DOCS_PRODUCT = 'Recoco' | 'CodeWeaver' | 'Thread'
14
14
  // The --sl-subnav-height CSS variable defaults to 2rem if not set in customCss.
15
15
 
16
16
  // @ts-expect-error: virtual:starlight/components/* are typed in virtual-internal.d.ts,
17
17
  // which is not in Starlight's public exports map
18
- import MobileMenuToggle from 'virtual:starlight/components/MobileMenuToggle';
19
- import DocsBreadcrumb from './DocsBreadcrumb.astro';
18
+ import MobileMenuToggle from "virtual:starlight/components/MobileMenuToggle";
19
+ import DocsBreadcrumb from "./DocsBreadcrumb.astro";
20
20
 
21
21
  const { hasSidebar } = Astro.locals.starlightRoute;
22
22
 
23
23
  const product = import.meta.env.PUBLIC_DOCS_PRODUCT as
24
- | 'ReCoco'
25
- | 'CodeWeaver'
26
- | 'Thread'
24
+ | "Recoco"
25
+ | "CodeWeaver"
26
+ | "Thread"
27
27
  | undefined;
28
28
 
29
29
  // Strip the configured base URL to get the within-product path for the breadcrumb.
30
- // e.g. for base='/ReCoco/' and pathname='/ReCoco/guide/start', path = 'guide/start'
31
- const basePath = (import.meta.env.BASE_URL ?? '/').replace(/\/?$/, '/');
30
+ // e.g. for base='/Recoco/' and pathname='/Recoco/guide/start', path = 'guide/start'
31
+ const basePath = (import.meta.env.BASE_URL ?? "/").replace(/\/?$/, "/");
32
32
  const currentPath = Astro.url.pathname
33
33
  .slice(basePath.length)
34
- .replace(/^\//, '');
34
+ .replace(/^\//, "");
35
35
  ---
36
36
 
37
37
  <div class="page sl-flex">
38
-
39
38
  <nav class="knitli-subnav sl-flex" aria-label="Knitli">
40
39
  {product && (
41
40
  <div class="subnav-breadcrumb">
@@ -53,7 +52,9 @@ const currentPath = Astro.url.pathname
53
52
  </div>
54
53
  </nav>
55
54
 
56
- <header class="header"><slot name="header" /></header>
55
+ <header class="header">
56
+ <slot name="header"/>
57
+ </header>
57
58
 
58
59
  {
59
60
  hasSidebar && (
@@ -68,123 +69,129 @@ const currentPath = Astro.url.pathname
68
69
  )
69
70
  }
70
71
 
71
- <div class="main-frame"><slot /></div>
72
+ <div class="main-frame">
73
+ <slot/>
74
+ </div>
72
75
  </div>
73
76
 
74
77
  <style>
75
- @layer starlight.core {
76
- /* Replicated from Starlight's PageFrame — only positional values modified */
77
- .page {
78
- flex-direction: column;
79
- min-height: 100vh;
80
- }
78
+ @layer starlight.core {
79
+ /* Replicated from Starlight's PageFrame — only positional values modified */
80
+ .page {
81
+ flex-direction: column;
82
+ min-height: 100vh;
83
+ }
81
84
 
82
- .header {
83
- z-index: var(--sl-z-index-navbar);
84
- position: fixed;
85
- inset-inline-start: 0;
86
- inset-block-start: var(--sl-subnav-height, 2rem); /* offset below subnav */
87
- width: 100%;
88
- height: var(--sl-nav-height);
89
- border-bottom: 1px solid var(--sl-color-hairline-shade);
90
- padding: var(--sl-nav-pad-y) var(--sl-nav-pad-x);
91
- padding-inline-end: var(--sl-nav-pad-x);
92
- background-color: var(--sl-color-bg-nav);
93
- }
85
+ .header {
86
+ z-index: var(--sl-z-index-navbar);
87
+ position: fixed;
88
+ inset-inline-start: 0;
89
+ inset-block-start: var(--sl-subnav-height, 2rem); /* offset below subnav */
90
+ width: 100%;
91
+ height: var(--sl-nav-height);
92
+ border-bottom: 1px solid var(--sl-color-hairline-shade);
93
+ padding: var(--sl-nav-pad-y) var(--sl-nav-pad-x);
94
+ padding-inline-end: var(--sl-nav-pad-x);
95
+ background-color: var(--sl-color-bg-nav);
96
+ }
94
97
 
95
- :global([data-has-sidebar]) .header {
96
- padding-inline-end: calc(
97
- var(--sl-nav-gap) + var(--sl-nav-pad-x) + var(--sl-menu-button-size)
98
- );
99
- }
98
+ :global([data-has-sidebar]) .header {
99
+ padding-inline-end: calc(
100
+ var(--sl-nav-gap) +
101
+ var(--sl-nav-pad-x) +
102
+ var(--sl-menu-button-size)
103
+ );
104
+ }
100
105
 
101
- .sidebar-pane {
102
- visibility: var(--sl-sidebar-visibility, hidden);
103
- position: fixed;
104
- z-index: var(--sl-z-index-menu);
105
- inset-block: calc(var(--sl-nav-height) + var(--sl-subnav-height, 2rem)) 0;
106
- inset-inline-start: 0;
107
- width: 100%;
108
- background-color: var(--sl-color-black);
109
- overflow-y: auto;
110
- }
106
+ .sidebar-pane {
107
+ visibility: var(--sl-sidebar-visibility, hidden);
108
+ position: fixed;
109
+ z-index: var(--sl-z-index-menu);
110
+ inset-block: calc(var(--sl-nav-height) + var(--sl-subnav-height, 2rem)) 0;
111
+ inset-inline-start: 0;
112
+ width: 100%;
113
+ background-color: var(--sl-color-black);
114
+ overflow-y: auto;
115
+ }
111
116
 
112
- :global([aria-expanded='true']) ~ .sidebar-pane {
113
- --sl-sidebar-visibility: visible;
114
- }
117
+ :global([aria-expanded="true"]) ~ .sidebar-pane {
118
+ --sl-sidebar-visibility: visible;
119
+ }
115
120
 
116
- .sidebar-content {
117
- height: 100%;
118
- min-height: max-content;
119
- padding: 1rem var(--sl-sidebar-pad-x) 0;
120
- flex-direction: column;
121
- gap: 1rem;
122
- }
121
+ .sidebar-content {
122
+ height: 100%;
123
+ min-height: max-content;
124
+ padding: 1rem var(--sl-sidebar-pad-x) 0;
125
+ flex-direction: column;
126
+ gap: 1rem;
127
+ }
123
128
 
124
- @media (min-width: 50rem) {
125
- .sidebar-content::after {
126
- content: '';
127
- padding-bottom: 1px;
128
- }
129
+ @media (min-width: 50rem) {
130
+ .sidebar-content::after {
131
+ content: "";
132
+ padding-bottom: 1px;
129
133
  }
134
+ }
130
135
 
131
- .main-frame {
132
- padding-top: calc(
133
- var(--sl-nav-height) + var(--sl-subnav-height, 2rem) + var(--sl-mobile-toc-height)
134
- );
135
- padding-inline-start: var(--sl-content-inline-start);
136
- }
136
+ .main-frame {
137
+ padding-top: calc(
138
+ var(--sl-nav-height) +
139
+ var(--sl-subnav-height, 2rem) +
140
+ var(--sl-mobile-toc-height)
141
+ );
142
+ padding-inline-start: var(--sl-content-inline-start);
143
+ }
137
144
 
138
- @media (min-width: 50rem) {
139
- :global([data-has-sidebar]) .header {
140
- padding-inline-end: var(--sl-nav-pad-x);
141
- }
142
- .sidebar-pane {
143
- --sl-sidebar-visibility: visible;
144
- width: var(--sl-sidebar-width);
145
- background-color: var(--sl-color-bg-sidebar);
146
- border-inline-end: 1px solid var(--sl-color-hairline-shade);
147
- }
145
+ @media (min-width: 50rem) {
146
+ :global([data-has-sidebar]) .header {
147
+ padding-inline-end: var(--sl-nav-pad-x);
148
148
  }
149
-
150
- /* Knitli cross-site subnav */
151
- .knitli-subnav {
152
- position: fixed;
153
- inset-block-start: 0;
154
- inset-inline-start: 0;
155
- width: 100%;
156
- height: var(--sl-subnav-height, 2rem);
157
- z-index: var(--sl-z-index-navbar);
158
- background-color: var(--sl-color-bg-nav);
159
- padding-inline: var(--sl-nav-pad-x);
160
- justify-content: space-between;
161
- align-items: center;
162
- gap: 1rem;
149
+ .sidebar-pane {
150
+ --sl-sidebar-visibility: visible;
151
+ width: var(--sl-sidebar-width);
152
+ background-color: var(--sl-color-bg-sidebar);
153
+ border-inline-end: 1px solid var(--sl-color-hairline-shade);
163
154
  }
155
+ }
164
156
 
165
- .subnav-breadcrumb {
166
- flex: 1;
167
- min-width: 0; /* allows breadcrumb to shrink and truncate */
168
- overflow: hidden;
169
- }
157
+ /* Knitli cross-site subnav */
158
+ .knitli-subnav {
159
+ position: fixed;
160
+ inset-block-start: 0;
161
+ inset-inline-start: 0;
162
+ width: 100%;
163
+ height: var(--sl-subnav-height, 2rem);
164
+ z-index: var(--sl-z-index-navbar);
165
+ background-color: var(--sl-color-bg-nav);
166
+ padding-inline: var(--sl-nav-pad-x);
167
+ justify-content: space-between;
168
+ align-items: center;
169
+ gap: 1rem;
170
+ }
170
171
 
171
- .subnav-links {
172
- gap: 1.25rem;
173
- align-items: center;
174
- flex-shrink: 0;
175
- margin-inline-start: auto;
176
- }
172
+ .subnav-breadcrumb {
173
+ flex: 1;
174
+ min-width: 0; /* allows breadcrumb to shrink and truncate */
175
+ overflow: hidden;
176
+ }
177
177
 
178
- .subnav-link {
179
- font-size: var(--sl-text-xs);
180
- color: var(--sl-color-gray-3);
181
- text-decoration: none;
182
- transition: color 0.2s ease;
183
- white-space: nowrap;
184
- }
178
+ .subnav-links {
179
+ gap: 1.25rem;
180
+ align-items: center;
181
+ flex-shrink: 0;
182
+ margin-inline-start: auto;
183
+ }
185
184
 
186
- .subnav-link:hover {
187
- color: var(--sl-color-white);
188
- }
185
+ .subnav-link {
186
+ font-size: var(--sl-text-xs);
187
+ color: var(--sl-color-gray-3);
188
+ text-decoration: none;
189
+ transition: color 0.2s ease;
190
+ white-space: nowrap;
191
+ }
192
+
193
+ .subnav-link:hover {
194
+ color: var(--sl-color-white);
189
195
  }
196
+ }
190
197
  </style>
package/src/index.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ export type Components = {
2
+ DocsBreadcrumb: () => Promise<
3
+ typeof import("./components/DocsBreadcrumb.astro")
4
+ >;
5
+ DocsFooter: () => Promise<typeof import("./components/Footer.astro")>;
6
+ PageFrame: () => Promise<typeof import("./components/PageFrame.astro")>;
7
+ };
8
+
9
+ export type DocsAssets = {
10
+ knitliLogo: string;
11
+ recocoLogoMed: string;
12
+ recocoLogoSm: string;
13
+ recocoLogoXl: string;
14
+ codeweaverPrimary: string;
15
+ codeweaverReverse: string;
16
+ codeweaverTheme: string;
17
+ variables: string;
18
+ threadLogoDark: string;
19
+ threadLogoLight: string;
20
+ headlineLogoDark: string;
21
+ headlineLogoLight: string;
22
+ knitliWordmark: string;
23
+ docsStyle: string;
24
+ };
25
+
26
+ export type DocsComponentsPackage = Components & {
27
+ DocsAssets: DocsAssets;
28
+ };
29
+
30
+ declare const DocsComponents: DocsComponentsPackage;
31
+
32
+ export default DocsComponents;
package/src/index.ts CHANGED
@@ -6,10 +6,50 @@
6
6
  // Main exports for @knitli/docs-components package
7
7
 
8
8
  // Export type definitions
9
- export * from './types/index.js';
9
+ export * from "./types/index.js";
10
10
 
11
- // Components are exported via package.json exports field
12
- // Import them directly:
13
- // import DocsHeader from '@knitli/docs-components/DocsHeader.astro';
14
- // import DocsFooter from '@knitli/docs-components/DocsFooter.astro';
15
- // import DocsBreadcrumb from '@knitli/docs-components/DocsBreadcrumb.astro';
11
+ import {
12
+ codeweaverPrimary,
13
+ codeweaverReverse,
14
+ headlineLogoDark,
15
+ headlineLogoLight,
16
+ knitliLogo,
17
+ knitliWordmark,
18
+ recocoLogoMed,
19
+ recocoLogoSm,
20
+ recocoLogoXl,
21
+ threadLogoDark,
22
+ threadLogoLight,
23
+ } from "./assets/logos/index.js";
24
+
25
+ import { codeweaverTheme, variables } from "./assets/styles/index.js";
26
+
27
+ import { docsStyle } from "./styles/index.js";
28
+
29
+ export const DocsAssets = {
30
+ knitliLogo,
31
+ recocoLogoMed,
32
+ recocoLogoSm,
33
+ recocoLogoXl,
34
+ codeweaverPrimary,
35
+ codeweaverReverse,
36
+ codeweaverTheme,
37
+ variables,
38
+ threadLogoDark,
39
+ threadLogoLight,
40
+ headlineLogoDark,
41
+ headlineLogoLight,
42
+ knitliWordmark,
43
+ docsStyle,
44
+ };
45
+
46
+ const components = {
47
+ DocsBreadcrumb: async () => await import("./components/DocsBreadcrumb.astro"),
48
+ DocsFooter: async () => await import("./components/Footer.astro"),
49
+ PageFrame: async () => await import("./components/PageFrame.astro"),
50
+ };
51
+
52
+ export default {
53
+ ...components,
54
+ DocsAssets,
55
+ };
@@ -0,0 +1,73 @@
1
+ /* Custom styles for docs-home - Override Knitli global styles */
2
+ /* Reset body to use Starlight defaults instead of Knitli's parchment background */
3
+ body {
4
+ background: var(--sl-color-bg) !important;
5
+ font-family:
6
+ "DM Mono", "Roboto Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace !important;
7
+ color: var(--sl-color-text) !important;
8
+ }
9
+
10
+ /* Ensure main content panel uses Starlight theme colors */
11
+ .content-panel {
12
+ background-color: var(--sl-color-bg-nav) !important;
13
+ }
14
+
15
+ /* Ensure page background respects Starlight theme, and fills viewport height */
16
+ .page {
17
+ background-color: var(--sl-color-bg) !important;
18
+ min-height: 100dvh !important;
19
+ flex-direction: column !important;
20
+ }
21
+
22
+ /* Make the main frame grow to push footer to bottom on short pages */
23
+ .main-frame {
24
+ flex: 1 !important;
25
+ display: flex !important;
26
+ flex-direction: column !important;
27
+ background-color: var(--sl-color-bg-nav);
28
+ }
29
+
30
+ .main-frame > main {
31
+ flex: 1 !important;
32
+ }
33
+
34
+ /* Splash page hero - keep transparent but ensure text uses Starlight colors */
35
+ .splash .hero {
36
+ background-color: transparent;
37
+ color: var(--sl-color-text) !important;
38
+ }
39
+
40
+ /* Dark mode colors. */
41
+ :root {
42
+ --font-sans:
43
+ "DM Mono", "Roboto Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace;
44
+ --font-mono: "JetBrains Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace;
45
+ --sl-subnav-height: 2rem;
46
+
47
+ --sl-color-accent-low: #3d170d;
48
+ --sl-color-accent: #ba3100;
49
+ --sl-color-accent-high: #eebbad;
50
+ --sl-color-white: #ffffff;
51
+ --sl-color-gray-1: #efedef;
52
+ --sl-color-gray-2: #cac7ca;
53
+ --sl-color-gray-3: #a8a2a7;
54
+ --sl-color-gray-4: #5c565a;
55
+ --sl-color-gray-5: #3b363a;
56
+ --sl-color-gray-6: #2a2529;
57
+ --sl-color-black: #1a1719;
58
+ }
59
+ /* Light mode colors. */
60
+ :root[data-theme="light"] {
61
+ --sl-color-accent-low: #f4cdc2;
62
+ --sl-color-accent: #982600;
63
+ --sl-color-accent-high: #581b0b;
64
+ --sl-color-white: #1a1719;
65
+ --sl-color-gray-1: #2a2529;
66
+ --sl-color-gray-2: #3b363a;
67
+ --sl-color-gray-3: #5c565a;
68
+ --sl-color-gray-4: #8f898e;
69
+ --sl-color-gray-5: #c4c1c3;
70
+ --sl-color-gray-6: #efedef;
71
+ --sl-color-gray-7: #f7f6f7;
72
+ --sl-color-black: #ffffff;
73
+ }
@@ -0,0 +1,8 @@
1
+ // Type definitions for custom.css
2
+
3
+ // This file is necessary to allow importing CSS files in TypeScript without errors.
4
+
5
+ declare module "*.css" {
6
+ const content: string;
7
+ export default content;
8
+ }
@@ -0,0 +1,3 @@
1
+ import DocsStyle from "#style/custom.css";
2
+
3
+ export const docsStyle = DocsStyle;
@@ -8,7 +8,7 @@
8
8
  /**
9
9
  * Supported Knitli products for documentation
10
10
  */
11
- export type ProductName = 'ReCoco' | 'CodeWeaver' | 'Thread';
11
+ export type ProductName = "Recoco" | "CodeWeaver" | "Thread";
12
12
 
13
13
  /**
14
14
  * Site URLs configuration
@@ -19,49 +19,6 @@ export interface SiteUrls {
19
19
  docs: string;
20
20
  }
21
21
 
22
- /**
23
- * Props for DocsHeader component
24
- */
25
- export interface DocsHeaderProps {
26
- /**
27
- * Current product being documented
28
- */
29
- currentProduct?: ProductName;
30
-
31
- /**
32
- * Current URL path
33
- */
34
- currentPath?: string;
35
-
36
- /**
37
- * URL to the product's documentation home
38
- */
39
- productUrl?: string;
40
-
41
- /**
42
- * Whether to show breadcrumb navigation
43
- * @default true
44
- */
45
- showBreadcrumb?: boolean;
46
-
47
- /**
48
- * Visual variant of the header
49
- * @default 'default'
50
- */
51
- variant?: 'default' | 'minimal';
52
- }
53
-
54
- /**
55
- * Props for DocsFooter component
56
- */
57
- export interface DocsFooterProps {
58
- /**
59
- * Visual variant of the footer
60
- * @default 'default'
61
- */
62
- variant?: 'default' | 'minimal';
63
- }
64
-
65
22
  /**
66
23
  * Props for DocsBreadcrumb component
67
24
  */
@@ -85,5 +42,5 @@ export interface DocsBreadcrumbProps {
85
42
  * Visual variant of the breadcrumb
86
43
  * @default 'default'
87
44
  */
88
- variant?: 'default' | 'compact';
45
+ variant?: "default" | "compact";
89
46
  }