@veluai/velu 0.2.35 → 0.2.37

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 (59) hide show
  1. package/README.md +56 -0
  2. package/dist/cli.js +129 -54
  3. package/docs/mintlify-migration.md +159 -0
  4. package/docs/vepa.md +96 -0
  5. package/package.json +8 -2
  6. package/runtime/velu-ui/components/Accordion.jsx +3 -3
  7. package/runtime/velu-ui/components/ApiClient.jsx +4 -2
  8. package/runtime/velu-ui/components/ApiReferencePage.jsx +23 -15
  9. package/runtime/velu-ui/components/ApiSamples.jsx +9 -4
  10. package/runtime/velu-ui/components/AskBar.jsx +3 -2
  11. package/runtime/velu-ui/components/Callout.jsx +11 -26
  12. package/runtime/velu-ui/components/Card.jsx +16 -12
  13. package/runtime/velu-ui/components/ChangelogFilters.jsx +2 -1
  14. package/runtime/velu-ui/components/Chatbot.jsx +20 -9
  15. package/runtime/velu-ui/components/CodeBlock.jsx +7 -6
  16. package/runtime/velu-ui/components/Columns.jsx +2 -0
  17. package/runtime/velu-ui/components/ContextMenu.jsx +3 -2
  18. package/runtime/velu-ui/components/Field.jsx +2 -2
  19. package/runtime/velu-ui/components/Icon.jsx +1 -0
  20. package/runtime/velu-ui/components/Image.jsx +2 -2
  21. package/runtime/velu-ui/components/MethodBadge.jsx +2 -2
  22. package/runtime/velu-ui/components/NavSelect.jsx +22 -4
  23. package/runtime/velu-ui/components/NotFound.jsx +7 -7
  24. package/runtime/velu-ui/components/PageFeedback.jsx +13 -3
  25. package/runtime/velu-ui/components/PageFooter.jsx +3 -0
  26. package/runtime/velu-ui/components/PageHeader.jsx +37 -15
  27. package/runtime/velu-ui/components/PageNav.jsx +2 -1
  28. package/runtime/velu-ui/components/Prompt.jsx +2 -2
  29. package/runtime/velu-ui/components/Search.jsx +1 -0
  30. package/runtime/velu-ui/components/Sidebar.jsx +18 -6
  31. package/runtime/velu-ui/components/Steps.jsx +4 -4
  32. package/runtime/velu-ui/components/ThemePreferenceMenu.jsx +57 -0
  33. package/runtime/velu-ui/components/ThemeToggle.jsx +4 -1
  34. package/runtime/velu-ui/components/Toc.jsx +6 -4
  35. package/runtime/velu-ui/components/Tree.jsx +6 -5
  36. package/runtime/velu-ui/components/TryItBar.jsx +1 -0
  37. package/runtime/velu-ui/components/Update.jsx +2 -2
  38. package/runtime/velu-ui/components/VepaFooter.jsx +40 -0
  39. package/runtime/velu-ui/components/callout.css +28 -0
  40. package/runtime/velu-ui/components/card.css +9 -0
  41. package/runtime/velu-ui/components/chatbot.css +42 -0
  42. package/runtime/velu-ui/components/docs-layout.css +80 -0
  43. package/runtime/velu-ui/components/page-header.css +6 -0
  44. package/runtime/velu-ui/components/sidebar.css +5 -5
  45. package/runtime/velu-ui/element-selectors.css +66 -0
  46. package/runtime/velu-ui/primitives/Cluster.jsx +12 -0
  47. package/runtime/velu-ui/primitives/Stack.jsx +12 -0
  48. package/runtime/velu-ui/primitives/Switcher.jsx +11 -1
  49. package/runtime/velu-ui/styles.css +52 -35
  50. package/runtime/velu-ui/themes/vepa.css +264 -0
  51. package/schema/velu.schema.json +5 -0
  52. package/src/navigation.js +3 -2
  53. package/src/runtime/App.jsx +144 -52
  54. package/src/runtime/VepaToc.jsx +12 -0
  55. package/src/runtime/client-entry.jsx +23 -0
  56. package/src/runtime/dev-warnings.js +16 -0
  57. package/src/runtime/page-mode.js +54 -0
  58. package/src/runtime/server-entry.jsx +1 -0
  59. package/templates/starter/essentials/settings.mdx +15 -0
@@ -20,11 +20,22 @@ import React from 'react';
20
20
  * @param {number|null} [props.splitAfter=null] 1-based child index; everything
21
21
  * after it is pushed to the bottom (margin-block-end:auto on that child)
22
22
  */
23
+
24
+ // React 18 sets props on custom elements (tag names with a hyphen, e.g. the
25
+ // Mintlify-compatible `as="sidebar-group"`) as attributes verbatim, so
26
+ // `className` would come out as a literal className="" attribute. Hand those
27
+ // tags `class` instead. (React 19 maps className for custom elements itself,
28
+ // and accepts `class` too.)
29
+ const isCustomTag = (Tag) => typeof Tag === 'string' && Tag.includes('-');
30
+ const classProp = (Tag, className) =>
31
+ className == null ? {} : { [isCustomTag(Tag) ? 'class' : 'className']: className };
32
+
23
33
  const Stack = React.forwardRef(function Stack(
24
34
  {
25
35
  as: Tag = 'div',
26
36
  space = 'var(--s1)',
27
37
  splitAfter = null,
38
+ className,
28
39
  style,
29
40
  children,
30
41
  ...rest
@@ -53,6 +64,7 @@ const Stack = React.forwardRef(function Stack(
53
64
  ...(splitAfter ? { blockSize: '100%' } : null),
54
65
  ...style,
55
66
  }}
67
+ {...classProp(Tag, className)}
56
68
  {...rest}
57
69
  >
58
70
  {kids}
@@ -22,6 +22,16 @@ import React from 'react';
22
22
  * React-native + SSR-safe + tokenized (vs. the browser-only web component
23
23
  * which injects a runtime <style>). Needs its own CSS (styles `> *`).
24
24
  */
25
+
26
+ // React 18 sets props on custom elements (tag names with a hyphen, e.g. the
27
+ // Mintlify-compatible `as="sidebar-group"`) as attributes verbatim, so
28
+ // `className` would come out as a literal className="" attribute. Hand those
29
+ // tags `class` instead. (React 19 maps className for custom elements itself,
30
+ // and accepts `class` too.)
31
+ const isCustomTag = (Tag) => typeof Tag === 'string' && Tag.includes('-');
32
+ const classProp = (Tag, className) =>
33
+ className == null ? {} : { [isCustomTag(Tag) ? 'class' : 'className']: className };
34
+
25
35
  export default function Switcher({
26
36
  as: Tag = 'div',
27
37
  space = 'var(--s1)',
@@ -42,7 +52,7 @@ export default function Switcher({
42
52
 
43
53
  return (
44
54
  <Tag
45
- className={`velu-switcher ${className}`.trim()}
55
+ {...classProp(Tag, `velu-switcher ${className}`.trim())}
46
56
  data-limit-exceeded={exceeded ? '' : undefined}
47
57
  style={{
48
58
  '--switcher-space': space,
@@ -1,9 +1,18 @@
1
1
  /* Aggregate stylesheet for velu-ui. Consumers import this once.
2
2
 
3
- Tailwind v4 first (theme/preflight/utilities all in @layer).
4
- base.css is intentionally UNLAYERED, so it wins over Tailwind's
5
- preflight `base` layer our fluid type/measure beat Tailwind's reset
6
- by cascade-layer precedence (unlayered > layered). */
3
+ Cascade layers, lowest to highest precedence:
4
+ Tailwind's theme / base (preflight) / components / utilities
5
+ velu - everything in this package (base.css + every component sheet)
6
+ (unlayered) - the PROJECT's own custom CSS (any .css file in a docs
7
+ project is linked after this sheet, unlayered)
8
+ Unlayered styles beat every layer regardless of specificity, so a project
9
+ can restyle components with Mintlify-style element selectors - a plain
10
+ `card { border-radius: 0 }` (specificity 0,0,1) overrides `.velu-card`
11
+ (0,1,0) because velu-ui lives in a layer and the project sheet does not.
12
+ The `velu` layer is declared after Tailwind's, so our fluid type/measure
13
+ still beat Tailwind's preflight, as before. */
14
+ @layer theme, base, components, utilities, velu;
15
+
7
16
  @import 'tailwindcss';
8
17
 
9
18
  /* Map Tailwind's `dark:` variant onto our [data-theme="dark"] attribute
@@ -14,36 +23,44 @@
14
23
  and ignores node_modules — velu-ui is reached via a workspace symlink
15
24
  there, so its component classes would NOT be scanned. This @source is
16
25
  relative to THIS file (packages/velu-ui/src/styles.css); "." == the
17
- velu-ui src tree, so Tailwind also scans velu-ui components. */
26
+ velu-ui src tree, so Tailwind also scans velu-ui components.
27
+
28
+ Project MDX/JSX (the docs author's content) is registered as an extra
29
+ `@source` at `velu dev` / `velu build` time by
30
+ `veluTailwindProjectSource` in velu-cli — so utilities used in content
31
+ (`w-full`, `rounded-xl`, `dark:…`, …) are generated too. */
18
32
  @source ".";
19
33
 
20
- @import './base.css';
21
- @import './primitives/switcher.css';
22
- @import './components/sidebar.css';
23
- @import './components/nav-select.css';
24
- @import './components/context-menu.css';
25
- @import './components/accordion.css';
26
- @import './components/card.css';
27
- @import './components/icon.css';
28
- @import './components/image.css';
29
- @import './components/code-block.css';
30
- @import './components/field.css';
31
- @import './components/prompt.css';
32
- @import './components/steps.css';
33
- @import './components/tree.css';
34
- @import './components/update.css';
35
- @import './components/changelog-filters.css';
36
- @import './components/api.css';
37
- @import './components/api-page.css';
38
- @import './components/not-found.css';
39
- @import './components/ask-bar.css';
40
- @import './components/chatbot.css';
41
- @import './components/page-feedback.css';
42
- @import './components/page-nav.css';
43
- @import './components/page-footer.css';
44
- @import './components/powered-by.css';
45
- @import './components/page-header.css';
46
- @import './components/theme-toggle.css';
47
- @import './components/docs-layout.css';
48
- @import './components/toc-bar.css';
49
- @import './components/search.css';
34
+ @import './base.css' layer(velu);
35
+ @import './element-selectors.css' layer(velu);
36
+ @import './primitives/switcher.css' layer(velu);
37
+ @import './components/sidebar.css' layer(velu);
38
+ @import './components/nav-select.css' layer(velu);
39
+ @import './components/context-menu.css' layer(velu);
40
+ @import './components/accordion.css' layer(velu);
41
+ @import './components/callout.css' layer(velu);
42
+ @import './components/card.css' layer(velu);
43
+ @import './components/icon.css' layer(velu);
44
+ @import './components/image.css' layer(velu);
45
+ @import './components/code-block.css' layer(velu);
46
+ @import './components/field.css' layer(velu);
47
+ @import './components/prompt.css' layer(velu);
48
+ @import './components/steps.css' layer(velu);
49
+ @import './components/tree.css' layer(velu);
50
+ @import './components/update.css' layer(velu);
51
+ @import './components/changelog-filters.css' layer(velu);
52
+ @import './components/api.css' layer(velu);
53
+ @import './components/api-page.css' layer(velu);
54
+ @import './components/not-found.css' layer(velu);
55
+ @import './components/ask-bar.css' layer(velu);
56
+ @import './components/chatbot.css' layer(velu);
57
+ @import './components/page-feedback.css' layer(velu);
58
+ @import './components/page-nav.css' layer(velu);
59
+ @import './components/page-footer.css' layer(velu);
60
+ @import './components/powered-by.css' layer(velu);
61
+ @import './components/page-header.css' layer(velu);
62
+ @import './components/theme-toggle.css' layer(velu);
63
+ @import './components/docs-layout.css' layer(velu);
64
+ @import './components/toc-bar.css' layer(velu);
65
+ @import './components/search.css' layer(velu);
66
+ @import './themes/vepa.css' layer(velu);
@@ -0,0 +1,264 @@
1
+ /* Reference: Mintlify client 0.0.3566, Sequoia. Preset selectors are
2
+ intentionally scoped so a project's unlayered custom CSS still wins. */
3
+ :root:has([data-site-theme='vepa']),
4
+ [data-site-theme='vepa'] {
5
+ --page-bg: #fff;
6
+ --text-color: var(--vepa-gray-700);
7
+ --muted-color: var(--vepa-gray-500);
8
+ --border-color: var(--vepa-gray-200);
9
+ --surface-color: var(--vepa-gray-50);
10
+ --vepa-heading: var(--vepa-gray-900);
11
+ --vepa-hairline: var(--vepa-gray-100);
12
+ --velu-aside-right-width: 18rem;
13
+ --f-h1: 36px;
14
+ --lh-h1: 40px;
15
+ --f-h4: 18px;
16
+ --lh-h4: 28px;
17
+ font-family: var(--font-sans);
18
+ color: var(--text-color);
19
+ font-size: 16px;
20
+ line-height: 28px;
21
+ -webkit-font-smoothing: antialiased;
22
+ }
23
+ /* Set the default on the root, while honoring a project's body font override. */
24
+ [data-site-theme='vepa'] { font-family: inherit; }
25
+ :root[data-theme='dark']:has([data-site-theme='vepa']),
26
+ [data-theme='dark'] [data-site-theme='vepa'] {
27
+ --page-bg: var(--vepa-background-dark);
28
+ --text-color: var(--vepa-gray-400);
29
+ --muted-color: var(--vepa-gray-400);
30
+ --border-color: var(--vepa-gray-800);
31
+ --surface-color: var(--vepa-gray-900);
32
+ --vepa-heading: var(--vepa-gray-200);
33
+ --vepa-hairline: var(--vepa-gray-800);
34
+ }
35
+ [data-site-theme='vepa'] .velu-header {
36
+ padding: 0;
37
+ border: 0;
38
+ box-shadow: inset 0 -1px var(--vepa-hairline);
39
+ background: var(--page-bg);
40
+ backdrop-filter: none;
41
+ }
42
+ [data-site-theme='vepa'] .velu-header__top {
43
+ height: 48px;
44
+ padding-inline: 24px;
45
+ grid-template-columns: repeat(3, minmax(0, 1fr));
46
+ gap: 0;
47
+ }
48
+ [data-site-theme='vepa'] .velu-header__col--center { width: 100%; padding-inline: 8px; }
49
+ [data-site-theme='vepa'] .velu-header__col--center > * { justify-content: center !important; flex-wrap: nowrap !important; }
50
+ [data-site-theme='vepa'] .velu-logo { height: 22px; }
51
+ [data-site-theme='vepa'] .velu-header__wordmark { font-family: inherit; font-size: 30px; line-height: 35px; font-weight: 700; }
52
+ [data-site-theme='vepa'] .velu-header__mark { display: none; }
53
+ [data-site-theme='vepa'] .velu-header__action { font-size: 14px; line-height: 20px; border-radius: 8px; padding: 6px 12px; border: 0; }
54
+ [data-site-theme='vepa'] .velu-header__action--primary { font-weight: 500; }
55
+ [data-theme='dark'] [data-site-theme='vepa'] .velu-header__action--primary { color: #000b; }
56
+ [data-site-theme='vepa'] .velu-header__action--link { font-weight: 400; padding-inline: 8px; }
57
+ [data-site-theme='vepa'] .velu-search__trigger { inline-size: 256px !important; height: 32px; padding: 0 8px; gap: 4px; background: var(--surface-color); border-color: var(--vepa-hairline); border-radius: 8px; font-size: 14px; }
58
+ [data-site-theme='vepa'] .velu-search__trigger-icon svg { width: 16px; height: 16px; }
59
+ [data-site-theme='vepa'] .velu-search__kbd { background: var(--page-bg); border: 0; padding: 2px 6px; font: 500 12px/16px var(--font-sans); border-radius: 4px; }
60
+ [data-site-theme='vepa'] .velu-header__tabs { height: 48px; padding: 0 24px; background: var(--surface-color); }
61
+ [data-site-theme='vepa'] .velu-header__tab { height: 48px; padding-block: 0; font-size: 14px; line-height: 20px; }
62
+ @container docs (min-width: 1024px) {
63
+ [data-site-theme='vepa'] .velu-header[data-has-tabs='false'] .velu-header__tabs { display: none !important; }
64
+ [data-site-theme='vepa'] .velu-header__crumbs,
65
+ [data-site-theme='vepa'] .velu-header__burger { display: none; }
66
+ [data-site-theme='vepa'] .velu-docs-layout__aside--left { display: flex; width: 288px; top: var(--velu-header-height); bottom: 0; padding: 24px 8px 16px; border-right: 1px solid var(--vepa-hairline); transform: none; }
67
+ [data-site-theme='vepa'] .velu-docs-layout__center { margin-left: 288px; margin-right: var(--velu-aside-right-width); }
68
+ [data-site-theme='vepa'] .velu-docs-layout__aside--right { display: block; top: var(--velu-header-height); padding: 16px 32px; width: var(--velu-aside-right-width); border-left: 1px solid var(--vepa-hairline); }
69
+ [data-site-theme='vepa'] .velu-docs-layout__sidebar-toggle { display: none; }
70
+ }
71
+ [data-site-theme='vepa'] .velu-docs-layout__main { padding: 24px; }
72
+ [data-site-theme='vepa'] .velu-docs-layout__article { max-inline-size: 648px; position: relative; }
73
+ [data-site-theme='vepa'] .velu-sidebar { margin: 0; width: 100%; }
74
+ [data-site-theme='vepa'] :is(.velu-sidebar__section, .velu-api-sidebar__section) { position: static; font: 400 12px/16px var(--font-sans); text-transform: none; letter-spacing: 0; padding: 0 24px 8px; color: var(--vepa-heading); }
75
+ [data-site-theme='vepa'] .velu-sidebar__section::after,
76
+ [data-site-theme='vepa'] .velu-sidebar__indicator { display: none; }
77
+ [data-site-theme='vepa'] .velu-sidebar__item,
78
+ [data-site-theme='vepa'] .velu-sidebar__subitem,
79
+ [data-site-theme='vepa'] .velu-api-sidebar__item { font: 400 14px/20px var(--font-sans); padding: 6px 24px; border-radius: 8px; }
80
+ [data-site-theme='vepa'] :is(.velu-sidebar__item, .velu-api-sidebar__item):hover { background: var(--surface-color); }
81
+ [data-site-theme='vepa'] :is(.velu-sidebar__item--active, .velu-api-sidebar__item--active) { color: var(--accent-color); font-weight: 600; border-inline-start: 0; }
82
+ [data-site-theme='vepa'] :is(.velu-sidebar__list, .velu-api-sidebar__list) { gap: 1px !important; }
83
+ [data-site-theme='vepa'] .velu-sidebar > sidebar-group { gap: 0 !important; margin-bottom: 16px; }
84
+ /* API rows share the guide typography; only HTTP method badges use mono. */
85
+ [data-site-theme='vepa'] .velu-api-sidebar { margin: 0; border: 0; width: 100%; gap: 0 !important; }
86
+ [data-site-theme='vepa'] .velu-api-sidebar__section:not(:first-child) { margin-top: 32px; }
87
+ [data-site-theme='vepa'] .velu-api-sidebar__label { font: inherit; }
88
+ [data-site-theme='vepa'] .velu-api-sidebar__item { gap: 8px; align-items: baseline; }
89
+ [data-site-theme='vepa'] .velu-api-sidebar__item .velu-method-badge { font-size: 10px; line-height: 16px; padding: 0 4px; border: 0; border-radius: 4px; }
90
+ [data-site-theme='vepa'] .velu-context-bar { min-height: 16px; margin-bottom: 10px; }
91
+ [data-site-theme='vepa'] .velu-context-bar__eyebrow { font: 500 12px/16px var(--font-sans); color: var(--accent-color); text-transform: none; letter-spacing: 0; }
92
+ [data-site-theme='vepa'] .velu-context-bar__actions { position: absolute; right: 0; top: 29px; }
93
+ [data-site-theme='vepa'] .velu-context-menu__split { height: 34px; border-radius: 12px; }
94
+ [data-site-theme='vepa'] .velu-context-menu__copy,
95
+ [data-site-theme='vepa'] .velu-context-menu__toggle { font-size: 14px; line-height: 20px; padding: 6px 12px; }
96
+ [data-site-theme='vepa'] .velu-hero { gap: 4px; margin: 0; }
97
+ [data-site-theme='vepa'] .velu-hero + .velu-prose { margin-top: 32px; }
98
+ [data-site-theme='vepa'] .velu-hero h1 { font: 500 36px/40px var(--font-sans); letter-spacing: -.025em; color: var(--vepa-heading); margin: 0; padding-right: 170px; }
99
+ [data-site-theme='vepa'] [data-contextual-actions='false'] .velu-hero h1 { padding-right: 0; }
100
+ [data-site-theme='vepa'] :is(.velu-sidebar__section,.velu-api-sidebar__section) { background: transparent; }
101
+ [data-site-theme='vepa'] .velu-api-page__custom-content { margin-block: 56px; }
102
+ [data-site-theme='vepa'] .velu-hero p { color: var(--text-color) !important; margin: 8px 0 0; font-weight: 400; }
103
+ [data-site-theme='vepa'] .velu-prose { font-size: 16px; line-height: 28px; }
104
+ [data-site-theme='vepa'] .velu-prose > p { margin-block: 20px; max-width: none; }
105
+ [data-site-theme='vepa'] .velu-prose > :first-child { margin-top: 0; }
106
+ [data-site-theme='vepa'] .velu-prose :is(h2,h3,h4) { color: var(--vepa-heading); font-weight: 500; }
107
+ [data-site-theme='vepa'] .velu-prose :is(h2,h3,h4),
108
+ [data-site-theme='vepa'] .velu-card__title { font-family: var(--font-sans); }
109
+ [data-site-theme='vepa'] .velu-prose :where(div > p) { margin-block: 20px; }
110
+ [data-site-theme='vepa'] .velu-card__text > p { margin: 0; }
111
+ [data-site-theme='vepa'] .velu-prose h2 { font-size: 24px; line-height: 32px; margin: 48px 0 16px; }
112
+ .velu-vepa-toc { font: 400 14px/24px var(--font-sans); }
113
+ .velu-vepa-toc { font-family: inherit; }
114
+ .velu-vepa-toc > button { font: 400 12px/16px var(--font-sans); padding: 8px 0; color: var(--muted-color); background: none; border: 0; cursor: pointer; }
115
+ .velu-vepa-toc ul { list-style: none; padding: 0; margin: 0; }
116
+ .velu-vepa-toc ul ul { padding-left: 16px; }
117
+ .velu-vepa-toc a { display: block; padding-block: 4px; color: var(--text-color); text-decoration: none; }
118
+ .velu-vepa-toc a[aria-current] { color: var(--accent-color); font-weight: 500; }
119
+ .velu-theme-menu { position: relative; line-height: 20px; }
120
+ .velu-theme-menu__trigger { width: 32px; height: 32px; display: grid; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--muted-color); cursor: pointer; }
121
+ .velu-theme-menu__options { position: absolute; z-index: 40; top: 36px; right: 0; width: 144px; padding: 4px; border: 1px solid var(--border-color); border-radius: 12px; background: var(--page-bg); box-shadow: 0 4px 16px #0002; }
122
+ .velu-theme-menu__options button { display: flex; align-items: center; gap: 8px; width: 100%; border: 0; padding: 8px; background: none; border-radius: 8px; color: var(--text-color); font: 400 14px/20px var(--font-sans); cursor: pointer; }
123
+ .velu-theme-menu__options button span { flex: 1; text-align: left; }
124
+ .velu-theme-menu__options button:focus-visible,
125
+ .velu-theme-menu__options button:hover { outline: none; background: var(--surface-color); }
126
+ [data-site-theme='vepa'] :is(.velu-columns,.velu-card-group) { display: grid; grid-template-columns: repeat(var(--vepa-columns, 2), minmax(0, 1fr)); gap: 16px; margin-block: 28px; }
127
+ [data-site-theme='vepa'] :is(.velu-columns,.velu-card-group) > * { min-width: 0; }
128
+ [data-site-theme='vepa'] .velu-card { border-radius: 16px; }
129
+ [data-site-theme='vepa'] .velu-card__body { padding: 24px; gap: 4px; }
130
+ [data-site-theme='vepa'] .velu-card__icon { width: 24px; height: 24px; font-size: 24px; margin-bottom: 8px; }
131
+ [data-site-theme='vepa'] .velu-card__title { font-size: 16px; line-height: 24px; font-weight: 600; }
132
+ [data-site-theme='vepa'] .velu-card__text { font-size: 16px; line-height: 24px; }
133
+ @container docs (max-width: 1279px) {
134
+ [data-site-theme='vepa'] .velu-docs-layout__aside--right { display: none; }
135
+ [data-site-theme='vepa'] .velu-docs-layout__center { margin-right: 0; }
136
+ }
137
+ @container docs (max-width: 1023px) {
138
+ [data-site-theme='vepa'] .velu-header__top { display: grid; grid-template-columns: minmax(0,1fr) auto auto; padding-inline: 16px; gap: 12px !important; }
139
+ [data-site-theme='vepa'] .velu-header__col--brand { min-width: 0; flex-wrap: nowrap !important; }
140
+ [data-site-theme='vepa'] .velu-header__wordmark { font-size: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
141
+ [data-site-theme='vepa'] .velu-header__col--actions { flex-wrap: nowrap !important; gap: 8px !important; }
142
+ [data-site-theme='vepa'] .velu-header__col--center { padding: 0; }
143
+ [data-site-theme='vepa'] .velu-header__actions-list,
144
+ [data-site-theme='vepa'] .velu-header__tab { display: none; }
145
+ [data-site-theme='vepa'] .velu-header__tabs { height: 56px; padding-inline: 16px; }
146
+ [data-site-theme='vepa'] .velu-header__crumbs { display: flex; font-size: 14px; line-height: 20px; }
147
+ [data-site-theme='vepa'] .velu-header__menu { display: flex; order: -1; margin: 0; width: 20px; padding: 0; }
148
+ [data-site-theme='vepa'] .velu-search__trigger { inline-size: 32px !important; border: 0; background: none; padding: 8px; }
149
+ [data-site-theme='vepa'] .velu-search__trigger-label,
150
+ [data-site-theme='vepa'] .velu-search__kbd { display: none; }
151
+ [data-site-theme='vepa'] .velu-docs-layout__center { margin-inline: 0; }
152
+ [data-site-theme='vepa'] .velu-docs-layout__sidebar-toggle,
153
+ [data-site-theme='vepa'] .velu-toc-bar { display: none; }
154
+ [data-site-theme='vepa'] .velu-docs-layout__aside--left { width: 288px; inset-inline: 0 auto; top: var(--velu-header-height); bottom: 0; padding: 24px 8px; transform: translateX(-100%); z-index: 40; visibility: hidden; }
155
+ [data-site-theme='vepa'][data-drawer-open='true'] .velu-docs-layout__aside--left { transform: none; visibility: visible; }
156
+ [data-site-theme='vepa'] :is(.velu-docs-layout__drawer-head,.velu-docs-layout__drawer-select) { display: none; }
157
+ [data-site-theme='vepa'] .velu-docs-layout__aside--left .velu-sidebar { opacity: 1; pointer-events: auto; }
158
+ [data-site-theme='vepa'] .velu-context-bar__actions { position: static; margin-top: 12px; }
159
+ [data-site-theme='vepa'] .velu-context-bar { display: contents !important; }
160
+ [data-site-theme='vepa'] .velu-docs-layout__article { display: flex; flex-direction: column; }
161
+ [data-site-theme='vepa'] .velu-context-bar__eyebrow { order: -3; margin-bottom: 10px; }
162
+ [data-site-theme='vepa'] .velu-hero { order: -2; margin-bottom: 0; }
163
+ [data-site-theme='vepa'] .velu-hero h1 { padding-right: 0; }
164
+ [data-site-theme='vepa'] .velu-prose { margin-top: 32px; }
165
+ }
166
+ @container docs (max-width: 639px) {
167
+ [data-site-theme='vepa'] .velu-hero h1 { font-size: 30px; line-height: 36px; }
168
+ [data-site-theme='vepa'] :is(.velu-columns,.velu-card-group) { grid-template-columns: 1fr; }
169
+ }
170
+ /* Modes retain their semantic chrome rules; only their measure changes. */
171
+ [data-site-theme='vepa'][data-page-mode='wide'] .velu-docs-layout__center,
172
+ [data-site-theme='vepa'][data-page-mode='frame'] .velu-docs-layout__center { margin-right: 0; }
173
+ [data-site-theme='vepa'][data-page-mode='wide'] .velu-docs-layout__article { max-inline-size: 896px; }
174
+ [data-site-theme='vepa'][data-page-mode='frame'] .velu-docs-layout__article { max-inline-size: 1152px; }
175
+ [data-site-theme='vepa']:is([data-page-mode='custom'],[data-page-mode='center'],[data-page-mode='assistant']) .velu-docs-layout__center { margin-inline: 0; }
176
+ [data-site-theme='vepa']:is([data-page-mode='wide'],[data-page-mode='frame'],[data-page-mode='custom'],[data-page-mode='center'],[data-page-mode='assistant']) .velu-docs-layout__aside--right,
177
+ [data-site-theme='vepa']:is([data-page-mode='custom'],[data-page-mode='center'],[data-page-mode='assistant']) .velu-docs-layout__aside--left { display: none; }
178
+ [data-site-theme='vepa'][data-page-mode='custom'] .velu-docs-layout__article { max-inline-size: none; }
179
+ [data-site-theme='vepa'][data-page-mode='center'] .velu-docs-layout__article { max-inline-size: 768px; }
180
+
181
+ /* API examples use a code rail, not the padded 18rem TOC. Reserve the
182
+ same width in the article geometry so neither column overlaps. */
183
+ [data-site-theme='vepa'][data-api='true'] { --velu-aside-right-width: calc(28rem + 24px); }
184
+ [data-site-theme='vepa'][data-api='true'] .velu-docs-layout__aside--right {
185
+ padding: 24px 24px 24px 0;
186
+ border-left: 0;
187
+ min-width: 0;
188
+ }
189
+ [data-site-theme='vepa'] .velu-api-samples { min-width: 0; gap: 24px; }
190
+ [data-site-theme='vepa'] .velu-api-samples > * { min-width: 0; max-width: 100%; }
191
+ [data-site-theme='vepa'] .velu-api-samples :is(pre,code) { font-size: 13px; line-height: 22px; }
192
+ .velu-vepa-request { border: 1px solid var(--border-color); border-radius: 16px; background: var(--surface-color); overflow: hidden; }
193
+ .velu-api-page__inline-samples { display: none; }
194
+ @container docs (max-width: 1279px) {
195
+ [data-site-theme='vepa'] .velu-api-page__inline-samples { display: block; margin-block: 24px 56px; }
196
+ }
197
+ .velu-vepa-request__header { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 8px 12px; font-size: 12px; line-height: 20px; }
198
+ .velu-vepa-request__header select { max-width: 45%; color: var(--muted-color); background: transparent; border: 0; font: inherit; }
199
+ .velu-vepa-request .velu-code-block { border: 0; border-radius: 16px; }
200
+ [data-site-theme='vepa'] .velu-api-page__section { position: relative; margin-block-start: 48px; }
201
+ [data-site-theme='vepa'] .velu-api-page__section > h2 { font: 600 18px/28px var(--font-sans); padding-bottom: 12px; border-bottom: 1px solid var(--border-color); margin: 0 0 24px; }
202
+ .velu-vepa-responses__status { position: absolute; right: 0; top: 4px; font-size: 12px; color: var(--muted-color); }
203
+ .velu-vepa-responses section + section { position: relative; padding-top: 24px; }
204
+ [data-site-theme='vepa'] .velu-api-sidebar .velu-method-badge--get { color: #087443; background: #d6f5e3; }
205
+ [data-site-theme='vepa'] .velu-api-sidebar .velu-method-badge--post { color: #164be9; background: #dfebff; }
206
+ /* Vepa advanced footer: measured against Mintlify Sequoia 0.0.3566. */
207
+ [data-site-theme='vepa'] > [data-velu-footer] { margin-inline-start: 288px; }
208
+ .vepa-footer { border-top: 1px solid var(--vepa-hairline); background: var(--page-bg); }
209
+ .vepa-footer__inner { display: flex; flex-direction: column; gap: 48px; max-width: 984px; width: 100%; margin: auto; padding: 112px 32px; }
210
+ .vepa-footer__top { display: flex; justify-content: space-between; gap: 32px; }
211
+ .vepa-footer__brand-column { display: flex; flex-direction: column; justify-content: space-between; align-items: flex-start; min-width: 192px; gap: 96px; }
212
+ .vepa-footer__brand { color: var(--vepa-heading); text-decoration: none; font-family: inherit; font-size: 30px; line-height: 35px; font-weight: 700; }
213
+ .vepa-footer__brand .velu-logo { height: 26px; max-width: 192px; }
214
+ .vepa-footer__columns { display: grid; grid-template-columns: repeat(var(--footer-columns), minmax(0,1fr)); gap: 32px; flex: 1; min-width: 0; }
215
+ .vepa-footer__column { display: flex; flex-direction: column; align-items: center; }
216
+ .vepa-footer__links { display: flex; flex-direction: column; gap: 16px; min-width: 0; max-width: 100%; }
217
+ .vepa-footer__heading { margin: 0 0 4px; color: var(--vepa-gray-950); font: 600 14px/20px var(--font-sans); }
218
+ .vepa-footer__link { font: 400 14px/20px var(--font-sans); color: color-mix(in srgb, var(--vepa-gray-950) 50%, transparent); max-width: 144px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-decoration: none; }
219
+ .vepa-footer__link:hover { color: color-mix(in srgb, var(--vepa-gray-950) 70%, transparent); }
220
+ .vepa-footer .velu-socials { gap: 16px !important; min-width: 140px; max-width: 492px; height: fit-content; }
221
+ .vepa-footer .velu-social { width: 20px; height: 20px; color: var(--vepa-gray-500); }
222
+ .vepa-footer .velu-social svg { width: 20px; height: 20px; }
223
+ .vepa-footer__end-socials { justify-content: flex-end !important; }
224
+ .vepa-footer[data-layout='compact'] .vepa-footer__brand-socials,
225
+ .vepa-footer[data-layout='expanded'] .vepa-footer__end-socials,
226
+ .vepa-footer__mobile-socials { display: none !important; }
227
+ .vepa-footer__divider { height: 1px; background: var(--vepa-hairline); }
228
+ .vepa-footer__bottom { display: flex; justify-content: space-between; align-items: center; }
229
+ .vepa-footer__powered { display: flex; align-items: baseline; gap: 4px; color: var(--vepa-gray-400); font: 400 14px/20px var(--font-sans); text-decoration: none; }
230
+ .vepa-footer__powered strong { font-size: 16px; font-weight: 600; }
231
+ .vepa-footer-theme { display: flex; gap: 8px; }
232
+ .vepa-footer-theme button { display: grid; place-items: center; padding: 6px; background: transparent; border: 0; border-radius: 8px; color: var(--vepa-gray-400); cursor: pointer; }
233
+ .vepa-footer-theme button[aria-pressed='true'] { color: var(--vepa-gray-600); background: var(--vepa-gray-200); }
234
+ .vepa-footer[data-single='true'] .vepa-footer__links { flex-direction: row; align-items: center; justify-content: center; gap: 32px; }
235
+ [data-theme='dark'] .vepa-footer__heading { color: white; }
236
+ [data-theme='dark'] .vepa-footer__link { color: #ffffff80; }
237
+ [data-theme='dark'] .vepa-footer__link:hover { color: #ffffffb3; }
238
+ [data-theme='dark'] .vepa-footer .velu-social { color: var(--vepa-gray-600); }
239
+ [data-theme='dark'] .vepa-footer__divider { background: #ffffff0d; }
240
+ [data-theme='dark'] .vepa-footer__powered { color: var(--vepa-gray-500); }
241
+ [data-theme='dark'] .vepa-footer-theme button { color: var(--vepa-gray-600); }
242
+ [data-theme='dark'] .vepa-footer-theme button[aria-pressed='true'] { color: var(--vepa-gray-400); background: var(--vepa-gray-800); }
243
+ @container docs (max-width: 1023px) {
244
+ [data-site-theme='vepa'] > [data-velu-footer] { margin-inline-start: 0; }
245
+ .vepa-footer__inner { padding-block: 80px; }
246
+ .vepa-footer__brand-column { min-width: 80px; }
247
+ }
248
+ @container docs (max-width: 767px) {
249
+ .vepa-footer__inner { padding-block: 64px; }
250
+ .vepa-footer__top { flex-direction: column; }
251
+ .vepa-footer__brand-column { flex-direction: row; align-items: center; gap: 0; min-width: 64px; }
252
+ .vepa-footer__column { align-items: flex-start; }
253
+ .vepa-footer__columns { grid-template-columns: repeat(2,minmax(0,1fr)); }
254
+ .vepa-footer__link { white-space: normal; }
255
+ .vepa-footer__end-socials { display: none !important; }
256
+ .vepa-footer[data-layout='compact'][data-headings='true'] .vepa-footer__brand-socials { display: flex !important; justify-content: flex-end !important; }
257
+ .vepa-footer[data-headings='false'] .vepa-footer__brand-socials { display: none !important; }
258
+ .vepa-footer__mobile-socials { display: flex !important; }
259
+ .vepa-footer[data-single='true'] .vepa-footer__links { flex-direction: column; align-items: flex-start; gap: 16px; }
260
+ }
261
+ @container docs (max-width: 639px) {
262
+ .vepa-footer__columns { display: flex; flex-direction: column; }
263
+ .vepa-footer__brand { font-size: 24px; line-height: 30px; }
264
+ }
@@ -7,6 +7,11 @@
7
7
  "required": ["name"],
8
8
  "additionalProperties": false,
9
9
  "properties": {
10
+ "theme": {
11
+ "type": "string",
12
+ "enum": ["velu", "vepa"],
13
+ "description": "Visual preset. Vepa follows the Mintlify Sequoia layout; light/dark preference is independent. Defaults to velu."
14
+ },
10
15
  "$schema": {
11
16
  "type": "string",
12
17
  "description": "URL of this JSON Schema, enabling editor validation + autocomplete."
package/src/navigation.js CHANGED
@@ -452,8 +452,9 @@ function itemFor(pageNode, pagesMap, ctx) {
452
452
  const fm = pagesMap[href]?.frontmatter;
453
453
  // Generated API pages carry their own label + HTTP method (for the sidebar
454
454
  // method badge); normal pages source their label from frontmatter.
455
- const label = pageNode.label ?? fm?.title ?? titleCase(lastSeg(href));
455
+ const label = pageNode.label ?? fm?.sidebarTitle ?? fm?.title ?? titleCase(lastSeg(href));
456
456
  const item = { label, href };
457
- if (pageNode.method) item.method = pageNode.method;
457
+ const method = pageNode.method ?? pagesMap[href]?.operation?.method;
458
+ if (method) item.method = method;
458
459
  return item;
459
460
  }