@publish.os/nextjs 0.0.1-alpha.8 → 0.0.1-alpha.90

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 (201) hide show
  1. package/compiler-assets/nextjs/defaults/app/globals.css +1 -0
  2. package/compiler-assets/nextjs/defaults/group/index.tsx +50 -0
  3. package/compiler-assets/nextjs/defaults/group/layout.tsx +7 -3
  4. package/compiler-assets/nextjs/defaults/group/page.tsx +35 -43
  5. package/compiler-assets/nextjs/defaults/project/next.config.mjs +22 -11
  6. package/compiler-assets/nextjs/defaults/project/tsconfig.json.template +1 -4
  7. package/compiler-assets/nextjs/defaults/root/css/animation.css +131 -0
  8. package/compiler-assets/nextjs/defaults/root/css/components/dialog.css +4 -1
  9. package/compiler-assets/nextjs/defaults/root/css/components/menu.css +1 -1
  10. package/compiler-assets/nextjs/defaults/root/css/components/navigation-menu.css +1 -1
  11. package/compiler-assets/nextjs/defaults/root/css/components/popover.css +1 -1
  12. package/compiler-assets/nextjs/defaults/root/css/components/select.css +1 -1
  13. package/compiler-assets/nextjs/defaults/root/css/components/tooltip.css +1 -1
  14. package/compiler-assets/nextjs/defaults/root/css/shadow.css +6 -25
  15. package/compiler-assets/nextjs/defaults/root/css/typography.css +51 -68
  16. package/compiler-assets/nextjs/defaults/root/globals.css +25 -0
  17. package/compiler-assets/nextjs/defaults/root/{page.tsx → index.tsx} +6 -2
  18. package/compiler-assets/nextjs/defaults/root/layout.tsx +7 -1
  19. package/compiler-assets/nextjs/defaults/root/theme.css +22 -22
  20. package/compiler-assets/nextjs/shims/generated-group-page.tsx +19 -2
  21. package/compiler-assets/nextjs/shims/generated-leaf-page.tsx +16 -2
  22. package/compiler-assets/nextjs/shims/global-layout.tsx +11 -43
  23. package/compiler-assets/nextjs/shims/proxy.ts +21 -9
  24. package/compiler-assets/nextjs/shims/publish-os-theme-provider.tsx +76 -15
  25. package/compiler-assets/nextjs/shims/root-page.tsx +7 -1
  26. package/compiler-assets/nextjs/shims/site-fenced-code-block.tsx +34 -0
  27. package/compiler-assets/nextjs/shims/site-heading-level.tsx +14 -0
  28. package/compiler-assets/nextjs/shims/site-mdx-components.tsx +100 -0
  29. package/compiler-assets/nextjs/shims/site-mdx.tsx +12 -0
  30. package/compiler-assets/nextjs/shims/theme-defaults.css +41 -25
  31. package/dist/build-operation-2JAYBSKF.js +83 -0
  32. package/dist/button-CtzUJB8u.d.ts +11 -0
  33. package/dist/{button-CFdx-ohV.d.ts → button-c3WGnxIj.d.ts} +3 -3
  34. package/dist/chunk-535TM4A5.js +1455 -0
  35. package/dist/chunk-726GV2NF.js +2344 -0
  36. package/dist/chunk-7OGTPSKI.js +156 -0
  37. package/dist/chunk-AI2UULNX.js +9 -0
  38. package/dist/chunk-B2V22WRT.js +297 -0
  39. package/dist/chunk-DLDFHU7Y.js +191 -0
  40. package/dist/chunk-DWA3ZRGW.js +142 -0
  41. package/dist/chunk-GGKFQ3MA.js +621 -0
  42. package/dist/chunk-H6XILMZX.js +6154 -0
  43. package/dist/chunk-NECL5IBJ.js +318 -0
  44. package/dist/chunk-SVYGXXYR.js +36 -0
  45. package/dist/chunk-UF6ATARM.js +1100 -0
  46. package/dist/chunk-VO2I7MTM.js +56 -0
  47. package/dist/chunk-WDY4IK6Z.js +128 -0
  48. package/dist/chunk-WKTEO6RS.js +586 -0
  49. package/dist/chunk-YLTOLYWM.js +92 -0
  50. package/dist/compiler.d.ts +41 -7
  51. package/dist/compiler.js +48 -13143
  52. package/dist/compose-NN23UJGC.js +13 -0
  53. package/dist/config/createNextConfig.js +13 -0
  54. package/dist/dev-operation-TZDVJCN7.js +1055 -0
  55. package/dist/framework-selection-X4U6Y6QC.js +10 -0
  56. package/dist/ide-support-ZNW7ODFY.js +15 -0
  57. package/dist/index.d.ts +15 -3
  58. package/dist/kernel/components/blocks/AgentActions.js +71 -61
  59. package/dist/kernel/components/blocks/design-system-preview.d.ts +1 -1
  60. package/dist/kernel/components/blocks/design-system-preview.js +32 -13
  61. package/dist/kernel/components/blocks/link-playground.js +2 -2
  62. package/dist/kernel/components/blocks/logo-block.js +2 -2
  63. package/dist/kernel/components/blocks/nav-breadcrumb.d.ts +10 -2
  64. package/dist/kernel/components/blocks/nav-breadcrumb.js +20 -5
  65. package/dist/kernel/components/blocks/navbar.d.ts +2 -2
  66. package/dist/kernel/components/blocks/navbar.js +401 -60
  67. package/dist/kernel/components/blocks/navigation-progress-playground.js +4 -4
  68. package/dist/kernel/components/blocks/navigation-progress.js +4 -1
  69. package/dist/kernel/components/blocks/next-prev.d.ts +1 -1
  70. package/dist/kernel/components/blocks/next-prev.js +11 -23
  71. package/dist/kernel/components/blocks/page-list.d.ts +1 -1
  72. package/dist/kernel/components/blocks/page-list.js +5 -4
  73. package/dist/kernel/components/blocks/search.d.ts +83 -58
  74. package/dist/kernel/components/blocks/search.js +553 -426
  75. package/dist/kernel/components/blocks/sidebar-node.d.ts +2 -2
  76. package/dist/kernel/components/blocks/sidebar-node.js +11 -9
  77. package/dist/kernel/components/blocks/sidebar.d.ts +3 -3
  78. package/dist/kernel/components/blocks/sidebar.js +18 -11
  79. package/dist/kernel/components/blocks/theme-toggle.d.ts +2 -2
  80. package/dist/kernel/components/blocks/theme-toggle.js +48 -2
  81. package/dist/kernel/components/blocks/toc.js +3 -3
  82. package/dist/kernel/components/mdx/components/blockquote.js +1 -1
  83. package/dist/kernel/components/mdx/components/callout.d.ts +5 -7
  84. package/dist/kernel/components/mdx/components/callout.js +66 -35
  85. package/dist/kernel/components/mdx/components/code-block.d.ts +5 -2
  86. package/dist/kernel/components/mdx/components/code-block.js +106 -5
  87. package/dist/kernel/components/mdx/components/copy-code-button.d.ts +8 -0
  88. package/dist/kernel/components/mdx/components/copy-code-button.js +60 -0
  89. package/dist/kernel/components/mdx/components/figure-caption.js +1 -1
  90. package/dist/kernel/components/mdx/components/figure.js +1 -1
  91. package/dist/kernel/components/mdx/components/heading-copy-link.js +3 -3
  92. package/dist/kernel/components/mdx/components/image-zoom.d.ts +2 -2
  93. package/dist/kernel/components/mdx/components/image-zoom.js +1 -1
  94. package/dist/kernel/components/mdx/components/image.js +77 -56
  95. package/dist/kernel/components/mdx/components/inline-code.js +1 -1
  96. package/dist/kernel/components/mdx/components/kbd.d.ts +2 -2
  97. package/dist/kernel/components/mdx/components/kbd.js +3 -2
  98. package/dist/kernel/components/mdx/components/link.d.ts +35 -4
  99. package/dist/kernel/components/mdx/components/link.js +1 -1
  100. package/dist/kernel/components/mdx/components/paragraph.js +1 -4
  101. package/dist/kernel/components/mdx/components/task-list.js +1 -1
  102. package/dist/kernel/components/mdx/components/video-player.js +2 -2
  103. package/dist/kernel/components/mdx/components/video.js +1 -1
  104. package/dist/kernel/components/mdx/error-boundary.d.ts +1 -1
  105. package/dist/kernel/components/mdx/mdx.d.ts +12 -8
  106. package/dist/kernel/components/mdx/mdx.js +115 -39
  107. package/dist/kernel/components/mdx/rehype-heading-ids.js +1 -1
  108. package/dist/kernel/components/mdx/types.d.ts +1 -1
  109. package/dist/kernel/components/ui/breadcrumb-trail.d.ts +6 -23
  110. package/dist/kernel/components/ui/breadcrumb.d.ts +11 -3
  111. package/dist/kernel/components/ui/breadcrumb.js +6 -4
  112. package/dist/kernel/components/ui/button-group.d.ts +1 -1
  113. package/dist/kernel/components/ui/button-group.js +5 -4
  114. package/dist/kernel/components/ui/button.d.ts +2 -2
  115. package/dist/kernel/components/ui/button.js +6 -6
  116. package/dist/kernel/components/ui/card.d.ts +2 -2
  117. package/dist/kernel/components/ui/drawer.d.ts +3 -1
  118. package/dist/kernel/components/ui/drawer.js +5 -1
  119. package/dist/kernel/components/ui/input.d.ts +4 -4
  120. package/dist/kernel/components/ui/kbd.d.ts +1 -1
  121. package/dist/kernel/components/ui/kbd.js +9 -16
  122. package/dist/kernel/components/ui/link.d.ts +5 -3
  123. package/dist/kernel/components/ui/link.js +10 -9
  124. package/dist/kernel/components/ui/menu.js +5 -5
  125. package/dist/kernel/components/ui/mod-key.d.ts +10 -0
  126. package/dist/kernel/components/ui/mod-key.js +36 -0
  127. package/dist/kernel/components/ui/navigation-menu.js +2 -2
  128. package/dist/kernel/components/ui/progress.js +1 -1
  129. package/dist/kernel/components/ui/scroll-area.d.ts +8 -8
  130. package/dist/kernel/components/ui/scroll-area.js +4 -4
  131. package/dist/kernel/components/ui/select.js +7 -10
  132. package/dist/kernel/components/ui/text.d.ts +2 -2
  133. package/dist/kernel/components/ui/theme-toggle.d.ts +3 -3
  134. package/dist/kernel/components/ui/theme-toggle.js +4 -9
  135. package/dist/kernel/defaults.registry.d.ts +9 -9
  136. package/dist/kernel/defaults.registry.js +9 -9
  137. package/dist/kernel/routes/agent/markdown.d.ts +0 -1
  138. package/dist/kernel/routes/layouts/group.d.ts +1 -1
  139. package/dist/kernel/routes/metadata/feed.d.ts +1 -1
  140. package/dist/kernel/routes/metadata/feed.js +13 -9
  141. package/dist/kernel/routes/metadata/llms.d.ts +2 -1
  142. package/dist/kernel/routes/metadata/llms.js +4 -4
  143. package/dist/kernel/routes/metadata/robots.d.ts +1 -1
  144. package/dist/kernel/routes/metadata/robots.js +2 -2
  145. package/dist/kernel/routes/metadata/sitemap.d.ts +6 -3
  146. package/dist/kernel/routes/metadata/sitemap.js +48 -20
  147. package/dist/kernel/routes/pages/group.d.ts +1 -1
  148. package/dist/kernel/routes/pages/group.js +20 -12
  149. package/dist/kernel/routes/pages/leaf.d.ts +2 -2
  150. package/dist/kernel/routes/pages/leaf.js +20 -12
  151. package/dist/kernel/routes/pages/root.d.ts +2 -2
  152. package/dist/kernel/routes/pages/root.js +18 -12
  153. package/dist/resolvers/manifest-resolver.js +29 -6
  154. package/dist/search.d.ts +6 -7
  155. package/dist/search.js +47 -22
  156. package/dist/{sidebar-types-Bgchdfd6.d.ts → sidebar-types-DKpR27II.d.ts} +1 -1
  157. package/dist/{types-CIwwieNw.d.ts → types-BzkZty3r.d.ts} +23 -3
  158. package/dist/{types-DHBm7-j6.d.ts → types-CJWRG05y.d.ts} +20 -1
  159. package/dist/{types-B_b3C0U6.d.ts → types-CUtrppxt.d.ts} +8 -2
  160. package/dist/types.d.ts +14 -6
  161. package/dist/validate-local-source-XRL2Y7XE.js +14 -0
  162. package/dist/validate-publish-os-source-DAPZ4QGE.js +12 -0
  163. package/init/seed/minimal/.gitignore +1 -0
  164. package/init/seed/minimal/publish.os/assets/favicon/favicon.dark.png +0 -0
  165. package/init/seed/minimal/publish.os/assets/favicon/favicon.png +0 -0
  166. package/init/seed/minimal/publish.os/docs/content/get-started.mdx +6 -10
  167. package/init/seed/minimal/publish.os/docs/content/groups.mdx +1 -1
  168. package/init/seed/minimal/publish.os/docs/content/{theme.mdx → themes.mdx} +14 -12
  169. package/init/seed/minimal/publish.os/publish.os.config.json +3 -7
  170. package/init/seed/minimal/publish.os/theme.css +52 -24
  171. package/init/seed/minimal/publish.os/tsconfig.json +3 -0
  172. package/init/seed/minimal/seed.json +4 -1
  173. package/init/seed/scratch/publish.os/docs/content/get-started.mdx +6 -0
  174. package/init/seed/scratch/publish.os/publish.os.config.json +4 -0
  175. package/init/seed/scratch/seed.json +5 -0
  176. package/package.json +12 -26
  177. package/release/app/phosphor/package.json +3 -3
  178. package/release/app/phosphor/pnpm-lock.yaml.template +523 -360
  179. package/release/app/phosphor/pnpm-workspace.yaml +3 -0
  180. package/release/compiler/package.json +1 -1
  181. package/release/compiler/pnpm-lock.yaml.template +439 -286
  182. package/release/compiler/pnpm-workspace.yaml +3 -0
  183. package/release/release.json +7 -36
  184. package/compiler-assets/nextjs/defaults/group/leaf.tsx +0 -48
  185. package/dist/icons.d.ts +0 -1
  186. package/dist/icons.js +0 -2
  187. package/dist/kernel/components/mdx/components/pre.d.ts +0 -6
  188. package/dist/kernel/components/mdx/components/pre.js +0 -18
  189. package/dist/kernel/components/ui/meta-key.d.ts +0 -17
  190. package/dist/kernel/components/ui/meta-key.js +0 -9
  191. package/dist/kernel/framework-icons.d.ts +0 -1
  192. package/dist/kernel/framework-icons.js +0 -39
  193. package/dist/link-CYaCRDb6.d.ts +0 -35
  194. package/dist/route-metadata-og-image-BeKKFHg7.d.ts +0 -58
  195. package/dist/types-sM2g9nW0.d.ts +0 -12
  196. package/release/app/lucide/package.json +0 -30
  197. package/release/app/lucide/pnpm-lock.yaml.template +0 -2905
  198. package/release/app/lucide/pnpm-workspace.yaml +0 -11
  199. package/release/app/tabler/package.json +0 -30
  200. package/release/app/tabler/pnpm-lock.yaml.template +0 -2911
  201. package/release/app/tabler/pnpm-workspace.yaml +0 -11
package/dist/search.js CHANGED
@@ -5,14 +5,21 @@ import { useShortcut } from "@publish.os/nextjs/keyboard-shortcuts";
5
5
  import { useRouter } from "next/navigation";
6
6
  import {
7
7
  createContext,
8
+ startTransition,
9
+ use,
8
10
  useCallback,
9
- useContext,
10
11
  useEffect,
11
12
  useId,
12
13
  useMemo,
13
14
  useRef,
14
15
  useState
15
16
  } from "react";
17
+
18
+ // src/lib/hosting/framework-paths.ts
19
+ var FRAMEWORK_PREFIX = "/publishos", ASSET_PREFIX = `${FRAMEWORK_PREFIX}/assets`, SITE_API_PREFIX = `${FRAMEWORK_PREFIX}/api`, PAGEFIND_PREFIX = `${ASSET_PREFIX}/pagefind`, PAGEFIND_MODULE_URL = `${PAGEFIND_PREFIX}/pagefind.js`, PAGEFIND_ENTRY_URL = `${PAGEFIND_PREFIX}/pagefind-entry.json`, IMAGE_OPTIMIZER_PATH = `${SITE_API_PREFIX}/image`;
20
+ var OG_SERVICE_PREFIX = `${SITE_API_PREFIX}/og`, PUBLIC_ASSET_DIRECTORY = "publishos/assets", PUBLIC_FONT_DIRECTORY = `${PUBLIC_ASSET_DIRECTORY}/_publishos/fonts`, PUBLIC_PAGEFIND_DIRECTORY = `public/${PUBLIC_ASSET_DIRECTORY}/pagefind`, FRAMEWORK_PROXY_MATCHER = `/((?!${FRAMEWORK_PREFIX.slice(1)}(?:/|$)|_next/static|_next/image|_next/webpack-hmr).*)`;
21
+
22
+ // src/modules/search/search.tsx
16
23
  import { jsx } from "react/jsx-runtime";
17
24
  var EMPTY_SEARCH_OUTPUT = {
18
25
  items: [],
@@ -40,7 +47,7 @@ function inactiveIndexMessage() {
40
47
  total: 0
41
48
  };
42
49
  }
43
- var SEARCH_STATUS_URL = "/pagefind/pagefind-entry.json", PAGEFIND_URL = "/pagefind/pagefind.js", pagefindModulePromise = null, activeIndex;
50
+ var SEARCH_STATUS_URL = PAGEFIND_ENTRY_URL, PAGEFIND_URL = PAGEFIND_MODULE_URL, pagefindModulePromise = null, pagefindModuleFailures = 0, activeIndex;
44
51
  async function fetchSearchStatus(signal) {
45
52
  let response = await fetch(SEARCH_STATUS_URL, {
46
53
  cache: "no-store",
@@ -53,7 +60,10 @@ async function fetchSearchStatus(signal) {
53
60
  return response?.ok ? (await response.json()).publishos ?? null : null;
54
61
  }
55
62
  async function loadPagefind() {
56
- return pagefindModulePromise ??= new Function("src", "return import(src)")(PAGEFIND_URL), pagefindModulePromise;
63
+ let url = pagefindModuleFailures ? `${PAGEFIND_URL}?retry=${pagefindModuleFailures}` : PAGEFIND_URL;
64
+ return pagefindModulePromise ??= new Function("src", "return import(src)")(url).catch((error) => {
65
+ throw pagefindModuleFailures += 1, pagefindModulePromise = null, error;
66
+ }), pagefindModulePromise;
57
67
  }
58
68
  async function withPagefindIndex(revision, run) {
59
69
  let release = async (index) => {
@@ -66,7 +76,9 @@ async function withPagefindIndex(revision, run) {
66
76
  readers: 0,
67
77
  retired: !1,
68
78
  instance: loadPagefind().then(async (module) => {
69
- let instance = module.createInstance({ bundlePath: "/pagefind/" });
79
+ let instance = module.createInstance({
80
+ baseUrl: "/"
81
+ });
70
82
  return await instance.init?.(), instance;
71
83
  })
72
84
  }, previous && (previous.retired = !0, release(previous).catch(() => {
@@ -76,6 +88,8 @@ async function withPagefindIndex(revision, run) {
76
88
  selected.readers += 1;
77
89
  try {
78
90
  return await run(await selected.instance);
91
+ } catch (error) {
92
+ throw activeIndex === selected && (activeIndex = void 0), selected.retired = !0, error;
79
93
  } finally {
80
94
  selected.readers -= 1, await release(selected);
81
95
  }
@@ -92,6 +106,20 @@ function pagefindFilters(filters) {
92
106
  function titleForResult(data) {
93
107
  return data.meta?.title ?? data.sub_results?.find((subResult) => subResult.title)?.title ?? data.url;
94
108
  }
109
+ function plainExcerpt(value) {
110
+ let entities = {
111
+ "&": "&",
112
+ "&lt;": "<",
113
+ "&gt;": ">",
114
+ "&quot;": '"',
115
+ "&#39;": "'",
116
+ "&#x27;": "'"
117
+ };
118
+ return value.replace(/<[^>]*>/g, "").replace(
119
+ /&(?:amp|lt|gt|quot|#39|#x27);/g,
120
+ (entity) => entities[entity] ?? entity
121
+ );
122
+ }
95
123
  function toSearchResult({
96
124
  data,
97
125
  fallbackId,
@@ -102,11 +130,11 @@ function toSearchResult({
102
130
  excerpt,
103
131
  id: data.url || fallbackId,
104
132
  meta: data.meta ?? {},
105
- plainExcerpt: data.plain_excerpt ?? excerpt.replace(/<[^>]*>/g, ""),
133
+ plainExcerpt: plainExcerpt(data.plain_excerpt ?? excerpt),
106
134
  score,
107
135
  subResults: (data.sub_results ?? []).map((result) => ({
108
136
  excerpt: result.excerpt ?? "",
109
- plainExcerpt: (result.excerpt ?? "").replace(/<[^>]*>/g, ""),
137
+ plainExcerpt: plainExcerpt(result.plain_excerpt ?? result.excerpt ?? ""),
110
138
  title: result.title ?? title,
111
139
  url: result.url ?? data.url
112
140
  })),
@@ -204,7 +232,7 @@ function useSearch(input) {
204
232
  }, [stableInput]), output;
205
233
  }
206
234
  function useSearchBlock() {
207
- let value = useContext(SearchBlockContext);
235
+ let value = use(SearchBlockContext);
208
236
  if (!value)
209
237
  throw new Error("useSearchBlock must be used inside <Search.Root>.");
210
238
  return value;
@@ -215,14 +243,15 @@ function SearchProvider({
215
243
  limit = DEFAULT_SEARCH_LIMIT,
216
244
  onOpenChange,
217
245
  open: controlledOpen,
218
- shortcut = "mod+k",
219
- variant = "desktop"
246
+ shortcut = "mod+k"
220
247
  }) {
221
- let [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen), [query, setQuery] = useState(""), [isTyping, setIsTyping] = useState(!1), [selectedValue, setSelectedValue] = useState(""), typingTimer = useRef(null), inputRef = useRef(null), listRef = useRef(null), router = useRouter(), inputId = useId(), listId = useId(), open = controlledOpen ?? uncontrolledOpen, output = useSearch({ limit, q: query }), [displayResults, setDisplayResults] = useState([]), selectedResultId = (displayResults.find((result) => result.id === selectedValue) ?? displayResults[0])?.id ?? "", loading = !!query.trim() && !isTyping && output.status === "idle", setOpen = useCallback(
248
+ let [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen), [query, setQuery] = useState(""), [isTyping, setIsTyping] = useState(!1), [selectedValue, setSelectedValue] = useState(""), typingTimer = useRef(null), inputRef = useRef(null), listRef = useRef(null), triggerRef = useRef(null), router = useRouter(), inputId = useId(), listId = useId(), popupId = useId(), open = controlledOpen ?? uncontrolledOpen, output = useSearch({ limit, q: open ? query : "" }), [displayResults, setDisplayResults] = useState([]), selectedResultId = (displayResults.find((result) => result.id === selectedValue) ?? displayResults[0])?.id ?? "", loading = open && !!query.trim() && !isTyping && output.status === "idle", setOpen = useCallback(
222
249
  (nextOpen) => {
223
- controlledOpen === void 0 && setUncontrolledOpen(nextOpen), onOpenChange?.(nextOpen), nextOpen || (setQuery(""), setSelectedValue(""), setIsTyping(!1));
250
+ startTransition(() => {
251
+ controlledOpen === void 0 && setUncontrolledOpen(nextOpen), onOpenChange?.(nextOpen);
252
+ }), nextOpen && !open && (setQuery(""), setSelectedValue(""), setIsTyping(!1)), nextOpen || typingTimer.current !== null && (window.clearTimeout(typingTimer.current), typingTimer.current = null);
224
253
  },
225
- [controlledOpen, onOpenChange]
254
+ [controlledOpen, onOpenChange, open]
226
255
  ), setQueryValue = useCallback((value) => {
227
256
  setQuery(value);
228
257
  }, []), handleInputChange = useCallback((value) => {
@@ -235,13 +264,8 @@ function SearchProvider({
235
264
  },
236
265
  [router, setOpen]
237
266
  );
238
- useEffect(() => {
239
- if (!open) return;
240
- let frame = window.requestAnimationFrame(() => {
241
- inputRef.current?.focus();
242
- });
243
- return () => window.cancelAnimationFrame(frame);
244
- }, [open]), useShortcut(shortcut, () => setOpen(!0), {
267
+ useShortcut(shortcut || "mod+k", () => setOpen(!0), {
268
+ enabled: shortcut !== !1 && !open,
245
269
  description: "Open search",
246
270
  group: "Search",
247
271
  priority: 100
@@ -277,8 +301,9 @@ function SearchProvider({
277
301
  inputRef,
278
302
  listId,
279
303
  listRef,
304
+ popupId,
280
305
  shortcut,
281
- variant
306
+ triggerRef
282
307
  },
283
308
  state: {
284
309
  displayResults,
@@ -304,12 +329,12 @@ function SearchProvider({
304
329
  output.message,
305
330
  output.status,
306
331
  output.total,
332
+ popupId,
307
333
  query,
308
334
  selectedResultId,
309
335
  setOpen,
310
336
  setQueryValue,
311
- shortcut,
312
- variant
337
+ shortcut
313
338
  ]
314
339
  );
315
340
  return /* @__PURE__ */ jsx(SearchBlockContext.Provider, { value: contextValue, children });
@@ -1,5 +1,5 @@
1
1
  import { Ref, ReactNode, MouseEvent } from 'react';
2
- import { T as TreeNode } from './types-DHBm7-j6.js';
2
+ import { T as TreeNode } from './types-CJWRG05y.js';
3
3
 
4
4
  type SidebarTreeNode = TreeNode & {
5
5
  children?: SidebarTreeNode[];
@@ -1,8 +1,8 @@
1
1
  type SiteData = {
2
2
  name: string;
3
3
  description?: string;
4
- url?: string;
5
- og?: OgMetadata;
4
+ origin?: string;
5
+ og?: OgIndexMetadata;
6
6
  };
7
7
  type OgImageMetadata = string | {
8
8
  src: string;
@@ -13,6 +13,9 @@ type OgMetadata = {
13
13
  description?: string;
14
14
  image?: OgImageMetadata;
15
15
  };
16
+ type OgIndexMetadata = OgMetadata & {
17
+ scope?: "page" | "subtree";
18
+ };
16
19
  type Author = {
17
20
  id?: string;
18
21
  name: string;
@@ -42,6 +45,7 @@ type PageNode = {
42
45
  fileID: string;
43
46
  title: string;
44
47
  path: string;
48
+ href?: string;
45
49
  group: string;
46
50
  description?: string;
47
51
  status: PageStatus;
@@ -57,6 +61,7 @@ type SectionNode = {
57
61
  id: string;
58
62
  title: string;
59
63
  path?: string;
64
+ href?: string;
60
65
  group?: string;
61
66
  children: TreeNode[];
62
67
  };
@@ -65,6 +70,7 @@ type FolderNode = {
65
70
  id: string;
66
71
  title: string;
67
72
  path?: string;
73
+ href?: string;
68
74
  group?: string;
69
75
  children: TreeNode[];
70
76
  };
@@ -94,7 +100,9 @@ type GroupManifest = {
94
100
  key: string;
95
101
  title: string;
96
102
  path: string;
103
+ origin?: string;
97
104
  ancestry?: string[];
105
+ og?: OgIndexMetadata;
98
106
  meta?: Record<string, unknown>;
99
107
  tree: TreeNode[];
100
108
  pages: PageData[];
@@ -108,6 +116,10 @@ type ManifestLike = {
108
116
  attribution?: Record<string, ResolvedAttribution>;
109
117
  contentHash: string;
110
118
  };
119
+ type RootPageProps = {
120
+ site: SiteData;
121
+ tree: TreeNode[];
122
+ };
111
123
  type LayoutProps = {
112
124
  children: React.ReactNode;
113
125
  site: SiteData;
@@ -116,6 +128,14 @@ type LayoutProps = {
116
128
  currentPath: string;
117
129
  group: string;
118
130
  };
131
+ type PageProps<TMeta extends Record<string, unknown> = Record<string, unknown>> = {
132
+ site: SiteData;
133
+ tree: TreeNode[];
134
+ node: TreeNode;
135
+ page: PageData<TMeta>;
136
+ currentPath: string;
137
+ group: string;
138
+ };
119
139
  type IndexPageProps = {
120
140
  site: SiteData;
121
141
  tree: TreeNode[];
@@ -124,4 +144,4 @@ type IndexPageProps = {
124
144
  group: string;
125
145
  };
126
146
 
127
- export type { IndexPageProps as I, LayoutProps as L, ManifestLike as M, PageStatus as P };
147
+ export type { IndexPageProps as I, LayoutProps as L, ManifestLike as M, PageStatus as P, ResolvedAttribution as R, PageProps as a, RootPageProps as b };
@@ -15,11 +15,28 @@ type Author = {
15
15
  url?: string;
16
16
  };
17
17
  type PageStatus = "published" | "draft" | "archived";
18
+ type PageData<TMeta extends Record<string, unknown> = Record<string, unknown>> = {
19
+ fileID: string;
20
+ group: string;
21
+ slug: string;
22
+ path: string;
23
+ title: string;
24
+ description?: string;
25
+ status: PageStatus;
26
+ publishedAt?: string;
27
+ updatedAt?: string;
28
+ authors: Author[];
29
+ tags: string[];
30
+ og?: OgMetadata;
31
+ meta: TMeta;
32
+ body: string;
33
+ };
18
34
  type PageNode = {
19
35
  type: "page";
20
36
  fileID: string;
21
37
  title: string;
22
38
  path: string;
39
+ href?: string;
23
40
  group: string;
24
41
  description?: string;
25
42
  status: PageStatus;
@@ -35,6 +52,7 @@ type SectionNode = {
35
52
  id: string;
36
53
  title: string;
37
54
  path?: string;
55
+ href?: string;
38
56
  group?: string;
39
57
  children: TreeNode[];
40
58
  };
@@ -43,6 +61,7 @@ type FolderNode = {
43
61
  id: string;
44
62
  title: string;
45
63
  path?: string;
64
+ href?: string;
46
65
  group?: string;
47
66
  children: TreeNode[];
48
67
  };
@@ -54,4 +73,4 @@ type LinkNode = {
54
73
  };
55
74
  type TreeNode = PageNode | SectionNode | FolderNode | LinkNode;
56
75
 
57
- export type { TreeNode as T };
76
+ export type { PageData as P, TreeNode as T };
@@ -1,8 +1,8 @@
1
1
  type SiteData = {
2
2
  name: string;
3
3
  description?: string;
4
- url?: string;
5
- og?: OgMetadata;
4
+ origin?: string;
5
+ og?: OgIndexMetadata;
6
6
  };
7
7
  type OgImageMetadata = string | {
8
8
  src: string;
@@ -13,6 +13,9 @@ type OgMetadata = {
13
13
  description?: string;
14
14
  image?: OgImageMetadata;
15
15
  };
16
+ type OgIndexMetadata = OgMetadata & {
17
+ scope?: "page" | "subtree";
18
+ };
16
19
  type Author = {
17
20
  id?: string;
18
21
  name: string;
@@ -26,6 +29,7 @@ type PageNode = {
26
29
  fileID: string;
27
30
  title: string;
28
31
  path: string;
32
+ href?: string;
29
33
  group: string;
30
34
  description?: string;
31
35
  status: PageStatus;
@@ -41,6 +45,7 @@ type SectionNode = {
41
45
  id: string;
42
46
  title: string;
43
47
  path?: string;
48
+ href?: string;
44
49
  group?: string;
45
50
  children: TreeNode[];
46
51
  };
@@ -49,6 +54,7 @@ type FolderNode = {
49
54
  id: string;
50
55
  title: string;
51
56
  path?: string;
57
+ href?: string;
52
58
  group?: string;
53
59
  children: TreeNode[];
54
60
  };
package/dist/types.d.ts CHANGED
@@ -46,7 +46,6 @@ type SearchOutput = {
46
46
  status: SearchStatus;
47
47
  total: number;
48
48
  };
49
- type SearchBlockVariant = "desktop" | "mobile";
50
49
  type SearchBlockState = {
51
50
  displayResults: SearchResult[];
52
51
  isTyping: boolean;
@@ -70,8 +69,9 @@ type SearchBlockMeta = {
70
69
  inputRef: RefObject<HTMLInputElement | null>;
71
70
  listId: string;
72
71
  listRef: RefObject<HTMLDivElement | null>;
73
- shortcut: string;
74
- variant: SearchBlockVariant;
72
+ popupId: string;
73
+ shortcut: string | false;
74
+ triggerRef: RefObject<HTMLButtonElement | null>;
75
75
  };
76
76
  type SearchBlockContextValue = {
77
77
  actions: SearchBlockActions;
@@ -87,8 +87,8 @@ type Heading = {
87
87
  type SiteData = {
88
88
  name: string;
89
89
  description?: string;
90
- url?: string;
91
- og?: OgMetadata;
90
+ origin?: string;
91
+ og?: OgIndexMetadata;
92
92
  };
93
93
  type OgImageMetadata = string | {
94
94
  src: string;
@@ -99,6 +99,9 @@ type OgMetadata = {
99
99
  description?: string;
100
100
  image?: OgImageMetadata;
101
101
  };
102
+ type OgIndexMetadata = OgMetadata & {
103
+ scope?: "page" | "subtree";
104
+ };
102
105
  type Author = {
103
106
  id?: string;
104
107
  name: string;
@@ -142,6 +145,7 @@ type PageNode = {
142
145
  fileID: string;
143
146
  title: string;
144
147
  path: string;
148
+ href?: string;
145
149
  group: string;
146
150
  description?: string;
147
151
  status: PageStatus;
@@ -157,6 +161,7 @@ type SectionNode = {
157
161
  id: string;
158
162
  title: string;
159
163
  path?: string;
164
+ href?: string;
160
165
  group?: string;
161
166
  children: TreeNode[];
162
167
  };
@@ -165,6 +170,7 @@ type FolderNode = {
165
170
  id: string;
166
171
  title: string;
167
172
  path?: string;
173
+ href?: string;
168
174
  group?: string;
169
175
  children: TreeNode[];
170
176
  };
@@ -199,7 +205,9 @@ type GroupManifest = {
199
205
  key: string;
200
206
  title: string;
201
207
  path: string;
208
+ origin?: string;
202
209
  ancestry?: string[];
210
+ og?: OgIndexMetadata;
203
211
  meta?: Record<string, unknown>;
204
212
  tree: TreeNode[];
205
213
  pages: PageData[];
@@ -265,4 +273,4 @@ type GroupContext = {
265
273
 
266
274
  declare const __publishOsTypesModule = true;
267
275
 
268
- export { type Author, type FolderNode, type GroupContext, type GroupForcedMode, type GroupManifest, type Heading, type IndexPageProps, type LayoutProps, type LinkNode, type ManifestLike, type NavFolder, type NavItem, type NavLink, type NavPage, type NavSection, type OgImageMetadata, type OgMetadata, type PageData, type PageFrontmatter, type PageNode, type PageProps, type PageStatus, type PageSummary, type ResolvedAttribution, type RootLayoutProps, type RootPageProps, type RouteRecord, type SearchBlockActions, type SearchBlockContextValue, type SearchBlockMeta, type SearchBlockState, type SearchBlockVariant, type SearchInput, type SearchOutput, type SearchResult, type SearchStatus, type SearchSubResult, type SectionNode, type SiteData, type ThemeMode, type TreeNode, __publishOsTypesModule };
276
+ export { type Author, type FolderNode, type GroupContext, type GroupForcedMode, type GroupManifest, type Heading, type IndexPageProps, type LayoutProps, type LinkNode, type ManifestLike, type NavFolder, type NavItem, type NavLink, type NavPage, type NavSection, type OgImageMetadata, type OgIndexMetadata, type OgMetadata, type PageData, type PageFrontmatter, type PageNode, type PageProps, type PageStatus, type PageSummary, type ResolvedAttribution, type RootLayoutProps, type RootPageProps, type RouteRecord, type SearchBlockActions, type SearchBlockContextValue, type SearchBlockMeta, type SearchBlockState, type SearchInput, type SearchOutput, type SearchResult, type SearchStatus, type SearchSubResult, type SectionNode, type SiteData, type ThemeMode, type TreeNode, __publishOsTypesModule };
@@ -0,0 +1,14 @@
1
+ import {
2
+ validateLocalSource
3
+ } from "./chunk-VO2I7MTM.js";
4
+ import "./chunk-726GV2NF.js";
5
+ import "./chunk-NECL5IBJ.js";
6
+ import "./chunk-535TM4A5.js";
7
+ import "./chunk-DLDFHU7Y.js";
8
+ import "./chunk-7OGTPSKI.js";
9
+ import "./chunk-YLTOLYWM.js";
10
+ import "./chunk-AI2UULNX.js";
11
+ import "./chunk-WDY4IK6Z.js";
12
+ export {
13
+ validateLocalSource
14
+ };
@@ -0,0 +1,12 @@
1
+ import {
2
+ validatePublishOsSource
3
+ } from "./chunk-726GV2NF.js";
4
+ import "./chunk-NECL5IBJ.js";
5
+ import "./chunk-535TM4A5.js";
6
+ import "./chunk-7OGTPSKI.js";
7
+ import "./chunk-YLTOLYWM.js";
8
+ import "./chunk-AI2UULNX.js";
9
+ import "./chunk-WDY4IK6Z.js";
10
+ export {
11
+ validatePublishOsSource
12
+ };
@@ -0,0 +1 @@
1
+ .publish.os/
@@ -14,11 +14,11 @@ Local previews and builds do not require an account.
14
14
 
15
15
  From your project directory, run this command:
16
16
 
17
- ```bash
18
- npx --package @publish.os/cli@latest publishos dev
17
+ ```bash title="Preview the site"
18
+ npx @publish.os/cli@latest dev
19
19
  ```
20
20
 
21
- Open the address that the CLI shows. To stop the preview, press `Ctrl+C`.
21
+ Open the address that the CLI shows. To stop the preview, press <kbd>Ctrl</kbd>+<kbd>C</kbd>.
22
22
 
23
23
  ## Make one change
24
24
 
@@ -30,13 +30,7 @@ Use Markdown for normal text. You can use **bold text**, _italic text_, and `cod
30
30
 
31
31
  You can also use MDX components to add interactive elements to your pages.
32
32
 
33
- <Callout title="A short note">
34
- A short notice or piece of information.
35
- </Callout>
36
-
37
- ```text
38
- Code blocks can show quick examples.
39
- ```
33
+ Use [callouts](/docs/callouts) to add notes, warnings, and useful context. The callout guide shows every color and style.
40
34
 
41
35
  You can show a keyboard shortcut such as <kbd>Ctrl</kbd>+<kbd>Enter</kbd>.
42
36
 
@@ -52,3 +46,5 @@ description: Add a page to your site.
52
46
 
53
47
  Each MDX file contains one page.
54
48
  ```
49
+
50
+ Next try creating or modifying <a href="/docs/groups">groups</a> or customizing your <a href="/docs/themes">theme</a>.
@@ -28,4 +28,4 @@ The `blog` folder creates a separate content group. Its pages can share a layout
28
28
  | `docs` | Explain how to use it |
29
29
  | `blog` | Explain what you learn |
30
30
 
31
- Use short file names with hyphens between words. Link to the page that answers the next question, such as [how to change the theme](/docs/theme).
31
+ Use short file names with hyphens between words. Link to the page that answers the next question, such as [how to change the theme](/docs/themes).
@@ -27,21 +27,21 @@ You can use `xs`, `sm`, `md`, `lg`, `xl`, or `none`. You can also use a custom v
27
27
 
28
28
  The neutral color palette changes the complete design system. Define the palette with a neutral scale.
29
29
 
30
- Low values usually define surfaces. Higher values add contrast for borders, text, and emphasized elements.
30
+ Keep every palette color opaque, including subtle surfaces. Hover, active, and stroke tokens use transparency so controls adapt to the surface beneath them.
31
31
 
32
32
  ```css
33
- --gray-100: #ffffff;
34
- --gray-200: #fafafa;
35
- --gray-300: #f5f5f5;
36
- --gray-400: #eeeeee;
37
- --gray-500: #e5e5e5;
38
- --gray-600: #d4d4d4;
39
- --gray-700: #a3a3a3;
33
+ --gray-100: #fcfcfc;
34
+ --gray-200: #f9f9f9;
35
+ --gray-300: #f3f3f3;
36
+ --gray-400: #f0f0f0;
37
+ --gray-500: #e0e0e0;
38
+ --gray-600: #c6c6c6;
39
+ --gray-700: #999999;
40
40
  --gray-800: #737373;
41
- --gray-900: #525252;
42
- --gray-1000: #404040;
43
- --gray-1100: #262626;
44
- --gray-1200: #000000;
41
+ --gray-900: #5d5d5d;
42
+ --gray-1000: #464646;
43
+ --gray-1100: #2e2e2e;
44
+ --gray-1200: #171717;
45
45
 
46
46
  --neutral-100: var(--gray-100);
47
47
  --neutral-200: var(--gray-200);
@@ -62,3 +62,5 @@ Set the accent to your brand color or a color from the palette:
62
62
  ```css
63
63
  --accent: #ed940f;
64
64
  ```
65
+
66
+ For layered controls, keep page and popup surfaces opaque. Derive hover, pressed, and border colors from a foreground or accent with transparency. The default theme does this with `color-mix()`, so the same control works on both light and dark surfaces. Keep text and solid button fills opaque for contrast.
@@ -1,21 +1,17 @@
1
1
  {
2
2
  "version": 1,
3
- "runtime": "@publish.os/nextjs@0.0.1-alpha.8",
3
+ "runtime": "@publish.os/nextjs@0.0.1-alpha.90",
4
4
  "site": {
5
- "name": "publishOS guides",
5
+ "name": "publish.os guides",
6
6
  "description": "Write pages, organize content, and build your site."
7
7
  },
8
8
  "fonts": {
9
9
  "main": {
10
- "family": "Work Sans",
11
- "weight": "100 900"
10
+ "family": "Inter"
12
11
  },
13
12
  "mono": {
14
13
  "family": "DM Mono",
15
14
  "weight": ["300", "400", "500"]
16
15
  }
17
- },
18
- "icons": {
19
- "family": "phosphor"
20
16
  }
21
17
  }
@@ -1,18 +1,18 @@
1
1
  /* Delete this file to use the same PublishOS fallback theme. */
2
2
 
3
3
  :root {
4
- --gray-100: #ffffff;
5
- --gray-200: #fafafa;
6
- --gray-300: #f5f5f5;
7
- --gray-400: #eeeeee;
8
- --gray-500: #e5e5e5;
9
- --gray-600: #d4d4d4;
10
- --gray-700: #a3a3a3;
4
+ --gray-100: #fcfcfc;
5
+ --gray-200: #f9f9f9;
6
+ --gray-300: #f3f3f3;
7
+ --gray-400: #f0f0f0;
8
+ --gray-500: #e0e0e0;
9
+ --gray-600: #c6c6c6;
10
+ --gray-700: #999999;
11
11
  --gray-800: #737373;
12
- --gray-900: #525252;
13
- --gray-1000: #404040;
14
- --gray-1100: #262626;
15
- --gray-1200: #000000;
12
+ --gray-900: #5d5d5d;
13
+ --gray-1000: #464646;
14
+ --gray-1100: #2e2e2e;
15
+ --gray-1200: #171717;
16
16
 
17
17
  --neutral-100: var(--gray-100);
18
18
  --neutral-200: var(--gray-200);
@@ -27,21 +27,49 @@
27
27
  --neutral-1100: var(--gray-1100);
28
28
  --neutral-1200: var(--gray-1200);
29
29
 
30
- --accent: var(--gray-1200);
31
- --theme-radius: var(--theme-radius-md);
30
+ --blue-100: #f7fbff;
31
+ --blue-200: #edf6fe;
32
+ --blue-300: #e3f1fd;
33
+ --blue-400: #d8ecfc;
34
+ --blue-500: #b3dbfd;
35
+ --blue-600: #8ecaff;
36
+ --blue-700: #6ab7ff;
37
+ --blue-800: #42a3ff;
38
+ --blue-900: #018dff;
39
+ --blue-1000: #0071ce;
40
+ --blue-1100: #00569f;
41
+ --blue-1200: #003d73;
42
+
43
+ --accent: var(--blue-900);
44
+ --accent-2: var(--blue-800);
45
+ --accent-3: var(--blue-700);
46
+ --theme-radius: var(--theme-radius-sm);
32
47
  }
33
48
 
34
49
  .dark {
35
- --gray-100: #000000;
36
- --gray-200: #0a0a0a;
37
- --gray-300: #171717;
38
- --gray-400: #262626;
39
- --gray-500: #404040;
50
+ --gray-100: #131313;
51
+ --gray-200: #1a1a1a;
52
+ --gray-300: #212121;
53
+ --gray-400: #292929;
54
+ --gray-500: #383838;
40
55
  --gray-600: #525252;
41
- --gray-700: #737373;
42
- --gray-800: #a3a3a3;
43
- --gray-900: #d4d4d4;
44
- --gray-1000: #e5e5e5;
45
- --gray-1100: #f5f5f5;
46
- --gray-1200: #ffffff;
56
+ --gray-700: #767676;
57
+ --gray-800: #b3b3b3;
58
+ --gray-900: #c4c4c4;
59
+ --gray-1000: #d2d2d2;
60
+ --gray-1100: #e6e6e6;
61
+ --gray-1200: #f5f5f5;
62
+
63
+ --blue-100: #101d29;
64
+ --blue-200: #142739;
65
+ --blue-300: #173249;
66
+ --blue-400: #193d5a;
67
+ --blue-500: #235278;
68
+ --blue-600: #2d6898;
69
+ --blue-700: #377fb9;
70
+ --blue-800: #4297dc;
71
+ --blue-900: #4dafff;
72
+ --blue-1000: #84c8ff;
73
+ --blue-1100: #b6dfff;
74
+ --blue-1200: #e8f5ff;
47
75
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "./.publish.os/ide/tsconfig.json"
3
+ }