@knitli/docs-components 1.0.3 → 1.1.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.
package/CHANGELOG.md CHANGED
@@ -1,14 +1,10 @@
1
- # Changelog
1
+ ### Changelog
2
2
 
3
- All notable changes to this project will be documented in this file.
3
+ All notable changes to this project will be documented in this file. Dates are displayed in UTC.
4
4
 
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
+ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
7
6
 
8
- ## [Unreleased]
7
+ #### 1.0.4
9
8
 
10
- ### Added
11
- - Initial package structure
12
- - DocsHeader component with Knitli branding
13
- - Copper Archive CSS theme
14
- - Logo assets and usage guide
9
+ - chore: Updated licensing and README to clarify difference between Knitli brand assets (proprietary) and the rest of the project (MIT OR Apache-2.0).
10
+ - chore: Updated configuration and tsconfig
package/README.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # @knitli/docs-components
2
2
 
3
- Shared branded components for Knitli documentation sites. This package is **not licensed**, which means you cannot include its components in your project without Knitli's written authorization. For license inquiries, contact <license_request@knitli.com>
3
+ Shared branded components for Knitli documentation sites.
4
+
5
+ ## License
6
+
7
+ ### Knitli Brand Assets
8
+
9
+ This package includes Knitli brand assets, such as the Knitli logo. These are proprietary and not licensed. You may not use or modify them in any way without Knitli's written permission.
10
+
11
+ ### Other Materials
12
+
13
+ All other materials in this package are licensed under either the Apache-2.0 or MIT license. You can choose either.
4
14
 
5
15
  ## Installation
6
16
 
@@ -203,8 +213,4 @@ npm publish
203
213
 
204
214
  ## Changelog
205
215
 
206
- See [CHANGELOG.md](./CHANGELOG.md)
207
-
208
- ## License
209
-
210
- Not licensed.
216
+ See [CHANGELOG.md](./CHANGELOG.md)
package/package.json CHANGED
@@ -1,19 +1,34 @@
1
1
  {
2
2
  "author": "Knitli Inc.",
3
3
  "description": "Shared branded components for Knitli documentation sites",
4
+ "dependencies": {
5
+ "astro": "catalog:astro-core",
6
+ "lightningcss": "catalog:optimization",
7
+ "svgo": "catalog:optimization",
8
+ "@knitli/shared-layouts": "workspace:*",
9
+ "@knitli/shared-file-types": "workspace:*",
10
+ "@knitli/tsconfig": "workspace:*"
11
+
12
+ },
4
13
  "devDependencies": {
5
- "@types/node": "^24.0.0",
6
- "astro": "^5.17.0",
14
+ "astro": "catalog:astro-core",
7
15
  "auto-changelog": "^2.4.0",
8
- "typescript": "^5.3.0"
16
+ "typescript": "catalog:dev-common",
17
+ "bun": "catalog:dev-common",
18
+ "vitest": "catalog:dev-common",
19
+ "@biomejs/biome": "catalog:dev-common",
20
+ "@types/node": "catalog:types",
21
+ "@knitli/tsconfig": "*"
22
+ },
23
+ "engine": {
24
+ "node": "catalog:"
9
25
  },
10
26
  "exports": {
11
27
  ".": "./dist/index.js",
12
28
  "./DocsBreadcrumb.astro": "./src/components/DocsBreadcrumb.astro",
13
- "./DocsFooter.astro": "./src/components/DocsFooter.astro",
14
- "./DocsHeader.astro": "./src/components/DocsHeader.astro",
29
+ "./Footer.astro": "./src/components/Footer.astro",
30
+ "./PageFrame.astro": "./src/components/PageFrame.astro",
15
31
  "./logos/*": "./src/assets/logos/*",
16
- "./styles/copper.css": "./src/styles/copper-archive.css",
17
32
  "./styles/theme.css": "./src/styles/docs-theme.css",
18
33
  "./styles/variables.css": "./src/styles/variables.css"
19
34
  },
@@ -31,10 +46,11 @@
31
46
  "components",
32
47
  "starlight"
33
48
  ],
34
- "license": "LicenseRef-Not_Licensed",
49
+ "license": "(MIT OR Apache-2.0) AND LicenseRef-KnitliProprietary",
35
50
  "main": "./dist/index.js",
36
51
  "name": "@knitli/docs-components",
37
52
  "peerDependencies": {
53
+ "@astrojs/starlight": ">=0.30.0",
38
54
  "astro": "^5.0.0"
39
55
  },
40
56
  "repository": {
@@ -43,11 +59,12 @@
43
59
  "url": "git+https://github.com/knitli/knitli-site.git"
44
60
  },
45
61
  "scripts": {
46
- "build": "tsc",
62
+ "build": "bunx tsc",
47
63
  "prepublishOnly": "bun run build",
48
- "version": "auto-changelog -p && git add CHANGELOG.md"
64
+ "version": "auto-changelog -p && git add CHANGELOG.md",
65
+ "publish": "bun publish --access public"
49
66
  },
50
67
  "type": "module",
51
68
  "types": "./dist/index.d.ts",
52
- "version": "1.0.3"
69
+ "version": "1.1.0"
53
70
  }
@@ -3,19 +3,18 @@
3
3
  // SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
4
4
  //
5
5
  // SPDX-License-Identifier: MIT OR Apache-2.0
6
- //
7
- // Optional breadcrumb component for product-specific navigation
8
6
 
9
7
  interface Props {
10
8
  product?: 'ReCoco' | 'CodeWeaver' | 'Thread';
11
9
  productUrl?: string;
12
10
  path?: string;
13
- variant?: 'default' | 'compact';
11
+ /** 'inline' no padding, designed for embedding in a subnav bar */
12
+ variant?: 'default' | 'compact' | 'inline';
14
13
  }
15
14
 
16
15
  const {
17
16
  product,
18
- productUrl = product ? `/${product}` : '',
17
+ productUrl = '/',
19
18
  path = '',
20
19
  variant = 'default',
21
20
  } = Astro.props;
@@ -24,40 +23,39 @@ const {
24
23
  const segments = path
25
24
  .split('/')
26
25
  .filter(Boolean)
27
- .map((segment) => ({
26
+ .map((segment, index, all) => ({
28
27
  name: segment.replace(/-/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase()),
29
- path: segment,
28
+ href: `${productUrl}${all.slice(0, index + 1).join('/')}`,
29
+ isLast: index === all.length - 1,
30
30
  }));
31
31
  ---
32
32
 
33
33
  {product && (
34
34
  <nav
35
- class:list={['docs-breadcrumb-nav', { compact: variant === 'compact' }]}
35
+ class:list={['docs-breadcrumb-nav', variant]}
36
36
  aria-label="Breadcrumb"
37
37
  >
38
38
  <ol class="breadcrumb-list">
39
39
  <li class="breadcrumb-item">
40
- <a href="/">Documentation</a>
40
+ <a href="https://docs.knitli.com">Documentation</a>
41
41
  </li>
42
42
 
43
- <li class="breadcrumb-separator" aria-hidden="true">→</li>
43
+ <li class="breadcrumb-separator" aria-hidden="true">›</li>
44
44
 
45
45
  <li class="breadcrumb-item">
46
- {productUrl ? (
46
+ {segments.length > 0 ? (
47
47
  <a href={productUrl}>{product}</a>
48
48
  ) : (
49
- <span class="breadcrumb-current">{product}</span>
49
+ <span class="breadcrumb-current" aria-current="page">{product}</span>
50
50
  )}
51
51
  </li>
52
52
 
53
- {segments.map((segment, index) => (
53
+ {segments.map((segment) => (
54
54
  <>
55
- <li class="breadcrumb-separator" aria-hidden="true">→</li>
55
+ <li class="breadcrumb-separator" aria-hidden="true">›</li>
56
56
  <li class="breadcrumb-item">
57
- {index < segments.length - 1 ? (
58
- <a href={`${productUrl}/${segments.slice(0, index + 1).map((s) => s.path).join('/')}`}>
59
- {segment.name}
60
- </a>
57
+ {!segment.isLast ? (
58
+ <a href={segment.href}>{segment.name}</a>
61
59
  ) : (
62
60
  <span class="breadcrumb-current" aria-current="page">
63
61
  {segment.name}
@@ -71,83 +69,82 @@ const segments = path
71
69
  )}
72
70
 
73
71
  <style>
74
- :root {
75
- --docs-copper: oklch(0.58 0.08 50);
76
- --docs-slate: oklch(0.35 0.02 240);
77
- --docs-parchment: oklch(0.96 0.015 70);
72
+ .docs-breadcrumb-nav {
73
+ font-size: var(--sl-text-xs);
78
74
  }
79
75
 
80
- .docs-breadcrumb-nav {
76
+ .docs-breadcrumb-nav.default {
81
77
  padding: 1rem 0;
82
- font-family: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
83
78
  }
84
79
 
85
80
  .docs-breadcrumb-nav.compact {
86
81
  padding: 0.5rem 0;
87
82
  }
88
83
 
84
+ /* inline: no padding, fits inside a subnav bar */
85
+ .docs-breadcrumb-nav.inline {
86
+ padding: 0;
87
+ display: flex;
88
+ align-items: center;
89
+ height: 100%;
90
+ min-width: 0;
91
+ overflow: hidden;
92
+ }
93
+
89
94
  .breadcrumb-list {
90
95
  display: flex;
91
- flex-wrap: wrap;
96
+ flex-wrap: nowrap;
92
97
  align-items: center;
93
- gap: 0.5rem;
98
+ gap: 0.35rem;
94
99
  list-style: none;
95
100
  margin: 0;
96
101
  padding: 0;
102
+ min-width: 0;
103
+ overflow: hidden;
97
104
  }
98
105
 
99
106
  .breadcrumb-item {
100
- font-size: 0.875rem;
107
+ font-size: inherit;
108
+ white-space: nowrap;
109
+ overflow: hidden;
110
+ text-overflow: ellipsis;
111
+ }
112
+
113
+ /* Only ellipsis the last item — earlier ones can wrap/hide naturally */
114
+ .breadcrumb-item:last-child {
115
+ min-width: 0;
101
116
  }
102
117
 
103
118
  .breadcrumb-item a {
104
- color: var(--docs-slate);
119
+ color: var(--sl-color-gray-3);
105
120
  text-decoration: none;
106
- opacity: 0.7;
107
- transition: all 0.2s ease;
121
+ transition: color 0.15s ease;
108
122
  }
109
123
 
110
124
  .breadcrumb-item a:hover {
111
- opacity: 1;
112
- text-decoration: underline;
113
- color: var(--docs-copper);
125
+ color: var(--sl-color-gray-1);
126
+ text-decoration: none;
114
127
  }
115
128
 
116
129
  .breadcrumb-current {
117
- color: var(--docs-slate);
130
+ color: var(--sl-color-gray-2);
118
131
  font-weight: 500;
119
132
  }
120
133
 
121
134
  .breadcrumb-separator {
122
- color: var(--docs-slate);
123
- opacity: 0.4;
124
- font-size: 0.875rem;
125
- }
126
-
127
- /* Mobile Responsive */
128
- @media (max-width: 768px) {
129
- .breadcrumb-list {
130
- gap: 0.375rem;
131
- font-size: 0.8125rem;
132
- }
133
-
134
- .breadcrumb-item,
135
- .breadcrumb-separator {
136
- font-size: 0.8125rem;
137
- }
135
+ color: var(--sl-color-gray-5);
136
+ font-size: inherit;
137
+ flex-shrink: 0;
138
138
  }
139
139
 
140
- /* Accessibility */
141
140
  .breadcrumb-item a:focus-visible {
142
- outline: 3px solid var(--docs-copper);
143
- outline-offset: 4px;
144
- border-radius: 4px;
141
+ outline: 2px solid var(--sl-color-accent);
142
+ outline-offset: 2px;
143
+ border-radius: 2px;
145
144
  }
146
145
 
147
- /* Reduced motion */
148
146
  @media (prefers-reduced-motion: reduce) {
149
- * {
150
- animation-duration: 0.01ms !important;
147
+ .breadcrumb-item a {
151
148
  transition-duration: 0.01ms !important;
152
149
  }
153
150
  }
@@ -1,181 +1,8 @@
1
1
  ---
2
- // SPDX-FileCopyrightText: 2025 Knitli Inc.
3
- // SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
4
- //
5
- // SPDX-License-Identifier: MIT OR Apache-2.0
6
- //
7
- // Simple footer for Knitli documentation sites
8
-
9
- interface Props {
10
- variant?: 'default' | 'minimal';
11
- }
12
-
13
- const { variant = 'default' } = Astro.props;
14
-
15
- // Environment-aware URL configuration
16
- const isDev = import.meta.env.DEV;
17
-
18
- const getSiteUrls = () => {
19
- if (isDev) {
20
- return {
21
- marketing: import.meta.env.PUBLIC_MARKETING_URL || 'http://localhost:4321',
22
- blog: import.meta.env.PUBLIC_BLOG_URL || 'http://localhost:4322',
23
- docs: import.meta.env.PUBLIC_DOCS_URL || 'http://localhost:4323',
24
- };
25
- }
26
-
27
- return {
28
- marketing: 'https://knitli.com',
29
- blog: 'https://blog.knitli.com',
30
- docs: 'https://docs.knitli.com',
31
- };
32
- };
33
-
34
- const urls = getSiteUrls();
35
- const currentYear = new Date().getFullYear();
2
+ // DEPRECATED This component has been removed.
3
+ // Use Footer.astro instead:
4
+ // starlight({ components: { Footer: '@knitli/docs-components/Footer.astro' } })
5
+ throw new Error(
6
+ '@knitli/docs-components: DocsFooter has been removed. Use Footer.astro instead.'
7
+ );
36
8
  ---
37
-
38
- <footer class:list={['docs-footer', { minimal: variant === 'minimal' }]}>
39
- <div class="footer-content">
40
- {variant === 'default' && (
41
- <nav class="footer-nav" aria-label="Footer navigation">
42
- <a href={urls.marketing}>Main Site</a>
43
- <a href={urls.blog}>Blog</a>
44
- <a href="https://github.com/knitli" target="_blank" rel="noopener noreferrer">
45
- GitHub
46
- </a>
47
- <a href={`${urls.marketing}/privacy`}>Privacy</a>
48
- </nav>
49
- )}
50
-
51
- <div class="footer-legal">
52
- <p class="copyright">
53
- © {currentYear} <a href={urls.marketing}>Knitli Inc.</a> All rights reserved.
54
- </p>
55
- {variant === 'default' && (
56
- <p class="license">
57
- Documentation licensed under{' '}
58
- <a
59
- href="https://github.com/knitli/knitli-site/blob/main/LICENSE"
60
- target="_blank"
61
- rel="noopener noreferrer"
62
- >
63
- MIT OR Apache-2.0
64
- </a>
65
- </p>
66
- )}
67
- </div>
68
- </div>
69
- </footer>
70
-
71
- <style>
72
- :root {
73
- --docs-copper: oklch(0.58 0.08 50);
74
- --docs-slate: oklch(0.35 0.02 240);
75
- --docs-parchment: oklch(0.96 0.015 70);
76
- }
77
-
78
- .docs-footer {
79
- background: var(--docs-parchment);
80
- border-top: 1px solid oklch(0.85 0.01 50);
81
- margin-top: 4rem;
82
- padding: 2rem 0;
83
- }
84
-
85
- .docs-footer.minimal {
86
- margin-top: 2rem;
87
- padding: 1rem 0;
88
- }
89
-
90
- .footer-content {
91
- max-width: 1400px;
92
- margin: 0 auto;
93
- padding: 0 2rem;
94
- display: flex;
95
- flex-direction: column;
96
- gap: 1.5rem;
97
- align-items: center;
98
- }
99
-
100
- .footer-nav {
101
- display: flex;
102
- gap: 2rem;
103
- align-items: center;
104
- flex-wrap: wrap;
105
- justify-content: center;
106
- }
107
-
108
- .footer-nav a {
109
- font-family: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
110
- font-size: 0.875rem;
111
- color: var(--docs-slate);
112
- text-decoration: none;
113
- transition: color 0.2s ease;
114
- }
115
-
116
- .footer-nav a:hover {
117
- color: var(--docs-copper);
118
- }
119
-
120
- .footer-legal {
121
- display: flex;
122
- flex-direction: column;
123
- gap: 0.5rem;
124
- text-align: center;
125
- }
126
-
127
- .copyright,
128
- .license {
129
- font-family: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
130
- font-size: 0.8125rem;
131
- color: var(--docs-slate);
132
- opacity: 0.7;
133
- margin: 0;
134
- }
135
-
136
- .copyright a,
137
- .license a {
138
- color: inherit;
139
- text-decoration: none;
140
- transition: opacity 0.2s ease;
141
- }
142
-
143
- .copyright a:hover,
144
- .license a:hover {
145
- opacity: 1;
146
- text-decoration: underline;
147
- }
148
-
149
- /* Mobile Responsive */
150
- @media (max-width: 768px) {
151
- .footer-content {
152
- padding: 0 1rem;
153
- }
154
-
155
- .footer-nav {
156
- gap: 1rem;
157
- flex-direction: column;
158
- }
159
-
160
- .footer-legal {
161
- font-size: 0.75rem;
162
- }
163
- }
164
-
165
- /* Accessibility */
166
- .footer-nav a:focus-visible,
167
- .copyright a:focus-visible,
168
- .license a:focus-visible {
169
- outline: 3px solid var(--docs-copper);
170
- outline-offset: 4px;
171
- border-radius: 4px;
172
- }
173
-
174
- /* Reduced motion */
175
- @media (prefers-reduced-motion: reduce) {
176
- * {
177
- animation-duration: 0.01ms !important;
178
- transition-duration: 0.01ms !important;
179
- }
180
- }
181
- </style>