@silicajs/components 0.2.4 → 0.3.1

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.
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type BacklinkItem = {
4
4
  slug: string;
@@ -8,6 +8,6 @@ type BacklinksProps = {
8
8
  backlinks: BacklinkItem[];
9
9
  className?: string;
10
10
  };
11
- declare function Backlinks({ backlinks, className }: BacklinksProps): react_jsx_runtime.JSX.Element | null;
11
+ declare function Backlinks({ backlinks, className }: BacklinksProps): React.JSX.Element | null;
12
12
 
13
13
  export { type BacklinkItem, Backlinks, type BacklinksProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type BreadcrumbLinkItem = {
4
4
  label: string;
@@ -8,6 +8,6 @@ type BreadcrumbsProps = {
8
8
  items: BreadcrumbLinkItem[];
9
9
  className?: string;
10
10
  };
11
- declare function Breadcrumbs({ items, className }: BreadcrumbsProps): react_jsx_runtime.JSX.Element | null;
11
+ declare function Breadcrumbs({ items, className }: BreadcrumbsProps): React.JSX.Element | null;
12
12
 
13
13
  export { type BreadcrumbLinkItem, Breadcrumbs, type BreadcrumbsProps };
@@ -1,8 +1,8 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type DarkModeToggleProps = {
4
4
  className?: string;
5
5
  };
6
- declare function DarkModeToggle({ className }: DarkModeToggleProps): react_jsx_runtime.JSX.Element;
6
+ declare function DarkModeToggle({ className }: DarkModeToggleProps): React.JSX.Element;
7
7
 
8
8
  export { DarkModeToggle, type DarkModeToggleProps };
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  declare function GoogleIcon({ className }: {
4
4
  className?: string;
5
- }): react_jsx_runtime.JSX.Element;
5
+ }): React.JSX.Element;
6
6
 
7
7
  export { GoogleIcon };
package/dist/index.d.ts CHANGED
@@ -13,6 +13,5 @@ export { TagsList, TagsListProps } from './tags-list.js';
13
13
  export { UserMenu, UserMenuProps } from './user-menu.js';
14
14
  export { VaultTree, VaultTreeProps } from './vault-tree.js';
15
15
  export { breadcrumbSegmentHref, prettySegment, slugToHref } from './slug.js';
16
- import 'react/jsx-runtime';
17
16
  import 'react';
18
17
  import '@silicajs/core/runtime';
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type NotAllowedProps = {
4
4
  title?: string;
@@ -9,6 +9,6 @@ type NotAllowedProps = {
9
9
  };
10
10
  className?: string;
11
11
  };
12
- declare function NotAllowed({ title, description, cta, className, }: NotAllowedProps): react_jsx_runtime.JSX.Element;
12
+ declare function NotAllowed({ title, description, cta, className, }: NotAllowedProps): React.JSX.Element;
13
13
 
14
14
  export { NotAllowed, type NotAllowedProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type NotFoundProps = {
4
4
  title?: string;
@@ -9,6 +9,6 @@ type NotFoundProps = {
9
9
  };
10
10
  className?: string;
11
11
  };
12
- declare function NotFound({ title, description, cta, className, }: NotFoundProps): react_jsx_runtime.JSX.Element;
12
+ declare function NotFound({ title, description, cta, className, }: NotFoundProps): React.JSX.Element;
13
13
 
14
14
  export { NotFound, type NotFoundProps };
@@ -1,10 +1,12 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
+ import { PageProperty } from '@silicajs/core/runtime';
2
3
 
3
4
  type PagePropertiesProps = {
4
- frontmatter: Record<string, unknown>;
5
+ frontmatter?: Record<string, unknown>;
6
+ properties?: PageProperty[];
5
7
  className?: string;
6
8
  defaultOpen?: boolean;
7
9
  };
8
- declare function PageProperties({ frontmatter, className, defaultOpen, }: PagePropertiesProps): react_jsx_runtime.JSX.Element | null;
10
+ declare function PageProperties({ frontmatter, properties: resolvedProperties, className, defaultOpen, }: PagePropertiesProps): React.JSX.Element | null;
9
11
 
10
12
  export { PageProperties, type PagePropertiesProps };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { ChevronRight } from "lucide-react";
4
4
  import { useEffect, useState } from "react";
5
5
  import { cn } from "@silicajs/ui/lib/utils";
@@ -8,14 +8,18 @@ import {
8
8
  CollapsibleContent,
9
9
  CollapsibleTrigger
10
10
  } from "@silicajs/ui/components/collapsible";
11
- import { getPageProperties } from "@silicajs/core/runtime";
11
+ import {
12
+ getPageProperties
13
+ } from "@silicajs/core/runtime";
14
+ import { SilicaLink } from "./routing.js";
12
15
  const STORAGE_KEY = "silica:page-properties:open";
13
16
  function PageProperties({
14
17
  frontmatter,
18
+ properties: resolvedProperties,
15
19
  className,
16
20
  defaultOpen = false
17
21
  }) {
18
- const properties = getPageProperties(frontmatter);
22
+ const properties = resolvedProperties ?? getPageProperties(frontmatter ?? {});
19
23
  const [open, setOpen] = useState(defaultOpen);
20
24
  useEffect(() => {
21
25
  try {
@@ -65,7 +69,7 @@ function PageProperties({
65
69
  className: "grid grid-cols-[10rem_1fr] gap-x-4 border-t border-border first:border-t-0",
66
70
  children: [
67
71
  /* @__PURE__ */ jsx("dt", { className: "px-4 py-2 text-muted-foreground", children: property.label }),
68
- /* @__PURE__ */ jsx("dd", { className: "px-4 py-2 text-foreground", children: property.value })
72
+ /* @__PURE__ */ jsx("dd", { className: "px-4 py-2 text-foreground", children: /* @__PURE__ */ jsx(PagePropertyValue, { property }) })
69
73
  ]
70
74
  },
71
75
  property.key
@@ -74,6 +78,26 @@ function PageProperties({
74
78
  }
75
79
  );
76
80
  }
81
+ function PagePropertyValue({ property }) {
82
+ if (!property.parts) return /* @__PURE__ */ jsx(Fragment, { children: property.value });
83
+ return /* @__PURE__ */ jsx(Fragment, { children: property.parts.map((part, index) => /* @__PURE__ */ jsx(PagePropertyPartView, { part }, `${part.type}-${index}`)) });
84
+ }
85
+ function PagePropertyPartView({ part }) {
86
+ if (part.type === "link") {
87
+ return /* @__PURE__ */ jsx(
88
+ SilicaLink,
89
+ {
90
+ href: part.href,
91
+ className: "text-primary underline underline-offset-2",
92
+ children: part.value
93
+ }
94
+ );
95
+ }
96
+ if (part.type === "broken-link") {
97
+ return /* @__PURE__ */ jsx("span", { className: "silica-broken-link", children: part.value });
98
+ }
99
+ return /* @__PURE__ */ jsx(Fragment, { children: part.value });
100
+ }
77
101
  export {
78
102
  PageProperties
79
103
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/page-properties.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronRight } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"@silicajs/ui/lib/utils\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@silicajs/ui/components/collapsible\";\nimport { getPageProperties } from \"@silicajs/core/runtime\";\n\nconst STORAGE_KEY = \"silica:page-properties:open\";\n\nexport type PagePropertiesProps = {\n frontmatter: Record<string, unknown>;\n className?: string;\n defaultOpen?: boolean;\n};\n\nexport function PageProperties({\n frontmatter,\n className,\n defaultOpen = false,\n}: PagePropertiesProps) {\n const properties = getPageProperties(frontmatter);\n const [open, setOpen] = useState<boolean>(defaultOpen);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n if (stored === \"true\" || stored === \"false\") {\n setOpen(stored === \"true\");\n }\n } catch {\n // ignore (private mode, disabled storage, etc.)\n }\n }, []);\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n try {\n window.localStorage.setItem(STORAGE_KEY, String(next));\n } catch {\n // ignore\n }\n }\n\n if (properties.length === 0) return null;\n\n return (\n <Collapsible\n data-slot=\"page-properties\"\n open={open}\n onOpenChange={handleOpenChange}\n className={cn(\n \"rounded-lg border border-border bg-card text-sm\",\n className,\n )}\n >\n <CollapsibleTrigger className=\"flex w-full cursor-pointer items-center gap-2 px-4 py-2.5 text-left font-medium\">\n <ChevronRight\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-90\",\n )}\n aria-hidden\n />\n <span className=\"text-foreground\">Page Properties</span>\n <span className=\"ml-auto text-xs tabular-nums text-muted-foreground\">\n {properties.length}\n </span>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"h-[var(--collapsible-panel-height)] overflow-hidden transition-[height] duration-200 ease-out data-[ending-style]:h-0 data-[starting-style]:h-0 motion-reduce:transition-none\">\n <dl className=\"border-t border-border\">\n {properties.map((property) => (\n <div\n key={property.key}\n className=\"grid grid-cols-[10rem_1fr] gap-x-4 border-t border-border first:border-t-0\"\n >\n <dt className=\"px-4 py-2 text-muted-foreground\">\n {property.label}\n </dt>\n <dd className=\"px-4 py-2 text-foreground\">{property.value}</dd>\n </div>\n ))}\n </dl>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"mappings":";AA6DM,SACE,KADF;AA3DN,SAAS,oBAAoB;AAC7B,SAAS,WAAW,gBAAgB;AAEpC,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAElC,MAAM,cAAc;AAQb,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAwB;AACtB,QAAM,aAAa,kBAAkB,WAAW;AAChD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkB,WAAW;AAErD,YAAU,MAAM;AACd,QAAI;AACF,YAAM,SAAS,OAAO,aAAa,QAAQ,WAAW;AACtD,UAAI,WAAW,UAAU,WAAW,SAAS;AAC3C,gBAAQ,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,WAAS,iBAAiB,MAAe;AACvC,YAAQ,IAAI;AACZ,QAAI;AACF,aAAO,aAAa,QAAQ,aAAa,OAAO,IAAI,CAAC;AAAA,IACvD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,cAAc;AAAA,MACd,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,6BAAC,sBAAmB,WAAU,mFAC5B;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA,cACA,eAAW;AAAA;AAAA,UACb;AAAA,UACA,oBAAC,UAAK,WAAU,mBAAkB,6BAAe;AAAA,UACjD,oBAAC,UAAK,WAAU,sDACb,qBAAW,QACd;AAAA,WACF;AAAA,QACA,oBAAC,sBAAmB,WAAU,iLAC5B,8BAAC,QAAG,WAAU,0BACX,qBAAW,IAAI,CAAC,aACf;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,kCAAC,QAAG,WAAU,mCACX,mBAAS,OACZ;AAAA,cACA,oBAAC,QAAG,WAAU,6BAA6B,mBAAS,OAAM;AAAA;AAAA;AAAA,UANrD,SAAS;AAAA,QAOhB,CACD,GACH,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/page-properties.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronRight } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"@silicajs/ui/lib/utils\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@silicajs/ui/components/collapsible\";\nimport {\n getPageProperties,\n type PageProperty,\n type PagePropertyPart,\n} from \"@silicajs/core/runtime\";\nimport { SilicaLink } from \"./routing.js\";\n\nconst STORAGE_KEY = \"silica:page-properties:open\";\n\nexport type PagePropertiesProps = {\n frontmatter?: Record<string, unknown>;\n properties?: PageProperty[];\n className?: string;\n defaultOpen?: boolean;\n};\n\nexport function PageProperties({\n frontmatter,\n properties: resolvedProperties,\n className,\n defaultOpen = false,\n}: PagePropertiesProps) {\n const properties = resolvedProperties ?? getPageProperties(frontmatter ?? {});\n const [open, setOpen] = useState<boolean>(defaultOpen);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n if (stored === \"true\" || stored === \"false\") {\n setOpen(stored === \"true\");\n }\n } catch {\n // ignore (private mode, disabled storage, etc.)\n }\n }, []);\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n try {\n window.localStorage.setItem(STORAGE_KEY, String(next));\n } catch {\n // ignore\n }\n }\n\n if (properties.length === 0) return null;\n\n return (\n <Collapsible\n data-slot=\"page-properties\"\n open={open}\n onOpenChange={handleOpenChange}\n className={cn(\n \"rounded-lg border border-border bg-card text-sm\",\n className,\n )}\n >\n <CollapsibleTrigger className=\"flex w-full cursor-pointer items-center gap-2 px-4 py-2.5 text-left font-medium\">\n <ChevronRight\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-90\",\n )}\n aria-hidden\n />\n <span className=\"text-foreground\">Page Properties</span>\n <span className=\"ml-auto text-xs tabular-nums text-muted-foreground\">\n {properties.length}\n </span>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"h-[var(--collapsible-panel-height)] overflow-hidden transition-[height] duration-200 ease-out data-[ending-style]:h-0 data-[starting-style]:h-0 motion-reduce:transition-none\">\n <dl className=\"border-t border-border\">\n {properties.map((property) => (\n <div\n key={property.key}\n className=\"grid grid-cols-[10rem_1fr] gap-x-4 border-t border-border first:border-t-0\"\n >\n <dt className=\"px-4 py-2 text-muted-foreground\">\n {property.label}\n </dt>\n <dd className=\"px-4 py-2 text-foreground\">\n <PagePropertyValue property={property} />\n </dd>\n </div>\n ))}\n </dl>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction PagePropertyValue({ property }: { property: PageProperty }) {\n if (!property.parts) return <>{property.value}</>;\n\n return (\n <>\n {property.parts.map((part, index) => (\n <PagePropertyPartView key={`${part.type}-${index}`} part={part} />\n ))}\n </>\n );\n}\n\nfunction PagePropertyPartView({ part }: { part: PagePropertyPart }) {\n if (part.type === \"link\") {\n return (\n <SilicaLink\n href={part.href}\n className=\"text-primary underline underline-offset-2\"\n >\n {part.value}\n </SilicaLink>\n );\n }\n\n if (part.type === \"broken-link\") {\n return <span className=\"silica-broken-link\">{part.value}</span>;\n }\n\n return <>{part.value}</>;\n}\n"],"mappings":";AAoEM,SAmCwB,UAlCtB,KADF;AAlEN,SAAS,oBAAoB;AAC7B,SAAS,WAAW,gBAAgB;AAEpC,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,OAGK;AACP,SAAS,kBAAkB;AAE3B,MAAM,cAAc;AASb,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAChB,GAAwB;AACtB,QAAM,aAAa,sBAAsB,kBAAkB,eAAe,CAAC,CAAC;AAC5E,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkB,WAAW;AAErD,YAAU,MAAM;AACd,QAAI;AACF,YAAM,SAAS,OAAO,aAAa,QAAQ,WAAW;AACtD,UAAI,WAAW,UAAU,WAAW,SAAS;AAC3C,gBAAQ,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,WAAS,iBAAiB,MAAe;AACvC,YAAQ,IAAI;AACZ,QAAI;AACF,aAAO,aAAa,QAAQ,aAAa,OAAO,IAAI,CAAC;AAAA,IACvD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,cAAc;AAAA,MACd,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,6BAAC,sBAAmB,WAAU,mFAC5B;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA,cACA,eAAW;AAAA;AAAA,UACb;AAAA,UACA,oBAAC,UAAK,WAAU,mBAAkB,6BAAe;AAAA,UACjD,oBAAC,UAAK,WAAU,sDACb,qBAAW,QACd;AAAA,WACF;AAAA,QACA,oBAAC,sBAAmB,WAAU,iLAC5B,8BAAC,QAAG,WAAU,0BACX,qBAAW,IAAI,CAAC,aACf;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,kCAAC,QAAG,WAAU,mCACX,mBAAS,OACZ;AAAA,cACA,oBAAC,QAAG,WAAU,6BACZ,8BAAC,qBAAkB,UAAoB,GACzC;AAAA;AAAA;AAAA,UARK,SAAS;AAAA,QAShB,CACD,GACH,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,kBAAkB,EAAE,SAAS,GAA+B;AACnE,MAAI,CAAC,SAAS,MAAO,QAAO,gCAAG,mBAAS,OAAM;AAE9C,SACE,gCACG,mBAAS,MAAM,IAAI,CAAC,MAAM,UACzB,oBAAC,wBAAmD,QAAzB,GAAG,KAAK,IAAI,IAAI,KAAK,EAAgB,CACjE,GACH;AAEJ;AAEA,SAAS,qBAAqB,EAAE,KAAK,GAA+B;AAClE,MAAI,KAAK,SAAS,QAAQ;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,WAAU;AAAA,QAET,eAAK;AAAA;AAAA,IACR;AAAA,EAEJ;AAEA,MAAI,KAAK,SAAS,eAAe;AAC/B,WAAO,oBAAC,UAAK,WAAU,sBAAsB,eAAK,OAAM;AAAA,EAC1D;AAEA,SAAO,gCAAG,eAAK,OAAM;AACvB;","names":[]}
package/dist/routing.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
3
2
 
4
3
  type SilicaLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {
@@ -13,7 +12,7 @@ type SilicaRoutingContextValue = {
13
12
  type SilicaRoutingProviderProps = Partial<SilicaRoutingContextValue> & {
14
13
  children: React.ReactNode;
15
14
  };
16
- declare function SilicaRoutingProvider({ children, Link, currentSlug, navigate, }: SilicaRoutingProviderProps): react_jsx_runtime.JSX.Element;
15
+ declare function SilicaRoutingProvider({ children, Link, currentSlug, navigate, }: SilicaRoutingProviderProps): React.JSX.Element;
17
16
  declare function useSilicaRouting(): SilicaRoutingContextValue;
18
17
  declare const SilicaLink: React.ForwardRefExoticComponent<React.AnchorHTMLAttributes<HTMLAnchorElement> & {
19
18
  href: string;
package/dist/search.d.ts CHANGED
@@ -1,14 +1,14 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type SearchTriggerProps = {
4
4
  placeholder?: string;
5
5
  className?: string;
6
6
  };
7
- declare function SearchTrigger({ placeholder, className, }: SearchTriggerProps): react_jsx_runtime.JSX.Element;
7
+ declare function SearchTrigger({ placeholder, className, }: SearchTriggerProps): React.JSX.Element;
8
8
  type SearchPaletteProps = {
9
9
  open: boolean;
10
10
  onOpenChange: (next: boolean) => void;
11
11
  };
12
- declare function SearchPalette({ open, onOpenChange }: SearchPaletteProps): react_jsx_runtime.JSX.Element;
12
+ declare function SearchPalette({ open, onOpenChange }: SearchPaletteProps): React.JSX.Element;
13
13
 
14
14
  export { SearchPalette, type SearchPaletteProps, SearchTrigger, type SearchTriggerProps };
package/dist/search.js CHANGED
@@ -115,21 +115,21 @@ function SearchPalette({ open, onOpenChange }) {
115
115
  /* @__PURE__ */ jsx(
116
116
  DialogContent,
117
117
  {
118
- className: "top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0",
118
+ className: "top-[12vh] translate-y-0 overflow-hidden rounded-xl! p-0 sm:max-w-xl",
119
119
  showCloseButton: false,
120
120
  children: /* @__PURE__ */ jsxs(Command, { shouldFilter: false, children: [
121
121
  /* @__PURE__ */ jsx(
122
122
  CommandInput,
123
123
  {
124
124
  autoFocus: true,
125
- placeholder: "Search your vault\u2026",
125
+ placeholder: "Type to search\u2026",
126
126
  value: query,
127
127
  onValueChange: setQuery
128
128
  }
129
129
  ),
130
- /* @__PURE__ */ jsxs(CommandList, { children: [
131
- isLoading ? /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-center text-sm text-muted-foreground", children: "Searching\u2026" }) : null,
132
- !isLoading && query.trim() && results.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: "No results" }) : null,
130
+ query.trim() ? /* @__PURE__ */ jsxs(CommandList, { children: [
131
+ isLoading ? /* @__PURE__ */ jsx("div", { className: "py-12 text-center text-sm text-muted-foreground", children: "Searching\u2026" }) : null,
132
+ !isLoading && results.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: "No results found" }) : null,
133
133
  results.map((result) => /* @__PURE__ */ jsx(
134
134
  CommandItem,
135
135
  {
@@ -138,14 +138,29 @@ function SearchPalette({ open, onOpenChange }) {
138
138
  navigate(slugToHref(result.slug));
139
139
  close();
140
140
  },
141
- children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
142
- /* @__PURE__ */ jsx("span", { className: "truncate font-medium text-foreground", children: /* @__PURE__ */ jsx(HighlightedText, { parts: result.titleParts }) }),
143
- result.excerptParts.length > 0 ? /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-muted-foreground", children: /* @__PURE__ */ jsx(HighlightedText, { parts: result.excerptParts }) }) : null
141
+ children: /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-1", children: [
142
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sm font-medium text-foreground", children: /* @__PURE__ */ jsx(HighlightedText, { parts: result.titleParts }) }),
143
+ result.excerptParts.length > 0 ? /* @__PURE__ */ jsx("span", { className: "truncate text-xs leading-relaxed text-muted-foreground", children: /* @__PURE__ */ jsx(HighlightedText, { parts: result.excerptParts }) }) : null
144
144
  ] })
145
145
  },
146
146
  result.slug
147
147
  ))
148
- ] })
148
+ ] }) : null,
149
+ results.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 border-t border-border px-4 py-2.5 text-xs text-muted-foreground", children: [
150
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
151
+ /* @__PURE__ */ jsx("kbd", { className: "inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1 font-sans", children: "\u21B5" }),
152
+ "to select"
153
+ ] }),
154
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
155
+ /* @__PURE__ */ jsx("kbd", { className: "inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1 font-sans", children: "\u2191" }),
156
+ /* @__PURE__ */ jsx("kbd", { className: "inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1 font-sans", children: "\u2193" }),
157
+ "to navigate"
158
+ ] }),
159
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
160
+ /* @__PURE__ */ jsx("kbd", { className: "inline-flex h-5 items-center justify-center rounded border border-border bg-muted px-1.5 font-sans", children: "esc" }),
161
+ "to close"
162
+ ] })
163
+ ] }) : null
149
164
  ] })
150
165
  }
151
166
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"@silicajs/ui/components/command\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@silicajs/ui/components/dialog\";\nimport { Button } from \"@silicajs/ui/components/button\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { useSilicaRouting } from \"./routing.js\";\nimport { slugToHref } from \"./slug.js\";\n\ntype SearchHighlightPart = {\n text: string;\n highlighted: boolean;\n};\n\ntype SearchResult = {\n slug: string;\n title: string;\n titleParts: SearchHighlightPart[];\n excerptParts: SearchHighlightPart[];\n};\n\nexport type SearchTriggerProps = {\n placeholder?: string;\n className?: string;\n};\n\nexport function SearchTrigger({\n placeholder = \"Search…\",\n className,\n}: SearchTriggerProps) {\n const [open, setOpen] = React.useState(false);\n\n React.useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n event.preventDefault();\n setOpen((value) => !value);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, []);\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className={className}\n >\n <SearchIcon\n data-icon=\"inline-start\"\n className=\"text-muted-foreground\"\n />\n <span className=\"flex-1 text-left text-muted-foreground\">\n {placeholder}\n </span>\n <kbd\n data-icon=\"inline-end\"\n className=\"pointer-events-none ml-2 inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground\"\n >\n <span className=\"text-xs\">⌘</span>K\n </kbd>\n </Button>\n <SearchPalette open={open} onOpenChange={setOpen} />\n </>\n );\n}\n\nexport type SearchPaletteProps = {\n open: boolean;\n onOpenChange: (next: boolean) => void;\n};\n\nexport function SearchPalette({ open, onOpenChange }: SearchPaletteProps) {\n const { navigate } = useSilicaRouting();\n const [query, setQuery] = React.useState(\"\");\n const [results, setResults] = React.useState<SearchResult[]>([]);\n const [isLoading, setIsLoading] = React.useState(false);\n\n React.useEffect(() => {\n if (!open) {\n setQuery(\"\");\n setResults([]);\n setIsLoading(false);\n }\n }, [open]);\n\n React.useEffect(() => {\n const controller = new AbortController();\n const trimmed = query.trim();\n if (!trimmed) {\n setResults([]);\n setIsLoading(false);\n return () => controller.abort();\n }\n\n setIsLoading(true);\n const timeout = window.setTimeout(() => {\n fetch(`/api/search?q=${encodeURIComponent(trimmed)}`, {\n signal: controller.signal,\n })\n .then((response) => (response.ok ? response.json() : { results: [] }))\n .then((payload: { results?: SearchResult[] }) => {\n setResults(payload.results ?? []);\n })\n .catch((error: unknown) => {\n if (error instanceof DOMException && error.name === \"AbortError\")\n return;\n setResults([]);\n })\n .finally(() => setIsLoading(false));\n }, 120);\n\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [query]);\n\n const close = () => onOpenChange(false);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>Search</DialogTitle>\n <DialogDescription>Search your vault.</DialogDescription>\n </DialogHeader>\n <DialogContent\n className=\"top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0\"\n showCloseButton={false}\n >\n <Command shouldFilter={false}>\n <CommandInput\n autoFocus\n placeholder=\"Search your vault…\"\n value={query}\n onValueChange={setQuery}\n />\n <CommandList>\n {isLoading ? (\n <div className=\"px-4 py-6 text-center text-sm text-muted-foreground\">\n Searching…\n </div>\n ) : null}\n {!isLoading && query.trim() && results.length === 0 ? (\n <CommandEmpty>No results</CommandEmpty>\n ) : null}\n {results.map((result) => (\n <CommandItem\n key={result.slug}\n value={`${result.title} ${result.slug}`}\n onSelect={() => {\n navigate(slugToHref(result.slug));\n close();\n }}\n >\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"truncate font-medium text-foreground\">\n <HighlightedText parts={result.titleParts} />\n </span>\n {result.excerptParts.length > 0 ? (\n <span className=\"truncate text-xs text-muted-foreground\">\n <HighlightedText parts={result.excerptParts} />\n </span>\n ) : null}\n </div>\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction HighlightedText({ parts }: { parts: SearchHighlightPart[] }) {\n return (\n <>\n {parts.map((part, index) =>\n part.highlighted ? (\n <mark\n key={index}\n className=\"bg-transparent p-0 font-medium text-primary\"\n >\n {part.text}\n </mark>\n ) : (\n <React.Fragment key={index}>{part.text}</React.Fragment>\n ),\n )}\n </>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/search.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"@silicajs/ui/components/command\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@silicajs/ui/components/dialog\";\nimport { Button } from \"@silicajs/ui/components/button\";\nimport { SearchIcon } from \"lucide-react\";\n\nimport { useSilicaRouting } from \"./routing.js\";\nimport { slugToHref } from \"./slug.js\";\n\ntype SearchHighlightPart = {\n text: string;\n highlighted: boolean;\n};\n\ntype SearchResult = {\n slug: string;\n title: string;\n titleParts: SearchHighlightPart[];\n excerptParts: SearchHighlightPart[];\n};\n\nexport type SearchTriggerProps = {\n placeholder?: string;\n className?: string;\n};\n\nexport function SearchTrigger({\n placeholder = \"Search…\",\n className,\n}: SearchTriggerProps) {\n const [open, setOpen] = React.useState(false);\n\n React.useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"k\") {\n event.preventDefault();\n setOpen((value) => !value);\n }\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, []);\n\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setOpen(true)}\n className={className}\n >\n <SearchIcon\n data-icon=\"inline-start\"\n className=\"text-muted-foreground\"\n />\n <span className=\"flex-1 text-left text-muted-foreground\">\n {placeholder}\n </span>\n <kbd\n data-icon=\"inline-end\"\n className=\"pointer-events-none ml-2 inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground\"\n >\n <span className=\"text-xs\">⌘</span>K\n </kbd>\n </Button>\n <SearchPalette open={open} onOpenChange={setOpen} />\n </>\n );\n}\n\nexport type SearchPaletteProps = {\n open: boolean;\n onOpenChange: (next: boolean) => void;\n};\n\nexport function SearchPalette({ open, onOpenChange }: SearchPaletteProps) {\n const { navigate } = useSilicaRouting();\n const [query, setQuery] = React.useState(\"\");\n const [results, setResults] = React.useState<SearchResult[]>([]);\n const [isLoading, setIsLoading] = React.useState(false);\n\n React.useEffect(() => {\n if (!open) {\n setQuery(\"\");\n setResults([]);\n setIsLoading(false);\n }\n }, [open]);\n\n React.useEffect(() => {\n const controller = new AbortController();\n const trimmed = query.trim();\n if (!trimmed) {\n setResults([]);\n setIsLoading(false);\n return () => controller.abort();\n }\n\n setIsLoading(true);\n const timeout = window.setTimeout(() => {\n fetch(`/api/search?q=${encodeURIComponent(trimmed)}`, {\n signal: controller.signal,\n })\n .then((response) => (response.ok ? response.json() : { results: [] }))\n .then((payload: { results?: SearchResult[] }) => {\n setResults(payload.results ?? []);\n })\n .catch((error: unknown) => {\n if (error instanceof DOMException && error.name === \"AbortError\")\n return;\n setResults([]);\n })\n .finally(() => setIsLoading(false));\n }, 120);\n\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [query]);\n\n const close = () => onOpenChange(false);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>Search</DialogTitle>\n <DialogDescription>Search your vault.</DialogDescription>\n </DialogHeader>\n <DialogContent\n className=\"top-[12vh] translate-y-0 overflow-hidden rounded-xl! p-0 sm:max-w-xl\"\n showCloseButton={false}\n >\n <Command shouldFilter={false}>\n <CommandInput\n autoFocus\n placeholder=\"Type to search…\"\n value={query}\n onValueChange={setQuery}\n />\n {query.trim() ? (\n <CommandList>\n {isLoading ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n Searching…\n </div>\n ) : null}\n {!isLoading && results.length === 0 ? (\n <CommandEmpty>No results found</CommandEmpty>\n ) : null}\n {results.map((result) => (\n <CommandItem\n key={result.slug}\n value={`${result.title} ${result.slug}`}\n onSelect={() => {\n navigate(slugToHref(result.slug));\n close();\n }}\n >\n <div className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n <HighlightedText parts={result.titleParts} />\n </span>\n {result.excerptParts.length > 0 ? (\n <span className=\"truncate text-xs leading-relaxed text-muted-foreground\">\n <HighlightedText parts={result.excerptParts} />\n </span>\n ) : null}\n </div>\n </CommandItem>\n ))}\n </CommandList>\n ) : null}\n {results.length > 0 ? (\n <div className=\"flex items-center gap-4 border-t border-border px-4 py-2.5 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1 font-sans\">\n ↵\n </kbd>\n to select\n </span>\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1 font-sans\">\n ↑\n </kbd>\n <kbd className=\"inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-muted px-1 font-sans\">\n ↓\n </kbd>\n to navigate\n </span>\n <span className=\"flex items-center gap-1.5\">\n <kbd className=\"inline-flex h-5 items-center justify-center rounded border border-border bg-muted px-1.5 font-sans\">\n esc\n </kbd>\n to close\n </span>\n </div>\n ) : null}\n </Command>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction HighlightedText({ parts }: { parts: SearchHighlightPart[] }) {\n return (\n <>\n {parts.map((part, index) =>\n part.highlighted ? (\n <mark\n key={index}\n className=\"bg-transparent p-0 font-medium text-primary\"\n >\n {part.text}\n </mark>\n ) : (\n <React.Fragment key={index}>{part.text}</React.Fragment>\n ),\n )}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
4
  type SignInShellProps = {
@@ -9,6 +9,6 @@ type SignInShellProps = {
9
9
  subheadline?: string;
10
10
  children: ReactNode;
11
11
  };
12
- declare function SignInShell({ title, description, logo, headline, subheadline, children, }: SignInShellProps): react_jsx_runtime.JSX.Element;
12
+ declare function SignInShell({ title, description, logo, headline, subheadline, children, }: SignInShellProps): React.JSX.Element;
13
13
 
14
14
  export { SignInShell, type SignInShellProps };
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
3
2
  import { TocItem } from '@silicajs/core/runtime';
4
3
 
@@ -8,6 +7,6 @@ type TableOfContentsProps = {
8
7
  heading?: React.ReactNode;
9
8
  className?: string;
10
9
  };
11
- declare function TableOfContents({ toc, activeId, heading, className, }: TableOfContentsProps): react_jsx_runtime.JSX.Element | null;
10
+ declare function TableOfContents({ toc, activeId, heading, className, }: TableOfContentsProps): React.JSX.Element | null;
12
11
 
13
12
  export { TableOfContents, type TableOfContentsProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { ManifestEntry } from '@silicajs/core/runtime';
3
3
 
4
4
  type TagsListProps = {
@@ -6,6 +6,6 @@ type TagsListProps = {
6
6
  tag: string;
7
7
  className?: string;
8
8
  };
9
- declare function TagsList({ entries: allEntries, tag, className, }: TagsListProps): react_jsx_runtime.JSX.Element;
9
+ declare function TagsList({ entries: allEntries, tag, className, }: TagsListProps): React.JSX.Element;
10
10
 
11
11
  export { TagsList, type TagsListProps };
@@ -1,8 +1,8 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type UserMenuProps = {
4
4
  logo?: string;
5
5
  };
6
- declare function UserMenu({ logo }: UserMenuProps): react_jsx_runtime.JSX.Element;
6
+ declare function UserMenu({ logo }: UserMenuProps): React.JSX.Element;
7
7
 
8
8
  export { UserMenu, type UserMenuProps };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  type VaultTreeEntry = {
4
4
  slug: string;
@@ -10,7 +10,7 @@ type VaultTreeProps = {
10
10
  currentSlug?: string;
11
11
  showHomeLink?: boolean;
12
12
  };
13
- declare function VaultTree({ navigationEndpoint, currentSlug: currentSlugProp, showHomeLink, }: VaultTreeProps): react_jsx_runtime.JSX.Element;
13
+ declare function VaultTree({ navigationEndpoint, currentSlug: currentSlugProp, showHomeLink, }: VaultTreeProps): React.JSX.Element;
14
14
  declare function loadNavigationEntries(endpoint: string): Promise<VaultTreeEntry[]>;
15
15
 
16
16
  export { VaultTree, type VaultTreeEntry, type VaultTreeProps, loadNavigationEntries };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicajs/components",
3
- "version": "0.2.4",
3
+ "version": "0.3.1",
4
4
  "description": "Silica-aware, framework-agnostic React composables built on @silicajs/ui.",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -28,9 +28,9 @@
28
28
  "test": "vitest run --passWithNoTests"
29
29
  },
30
30
  "dependencies": {
31
- "@silicajs/core": "^0.6.0",
31
+ "@silicajs/core": "^0.7.1",
32
32
  "@silicajs/remark-obsidian": "^0.1.0",
33
- "@silicajs/ui": "^0.1.2",
33
+ "@silicajs/ui": "^0.1.3",
34
34
  "lucide-react": "^1.17.0"
35
35
  },
36
36
  "peerDependencies": {
@@ -38,7 +38,7 @@
38
38
  "react-dom": "^19.2.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@types/react": "^19.2.10",
41
+ "@types/react": "^19.2.17",
42
42
  "@types/react-dom": "^19.2.3",
43
43
  "react": "^19.2.6",
44
44
  "react-dom": "^19.2.7",