@ciderpress/ui 1.0.0-rc.1 → 1.0.0-rc.10
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/dist/index.d.ts +1 -1
- package/dist/index.mjs +4 -3
- package/dist/node.d.ts +1 -1
- package/dist/node.mjs +335 -51
- package/dist/plugins/mermaid/MermaidRenderer.tsx +49 -6
- package/dist/theme/components/footer/site-footer.tsx +68 -9
- package/dist/theme/components/home/feature-card.tsx +5 -8
- package/dist/theme/components/home/feature.tsx +31 -11
- package/dist/theme/components/home/hero-demo-custom.tsx +116 -0
- package/dist/theme/components/home/hero-demo.css +27 -0
- package/dist/theme/components/home/layout.tsx +149 -26
- package/dist/theme/components/home/split-visual-custom.tsx +26 -0
- package/dist/theme/components/home/workspaces.tsx +39 -3
- package/dist/theme/components/nav/branch-tag.tsx +7 -7
- package/dist/theme/components/nav/ciderpress-docs-bar.css +13 -1
- package/dist/theme/components/nav/ciderpress-docs-bar.tsx +33 -2
- package/dist/theme/components/nav/ciderpress-header.css +2 -1
- package/dist/theme/components/nav/ciderpress-header.tsx +26 -3
- package/dist/theme/components/nav/ciderpress-nav-hamburger.css +50 -0
- package/dist/theme/components/nav/ciderpress-nav-hamburger.tsx +95 -9
- package/dist/theme/components/nav/ciderpress-nav-menu.css +88 -0
- package/dist/theme/components/nav/ciderpress-nav-menu.tsx +397 -38
- package/dist/theme/components/nav/ciderpress-nav-social-links.tsx +27 -22
- package/dist/theme/components/nav/floating-branch-indicator.tsx +7 -7
- package/dist/theme/components/nav/header-icon.css +24 -0
- package/dist/theme/components/nav/header-icon.tsx +119 -0
- package/dist/theme/components/nav/header-logo.css +16 -0
- package/dist/theme/components/nav/header-logo.tsx +200 -0
- package/dist/theme/components/nav/layout.tsx +117 -16
- package/dist/theme/components/nav/nav-logo.tsx +16 -19
- package/dist/theme/components/openapi/index.ts +0 -2
- package/dist/theme/components/openapi/openapi.css +0 -14
- package/dist/theme/components/shared/card-icon.tsx +37 -0
- package/dist/theme/components/shared/ciderpress-logo.tsx +5 -1
- package/dist/theme/components/shared/icon.tsx +120 -35
- package/dist/theme/components/shared/resolve-card-icon.ts +53 -12
- package/dist/theme/components/shared/section-card.tsx +37 -6
- package/dist/theme/components/sidebar/sidebar-badge.css +50 -0
- package/dist/theme/components/sidebar/sidebar-badge.tsx +153 -0
- package/dist/theme/components/sidebar/sidebar-links.tsx +6 -2
- package/dist/theme/components/sidebar/sidebar-scope.tsx +24 -1
- package/dist/theme/components/theme-provider.tsx +27 -11
- package/dist/theme/components/workspaces/card.tsx +7 -9
- package/dist/theme/hooks/use-ciderpress.ts +65 -5
- package/dist/theme/hooks/use-nav-items.ts +82 -11
- package/dist/theme/index.tsx +5 -3
- package/dist/theme/lib/read-social-links.ts +4 -3
- package/dist/theme/lib/theme-favicon.ts +1 -1
- package/dist/theme/lib/with-mount-base.ts +31 -0
- package/dist/theme/styles/overrides/footnotes.css +54 -0
- package/dist/theme/styles/overrides/lists.css +83 -0
- package/dist/theme/styles/overrides/rail.css +27 -10
- package/dist/theme/styles/overrides/section-card.css +9 -0
- package/dist/theme/styles/overrides/sidebar.css +22 -0
- package/package.json +18 -16
- package/src/theme/components/footer/site-footer.tsx +68 -9
- package/src/theme/components/home/feature-card.tsx +5 -8
- package/src/theme/components/home/feature.tsx +31 -11
- package/src/theme/components/home/hero-demo-custom.tsx +116 -0
- package/src/theme/components/home/hero-demo.css +27 -0
- package/src/theme/components/home/layout.tsx +149 -26
- package/src/theme/components/home/split-visual-custom.tsx +26 -0
- package/src/theme/components/home/workspaces.tsx +39 -3
- package/src/theme/components/nav/branch-tag.tsx +7 -7
- package/src/theme/components/nav/ciderpress-docs-bar.css +13 -1
- package/src/theme/components/nav/ciderpress-docs-bar.tsx +33 -2
- package/src/theme/components/nav/ciderpress-header.css +2 -1
- package/src/theme/components/nav/ciderpress-header.tsx +26 -3
- package/src/theme/components/nav/ciderpress-nav-hamburger.css +50 -0
- package/src/theme/components/nav/ciderpress-nav-hamburger.tsx +95 -9
- package/src/theme/components/nav/ciderpress-nav-menu.css +88 -0
- package/src/theme/components/nav/ciderpress-nav-menu.tsx +397 -38
- package/src/theme/components/nav/ciderpress-nav-social-links.tsx +27 -22
- package/src/theme/components/nav/floating-branch-indicator.tsx +7 -7
- package/src/theme/components/nav/header-icon.css +24 -0
- package/src/theme/components/nav/header-icon.tsx +119 -0
- package/src/theme/components/nav/header-logo.css +16 -0
- package/src/theme/components/nav/header-logo.tsx +200 -0
- package/src/theme/components/nav/layout.tsx +117 -16
- package/src/theme/components/nav/nav-logo.tsx +16 -19
- package/src/theme/components/openapi/index.ts +0 -2
- package/src/theme/components/openapi/openapi.css +0 -14
- package/src/theme/components/shared/card-icon.tsx +37 -0
- package/src/theme/components/shared/ciderpress-logo.tsx +5 -1
- package/src/theme/components/shared/icon.tsx +120 -35
- package/src/theme/components/shared/resolve-card-icon.ts +53 -12
- package/src/theme/components/shared/section-card.tsx +37 -6
- package/src/theme/components/sidebar/sidebar-badge.css +50 -0
- package/src/theme/components/sidebar/sidebar-badge.tsx +153 -0
- package/src/theme/components/sidebar/sidebar-links.tsx +6 -2
- package/src/theme/components/sidebar/sidebar-scope.tsx +24 -1
- package/src/theme/components/theme-provider.tsx +27 -11
- package/src/theme/components/workspaces/card.tsx +7 -9
- package/src/theme/hooks/use-ciderpress.ts +65 -5
- package/src/theme/hooks/use-nav-items.ts +82 -11
- package/src/theme/index.tsx +5 -3
- package/src/theme/lib/read-social-links.ts +4 -3
- package/src/theme/lib/theme-favicon.ts +1 -1
- package/src/theme/lib/with-mount-base.ts +31 -0
- package/src/theme/styles/overrides/footnotes.css +54 -0
- package/src/theme/styles/overrides/lists.css +83 -0
- package/src/theme/styles/overrides/rail.css +27 -10
- package/src/theme/styles/overrides/section-card.css +9 -0
- package/src/theme/styles/overrides/sidebar.css +22 -0
- package/dist/theme/components/openapi/copy-markdown-button.tsx +0 -41
- package/src/theme/components/openapi/copy-markdown-button.tsx +0 -41
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { match } from 'massaman/match'
|
|
1
2
|
import { useState } from 'react'
|
|
2
3
|
import type React from 'react'
|
|
3
4
|
import { Dialog, Modal, ModalOverlay } from 'react-aria-components'
|
|
@@ -71,15 +72,12 @@ export function CiderpressNavHamburger(props: CiderpressNavHamburgerProps): Reac
|
|
|
71
72
|
</header>
|
|
72
73
|
|
|
73
74
|
<nav className="cp-nav-drawer__nav" aria-label="Primary">
|
|
74
|
-
{props.navItems.map((item) => (
|
|
75
|
-
<
|
|
76
|
-
key={item
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
>
|
|
81
|
-
{item.text}
|
|
82
|
-
</RouteLink>
|
|
75
|
+
{props.navItems.map((item, index) => (
|
|
76
|
+
<DrawerNavEntry
|
|
77
|
+
key={`${drawerItemKey(item)}::${index}`}
|
|
78
|
+
item={item}
|
|
79
|
+
onNavigate={() => setOpen(false)}
|
|
80
|
+
/>
|
|
83
81
|
))}
|
|
84
82
|
</nav>
|
|
85
83
|
|
|
@@ -110,3 +108,91 @@ export function CiderpressNavHamburger(props: CiderpressNavHamburgerProps): Reac
|
|
|
110
108
|
}
|
|
111
109
|
|
|
112
110
|
export { CiderpressNavHamburger as default }
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Render one entry in the mobile drawer nav. Leaf items are a single
|
|
114
|
+
* link; dropdown parents become a collapsible {@link DrawerNavGroup}.
|
|
115
|
+
*
|
|
116
|
+
* @private
|
|
117
|
+
* @param props - The nav item and a callback to close the drawer.
|
|
118
|
+
* @returns The drawer entry element.
|
|
119
|
+
*/
|
|
120
|
+
function DrawerNavEntry(props: {
|
|
121
|
+
readonly item: CiderpressNavMenuItem
|
|
122
|
+
readonly onNavigate: () => void
|
|
123
|
+
}): React.ReactElement {
|
|
124
|
+
const { item, onNavigate } = props
|
|
125
|
+
const children = item.items ?? []
|
|
126
|
+
return match(children.length > 0)
|
|
127
|
+
.with(true, () => <DrawerNavGroup item={item} onNavigate={onNavigate} />)
|
|
128
|
+
.otherwise(() => (
|
|
129
|
+
<RouteLink href={item.link ?? '#'} className="cp-nav-drawer__link" onClick={onNavigate}>
|
|
130
|
+
{item.text}
|
|
131
|
+
</RouteLink>
|
|
132
|
+
))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* A collapsible dropdown section in the mobile drawer: a tappable header
|
|
137
|
+
* that toggles its child links open/closed. Collapsed by default so a
|
|
138
|
+
* deep nav doesn't fill the drawer on open.
|
|
139
|
+
*
|
|
140
|
+
* @private
|
|
141
|
+
* @param props - The dropdown item and a callback to close the drawer.
|
|
142
|
+
* @returns The collapsible group element.
|
|
143
|
+
*/
|
|
144
|
+
function DrawerNavGroup(props: {
|
|
145
|
+
readonly item: CiderpressNavMenuItem
|
|
146
|
+
readonly onNavigate: () => void
|
|
147
|
+
}): React.ReactElement {
|
|
148
|
+
const { item, onNavigate } = props
|
|
149
|
+
const [expanded, setExpanded] = useState(false)
|
|
150
|
+
const children = item.items ?? []
|
|
151
|
+
return (
|
|
152
|
+
<div className="cp-nav-drawer__group" role="group" aria-label={item.text}>
|
|
153
|
+
<button
|
|
154
|
+
type="button"
|
|
155
|
+
className="cp-nav-drawer__group-toggle"
|
|
156
|
+
onClick={() => setExpanded((current) => !current)}
|
|
157
|
+
aria-expanded={expanded}
|
|
158
|
+
>
|
|
159
|
+
<span>{item.text}</span>
|
|
160
|
+
<Icon
|
|
161
|
+
className="cp-nav-drawer__group-chevron"
|
|
162
|
+
icon="pixelarticons:chevron-down"
|
|
163
|
+
width={16}
|
|
164
|
+
height={16}
|
|
165
|
+
/>
|
|
166
|
+
</button>
|
|
167
|
+
{expanded && (
|
|
168
|
+
<div className="cp-nav-drawer__group-items">
|
|
169
|
+
{children.map((child, index) => (
|
|
170
|
+
<RouteLink
|
|
171
|
+
key={`${drawerItemKey(child)}::${index}`}
|
|
172
|
+
href={child.link ?? '#'}
|
|
173
|
+
className="cp-nav-drawer__link cp-nav-drawer__link--nested"
|
|
174
|
+
onClick={onNavigate}
|
|
175
|
+
>
|
|
176
|
+
{child.text}
|
|
177
|
+
</RouteLink>
|
|
178
|
+
))}
|
|
179
|
+
</div>
|
|
180
|
+
)}
|
|
181
|
+
</div>
|
|
182
|
+
)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Stable React key for a drawer nav item — its link when present,
|
|
187
|
+
* otherwise its label (dropdown parents may have no link of their own).
|
|
188
|
+
*
|
|
189
|
+
* @private
|
|
190
|
+
* @param item - Nav item to key.
|
|
191
|
+
* @returns Key string.
|
|
192
|
+
*/
|
|
193
|
+
function drawerItemKey(item: CiderpressNavMenuItem): string {
|
|
194
|
+
if (item.link !== undefined && item.link !== '') {
|
|
195
|
+
return item.link
|
|
196
|
+
}
|
|
197
|
+
return item.text
|
|
198
|
+
}
|
|
@@ -50,6 +50,13 @@
|
|
|
50
50
|
color: var(--cp-nav-menu-item-color-active, var(--cp-c-brand-1, currentColor));
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/* Measurement-only: dropdown items render a label→chevron gap in the
|
|
54
|
+
live toggle, so the hidden measure span must include it to size
|
|
55
|
+
correctly. Applied only in the measure row. */
|
|
56
|
+
.cp-nav-menu__item--measured-dropdown {
|
|
57
|
+
gap: 4px;
|
|
58
|
+
}
|
|
59
|
+
|
|
53
60
|
/* ── Hidden measurement layer ──────────────────────────────────────────
|
|
54
61
|
Renders every item at full natural width so the JS layer always has
|
|
55
62
|
a stable per-item measurement no matter how narrow the live menu
|
|
@@ -128,3 +135,84 @@
|
|
|
128
135
|
.cp-nav-menu__overflow-item--active {
|
|
129
136
|
color: var(--cp-nav-menu-item-color-active, var(--cp-c-brand-1, currentColor));
|
|
130
137
|
}
|
|
138
|
+
|
|
139
|
+
/* ── Inline dropdown (nav item with children) ──────────────────────── */
|
|
140
|
+
.cp-nav-menu__dropdown {
|
|
141
|
+
position: relative;
|
|
142
|
+
display: inline-flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.cp-nav-menu__dropdown-toggle {
|
|
147
|
+
gap: 4px;
|
|
148
|
+
background: transparent;
|
|
149
|
+
border: none;
|
|
150
|
+
cursor: pointer;
|
|
151
|
+
font-family: inherit;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.cp-nav-menu__dropdown-popover {
|
|
155
|
+
position: absolute;
|
|
156
|
+
/* Sit below the toggle with breathing room. The visual gap is bridged
|
|
157
|
+
by the transparent `::before` band below, so the whole toggle→menu
|
|
158
|
+
path stays inside the hover region and moving toward the menu never
|
|
159
|
+
crosses empty space that would trigger a close. */
|
|
160
|
+
top: calc(100% + 12px);
|
|
161
|
+
/* Anchor to the toggle's right edge. The primary nav is right-aligned
|
|
162
|
+
in the topbar, so opening leftward keeps the popover on-screen
|
|
163
|
+
instead of overflowing the viewport's right edge. */
|
|
164
|
+
right: 0;
|
|
165
|
+
z-index: 60;
|
|
166
|
+
min-width: 200px;
|
|
167
|
+
margin: 0;
|
|
168
|
+
padding: 6px;
|
|
169
|
+
list-style: none;
|
|
170
|
+
background: var(--cp-nav-menu-overflow-bg, var(--cp-c-bg, #1e1e2e));
|
|
171
|
+
border: 1px solid var(--cp-nav-menu-overflow-border, var(--cp-c-border, #313244));
|
|
172
|
+
border-radius: 8px;
|
|
173
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.24);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Invisible bridge: a transparent band spanning the visual gap between
|
|
177
|
+
the toggle and the popover surface (and a little to each side), so the
|
|
178
|
+
pointer stays within the dropdown's hover region the whole way down.
|
|
179
|
+
Without it, the 6px gap is dead space and mouse-leave fires mid-move. */
|
|
180
|
+
.cp-nav-menu__dropdown-popover::before {
|
|
181
|
+
content: '';
|
|
182
|
+
position: absolute;
|
|
183
|
+
bottom: 100%;
|
|
184
|
+
left: -12px;
|
|
185
|
+
right: -12px;
|
|
186
|
+
/* Taller than the 12px offset so the band overlaps both the toggle and
|
|
187
|
+
the popover surface — no hairline seam for the pointer to slip through. */
|
|
188
|
+
height: 16px;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* ── Dropdown parents collapsed into the "More" popover ────────────── */
|
|
192
|
+
.cp-nav-menu__overflow-group {
|
|
193
|
+
padding: 4px 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.cp-nav-menu__overflow-group + .cp-nav-menu__overflow-group,
|
|
197
|
+
.cp-nav-menu__overflow-item + .cp-nav-menu__overflow-group {
|
|
198
|
+
margin-top: 4px;
|
|
199
|
+
border-top: 1px solid var(--cp-nav-menu-overflow-border, var(--cp-c-border, #313244));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.cp-nav-menu__overflow-group-label {
|
|
203
|
+
display: block;
|
|
204
|
+
padding: 6px 12px 2px;
|
|
205
|
+
/* text-2 (not text-3): these small uppercase labels need AA contrast,
|
|
206
|
+
and text-3's low alpha fails 4.5:1 on the light themes. */
|
|
207
|
+
color: var(--cp-c-text-2, #9399b2);
|
|
208
|
+
font-size: 11px;
|
|
209
|
+
font-weight: 600;
|
|
210
|
+
letter-spacing: 0.04em;
|
|
211
|
+
text-transform: uppercase;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.cp-nav-menu__overflow-sublist {
|
|
215
|
+
margin: 0;
|
|
216
|
+
padding: 0;
|
|
217
|
+
list-style: none;
|
|
218
|
+
}
|