@oaspect/react 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -0
  3. package/dist/api-reference.js +476 -0
  4. package/dist/api-reference.js.map +1 -0
  5. package/dist/auth-panel.js +116 -0
  6. package/dist/auth-panel.js.map +1 -0
  7. package/dist/code-block.js +105 -0
  8. package/dist/code-block.js.map +1 -0
  9. package/dist/i18n/ar.js +89 -0
  10. package/dist/i18n/ar.js.map +1 -0
  11. package/dist/i18n/context.js +50 -0
  12. package/dist/i18n/context.js.map +1 -0
  13. package/dist/i18n/en.js +89 -0
  14. package/dist/i18n/en.js.map +1 -0
  15. package/dist/i18n/index.js +37 -0
  16. package/dist/i18n/index.js.map +1 -0
  17. package/dist/i18n/tr.js +89 -0
  18. package/dist/i18n/tr.js.map +1 -0
  19. package/dist/icons.js +55 -0
  20. package/dist/icons.js.map +1 -0
  21. package/dist/index.d.ts +78 -0
  22. package/dist/index.js +12 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/intro.js +132 -0
  25. package/dist/intro.js.map +1 -0
  26. package/dist/lazy.js +41 -0
  27. package/dist/lazy.js.map +1 -0
  28. package/dist/logo.js +12 -0
  29. package/dist/logo.js.map +1 -0
  30. package/dist/markdown.js +170 -0
  31. package/dist/markdown.js.map +1 -0
  32. package/dist/method-badge.js +37 -0
  33. package/dist/method-badge.js.map +1 -0
  34. package/dist/models.js +27 -0
  35. package/dist/models.js.map +1 -0
  36. package/dist/oaspect.css +1703 -0
  37. package/dist/operation.js +267 -0
  38. package/dist/operation.js.map +1 -0
  39. package/dist/samples.js +129 -0
  40. package/dist/samples.js.map +1 -0
  41. package/dist/schema-tree.js +160 -0
  42. package/dist/schema-tree.js.map +1 -0
  43. package/dist/send.js +58 -0
  44. package/dist/send.js.map +1 -0
  45. package/dist/sidebar.js +125 -0
  46. package/dist/sidebar.js.map +1 -0
  47. package/dist/spec-context.js +23 -0
  48. package/dist/spec-context.js.map +1 -0
  49. package/dist/storage.js +30 -0
  50. package/dist/storage.js.map +1 -0
  51. package/dist/try-it.js +277 -0
  52. package/dist/try-it.js.map +1 -0
  53. package/package.json +66 -0
  54. package/tailwind.css +21 -0
@@ -0,0 +1,116 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { TOKEN_FLOWS, buildTokenRequest, describeScheme } from "@oaspect/core";
5
+ import { useT } from "./i18n/context.js";
6
+ import Markdown from "./markdown.js";
7
+ import { sendRequest } from "./send.js";
8
+ import { useSettings } from "./spec-context.js";
9
+ const inputClass = "w-full rounded-lg border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:border-primary";
10
+ function Field({ label, value, onChange, secret = false, placeholder }) {
11
+ return /* @__PURE__ */ jsxs("label", { className: "block space-y-1", children: [
12
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: label }),
13
+ /* @__PURE__ */ jsx(
14
+ "input",
15
+ {
16
+ type: secret ? "password" : "text",
17
+ value: value ?? "",
18
+ onChange: (event) => onChange(event.target.value),
19
+ placeholder,
20
+ autoComplete: "off",
21
+ dir: "ltr",
22
+ className: inputClass
23
+ }
24
+ )
25
+ ] });
26
+ }
27
+ function TokenRequest({ name, scheme, credential }) {
28
+ const { setCredential, proxyUrl } = useSettings();
29
+ const t = useT();
30
+ const flows = TOKEN_FLOWS.filter((flow2) => scheme.flows?.[flow2]);
31
+ const [flow, setFlow] = useState(flows[0]);
32
+ const [state, setState] = useState({ status: "idle" });
33
+ if (!flow) return null;
34
+ async function requestToken() {
35
+ setState({ status: "loading" });
36
+ try {
37
+ const result = await sendRequest(buildTokenRequest(flow, scheme.flows[flow], credential ?? {}), { proxyUrl });
38
+ const body = JSON.parse(result.body || "{}");
39
+ if (result.status >= 400 || !body.access_token) throw new Error(body.error_description ?? body.error ?? `HTTP ${result.status}`);
40
+ setCredential(name, { token: body.access_token });
41
+ setState({ status: "done" });
42
+ } catch (error) {
43
+ setState({ status: "error", message: error.message });
44
+ }
45
+ }
46
+ const set = (key) => (value) => setCredential(name, { [key]: value });
47
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2 rounded-lg border border-dashed border-border p-2", children: [
48
+ flows.length > 1 && /* @__PURE__ */ jsx("select", { value: flow, onChange: (event) => setFlow(event.target.value), className: inputClass, children: flows.map((item) => /* @__PURE__ */ jsx("option", { children: item }, item)) }),
49
+ /* @__PURE__ */ jsx(Field, { label: "client_id", value: credential?.clientId, onChange: set("clientId") }),
50
+ /* @__PURE__ */ jsx(Field, { label: "client_secret", value: credential?.clientSecret, onChange: set("clientSecret"), secret: true }),
51
+ flow === "password" && /* @__PURE__ */ jsxs(Fragment, { children: [
52
+ /* @__PURE__ */ jsx(Field, { label: t("auth.username"), value: credential?.username, onChange: set("username") }),
53
+ /* @__PURE__ */ jsx(Field, { label: t("auth.password"), value: credential?.password, onChange: set("password"), secret: true })
54
+ ] }),
55
+ /* @__PURE__ */ jsx(
56
+ Field,
57
+ {
58
+ label: t("auth.scopes"),
59
+ value: credential?.scopes,
60
+ onChange: set("scopes"),
61
+ placeholder: Object.keys(scheme.flows[flow].scopes ?? {}).join(" ")
62
+ }
63
+ ),
64
+ /* @__PURE__ */ jsx(
65
+ "button",
66
+ {
67
+ type: "button",
68
+ onClick: requestToken,
69
+ disabled: state.status === "loading",
70
+ className: "rounded-lg border border-border px-3 py-1 text-xs font-medium hover:border-primary hover:text-primary disabled:opacity-60",
71
+ children: state.status === "loading" ? t("auth.gettingToken") : t("auth.getToken")
72
+ }
73
+ ),
74
+ state.status === "error" && /* @__PURE__ */ jsx("p", { className: "text-xs text-rose-700 dark:text-rose-400", children: t("auth.tokenFailed", { error: state.message }) })
75
+ ] });
76
+ }
77
+ function SchemeFields({ name, scheme }) {
78
+ const { credentials, setCredential } = useSettings();
79
+ const t = useT();
80
+ const credential = credentials[name];
81
+ const set = (key) => (value) => setCredential(name, { [key]: value });
82
+ if (scheme.type === "http" && String(scheme.scheme).toLowerCase() === "basic") {
83
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
84
+ /* @__PURE__ */ jsx(Field, { label: t("auth.username"), value: credential?.username, onChange: set("username") }),
85
+ /* @__PURE__ */ jsx(Field, { label: t("auth.password"), value: credential?.password, onChange: set("password"), secret: true })
86
+ ] });
87
+ }
88
+ if (scheme.type === "apiKey") return /* @__PURE__ */ jsx(Field, { label: scheme.name, value: credential?.token, onChange: set("token"), secret: true });
89
+ if (scheme.type === "oauth2" || scheme.type === "openIdConnect") {
90
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
91
+ /* @__PURE__ */ jsx(Field, { label: t("auth.accessToken"), value: credential?.token, onChange: set("token"), secret: true }),
92
+ scheme.type === "oauth2" && /* @__PURE__ */ jsx(TokenRequest, { name, scheme, credential }),
93
+ scheme.type === "oauth2" && !TOKEN_FLOWS.some((flow) => scheme.flows?.[flow]) && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("auth.redirectFlows") })
94
+ ] });
95
+ }
96
+ if (scheme.type === "mutualTLS") return /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: t("auth.mutualTls") });
97
+ return /* @__PURE__ */ jsx(Field, { label: "Token", value: credential?.token, onChange: set("token"), secret: true });
98
+ }
99
+ function AuthPanel({ schemes }) {
100
+ const t = useT();
101
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
102
+ /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold text-muted-foreground", children: t("auth.title") }),
103
+ Object.entries(schemes).map(([name, scheme]) => /* @__PURE__ */ jsxs("fieldset", { className: "space-y-2 border-t border-border pt-3 first-of-type:border-t-0 first-of-type:pt-0", children: [
104
+ /* @__PURE__ */ jsxs("legend", { className: "flex flex-wrap items-baseline gap-2", children: [
105
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-xs font-semibold", children: name }),
106
+ /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground", children: describeScheme(scheme) })
107
+ ] }),
108
+ /* @__PURE__ */ jsx(Markdown, { source: scheme.description, className: "text-xs text-muted-foreground" }),
109
+ /* @__PURE__ */ jsx(SchemeFields, { name, scheme })
110
+ ] }, name))
111
+ ] });
112
+ }
113
+ export {
114
+ AuthPanel as default
115
+ };
116
+ //# sourceMappingURL=auth-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth-panel.jsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { TOKEN_FLOWS, buildTokenRequest, describeScheme } from \"@oaspect/core\";\nimport { useT } from \"./i18n/context\";\nimport Markdown from \"./markdown\";\nimport { sendRequest } from \"./send\";\nimport { useSettings } from \"./spec-context\";\n\nconst inputClass =\n \"w-full rounded-lg border border-border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:border-primary\";\n\nfunction Field({ label, value, onChange, secret = false, placeholder }) {\n return (\n <label className=\"block space-y-1\">\n <span className=\"text-xs text-muted-foreground\">{label}</span>\n <input\n type={secret ? \"password\" : \"text\"}\n value={value ?? \"\"}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n autoComplete=\"off\"\n dir=\"ltr\"\n className={inputClass}\n />\n </label>\n );\n}\n\n// clientCredentials / password flows: request a token from tokenUrl, through\n// the proxy when there is one (token endpoints rarely allow CORS).\nfunction TokenRequest({ name, scheme, credential }) {\n const { setCredential, proxyUrl } = useSettings();\n const t = useT();\n const flows = TOKEN_FLOWS.filter((flow) => scheme.flows?.[flow]);\n const [flow, setFlow] = useState(flows[0]);\n const [state, setState] = useState({ status: \"idle\" });\n if (!flow) return null;\n\n async function requestToken() {\n setState({ status: \"loading\" });\n try {\n const result = await sendRequest(buildTokenRequest(flow, scheme.flows[flow], credential ?? {}), { proxyUrl });\n const body = JSON.parse(result.body || \"{}\");\n if (result.status >= 400 || !body.access_token) throw new Error(body.error_description ?? body.error ?? `HTTP ${result.status}`);\n setCredential(name, { token: body.access_token });\n setState({ status: \"done\" });\n } catch (error) {\n setState({ status: \"error\", message: error.message });\n }\n }\n\n const set = (key) => (value) => setCredential(name, { [key]: value });\n return (\n <div className=\"space-y-2 rounded-lg border border-dashed border-border p-2\">\n {flows.length > 1 && (\n <select value={flow} onChange={(event) => setFlow(event.target.value)} className={inputClass}>\n {flows.map((item) => (\n <option key={item}>{item}</option>\n ))}\n </select>\n )}\n <Field label=\"client_id\" value={credential?.clientId} onChange={set(\"clientId\")} />\n <Field label=\"client_secret\" value={credential?.clientSecret} onChange={set(\"clientSecret\")} secret />\n {flow === \"password\" && (\n <>\n <Field label={t(\"auth.username\")} value={credential?.username} onChange={set(\"username\")} />\n <Field label={t(\"auth.password\")} value={credential?.password} onChange={set(\"password\")} secret />\n </>\n )}\n <Field\n label={t(\"auth.scopes\")}\n value={credential?.scopes}\n onChange={set(\"scopes\")}\n placeholder={Object.keys(scheme.flows[flow].scopes ?? {}).join(\" \")}\n />\n <button\n type=\"button\"\n onClick={requestToken}\n disabled={state.status === \"loading\"}\n className=\"rounded-lg border border-border px-3 py-1 text-xs font-medium hover:border-primary hover:text-primary disabled:opacity-60\"\n >\n {state.status === \"loading\" ? t(\"auth.gettingToken\") : t(\"auth.getToken\")}\n </button>\n {state.status === \"error\" && <p className=\"text-xs text-rose-700 dark:text-rose-400\">{t(\"auth.tokenFailed\", { error: state.message })}</p>}\n </div>\n );\n}\n\nfunction SchemeFields({ name, scheme }) {\n const { credentials, setCredential } = useSettings();\n const t = useT();\n const credential = credentials[name];\n const set = (key) => (value) => setCredential(name, { [key]: value });\n\n if (scheme.type === \"http\" && String(scheme.scheme).toLowerCase() === \"basic\") {\n return (\n <>\n <Field label={t(\"auth.username\")} value={credential?.username} onChange={set(\"username\")} />\n <Field label={t(\"auth.password\")} value={credential?.password} onChange={set(\"password\")} secret />\n </>\n );\n }\n if (scheme.type === \"apiKey\") return <Field label={scheme.name} value={credential?.token} onChange={set(\"token\")} secret />;\n if (scheme.type === \"oauth2\" || scheme.type === \"openIdConnect\") {\n return (\n <>\n <Field label={t(\"auth.accessToken\")} value={credential?.token} onChange={set(\"token\")} secret />\n {scheme.type === \"oauth2\" && <TokenRequest name={name} scheme={scheme} credential={credential} />}\n {scheme.type === \"oauth2\" && !TOKEN_FLOWS.some((flow) => scheme.flows?.[flow]) && (\n <p className=\"text-xs text-muted-foreground\">{t(\"auth.redirectFlows\")}</p>\n )}\n </>\n );\n }\n if (scheme.type === \"mutualTLS\") return <p className=\"text-xs text-muted-foreground\">{t(\"auth.mutualTls\")}</p>;\n return <Field label=\"Token\" value={credential?.token} onChange={set(\"token\")} secret />;\n}\n\n/** Credential inputs for every security scheme in the document. */\nexport default function AuthPanel({ schemes }) {\n const t = useT();\n return (\n <div className=\"space-y-3\">\n <h3 className=\"text-xs font-semibold text-muted-foreground\">{t(\"auth.title\")}</h3>\n {Object.entries(schemes).map(([name, scheme]) => (\n <fieldset key={name} className=\"space-y-2 border-t border-border pt-3 first-of-type:border-t-0 first-of-type:pt-0\">\n <legend className=\"flex flex-wrap items-baseline gap-2\">\n <span className=\"font-mono text-xs font-semibold\">{name}</span>\n <span className=\"text-[11px] text-muted-foreground\">{describeScheme(scheme)}</span>\n </legend>\n <Markdown source={scheme.description} className=\"text-xs text-muted-foreground\" />\n <SchemeFields name={name} scheme={scheme} />\n </fieldset>\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["flow"]}
@@ -0,0 +1,105 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { useT } from "./i18n/context.js";
5
+ import { tokenize } from "@oaspect/core";
6
+ function Highlighted({ code, language }) {
7
+ return tokenize(code, language).map(
8
+ (token, index) => token.type ? /* @__PURE__ */ jsx("span", { className: `syntax-${token.type}`, children: token.text }, index) : token.text
9
+ );
10
+ }
11
+ function CopyButton({ text, className = "" }) {
12
+ const [copied, setCopied] = useState(false);
13
+ const t = useT();
14
+ async function copy() {
15
+ try {
16
+ await navigator.clipboard.writeText(text);
17
+ setCopied(true);
18
+ setTimeout(() => setCopied(false), 1500);
19
+ } catch {
20
+ }
21
+ }
22
+ const label = copied ? t("copy.copied") : t("copy.copy");
23
+ return /* @__PURE__ */ jsx(
24
+ "button",
25
+ {
26
+ type: "button",
27
+ onClick: copy,
28
+ "aria-label": label,
29
+ title: label,
30
+ className: `inline-flex size-7 shrink-0 items-center justify-center rounded-md transition ${className} ${copied ? "!text-emerald-500" : ""}`,
31
+ children: /* @__PURE__ */ jsx(
32
+ "svg",
33
+ {
34
+ viewBox: "0 0 24 24",
35
+ "aria-hidden": "true",
36
+ className: "size-4",
37
+ fill: "none",
38
+ stroke: "currentColor",
39
+ strokeWidth: "2",
40
+ strokeLinecap: "round",
41
+ strokeLinejoin: "round",
42
+ children: copied ? /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
43
+ /* @__PURE__ */ jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }),
44
+ /* @__PURE__ */ jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
45
+ ] })
46
+ }
47
+ )
48
+ }
49
+ );
50
+ }
51
+ function CodeBlock({ code, language = "json", toolbar, actions, maxHeight = "28rem" }) {
52
+ return (
53
+ // Code reads left-to-right even when the UI is RTL.
54
+ /* @__PURE__ */ jsxs("div", { dir: "ltr", className: "overflow-hidden rounded-xl border border-border bg-code text-code-foreground", children: [
55
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-white/10 px-2 py-1.5", children: [
56
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 items-center gap-1 overflow-x-auto whitespace-nowrap [scrollbar-width:none]", children: toolbar }),
57
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
58
+ actions,
59
+ /* @__PURE__ */ jsx(CopyButton, { text: code, className: "text-white/60 hover:bg-white/10 hover:text-white" })
60
+ ] })
61
+ ] }),
62
+ /* @__PURE__ */ jsx("pre", { className: "overflow-auto p-4 font-mono text-xs leading-relaxed", style: { maxHeight }, children: /* @__PURE__ */ jsx("code", { children: /* @__PURE__ */ jsx(Highlighted, { code, language }) }) })
63
+ ] })
64
+ );
65
+ }
66
+ function ToolbarTab({ active, onClick, children }) {
67
+ return /* @__PURE__ */ jsx(
68
+ "button",
69
+ {
70
+ type: "button",
71
+ onClick,
72
+ className: `rounded-md px-2 py-1 text-xs font-medium transition ${active ? "bg-white/15 text-white" : "text-white/55 hover:text-white"}`,
73
+ children
74
+ }
75
+ );
76
+ }
77
+ function CodeEditor({ value, onChange, language = "json", rows = 14 }) {
78
+ const layer = useRef(null);
79
+ const shared = "m-0 whitespace-pre-wrap break-words p-3 font-mono text-xs leading-relaxed";
80
+ return /* @__PURE__ */ jsxs("div", { dir: "ltr", className: "relative overflow-hidden rounded-lg border border-border bg-code text-code-foreground focus-within:border-primary", children: [
81
+ /* @__PURE__ */ jsx("pre", { ref: layer, "aria-hidden": "true", className: `pointer-events-none absolute inset-0 overflow-hidden ${shared}`, children: /* @__PURE__ */ jsx(Highlighted, { code: `${value}
82
+ `, language }) }),
83
+ /* @__PURE__ */ jsx(
84
+ "textarea",
85
+ {
86
+ value,
87
+ onChange: (event) => onChange(event.target.value),
88
+ onScroll: (event) => {
89
+ layer.current.scrollTop = event.target.scrollTop;
90
+ },
91
+ spellCheck: false,
92
+ rows,
93
+ className: `relative block w-full resize-y bg-transparent text-transparent caret-white outline-none selection:bg-white/25 ${shared}`
94
+ }
95
+ )
96
+ ] });
97
+ }
98
+ export {
99
+ CodeEditor,
100
+ CopyButton,
101
+ Highlighted,
102
+ ToolbarTab,
103
+ CodeBlock as default
104
+ };
105
+ //# sourceMappingURL=code-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/code-block.jsx"],"sourcesContent":["\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { useT } from \"./i18n/context\";\nimport { tokenize } from \"@oaspect/core\";\n\nexport function Highlighted({ code, language }) {\n return tokenize(code, language).map((token, index) =>\n token.type ? (\n <span key={index} className={`syntax-${token.type}`}>\n {token.text}\n </span>\n ) : (\n token.text\n ),\n );\n}\n\nexport function CopyButton({ text, className = \"\" }) {\n const [copied, setCopied] = useState(false);\n const t = useT();\n\n async function copy() {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n } catch {\n // Clipboard can be unavailable (insecure context); nothing to do.\n }\n }\n\n const label = copied ? t(\"copy.copied\") : t(\"copy.copy\");\n\n return (\n <button\n type=\"button\"\n onClick={copy}\n aria-label={label}\n title={label}\n className={`inline-flex size-7 shrink-0 items-center justify-center rounded-md transition ${className} ${\n copied ? \"!text-emerald-500\" : \"\"\n }`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"size-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {copied ? (\n <path d=\"M20 6 9 17l-5-5\" />\n ) : (\n <>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </>\n )}\n </svg>\n </button>\n );\n}\n\n// `toolbar` sits on the left and scrolls sideways if it ever gets too wide;\n// `actions` stay pinned on the right next to the copy button.\nexport default function CodeBlock({ code, language = \"json\", toolbar, actions, maxHeight = \"28rem\" }) {\n return (\n // Code reads left-to-right even when the UI is RTL.\n <div dir=\"ltr\" className=\"overflow-hidden rounded-xl border border-border bg-code text-code-foreground\">\n <div className=\"flex items-center gap-2 border-b border-white/10 px-2 py-1.5\">\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto whitespace-nowrap [scrollbar-width:none]\">\n {toolbar}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {actions}\n <CopyButton text={code} className=\"text-white/60 hover:bg-white/10 hover:text-white\" />\n </div>\n </div>\n <pre className=\"overflow-auto p-4 font-mono text-xs leading-relaxed\" style={{ maxHeight }}>\n <code>\n <Highlighted code={code} language={language} />\n </code>\n </pre>\n </div>\n );\n}\n\nexport function ToolbarTab({ active, onClick, children }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`rounded-md px-2 py-1 text-xs font-medium transition ${\n active ? \"bg-white/15 text-white\" : \"text-white/55 hover:text-white\"\n }`}\n >\n {children}\n </button>\n );\n}\n\n// Textarea with a highlighted <pre> layered underneath it. The textarea text\n// is transparent so only the caret and selection come from it.\nexport function CodeEditor({ value, onChange, language = \"json\", rows = 14 }) {\n const layer = useRef(null);\n const shared = \"m-0 whitespace-pre-wrap break-words p-3 font-mono text-xs leading-relaxed\";\n\n return (\n <div dir=\"ltr\" className=\"relative overflow-hidden rounded-lg border border-border bg-code text-code-foreground focus-within:border-primary\">\n <pre ref={layer} aria-hidden=\"true\" className={`pointer-events-none absolute inset-0 overflow-hidden ${shared}`}>\n <Highlighted code={`${value}\\n`} language={language} />\n </pre>\n <textarea\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onScroll={(event) => {\n layer.current.scrollTop = event.target.scrollTop;\n }}\n spellCheck={false}\n rows={rows}\n className={`relative block w-full resize-y bg-transparent text-transparent caret-white outline-none selection:bg-white/25 ${shared}`}\n />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,89 @@
1
+ const messages = {
2
+ "auth.accessToken": "\u0631\u0645\u0632 \u0627\u0644\u0648\u0635\u0648\u0644",
3
+ "auth.getToken": "\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0631\u0645\u0632",
4
+ "auth.gettingToken": "\u062C\u0627\u0631\u064D \u0627\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0631\u0645\u0632\u2026",
5
+ "auth.mutualTls": "\u064A\u0633\u062A\u062E\u062F\u0645 \u0634\u0647\u0627\u062F\u0629 \u0639\u0645\u064A\u0644 \u062A\u064F\u0636\u0628\u0637 \u062E\u0627\u0631\u062C \u0627\u0644\u0645\u062A\u0635\u0641\u062D.",
6
+ "auth.password": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631",
7
+ "auth.redirectFlows": "\u064A\u062A\u0645 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u062A\u062F\u0641\u0642 \u0639\u0628\u0631 \u0625\u0639\u0627\u062F\u0629 \u062A\u0648\u062C\u064A\u0647 \u0627\u0644\u0645\u062A\u0635\u0641\u062D\u061B \u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0631\u0645\u0632 \u0627\u0644\u0648\u0635\u0648\u0644 \u0645\u0646 \u0645\u0643\u0627\u0646 \u0622\u062E\u0631 \u0648\u0627\u0644\u0635\u0642\u0647 \u0623\u0639\u0644\u0627\u0647.",
8
+ "auth.scopes": "\u0627\u0644\u0646\u0637\u0627\u0642\u0627\u062A (\u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A)",
9
+ "auth.title": "\u0627\u0644\u0645\u0635\u0627\u062F\u0642\u0629",
10
+ "auth.tokenFailed": "\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0631\u0645\u0632: {error}",
11
+ "auth.username": "\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645",
12
+ "connection.customServer": "\u0639\u0646\u0648\u0627\u0646 URL \u0645\u062E\u0635\u0635\u2026",
13
+ "connection.server": "\u0627\u0644\u062E\u0627\u062F\u0645",
14
+ "connection.title": "\u0627\u0644\u0627\u062A\u0635\u0627\u0644",
15
+ "connection.tokenNote": "\u064A\u064F\u062D\u0641\u0638 \u0627\u0644\u0631\u0645\u0632 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0641\u0642\u0637\u060C \u0648\u064A\u064F\u0633\u062A\u062E\u062F\u0645 \u0641\u064A \u0623\u0645\u062B\u0644\u0629 \u0627\u0644\u0634\u064A\u0641\u0631\u0629 \u0648\u0646\u0627\u0641\u0630\u0629 \xAB\u062C\u0631\u0651\u0628\xBB.",
16
+ "connection.tokenPlaceholder": "\u064A\u0636\u064A\u0641 \u062A\u0631\u0648\u064A\u0633\u0629 Authorization \u0625\u0644\u0649 \u0623\u0645\u062B\u0644\u0629 \u0627\u0644\u0637\u0644\u0628\u0627\u062A",
17
+ "copy.copied": "\u062A\u0645 \u0627\u0644\u0646\u0633\u062E",
18
+ "copy.copy": "\u0646\u0633\u062E",
19
+ "dialog.close": "\u0625\u063A\u0644\u0627\u0642",
20
+ "header.language": "\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0644\u063A\u0629",
21
+ "header.menu": "\u0627\u0644\u0642\u0627\u0626\u0645\u0629",
22
+ "header.skip": "\u0627\u0646\u062A\u0642\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u062D\u062A\u0648\u0649",
23
+ "header.theme": "\u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0633\u0645\u0629",
24
+ "intro.download": "\u062A\u0646\u0632\u064A\u0644 \u0645\u0633\u062A\u0646\u062F OpenAPI",
25
+ "intro.endpoints": "\u0646\u0642\u0627\u0637 \u0627\u0644\u0646\u0647\u0627\u064A\u0629",
26
+ "intro.groups": "\u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0627\u062A",
27
+ "intro.models": "\u0627\u0644\u0646\u0645\u0627\u0630\u062C",
28
+ "models.title": "\u0627\u0644\u0646\u0645\u0627\u0630\u062C",
29
+ "operation.callbacks": "\u0627\u0644\u0627\u0633\u062A\u062F\u0639\u0627\u0621\u0627\u062A \u0627\u0644\u0631\u0627\u062C\u0639\u0629",
30
+ "operation.links": "\u0627\u0644\u0631\u0648\u0627\u0628\u0637",
31
+ "operation.requestBody": "\u0646\u0635 \u0627\u0644\u0637\u0644\u0628",
32
+ "operation.responses": "\u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0627\u062A",
33
+ "operation.security": "\u064A\u062A\u0637\u0644\u0628",
34
+ "operation.securityOptional": "\u0627\u062E\u062A\u064A\u0627\u0631\u064A",
35
+ "operation.securityOr": "\u0623\u0648",
36
+ "params.cookie": "\u0645\u0639\u0627\u0645\u0644\u0627\u062A \u0645\u0644\u0641\u0627\u062A \u062A\u0639\u0631\u064A\u0641 \u0627\u0644\u0627\u0631\u062A\u0628\u0627\u0637",
37
+ "params.header": "\u0645\u0639\u0627\u0645\u0644\u0627\u062A \u0627\u0644\u062A\u0631\u0648\u064A\u0633\u0629",
38
+ "params.path": "\u0645\u0639\u0627\u0645\u0644\u0627\u062A \u0627\u0644\u0645\u0633\u0627\u0631",
39
+ "params.query": "\u0645\u0639\u0627\u0645\u0644\u0627\u062A \u0627\u0644\u0627\u0633\u062A\u0639\u0644\u0627\u0645",
40
+ "schema.arrayItem": "\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0635\u0641\u0648\u0641\u0629",
41
+ "schema.circular": "\u062F\u0627\u0626\u0631\u064A",
42
+ "schema.default": "\u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A:",
43
+ "schema.example": "\u0645\u062B\u0627\u0644:",
44
+ "schema.mapValue": "\u0642\u064A\u0645\u0629 \u0627\u0644\u062E\u0631\u064A\u0637\u0629",
45
+ "schema.none": "\u0644\u0627 \u064A\u0648\u062C\u062F \u0645\u062E\u0637\u0637 \u0645\u0639\u0631\u0651\u0641.",
46
+ "schema.values": "\u0627\u0644\u0642\u064A\u0645:",
47
+ "sidebar.introduction": "\u0645\u0642\u062F\u0645\u0629",
48
+ "sidebar.label": "\u0627\u0644\u062A\u0648\u062B\u064A\u0642",
49
+ "sidebar.noResults": "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0646\u062A\u0627\u0626\u062C.",
50
+ "sidebar.search": "\u0627\u0628\u062D\u062B \u0639\u0646 \u0646\u0642\u0637\u0629 \u0646\u0647\u0627\u064A\u0629 \u0623\u0648 \u0646\u0645\u0648\u0630\u062C",
51
+ "snippets.client": "\u0627\u0644\u0639\u0645\u064A\u0644",
52
+ "snippets.language": "\u0627\u0644\u0644\u063A\u0629",
53
+ "source.chooseFile": "\u0627\u062E\u062A\u0631 \u0645\u0644\u0641 JSON \u0623\u0648 YAML\u2026",
54
+ "source.default": "\u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A",
55
+ "source.file": "\u0627\u0644\u0645\u0644\u0641: {name}",
56
+ "source.loadUrl": "\u062A\u062D\u0645\u064A\u0644 \u0645\u0646 \u0639\u0646\u0648\u0627\u0646 URL",
57
+ "source.title": "\u0627\u0644\u0645\u0635\u062F\u0631",
58
+ "spec.fallback": "\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u0633\u062A\u0646\u062F \u0627\u0644\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u0629 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u061B \u064A\u062A\u0645 \u0639\u0631\u0636 \u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0648\u0642\u062F \u0644\u0627 \u062A\u0643\u0648\u0646 \u0645\u062D\u062F\u0651\u062B\u0629.",
59
+ "spec.loadFailed": "\u062A\u0639\u0630\u0651\u0631 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u0648\u0627\u0635\u0641\u0629: {error}",
60
+ "spec.loading": "\u062C\u0627\u0631\u064D \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u0633\u062A\u0646\u062F\u2026",
61
+ "spec.unreadableFile": "\u062A\u0639\u0630\u0651\u0631\u062A \u0642\u0631\u0627\u0621\u0629 {name}: {error}",
62
+ "tryIt.confirm.body": "\u0633\u064A\u064F\u0631\u0633\u0644 \u0637\u0644\u0628 {method} \u0625\u0644\u0649 {host}. \u0642\u062F \u062A\u0633\u062A\u0628\u062F\u0644 \u0627\u0644\u0642\u064A\u0645 \u0627\u0644\u062A\u062C\u0631\u064A\u0628\u064A\u0629 \u0633\u062C\u0644\u0627\u062A \u062D\u0642\u064A\u0642\u064A\u0629 \u0623\u0648 \u062A\u062D\u0630\u0641\u0647\u0627.",
63
+ "tryIt.confirm.cancel": "\u0625\u0644\u063A\u0627\u0621",
64
+ "tryIt.confirm.send": "\u0623\u0631\u0633\u0644 \u0639\u0644\u0649 \u0623\u064A \u062D\u0627\u0644",
65
+ "tryIt.confirm.skip": "\u0644\u0627 \u062A\u0633\u0623\u0644 \u0645\u062C\u062F\u062F\u064B\u0627 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u062C\u0644\u0633\u0629",
66
+ "tryIt.confirm.title": "\u0642\u062F \u064A\u063A\u064A\u0651\u0631 \u0647\u0630\u0627 \u0627\u0644\u0637\u0644\u0628 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
67
+ "tryIt.corsHint": "\u0642\u062F \u0644\u0627 \u062A\u0633\u0645\u062D \u0627\u0644\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u0629 \u0628\u0640 CORS \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0635\u062F\u0631\u061B \u062C\u0631\u0651\u0628 \u0648\u0636\u0639 \u0627\u0644\u0648\u0643\u064A\u0644.",
68
+ "tryIt.failed": "\u062A\u0639\u0630\u0651\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628: {message}",
69
+ "tryIt.fileHint": "\u0644\u0627 \u062A\u064F\u0636\u0627\u0641 \u062D\u0642\u0648\u0644 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u062A\u064A \u0644\u0645 \u064A\u064F\u062E\u062A\u0631 \u0644\u0647\u0627 \u0645\u0644\u0641 \u0625\u0644\u0649 \u0627\u0644\u0637\u0644\u0628.",
70
+ "tryIt.idle": "\u0627\u0636\u063A\u0637 \xAB\u0625\u0631\u0633\u0627\u0644\xBB \u0644\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628.",
71
+ "tryIt.mode.direct": "\u0645\u0628\u0627\u0634\u0631",
72
+ "tryIt.mode.directHint": "\u064A\u064F\u0631\u0633\u0644 \u0645\u0646 \u0627\u0644\u0645\u062A\u0635\u0641\u062D\u061B \u064A\u062C\u0628 \u0623\u0646 \u062A\u0633\u0645\u062D \u0627\u0644\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u0629 \u0628\u0640 CORS",
73
+ "tryIt.mode.label": "\u0637\u0631\u064A\u0642\u0629 \u0627\u0644\u0625\u0631\u0633\u0627\u0644",
74
+ "tryIt.mode.proxyDisabled": "\u0627\u0644\u0648\u0643\u064A\u0644 \u0645\u0639\u0637\u0651\u0644 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062E\u0627\u062F\u0645.",
75
+ "tryIt.mode.proxyHint": "\u064A\u064F\u0631\u0633\u0644 \u0639\u0628\u0631 \u062E\u0627\u062F\u0645 \u0627\u0644\u062A\u0648\u062B\u064A\u0642\u061B \u0644\u0627 \u062A\u062D\u062A\u0627\u062C \u0627\u0644\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u0629 \u0625\u0644\u0649 CORS",
76
+ "tryIt.open": "\u062C\u0631\u0651\u0628",
77
+ "tryIt.send": "\u0625\u0631\u0633\u0627\u0644",
78
+ "tryIt.sending": "\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0631\u0633\u0627\u0644\u2026",
79
+ "tryIt.settingsHint": "\u064A\u062A\u0645 \u0636\u0628\u0637 \u0627\u0644\u062E\u0627\u062F\u0645 \u0648\u0631\u0645\u0632 Bearer \u0645\u0646 \u0642\u0633\u0645 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.",
80
+ "tryIt.waiting": "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629\u2026",
81
+ "webhooks.hint": "\u0637\u0644\u0628\u0627\u062A \u062A\u0631\u0633\u0644\u0647\u0627 \u0647\u0630\u0647 \u0627\u0644\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u0629 \u0625\u0644\u0649 \u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u0644\u062F\u064A\u0643.",
82
+ "webhooks.payload": "\u0627\u0644\u062D\u0645\u0648\u0644\u0629",
83
+ "webhooks.title": "\u062E\u0637\u0627\u0641\u0627\u062A \u0627\u0644\u0648\u064A\u0628"
84
+ };
85
+ var ar_default = messages;
86
+ export {
87
+ ar_default as default
88
+ };
89
+ //# sourceMappingURL=ar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/ar.js"],"sourcesContent":["// Arabic UI messages (right-to-left).\nconst messages = {\n \"auth.accessToken\": \"رمز الوصول\",\n \"auth.getToken\": \"احصل على رمز\",\n \"auth.gettingToken\": \"جارٍ الحصول على الرمز…\",\n \"auth.mutualTls\": \"يستخدم شهادة عميل تُضبط خارج المتصفح.\",\n \"auth.password\": \"كلمة المرور\",\n \"auth.redirectFlows\": \"يتم تسجيل الدخول في هذا التدفق عبر إعادة توجيه المتصفح؛ احصل على رمز الوصول من مكان آخر والصقه أعلاه.\",\n \"auth.scopes\": \"النطاقات (مفصولة بمسافات)\",\n \"auth.title\": \"المصادقة\",\n \"auth.tokenFailed\": \"تعذّر الحصول على الرمز: {error}\",\n \"auth.username\": \"اسم المستخدم\",\n \"connection.customServer\": \"عنوان URL مخصص…\",\n \"connection.server\": \"الخادم\",\n \"connection.title\": \"الاتصال\",\n \"connection.tokenNote\": \"يُحفظ الرمز في هذا المتصفح فقط، ويُستخدم في أمثلة الشيفرة ونافذة «جرّب».\",\n \"connection.tokenPlaceholder\": \"يضيف ترويسة Authorization إلى أمثلة الطلبات\",\n \"copy.copied\": \"تم النسخ\",\n \"copy.copy\": \"نسخ\",\n \"dialog.close\": \"إغلاق\",\n \"header.language\": \"تغيير اللغة\",\n \"header.menu\": \"القائمة\",\n \"header.skip\": \"انتقل إلى المحتوى\",\n \"header.theme\": \"تبديل السمة\",\n \"intro.download\": \"تنزيل مستند OpenAPI\",\n \"intro.endpoints\": \"نقاط النهاية\",\n \"intro.groups\": \"المجموعات\",\n \"intro.models\": \"النماذج\",\n \"models.title\": \"النماذج\",\n \"operation.callbacks\": \"الاستدعاءات الراجعة\",\n \"operation.links\": \"الروابط\",\n \"operation.requestBody\": \"نص الطلب\",\n \"operation.responses\": \"الاستجابات\",\n \"operation.security\": \"يتطلب\",\n \"operation.securityOptional\": \"اختياري\",\n \"operation.securityOr\": \"أو\",\n \"params.cookie\": \"معاملات ملفات تعريف الارتباط\",\n \"params.header\": \"معاملات الترويسة\",\n \"params.path\": \"معاملات المسار\",\n \"params.query\": \"معاملات الاستعلام\",\n \"schema.arrayItem\": \"عنصر المصفوفة\",\n \"schema.circular\": \"دائري\",\n \"schema.default\": \"الافتراضي:\",\n \"schema.example\": \"مثال:\",\n \"schema.mapValue\": \"قيمة الخريطة\",\n \"schema.none\": \"لا يوجد مخطط معرّف.\",\n \"schema.values\": \"القيم:\",\n \"sidebar.introduction\": \"مقدمة\",\n \"sidebar.label\": \"التوثيق\",\n \"sidebar.noResults\": \"لم يتم العثور على نتائج.\",\n \"sidebar.search\": \"ابحث عن نقطة نهاية أو نموذج\",\n \"snippets.client\": \"العميل\",\n \"snippets.language\": \"اللغة\",\n \"source.chooseFile\": \"اختر ملف JSON أو YAML…\",\n \"source.default\": \"الافتراضي\",\n \"source.file\": \"الملف: {name}\",\n \"source.loadUrl\": \"تحميل من عنوان URL\",\n \"source.title\": \"المصدر\",\n \"spec.fallback\": \"تعذّر الوصول إلى مستند الواجهة البرمجية المباشر؛ يتم عرض نسخة احتياطية وقد لا تكون محدّثة.\",\n \"spec.loadFailed\": \"تعذّر تحميل المواصفة: {error}\",\n \"spec.loading\": \"جارٍ تحميل المستند…\",\n \"spec.unreadableFile\": \"تعذّرت قراءة {name}: {error}\",\n \"tryIt.confirm.body\": \"سيُرسل طلب {method} إلى {host}. قد تستبدل القيم التجريبية سجلات حقيقية أو تحذفها.\",\n \"tryIt.confirm.cancel\": \"إلغاء\",\n \"tryIt.confirm.send\": \"أرسل على أي حال\",\n \"tryIt.confirm.skip\": \"لا تسأل مجددًا في هذه الجلسة\",\n \"tryIt.confirm.title\": \"قد يغيّر هذا الطلب البيانات\",\n \"tryIt.corsHint\": \"قد لا تسمح الواجهة البرمجية بـ CORS لهذا المصدر؛ جرّب وضع الوكيل.\",\n \"tryIt.failed\": \"تعذّر إرسال الطلب: {message}\",\n \"tryIt.fileHint\": \"لا تُضاف حقول الملفات التي لم يُختر لها ملف إلى الطلب.\",\n \"tryIt.idle\": \"اضغط «إرسال» لإرسال الطلب.\",\n \"tryIt.mode.direct\": \"مباشر\",\n \"tryIt.mode.directHint\": \"يُرسل من المتصفح؛ يجب أن تسمح الواجهة البرمجية بـ CORS\",\n \"tryIt.mode.label\": \"طريقة الإرسال\",\n \"tryIt.mode.proxyDisabled\": \"الوكيل معطّل على هذا الخادم.\",\n \"tryIt.mode.proxyHint\": \"يُرسل عبر خادم التوثيق؛ لا تحتاج الواجهة البرمجية إلى CORS\",\n \"tryIt.open\": \"جرّب\",\n \"tryIt.send\": \"إرسال\",\n \"tryIt.sending\": \"جارٍ الإرسال…\",\n \"tryIt.settingsHint\": \"يتم ضبط الخادم ورمز Bearer من قسم الاتصال.\",\n \"tryIt.waiting\": \"في انتظار الاستجابة…\",\n \"webhooks.hint\": \"طلبات ترسلها هذه الواجهة البرمجية إلى نقطة النهاية لديك.\",\n \"webhooks.payload\": \"الحمولة\",\n \"webhooks.title\": \"خطافات الويب\",\n};\n\nexport default messages;\n"],"mappings":"AACA,MAAM,WAAW;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,+BAA+B;AAAA,EAC/B,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;AAEA,IAAO,aAAQ;","names":[]}
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createContext, useCallback, useContext, useMemo, useState } from "react";
4
+ import { localize } from "@oaspect/core";
5
+ import { translate } from "./index.js";
6
+ const LocaleContext = createContext({
7
+ locale: "en",
8
+ setLocale: () => {
9
+ },
10
+ messages: {}
11
+ });
12
+ function LocaleProvider({ locale: controlled, defaultLocale = "en", onLocaleChange, messages, children }) {
13
+ const [uncontrolled, setUncontrolled] = useState(defaultLocale);
14
+ const locale = controlled ?? uncontrolled;
15
+ const setLocale = useCallback(
16
+ (next) => {
17
+ if (controlled === void 0) setUncontrolled(next);
18
+ onLocaleChange?.(next);
19
+ },
20
+ [controlled, onLocaleChange]
21
+ );
22
+ const value = useMemo(() => ({ locale, setLocale, messages }), [locale, setLocale, messages]);
23
+ return /* @__PURE__ */ jsx(LocaleContext.Provider, { value, children });
24
+ }
25
+ function useLocale() {
26
+ return useContext(LocaleContext).locale;
27
+ }
28
+ function useSetLocale() {
29
+ return useContext(LocaleContext).setLocale;
30
+ }
31
+ function useAvailableLocales() {
32
+ return Object.keys(useContext(LocaleContext).messages);
33
+ }
34
+ function useT() {
35
+ const { locale, messages } = useContext(LocaleContext);
36
+ return useCallback((key, params) => translate(messages, locale, key, params), [locale, messages]);
37
+ }
38
+ function useLocalized() {
39
+ const locale = useLocale();
40
+ return useCallback((node, field) => localize(node, field, locale), [locale]);
41
+ }
42
+ export {
43
+ LocaleProvider,
44
+ useAvailableLocales,
45
+ useLocale,
46
+ useLocalized,
47
+ useSetLocale,
48
+ useT
49
+ };
50
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/context.jsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useCallback, useContext, useMemo, useState } from \"react\";\nimport { localize } from \"@oaspect/core\";\nimport { translate } from \"./index\";\n\nconst LocaleContext = createContext({\n locale: \"en\",\n setLocale: () => {},\n messages: {},\n});\n\n// Controlled when `locale` is given (the host owns it and listens to\n// onLocaleChange), uncontrolled otherwise.\nexport function LocaleProvider({ locale: controlled, defaultLocale = \"en\", onLocaleChange, messages, children }) {\n const [uncontrolled, setUncontrolled] = useState(defaultLocale);\n const locale = controlled ?? uncontrolled;\n\n const setLocale = useCallback(\n (next) => {\n if (controlled === undefined) setUncontrolled(next);\n onLocaleChange?.(next);\n },\n [controlled, onLocaleChange],\n );\n\n const value = useMemo(() => ({ locale, setLocale, messages }), [locale, setLocale, messages]);\n return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;\n}\n\nexport function useLocale() {\n return useContext(LocaleContext).locale;\n}\n\nexport function useSetLocale() {\n return useContext(LocaleContext).setLocale;\n}\n\nexport function useAvailableLocales() {\n return Object.keys(useContext(LocaleContext).messages);\n}\n\nexport function useT() {\n const { locale, messages } = useContext(LocaleContext);\n return useCallback((key, params) => translate(messages, locale, key, params), [locale, messages]);\n}\n\n// Spec text for the UI locale: localized(node, \"summary\") reads x-i18n first.\nexport function useLocalized() {\n const locale = useLocale();\n return useCallback((node, field) => localize(node, field, locale), [locale]);\n}\n"],"mappings":";AA2BS;AAzBT,SAAS,eAAe,aAAa,YAAY,SAAS,gBAAgB;AAC1E,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAE1B,MAAM,gBAAgB,cAAc;AAAA,EAClC,QAAQ;AAAA,EACR,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB,UAAU,CAAC;AACb,CAAC;AAIM,SAAS,eAAe,EAAE,QAAQ,YAAY,gBAAgB,MAAM,gBAAgB,UAAU,SAAS,GAAG;AAC/G,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,aAAa;AAC9D,QAAM,SAAS,cAAc;AAE7B,QAAM,YAAY;AAAA,IAChB,CAAC,SAAS;AACR,UAAI,eAAe,OAAW,iBAAgB,IAAI;AAClD,uBAAiB,IAAI;AAAA,IACvB;AAAA,IACA,CAAC,YAAY,cAAc;AAAA,EAC7B;AAEA,QAAM,QAAQ,QAAQ,OAAO,EAAE,QAAQ,WAAW,SAAS,IAAI,CAAC,QAAQ,WAAW,QAAQ,CAAC;AAC5F,SAAO,oBAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AACzD;AAEO,SAAS,YAAY;AAC1B,SAAO,WAAW,aAAa,EAAE;AACnC;AAEO,SAAS,eAAe;AAC7B,SAAO,WAAW,aAAa,EAAE;AACnC;AAEO,SAAS,sBAAsB;AACpC,SAAO,OAAO,KAAK,WAAW,aAAa,EAAE,QAAQ;AACvD;AAEO,SAAS,OAAO;AACrB,QAAM,EAAE,QAAQ,SAAS,IAAI,WAAW,aAAa;AACrD,SAAO,YAAY,CAAC,KAAK,WAAW,UAAU,UAAU,QAAQ,KAAK,MAAM,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAClG;AAGO,SAAS,eAAe;AAC7B,QAAM,SAAS,UAAU;AACzB,SAAO,YAAY,CAAC,MAAM,UAAU,SAAS,MAAM,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC;AAC7E;","names":[]}
@@ -0,0 +1,89 @@
1
+ const messages = {
2
+ "auth.accessToken": "Access token",
3
+ "auth.getToken": "Get token",
4
+ "auth.gettingToken": "Getting token\u2026",
5
+ "auth.mutualTls": "Uses a client certificate, configured outside the browser.",
6
+ "auth.password": "Password",
7
+ "auth.redirectFlows": "This flow signs in through a browser redirect; get an access token elsewhere and paste it above.",
8
+ "auth.scopes": "Scopes (space separated)",
9
+ "auth.title": "Authentication",
10
+ "auth.tokenFailed": "Token request failed: {error}",
11
+ "auth.username": "Username",
12
+ "connection.customServer": "Custom URL\u2026",
13
+ "connection.server": "Server",
14
+ "connection.title": "Connection",
15
+ "connection.tokenNote": "The token is stored only in this browser and used in code samples and the \u201CTry\u201D dialog.",
16
+ "connection.tokenPlaceholder": "Adds an Authorization header to sample requests",
17
+ "copy.copied": "Copied",
18
+ "copy.copy": "Copy",
19
+ "dialog.close": "Close",
20
+ "header.language": "Change language",
21
+ "header.menu": "Menu",
22
+ "header.skip": "Skip to content",
23
+ "header.theme": "Toggle theme",
24
+ "intro.download": "Download OpenAPI document",
25
+ "intro.endpoints": "Endpoints",
26
+ "intro.groups": "Groups",
27
+ "intro.models": "Models",
28
+ "models.title": "Models",
29
+ "operation.callbacks": "Callbacks",
30
+ "operation.links": "Links",
31
+ "operation.requestBody": "Request body",
32
+ "operation.responses": "Responses",
33
+ "operation.security": "Requires",
34
+ "operation.securityOptional": "optional",
35
+ "operation.securityOr": "or",
36
+ "params.cookie": "Cookie parameters",
37
+ "params.header": "Header parameters",
38
+ "params.path": "Path parameters",
39
+ "params.query": "Query parameters",
40
+ "schema.arrayItem": "Array item",
41
+ "schema.circular": "circular",
42
+ "schema.default": "Default:",
43
+ "schema.example": "Example:",
44
+ "schema.mapValue": "Map value",
45
+ "schema.none": "No schema defined.",
46
+ "schema.values": "Values:",
47
+ "sidebar.introduction": "Introduction",
48
+ "sidebar.label": "Documentation",
49
+ "sidebar.noResults": "No results found.",
50
+ "sidebar.search": "Search endpoints or models",
51
+ "snippets.client": "Client",
52
+ "snippets.language": "Language",
53
+ "source.chooseFile": "Choose a JSON or YAML file\u2026",
54
+ "source.default": "Default",
55
+ "source.file": "File: {name}",
56
+ "source.loadUrl": "Load from URL",
57
+ "source.title": "Source",
58
+ "spec.fallback": "The live API document could not be reached; showing a fallback copy that may be out of date.",
59
+ "spec.loadFailed": "Could not load spec: {error}",
60
+ "spec.loading": "Loading document\u2026",
61
+ "spec.unreadableFile": "{name} could not be read: {error}",
62
+ "tryIt.confirm.body": "A {method} request will be sent to {host}. Example values can overwrite or delete real records.",
63
+ "tryIt.confirm.cancel": "Cancel",
64
+ "tryIt.confirm.send": "Send anyway",
65
+ "tryIt.confirm.skip": "Don't ask again this session",
66
+ "tryIt.confirm.title": "This request may change data",
67
+ "tryIt.corsHint": "The API may not allow CORS for this origin; try Proxy mode.",
68
+ "tryIt.failed": "Request failed: {message}",
69
+ "tryIt.fileHint": "File fields without a chosen file are left out of the request.",
70
+ "tryIt.idle": "Press \u201CSend\u201D to send the request.",
71
+ "tryIt.mode.direct": "Direct",
72
+ "tryIt.mode.directHint": "Sends from the browser; the API must allow CORS",
73
+ "tryIt.mode.label": "Request mode",
74
+ "tryIt.mode.proxyDisabled": "The proxy is disabled on this server.",
75
+ "tryIt.mode.proxyHint": "Sends through the docs server; the API does not need CORS",
76
+ "tryIt.open": "Try",
77
+ "tryIt.send": "Send",
78
+ "tryIt.sending": "Sending\u2026",
79
+ "tryIt.settingsHint": "Server and Bearer token are set in the Connection section.",
80
+ "tryIt.waiting": "Waiting for response\u2026",
81
+ "webhooks.hint": "Requests this API sends to your endpoint.",
82
+ "webhooks.payload": "Payload",
83
+ "webhooks.title": "Webhooks"
84
+ };
85
+ var en_default = messages;
86
+ export {
87
+ en_default as default
88
+ };
89
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/en.js"],"sourcesContent":["// English UI messages (default locale). Keys are stable ids; values may use {param} placeholders.\nconst messages = {\n \"auth.accessToken\": \"Access token\",\n \"auth.getToken\": \"Get token\",\n \"auth.gettingToken\": \"Getting token…\",\n \"auth.mutualTls\": \"Uses a client certificate, configured outside the browser.\",\n \"auth.password\": \"Password\",\n \"auth.redirectFlows\": \"This flow signs in through a browser redirect; get an access token elsewhere and paste it above.\",\n \"auth.scopes\": \"Scopes (space separated)\",\n \"auth.title\": \"Authentication\",\n \"auth.tokenFailed\": \"Token request failed: {error}\",\n \"auth.username\": \"Username\",\n \"connection.customServer\": \"Custom URL…\",\n \"connection.server\": \"Server\",\n \"connection.title\": \"Connection\",\n \"connection.tokenNote\": \"The token is stored only in this browser and used in code samples and the “Try” dialog.\",\n \"connection.tokenPlaceholder\": \"Adds an Authorization header to sample requests\",\n \"copy.copied\": \"Copied\",\n \"copy.copy\": \"Copy\",\n \"dialog.close\": \"Close\",\n \"header.language\": \"Change language\",\n \"header.menu\": \"Menu\",\n \"header.skip\": \"Skip to content\",\n \"header.theme\": \"Toggle theme\",\n \"intro.download\": \"Download OpenAPI document\",\n \"intro.endpoints\": \"Endpoints\",\n \"intro.groups\": \"Groups\",\n \"intro.models\": \"Models\",\n \"models.title\": \"Models\",\n \"operation.callbacks\": \"Callbacks\",\n \"operation.links\": \"Links\",\n \"operation.requestBody\": \"Request body\",\n \"operation.responses\": \"Responses\",\n \"operation.security\": \"Requires\",\n \"operation.securityOptional\": \"optional\",\n \"operation.securityOr\": \"or\",\n \"params.cookie\": \"Cookie parameters\",\n \"params.header\": \"Header parameters\",\n \"params.path\": \"Path parameters\",\n \"params.query\": \"Query parameters\",\n \"schema.arrayItem\": \"Array item\",\n \"schema.circular\": \"circular\",\n \"schema.default\": \"Default:\",\n \"schema.example\": \"Example:\",\n \"schema.mapValue\": \"Map value\",\n \"schema.none\": \"No schema defined.\",\n \"schema.values\": \"Values:\",\n \"sidebar.introduction\": \"Introduction\",\n \"sidebar.label\": \"Documentation\",\n \"sidebar.noResults\": \"No results found.\",\n \"sidebar.search\": \"Search endpoints or models\",\n \"snippets.client\": \"Client\",\n \"snippets.language\": \"Language\",\n \"source.chooseFile\": \"Choose a JSON or YAML file…\",\n \"source.default\": \"Default\",\n \"source.file\": \"File: {name}\",\n \"source.loadUrl\": \"Load from URL\",\n \"source.title\": \"Source\",\n \"spec.fallback\": \"The live API document could not be reached; showing a fallback copy that may be out of date.\",\n \"spec.loadFailed\": \"Could not load spec: {error}\",\n \"spec.loading\": \"Loading document…\",\n \"spec.unreadableFile\": \"{name} could not be read: {error}\",\n \"tryIt.confirm.body\": \"A {method} request will be sent to {host}. Example values can overwrite or delete real records.\",\n \"tryIt.confirm.cancel\": \"Cancel\",\n \"tryIt.confirm.send\": \"Send anyway\",\n \"tryIt.confirm.skip\": \"Don't ask again this session\",\n \"tryIt.confirm.title\": \"This request may change data\",\n \"tryIt.corsHint\": \"The API may not allow CORS for this origin; try Proxy mode.\",\n \"tryIt.failed\": \"Request failed: {message}\",\n \"tryIt.fileHint\": \"File fields without a chosen file are left out of the request.\",\n \"tryIt.idle\": \"Press “Send” to send the request.\",\n \"tryIt.mode.direct\": \"Direct\",\n \"tryIt.mode.directHint\": \"Sends from the browser; the API must allow CORS\",\n \"tryIt.mode.label\": \"Request mode\",\n \"tryIt.mode.proxyDisabled\": \"The proxy is disabled on this server.\",\n \"tryIt.mode.proxyHint\": \"Sends through the docs server; the API does not need CORS\",\n \"tryIt.open\": \"Try\",\n \"tryIt.send\": \"Send\",\n \"tryIt.sending\": \"Sending…\",\n \"tryIt.settingsHint\": \"Server and Bearer token are set in the Connection section.\",\n \"tryIt.waiting\": \"Waiting for response…\",\n \"webhooks.hint\": \"Requests this API sends to your endpoint.\",\n \"webhooks.payload\": \"Payload\",\n \"webhooks.title\": \"Webhooks\",\n};\n\nexport default messages;\n"],"mappings":"AACA,MAAM,WAAW;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,+BAA+B;AAAA,EAC/B,eAAe;AAAA,EACf,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;AAEA,IAAO,aAAQ;","names":[]}
@@ -0,0 +1,37 @@
1
+ import ar from "./ar.js";
2
+ import en from "./en.js";
3
+ import tr from "./tr.js";
4
+ const BUILT_IN_MESSAGES = { en, tr, ar };
5
+ const LOCALE_NAMES = {
6
+ en: "English",
7
+ tr: "T\xFCrk\xE7e",
8
+ ar: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"
9
+ };
10
+ const RTL_LANGUAGES = /* @__PURE__ */ new Set(["ar", "fa", "he", "ur", "ps", "sd", "ug", "yi", "dv", "ku"]);
11
+ function directionOf(locale) {
12
+ return RTL_LANGUAGES.has(String(locale ?? "").toLowerCase().split("-")[0]) ? "rtl" : "ltr";
13
+ }
14
+ function mergeMessages(overrides = {}) {
15
+ const merged = {};
16
+ for (const locale of /* @__PURE__ */ new Set([...Object.keys(BUILT_IN_MESSAGES), ...Object.keys(overrides)])) {
17
+ merged[locale] = { ...BUILT_IN_MESSAGES[locale], ...overrides[locale] };
18
+ }
19
+ return merged;
20
+ }
21
+ function translate(messages, locale, key, params) {
22
+ const base = String(locale ?? "").split("-")[0];
23
+ const value = messages[locale]?.[key] ?? messages[base]?.[key] ?? messages.en?.[key] ?? key;
24
+ if (!params) return value;
25
+ return value.replace(
26
+ /\{(\w+)\}/g,
27
+ (match, name) => Object.prototype.hasOwnProperty.call(params, name) ? String(params[name]) : match
28
+ );
29
+ }
30
+ export {
31
+ BUILT_IN_MESSAGES,
32
+ LOCALE_NAMES,
33
+ directionOf,
34
+ mergeMessages,
35
+ translate
36
+ };
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/i18n/index.js"],"sourcesContent":["import ar from \"./ar\";\nimport en from \"./en\";\nimport tr from \"./tr\";\n\n// Built-in UI languages. Hosts can add or override languages through the\n// `messages` prop of <ApiReference>; English is the fallback for any key a\n// language does not define.\nexport const BUILT_IN_MESSAGES = { en, tr, ar };\n\nexport const LOCALE_NAMES = {\n en: \"English\",\n tr: \"Türkçe\",\n ar: \"العربية\",\n};\n\nconst RTL_LANGUAGES = new Set([\"ar\", \"fa\", \"he\", \"ur\", \"ps\", \"sd\", \"ug\", \"yi\", \"dv\", \"ku\"]);\n\nexport function directionOf(locale) {\n return RTL_LANGUAGES.has(String(locale ?? \"\").toLowerCase().split(\"-\")[0]) ? \"rtl\" : \"ltr\";\n}\n\n// Merges built-in messages with host overrides: { tr: { \"sidebar.search\": \"…\" } }.\nexport function mergeMessages(overrides = {}) {\n const merged = {};\n for (const locale of new Set([...Object.keys(BUILT_IN_MESSAGES), ...Object.keys(overrides)])) {\n merged[locale] = { ...BUILT_IN_MESSAGES[locale], ...overrides[locale] };\n }\n return merged;\n}\n\n// Looks a key up for `locale` (then its base language, then English) and\n// fills {param} placeholders. Unknown keys are returned as-is.\nexport function translate(messages, locale, key, params) {\n const base = String(locale ?? \"\").split(\"-\")[0];\n const value = messages[locale]?.[key] ?? messages[base]?.[key] ?? messages.en?.[key] ?? key;\n if (!params) return value;\n\n return value.replace(/\\{(\\w+)\\}/g, (match, name) =>\n Object.prototype.hasOwnProperty.call(params, name) ? String(params[name]) : match,\n );\n}\n"],"mappings":"AAAA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,QAAQ;AAKR,MAAM,oBAAoB,EAAE,IAAI,IAAI,GAAG;AAEvC,MAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,MAAM,gBAAgB,oBAAI,IAAI,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAEnF,SAAS,YAAY,QAAQ;AAClC,SAAO,cAAc,IAAI,OAAO,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,QAAQ;AACvF;AAGO,SAAS,cAAc,YAAY,CAAC,GAAG;AAC5C,QAAM,SAAS,CAAC;AAChB,aAAW,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,iBAAiB,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG;AAC5F,WAAO,MAAM,IAAI,EAAE,GAAG,kBAAkB,MAAM,GAAG,GAAG,UAAU,MAAM,EAAE;AAAA,EACxE;AACA,SAAO;AACT;AAIO,SAAS,UAAU,UAAU,QAAQ,KAAK,QAAQ;AACvD,QAAM,OAAO,OAAO,UAAU,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9C,QAAM,QAAQ,SAAS,MAAM,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,GAAG,KAAK,SAAS,KAAK,GAAG,KAAK;AACxF,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,MAAM;AAAA,IAAQ;AAAA,IAAc,CAAC,OAAO,SACzC,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,IAAI;AAAA,EAC9E;AACF;","names":[]}