extrojs 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/client.d.ts +7 -15
  2. package/dist/commands/build.js +1 -1
  3. package/dist/commands/dev.js +12 -29
  4. package/dist/config.d.ts +2 -2
  5. package/dist/core/asset.d.ts +10 -0
  6. package/dist/core/asset.js +10 -0
  7. package/dist/dev-assets.d.ts +3 -3
  8. package/dist/dev-assets.js +18 -16
  9. package/dist/exports/asset.d.ts +1 -0
  10. package/dist/exports/asset.js +1 -0
  11. package/dist/exports/link.d.ts +1 -0
  12. package/dist/exports/link.js +1 -0
  13. package/dist/exports/navigation.d.ts +2 -0
  14. package/dist/exports/navigation.js +1 -0
  15. package/dist/exports/runtime.d.ts +2 -0
  16. package/dist/exports/runtime.js +3 -0
  17. package/dist/load-config.d.ts +1 -1
  18. package/dist/paths.d.ts +1 -1
  19. package/dist/plugin/app-tree.d.ts +59 -0
  20. package/dist/plugin/app-tree.js +214 -0
  21. package/dist/plugin/asset-inventory.d.ts +24 -0
  22. package/dist/plugin/asset-inventory.js +9 -0
  23. package/dist/plugin/dev-reactions.d.ts +59 -0
  24. package/dist/plugin/dev-reactions.js +62 -0
  25. package/dist/plugin/emit-assets.d.ts +50 -0
  26. package/dist/plugin/emit-assets.js +40 -0
  27. package/dist/plugin/generators/html.d.ts +39 -0
  28. package/dist/plugin/generators/html.js +127 -0
  29. package/dist/plugin/generators/icons.d.ts +15 -0
  30. package/dist/plugin/generators/icons.js +16 -0
  31. package/dist/plugin/generators/public.d.ts +17 -0
  32. package/dist/plugin/generators/public.js +20 -0
  33. package/dist/plugin/icons.d.ts +5 -0
  34. package/dist/plugin/icons.js +20 -0
  35. package/dist/plugin/index.d.ts +31 -0
  36. package/dist/plugin/index.js +246 -0
  37. package/dist/plugin/internal.d.ts +14 -0
  38. package/dist/plugin/internal.js +6 -0
  39. package/dist/plugin/manifest.d.ts +29 -0
  40. package/dist/plugin/manifest.js +68 -0
  41. package/dist/plugin/public.d.ts +21 -0
  42. package/dist/plugin/public.js +63 -0
  43. package/dist/plugin/runtimes/clients/csui-mount.js +90 -0
  44. package/dist/plugin/runtimes/clients/dev-bridge.js +194 -0
  45. package/dist/plugin/runtimes/csui-mount.d.ts +18 -0
  46. package/dist/plugin/runtimes/csui-mount.js +21 -0
  47. package/dist/plugin/runtimes/dev-bridge.d.ts +22 -0
  48. package/dist/plugin/runtimes/dev-bridge.js +19 -0
  49. package/dist/plugin/runtimes/routes-module.d.ts +20 -0
  50. package/dist/plugin/runtimes/routes-module.js +51 -0
  51. package/dist/plugin/runtimes/runtime-module.d.ts +16 -0
  52. package/dist/plugin/runtimes/runtime-module.js +40 -0
  53. package/dist/plugin/surfaces.d.ts +37 -0
  54. package/dist/plugin/surfaces.js +67 -0
  55. package/dist/plugin/types/index.d.ts +9 -0
  56. package/dist/plugin/types/index.js +1 -0
  57. package/dist/plugin/utils/read-json.d.ts +1 -0
  58. package/dist/plugin/utils/read-json.js +8 -0
  59. package/dist/react/env.d.ts +13 -0
  60. package/dist/react/env.js +1 -0
  61. package/dist/router/build-tree.d.ts +46 -0
  62. package/dist/router/build-tree.js +56 -0
  63. package/dist/router/context.d.ts +13 -0
  64. package/dist/router/context.js +2 -0
  65. package/dist/router/create-router.d.ts +10 -0
  66. package/dist/router/create-router.js +126 -0
  67. package/dist/router/defaults.d.ts +24 -0
  68. package/dist/router/defaults.js +25 -0
  69. package/dist/router/error-boundary.d.ts +23 -0
  70. package/dist/router/error-boundary.js +21 -0
  71. package/dist/router/hooks.d.ts +18 -0
  72. package/dist/router/hooks.js +34 -0
  73. package/dist/router/index.d.ts +8 -0
  74. package/dist/router/index.js +7 -0
  75. package/dist/router/link.d.ts +305 -0
  76. package/dist/router/link.js +30 -0
  77. package/dist/router/match.d.ts +14 -0
  78. package/dist/router/match.js +27 -0
  79. package/dist/router/types.d.ts +55 -0
  80. package/dist/router/types.js +1 -0
  81. package/dist/types/index.d.ts +152 -0
  82. package/dist/types/index.js +1 -0
  83. package/package.json +39 -7
@@ -0,0 +1,13 @@
1
+ export interface Router {
2
+ push: (to: string) => void;
3
+ replace: (to: string) => void;
4
+ back: () => void;
5
+ forward: () => void;
6
+ }
7
+ export interface RouterContextValue {
8
+ pathname: string;
9
+ search: string;
10
+ params: Record<string, string>;
11
+ router: Router;
12
+ }
13
+ export declare const RouterContext: import("react").Context<RouterContextValue | null>;
@@ -0,0 +1,2 @@
1
+ import { createContext } from "react";
2
+ export const RouterContext = createContext(null);
@@ -0,0 +1,10 @@
1
+ import type { CreateRouterOptions, Route, RouterSurfaceOptions } from "./types.js";
2
+ /**
3
+ * @describe Mounts a surface (popup | options | sidepanel) and wires hash-based
4
+ * client-side routing into the given routes array. Called once per surface by
5
+ * the virtual runtime module emitted by @extrojs/vite-plugin.
6
+ */
7
+ export interface ExtroRouterHandle {
8
+ update: (newRoutes: Route[], opts?: RouterSurfaceOptions) => void;
9
+ }
10
+ export declare const createExtroRouter: (routes: Route[], options?: CreateRouterOptions) => ExtroRouterHandle;
@@ -0,0 +1,126 @@
1
+ import { createRoot } from "react-dom/client";
2
+ import { matchRoutes } from "./match.js";
3
+ import { DefaultNotFound } from "./defaults.js";
4
+ import { buildTree } from "./build-tree.js";
5
+ const toError = (err) => err instanceof Error ? err : new Error(String(err));
6
+ export const createExtroRouter = (routes, options = {}) => {
7
+ const { rootId = "root" } = options;
8
+ const el = document.getElementById(rootId);
9
+ if (!el) {
10
+ throw new Error(`Extro: #${rootId} element not found`);
11
+ }
12
+ const root = createRoot(el);
13
+ const router = createRouter();
14
+ let currentRoutes = routes;
15
+ let notFound = options.notFound ?? null;
16
+ let rootLayout = options.rootLayout ?? null;
17
+ let navToken = 0;
18
+ // Built-in fallback when the surface has no not-found.tsx (ADR 0003 §5).
19
+ const loadNotFound = () => notFound ? notFound() : Promise.resolve({ default: DefaultNotFound });
20
+ // Pure orchestration: resolve the navigation outcome (with the navToken
21
+ // guard + load failure handling) and hand it to `buildTree`. No structure
22
+ // lives here — every renderable shape is in build-tree.ts (ADR 0006).
23
+ const render = async () => {
24
+ const token = ++navToken;
25
+ const { pathname, search } = parseLocation();
26
+ const ctx = { pathname, search, router };
27
+ const matches = matchRoutes(pathname, currentRoutes);
28
+ if (!matches) {
29
+ // No Route matched: not-found inside the surface-root layout only
30
+ // (ADR 0003 §4). Nothing matched, so no deeper layout is in scope.
31
+ let nf;
32
+ let rl;
33
+ try {
34
+ ;
35
+ [nf, rl] = await Promise.all([
36
+ loadNotFound(),
37
+ rootLayout ? rootLayout() : Promise.resolve(null),
38
+ ]);
39
+ }
40
+ catch (err) {
41
+ if (token !== navToken)
42
+ return;
43
+ root.render(buildTree({ type: "load-error", error: toError(err), reset: () => void render() }, ctx));
44
+ return;
45
+ }
46
+ if (token !== navToken)
47
+ return;
48
+ root.render(buildTree({
49
+ type: "not-found",
50
+ notFound: nf.default,
51
+ rootLayout: rl ? rl.default : null,
52
+ }, ctx));
53
+ return;
54
+ }
55
+ const leaf = matches[matches.length - 1];
56
+ // Page + ancestor boundaries load in parallel, in route order
57
+ // (outermost first). A missing/broken module rejects here — outside
58
+ // React render, so no boundary can catch it; surface the built-in
59
+ // error instead of blanking the surface (ADR 0003 §5).
60
+ let mod;
61
+ let boundaryMods;
62
+ try {
63
+ ;
64
+ [mod, ...boundaryMods] = await Promise.all([
65
+ leaf.route.load(),
66
+ ...leaf.route.boundaries.map((b) => b.load()),
67
+ ]);
68
+ }
69
+ catch (err) {
70
+ if (token !== navToken)
71
+ return;
72
+ root.render(buildTree({ type: "load-error", error: toError(err), reset: () => void render() }, ctx));
73
+ return;
74
+ }
75
+ if (token !== navToken)
76
+ return;
77
+ // Zip each boundary's kind with its loaded component; structure (the
78
+ // §3 nesting) is buildTree's job, not this orchestrator's.
79
+ const boundaries = leaf.route.boundaries.map((b, i) => ({
80
+ kind: b.kind,
81
+ component: boundaryMods[i].default,
82
+ }));
83
+ root.render(buildTree({
84
+ type: "match",
85
+ page: mod.default,
86
+ params: leaf.params,
87
+ boundaries,
88
+ }, ctx));
89
+ };
90
+ window.addEventListener("hashchange", render);
91
+ render();
92
+ return {
93
+ update: (newRoutes, opts) => {
94
+ currentRoutes = newRoutes;
95
+ if (opts) {
96
+ notFound = opts.notFound ?? null;
97
+ rootLayout = opts.rootLayout ?? null;
98
+ }
99
+ render();
100
+ },
101
+ };
102
+ };
103
+ /**
104
+ * @describe Normalizes `window.location.hash` into a pathname + search string.
105
+ */
106
+ const parseLocation = () => {
107
+ const [rawPath = "", search = ""] = window.location.hash.replace(/^#/, "").split("?");
108
+ return { pathname: rawPath || "/", search };
109
+ };
110
+ const stripHash = (to) => (to.startsWith("#") ? to.slice(1) : to);
111
+ /**
112
+ * @describe Builds the stable router object passed through context. `replace`
113
+ * uses history.replaceState + a manual hashchange dispatch because
114
+ * replaceState alone doesn't fire the event.
115
+ */
116
+ const createRouter = () => ({
117
+ push: (to) => {
118
+ window.location.hash = stripHash(to);
119
+ },
120
+ replace: (to) => {
121
+ window.history.replaceState(null, "", `#${stripHash(to)}`);
122
+ window.dispatchEvent(new HashChangeEvent("hashchange"));
123
+ },
124
+ back: () => window.history.back(),
125
+ forward: () => window.history.forward(),
126
+ });
@@ -0,0 +1,24 @@
1
+ import type { ErrorProps } from "./types.js";
2
+ /**
3
+ * @describe Built-in error fallback (ADR 0003 §5). Always the outermost
4
+ * boundary so a thrown render never blanks the surface. Deliberately
5
+ * unstyled and minimal; shows `error.message` always (the extension error
6
+ * surface is seen by the developer far more than end users in v0.x).
7
+ */
8
+ export declare const DefaultError: ({ error, reset }: ErrorProps) => import("react").DetailedReactHTMLElement<{
9
+ style: {
10
+ padding: number;
11
+ fontFamily: "system-ui, sans-serif";
12
+ };
13
+ }, HTMLElement>;
14
+ /**
15
+ * @describe Built-in not-found fallback (ADR 0003 §4/§5). Rendered when a
16
+ * hash matches no Route. Takes no props per the user contract; reads the
17
+ * unmatched path from the router context it is mounted within.
18
+ */
19
+ export declare const DefaultNotFound: () => import("react").DetailedReactHTMLElement<{
20
+ style: {
21
+ padding: number;
22
+ fontFamily: "system-ui, sans-serif";
23
+ };
24
+ }, HTMLElement>;
@@ -0,0 +1,25 @@
1
+ import { createElement } from "react";
2
+ import { useLocation } from "./hooks.js";
3
+ /**
4
+ * @describe Built-in error fallback (ADR 0003 §5). Always the outermost
5
+ * boundary so a thrown render never blanks the surface. Deliberately
6
+ * unstyled and minimal; shows `error.message` always (the extension error
7
+ * surface is seen by the developer far more than end users in v0.x).
8
+ */
9
+ export const DefaultError = ({ error, reset }) => createElement("div", { style: { padding: 16, fontFamily: "system-ui, sans-serif" } }, createElement("p", { style: { margin: "0 0 8px", fontWeight: 600 } }, "Something went wrong"), createElement("pre", {
10
+ style: {
11
+ margin: "0 0 12px",
12
+ whiteSpace: "pre-wrap",
13
+ fontSize: 12,
14
+ color: "#b00",
15
+ },
16
+ }, error.message), createElement("button", { onClick: reset }, "Try again"));
17
+ /**
18
+ * @describe Built-in not-found fallback (ADR 0003 §4/§5). Rendered when a
19
+ * hash matches no Route. Takes no props per the user contract; reads the
20
+ * unmatched path from the router context it is mounted within.
21
+ */
22
+ export const DefaultNotFound = () => {
23
+ const { pathname } = useLocation();
24
+ return createElement("div", { style: { padding: 16, fontFamily: "system-ui, sans-serif" } }, createElement("p", { style: { margin: "0 0 4px", fontWeight: 600 } }, "404"), createElement("p", { style: { margin: 0, fontSize: 13, color: "#666" } }, `No route for ${pathname}`));
25
+ };
@@ -0,0 +1,23 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import type { ErrorProps } from "./types.js";
3
+ import { Component } from "react";
4
+ interface ErrorBoundaryProps {
5
+ fallback: ComponentType<ErrorProps>;
6
+ children: ReactNode;
7
+ }
8
+ interface ErrorBoundaryState {
9
+ error: Error | null;
10
+ }
11
+ /**
12
+ * @describe Catches render errors in its subtree and shows `fallback` with
13
+ * `{ error, reset }`. Composed inside its sibling layout (ADR 0003 §3), so a
14
+ * caught error never tears the layout down, and `reset()` only re-renders the
15
+ * boundary's own contents.
16
+ */
17
+ export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
18
+ state: ErrorBoundaryState;
19
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState;
20
+ reset: () => void;
21
+ render(): ReactNode;
22
+ }
23
+ export {};
@@ -0,0 +1,21 @@
1
+ import { Component, createElement } from "react";
2
+ /**
3
+ * @describe Catches render errors in its subtree and shows `fallback` with
4
+ * `{ error, reset }`. Composed inside its sibling layout (ADR 0003 §3), so a
5
+ * caught error never tears the layout down, and `reset()` only re-renders the
6
+ * boundary's own contents.
7
+ */
8
+ export class ErrorBoundary extends Component {
9
+ state = { error: null };
10
+ static getDerivedStateFromError(error) {
11
+ return { error };
12
+ }
13
+ reset = () => this.setState({ error: null });
14
+ render() {
15
+ const { error } = this.state;
16
+ if (error) {
17
+ return createElement(this.props.fallback, { error, reset: this.reset });
18
+ }
19
+ return this.props.children;
20
+ }
21
+ }
@@ -0,0 +1,18 @@
1
+ import type { Router } from "./context.js";
2
+ export declare const useLocation: () => {
3
+ pathname: string;
4
+ search: string;
5
+ };
6
+ export declare const useParams: <T extends Record<string, string> = Record<string, string>>() => T;
7
+ export declare const useRouter: () => Router;
8
+ type SearchInit = URLSearchParams | string | Record<string, string>;
9
+ interface UseSearchParamsResult {
10
+ params: URLSearchParams;
11
+ setParams: (next: SearchInit) => void;
12
+ }
13
+ /**
14
+ * @describe Reads + writes the URL search string. Updates use `router.replace`
15
+ * so query edits don't pile up history entries.
16
+ */
17
+ export declare const useSearchParams: () => UseSearchParamsResult;
18
+ export {};
@@ -0,0 +1,34 @@
1
+ import { useContext, useMemo } from "react";
2
+ import { RouterContext } from "./context.js";
3
+ const useRouterContext = () => {
4
+ const ctx = useContext(RouterContext);
5
+ if (!ctx) {
6
+ throw new Error("Extro: router hooks must be used inside a page rendered by createExtroRouter.");
7
+ }
8
+ return ctx;
9
+ };
10
+ export const useLocation = () => {
11
+ const { pathname, search } = useRouterContext();
12
+ return { pathname, search };
13
+ };
14
+ export const useParams = () => {
15
+ return useRouterContext().params;
16
+ };
17
+ export const useRouter = () => useRouterContext().router;
18
+ /**
19
+ * @describe Reads + writes the URL search string. Updates use `router.replace`
20
+ * so query edits don't pile up history entries.
21
+ */
22
+ export const useSearchParams = () => {
23
+ const { search, pathname, router } = useRouterContext();
24
+ const params = useMemo(() => new URLSearchParams(search), [search]);
25
+ const setParams = (next) => {
26
+ const nextSearch = next instanceof URLSearchParams
27
+ ? next.toString()
28
+ : typeof next === "string"
29
+ ? next
30
+ : new URLSearchParams(next).toString();
31
+ router.replace(nextSearch ? `${pathname}?${nextSearch}` : pathname);
32
+ };
33
+ return { params, setParams };
34
+ };
@@ -0,0 +1,8 @@
1
+ import "../react/env.js";
2
+ export { createExtroRouter } from "./create-router.js";
3
+ export type { ExtroRouterHandle } from "./create-router.js";
4
+ export { matchRoutes } from "./match.js";
5
+ export { Link } from "./link.js";
6
+ export { useLocation, useParams, useRouter, useSearchParams, } from "./hooks.js";
7
+ export type { Router, RouterContextValue } from "./context.js";
8
+ export type { CreateRouterOptions, DynamicRoute, ErrorProps, LayoutProps, PageProps, Route, RouteMatch, StaticRoute, } from "./types.js";
@@ -0,0 +1,7 @@
1
+ // Pulls in the ambient env typing so importing a routing subpath is enough to
2
+ // type `import.meta.env` with no extra setup.
3
+ import "../react/env.js";
4
+ export { createExtroRouter } from "./create-router.js";
5
+ export { matchRoutes } from "./match.js";
6
+ export { Link } from "./link.js";
7
+ export { useLocation, useParams, useRouter, useSearchParams, } from "./hooks.js";
@@ -0,0 +1,305 @@
1
+ import type { AnchorHTMLAttributes, MouseEvent } from "react";
2
+ interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
3
+ /** Route to navigate to, e.g. "/settings". The leading "#" is added for you. */
4
+ href: string;
5
+ /** Replace the current history entry instead of pushing a new one. */
6
+ replace?: boolean;
7
+ }
8
+ /**
9
+ * @describe Hash-router-aware anchor. Renders a real `<a>` pointing at the hash
10
+ * route, so middle-click and open-in-new-tab keep working, and prepends the "#"
11
+ * for you. With `replace`, it intercepts a plain left-click and swaps the
12
+ * current entry via `router.replace` instead of pushing a new one.
13
+ * @example <Link href="/settings">Settings</Link>
14
+ */
15
+ export declare const Link: ({ href, replace, onClick, ...rest }: LinkProps) => import("react").DetailedReactHTMLElement<{
16
+ content?: string | undefined | undefined;
17
+ title?: string | undefined | undefined;
18
+ type?: string | undefined | undefined;
19
+ slot?: string | undefined | undefined;
20
+ style?: import("react").CSSProperties | undefined;
21
+ color?: string | undefined | undefined;
22
+ children?: import("react").ReactNode;
23
+ download?: any;
24
+ hrefLang?: string | undefined | undefined;
25
+ media?: string | undefined | undefined;
26
+ ping?: string | undefined | undefined;
27
+ target?: import("react").HTMLAttributeAnchorTarget | undefined;
28
+ referrerPolicy?: import("react").HTMLAttributeReferrerPolicy | undefined;
29
+ defaultChecked?: boolean | undefined | undefined;
30
+ defaultValue?: string | number | readonly string[] | undefined;
31
+ suppressContentEditableWarning?: boolean | undefined | undefined;
32
+ suppressHydrationWarning?: boolean | undefined | undefined;
33
+ accessKey?: string | undefined | undefined;
34
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
35
+ autoFocus?: boolean | undefined | undefined;
36
+ className?: string | undefined | undefined;
37
+ contentEditable?: "inherit" | (boolean | "true" | "false") | "plaintext-only" | undefined;
38
+ contextMenu?: string | undefined | undefined;
39
+ dir?: string | undefined | undefined;
40
+ draggable?: (boolean | "true" | "false") | undefined;
41
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
42
+ hidden?: boolean | undefined | undefined;
43
+ id?: string | undefined | undefined;
44
+ lang?: string | undefined | undefined;
45
+ nonce?: string | undefined | undefined;
46
+ spellCheck?: (boolean | "true" | "false") | undefined;
47
+ tabIndex?: number | undefined | undefined;
48
+ translate?: "yes" | "no" | undefined | undefined;
49
+ radioGroup?: string | undefined | undefined;
50
+ role?: import("react").AriaRole | undefined;
51
+ about?: string | undefined | undefined;
52
+ datatype?: string | undefined | undefined;
53
+ inlist?: any;
54
+ prefix?: string | undefined | undefined;
55
+ property?: string | undefined | undefined;
56
+ rel?: string | undefined | undefined;
57
+ resource?: string | undefined | undefined;
58
+ rev?: string | undefined | undefined;
59
+ typeof?: string | undefined | undefined;
60
+ vocab?: string | undefined | undefined;
61
+ autoCorrect?: string | undefined | undefined;
62
+ autoSave?: string | undefined | undefined;
63
+ itemProp?: string | undefined | undefined;
64
+ itemScope?: boolean | undefined | undefined;
65
+ itemType?: string | undefined | undefined;
66
+ itemID?: string | undefined | undefined;
67
+ itemRef?: string | undefined | undefined;
68
+ results?: number | undefined | undefined;
69
+ security?: string | undefined | undefined;
70
+ unselectable?: "on" | "off" | undefined | undefined;
71
+ popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
72
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
73
+ popoverTarget?: string | undefined | undefined;
74
+ inert?: boolean | undefined | undefined;
75
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
76
+ is?: string | undefined | undefined;
77
+ exportparts?: string | undefined | undefined;
78
+ part?: string | undefined | undefined;
79
+ "aria-activedescendant"?: string | undefined | undefined;
80
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
81
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
82
+ "aria-braillelabel"?: string | undefined | undefined;
83
+ "aria-brailleroledescription"?: string | undefined | undefined;
84
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
85
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
86
+ "aria-colcount"?: number | undefined | undefined;
87
+ "aria-colindex"?: number | undefined | undefined;
88
+ "aria-colindextext"?: string | undefined | undefined;
89
+ "aria-colspan"?: number | undefined | undefined;
90
+ "aria-controls"?: string | undefined | undefined;
91
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
92
+ "aria-describedby"?: string | undefined | undefined;
93
+ "aria-description"?: string | undefined | undefined;
94
+ "aria-details"?: string | undefined | undefined;
95
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
96
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
97
+ "aria-errormessage"?: string | undefined | undefined;
98
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
99
+ "aria-flowto"?: string | undefined | undefined;
100
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
101
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
102
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
103
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
104
+ "aria-keyshortcuts"?: string | undefined | undefined;
105
+ "aria-label"?: string | undefined | undefined;
106
+ "aria-labelledby"?: string | undefined | undefined;
107
+ "aria-level"?: number | undefined | undefined;
108
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
109
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
110
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
111
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
112
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
113
+ "aria-owns"?: string | undefined | undefined;
114
+ "aria-placeholder"?: string | undefined | undefined;
115
+ "aria-posinset"?: number | undefined | undefined;
116
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
117
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
118
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
119
+ "aria-required"?: (boolean | "true" | "false") | undefined;
120
+ "aria-roledescription"?: string | undefined | undefined;
121
+ "aria-rowcount"?: number | undefined | undefined;
122
+ "aria-rowindex"?: number | undefined | undefined;
123
+ "aria-rowindextext"?: string | undefined | undefined;
124
+ "aria-rowspan"?: number | undefined | undefined;
125
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
126
+ "aria-setsize"?: number | undefined | undefined;
127
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
128
+ "aria-valuemax"?: number | undefined | undefined;
129
+ "aria-valuemin"?: number | undefined | undefined;
130
+ "aria-valuenow"?: number | undefined | undefined;
131
+ "aria-valuetext"?: string | undefined | undefined;
132
+ dangerouslySetInnerHTML?: {
133
+ __html: string | TrustedHTML;
134
+ } | undefined | undefined;
135
+ onCopy?: import("react").ClipboardEventHandler<HTMLAnchorElement> | undefined;
136
+ onCopyCapture?: import("react").ClipboardEventHandler<HTMLAnchorElement> | undefined;
137
+ onCut?: import("react").ClipboardEventHandler<HTMLAnchorElement> | undefined;
138
+ onCutCapture?: import("react").ClipboardEventHandler<HTMLAnchorElement> | undefined;
139
+ onPaste?: import("react").ClipboardEventHandler<HTMLAnchorElement> | undefined;
140
+ onPasteCapture?: import("react").ClipboardEventHandler<HTMLAnchorElement> | undefined;
141
+ onCompositionEnd?: import("react").CompositionEventHandler<HTMLAnchorElement> | undefined;
142
+ onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLAnchorElement> | undefined;
143
+ onCompositionStart?: import("react").CompositionEventHandler<HTMLAnchorElement> | undefined;
144
+ onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLAnchorElement> | undefined;
145
+ onCompositionUpdate?: import("react").CompositionEventHandler<HTMLAnchorElement> | undefined;
146
+ onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLAnchorElement> | undefined;
147
+ onFocus?: import("react").FocusEventHandler<HTMLAnchorElement> | undefined;
148
+ onFocusCapture?: import("react").FocusEventHandler<HTMLAnchorElement> | undefined;
149
+ onBlur?: import("react").FocusEventHandler<HTMLAnchorElement> | undefined;
150
+ onBlurCapture?: import("react").FocusEventHandler<HTMLAnchorElement> | undefined;
151
+ onChange?: import("react").ChangeEventHandler<HTMLAnchorElement, Element> | undefined;
152
+ onChangeCapture?: import("react").ChangeEventHandler<HTMLAnchorElement, Element> | undefined;
153
+ onBeforeInput?: import("react").InputEventHandler<HTMLAnchorElement> | undefined;
154
+ onBeforeInputCapture?: import("react").InputEventHandler<HTMLAnchorElement> | undefined;
155
+ onInput?: import("react").InputEventHandler<HTMLAnchorElement> | undefined;
156
+ onInputCapture?: import("react").InputEventHandler<HTMLAnchorElement> | undefined;
157
+ onReset?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
158
+ onResetCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
159
+ onSubmit?: import("react").SubmitEventHandler<HTMLAnchorElement> | undefined;
160
+ onSubmitCapture?: import("react").SubmitEventHandler<HTMLAnchorElement> | undefined;
161
+ onInvalid?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
162
+ onInvalidCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
163
+ onLoad?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
164
+ onLoadCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
165
+ onError?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
166
+ onErrorCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
167
+ onKeyDown?: import("react").KeyboardEventHandler<HTMLAnchorElement> | undefined;
168
+ onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLAnchorElement> | undefined;
169
+ onKeyPress?: import("react").KeyboardEventHandler<HTMLAnchorElement> | undefined;
170
+ onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLAnchorElement> | undefined;
171
+ onKeyUp?: import("react").KeyboardEventHandler<HTMLAnchorElement> | undefined;
172
+ onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLAnchorElement> | undefined;
173
+ onAbort?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
174
+ onAbortCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
175
+ onCanPlay?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
176
+ onCanPlayCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
177
+ onCanPlayThrough?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
178
+ onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
179
+ onDurationChange?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
180
+ onDurationChangeCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
181
+ onEmptied?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
182
+ onEmptiedCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
183
+ onEncrypted?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
184
+ onEncryptedCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
185
+ onEnded?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
186
+ onEndedCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
187
+ onLoadedData?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
188
+ onLoadedDataCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
189
+ onLoadedMetadata?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
190
+ onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
191
+ onLoadStart?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
192
+ onLoadStartCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
193
+ onPause?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
194
+ onPauseCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
195
+ onPlay?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
196
+ onPlayCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
197
+ onPlaying?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
198
+ onPlayingCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
199
+ onProgress?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
200
+ onProgressCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
201
+ onRateChange?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
202
+ onRateChangeCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
203
+ onSeeked?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
204
+ onSeekedCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
205
+ onSeeking?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
206
+ onSeekingCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
207
+ onStalled?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
208
+ onStalledCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
209
+ onSuspend?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
210
+ onSuspendCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
211
+ onTimeUpdate?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
212
+ onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
213
+ onVolumeChange?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
214
+ onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
215
+ onWaiting?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
216
+ onWaitingCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
217
+ onAuxClick?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
218
+ onAuxClickCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
219
+ onClickCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
220
+ onContextMenu?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
221
+ onContextMenuCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
222
+ onDoubleClick?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
223
+ onDoubleClickCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
224
+ onDrag?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
225
+ onDragCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
226
+ onDragEnd?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
227
+ onDragEndCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
228
+ onDragEnter?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
229
+ onDragEnterCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
230
+ onDragExit?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
231
+ onDragExitCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
232
+ onDragLeave?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
233
+ onDragLeaveCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
234
+ onDragOver?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
235
+ onDragOverCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
236
+ onDragStart?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
237
+ onDragStartCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
238
+ onDrop?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
239
+ onDropCapture?: import("react").DragEventHandler<HTMLAnchorElement> | undefined;
240
+ onMouseDown?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
241
+ onMouseDownCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
242
+ onMouseEnter?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
243
+ onMouseLeave?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
244
+ onMouseMove?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
245
+ onMouseMoveCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
246
+ onMouseOut?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
247
+ onMouseOutCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
248
+ onMouseOver?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
249
+ onMouseOverCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
250
+ onMouseUp?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
251
+ onMouseUpCapture?: import("react").MouseEventHandler<HTMLAnchorElement> | undefined;
252
+ onSelect?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
253
+ onSelectCapture?: import("react").ReactEventHandler<HTMLAnchorElement> | undefined;
254
+ onTouchCancel?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
255
+ onTouchCancelCapture?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
256
+ onTouchEnd?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
257
+ onTouchEndCapture?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
258
+ onTouchMove?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
259
+ onTouchMoveCapture?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
260
+ onTouchStart?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
261
+ onTouchStartCapture?: import("react").TouchEventHandler<HTMLAnchorElement> | undefined;
262
+ onPointerDown?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
263
+ onPointerDownCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
264
+ onPointerMove?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
265
+ onPointerMoveCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
266
+ onPointerUp?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
267
+ onPointerUpCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
268
+ onPointerCancel?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
269
+ onPointerCancelCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
270
+ onPointerEnter?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
271
+ onPointerLeave?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
272
+ onPointerOver?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
273
+ onPointerOverCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
274
+ onPointerOut?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
275
+ onPointerOutCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
276
+ onGotPointerCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
277
+ onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
278
+ onLostPointerCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
279
+ onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLAnchorElement> | undefined;
280
+ onScroll?: import("react").UIEventHandler<HTMLAnchorElement> | undefined;
281
+ onScrollCapture?: import("react").UIEventHandler<HTMLAnchorElement> | undefined;
282
+ onScrollEnd?: import("react").UIEventHandler<HTMLAnchorElement> | undefined;
283
+ onScrollEndCapture?: import("react").UIEventHandler<HTMLAnchorElement> | undefined;
284
+ onWheel?: import("react").WheelEventHandler<HTMLAnchorElement> | undefined;
285
+ onWheelCapture?: import("react").WheelEventHandler<HTMLAnchorElement> | undefined;
286
+ onAnimationStart?: import("react").AnimationEventHandler<HTMLAnchorElement> | undefined;
287
+ onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLAnchorElement> | undefined;
288
+ onAnimationEnd?: import("react").AnimationEventHandler<HTMLAnchorElement> | undefined;
289
+ onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLAnchorElement> | undefined;
290
+ onAnimationIteration?: import("react").AnimationEventHandler<HTMLAnchorElement> | undefined;
291
+ onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLAnchorElement> | undefined;
292
+ onToggle?: import("react").ToggleEventHandler<HTMLAnchorElement> | undefined;
293
+ onBeforeToggle?: import("react").ToggleEventHandler<HTMLAnchorElement> | undefined;
294
+ onTransitionCancel?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
295
+ onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
296
+ onTransitionEnd?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
297
+ onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
298
+ onTransitionRun?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
299
+ onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
300
+ onTransitionStart?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
301
+ onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLAnchorElement> | undefined;
302
+ href: string;
303
+ onClick: (event: MouseEvent<HTMLAnchorElement>) => void;
304
+ }, HTMLElement>;
305
+ export {};