@publish.os/nextjs 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +7 -0
  2. package/dist/cache/tags.cjs +76 -0
  3. package/dist/cache/tags.d.cts +12 -0
  4. package/dist/cache/tags.d.ts +12 -0
  5. package/dist/cache/tags.js +51 -0
  6. package/dist/components/color-palette.cjs +408 -0
  7. package/dist/components/color-palette.d.cts +5 -0
  8. package/dist/components/color-palette.d.ts +5 -0
  9. package/dist/components/color-palette.js +388 -0
  10. package/dist/components/nav-breadcrumb.cjs +141 -0
  11. package/dist/components/nav-breadcrumb.d.cts +9 -0
  12. package/dist/components/nav-breadcrumb.d.ts +9 -0
  13. package/dist/components/nav-breadcrumb.js +107 -0
  14. package/dist/components/page-list.cjs +68 -0
  15. package/dist/components/page-list.d.cts +11 -0
  16. package/dist/components/page-list.d.ts +11 -0
  17. package/dist/components/page-list.js +33 -0
  18. package/dist/components/providers.cjs +44 -0
  19. package/dist/components/providers.d.cts +8 -0
  20. package/dist/components/providers.d.ts +8 -0
  21. package/dist/components/providers.js +20 -0
  22. package/dist/components/site-header.cjs +302 -0
  23. package/dist/components/site-header.d.cts +12 -0
  24. package/dist/components/site-header.d.ts +12 -0
  25. package/dist/components/site-header.js +268 -0
  26. package/dist/components/theme-toggle.cjs +147 -0
  27. package/dist/components/theme-toggle.d.cts +5 -0
  28. package/dist/components/theme-toggle.d.ts +5 -0
  29. package/dist/components/theme-toggle.js +123 -0
  30. package/dist/config/createNextConfig.cjs +52 -0
  31. package/dist/config/createNextConfig.d.cts +8 -0
  32. package/dist/config/createNextConfig.d.ts +8 -0
  33. package/dist/config/createNextConfig.js +27 -0
  34. package/dist/index.cjs +347 -0
  35. package/dist/index.d.cts +14 -0
  36. package/dist/index.d.ts +14 -0
  37. package/dist/index.js +299 -0
  38. package/dist/layouts/group.cjs +157 -0
  39. package/dist/layouts/group.d.cts +15 -0
  40. package/dist/layouts/group.d.ts +15 -0
  41. package/dist/layouts/group.js +132 -0
  42. package/dist/mdx/error-boundary.cjs +94 -0
  43. package/dist/mdx/error-boundary.d.cts +13 -0
  44. package/dist/mdx/error-boundary.d.ts +13 -0
  45. package/dist/mdx/error-boundary.js +70 -0
  46. package/dist/mdx/error-fallback.cjs +58 -0
  47. package/dist/mdx/error-fallback.d.cts +9 -0
  48. package/dist/mdx/error-fallback.d.ts +9 -0
  49. package/dist/mdx/error-fallback.js +33 -0
  50. package/dist/mdx/mdx.cjs +182 -0
  51. package/dist/mdx/mdx.d.cts +10 -0
  52. package/dist/mdx/mdx.d.ts +10 -0
  53. package/dist/mdx/mdx.js +147 -0
  54. package/dist/pages/group.cjs +162 -0
  55. package/dist/pages/group.d.cts +15 -0
  56. package/dist/pages/group.d.ts +15 -0
  57. package/dist/pages/group.js +136 -0
  58. package/dist/pages/leaf.cjs +203 -0
  59. package/dist/pages/leaf.d.cts +23 -0
  60. package/dist/pages/leaf.d.ts +23 -0
  61. package/dist/pages/leaf.js +176 -0
  62. package/dist/pages/root.cjs +127 -0
  63. package/dist/pages/root.d.cts +14 -0
  64. package/dist/pages/root.d.ts +14 -0
  65. package/dist/pages/root.js +101 -0
  66. package/dist/resolvers/manifest-resolver.cjs +107 -0
  67. package/dist/resolvers/manifest-resolver.d.cts +13 -0
  68. package/dist/resolvers/manifest-resolver.d.ts +13 -0
  69. package/dist/resolvers/manifest-resolver.js +79 -0
  70. package/dist/routes/llms.cjs +101 -0
  71. package/dist/routes/llms.d.cts +7 -0
  72. package/dist/routes/llms.d.ts +7 -0
  73. package/dist/routes/llms.js +76 -0
  74. package/dist/routes/robots.cjs +94 -0
  75. package/dist/routes/robots.d.cts +5 -0
  76. package/dist/routes/robots.d.ts +5 -0
  77. package/dist/routes/robots.js +69 -0
  78. package/dist/routes/sitemap.cjs +108 -0
  79. package/dist/routes/sitemap.d.cts +5 -0
  80. package/dist/routes/sitemap.d.ts +5 -0
  81. package/dist/routes/sitemap.js +83 -0
  82. package/dist/types.cjs +18 -0
  83. package/dist/types.d.cts +144 -0
  84. package/dist/types.d.ts +144 -0
  85. package/dist/types.js +0 -0
  86. package/dist/utils/cn.cjs +49 -0
  87. package/dist/utils/cn.d.cts +15 -0
  88. package/dist/utils/cn.d.ts +15 -0
  89. package/dist/utils/cn.js +24 -0
  90. package/dist/utils/pretty-date.cjs +55 -0
  91. package/dist/utils/pretty-date.d.cts +6 -0
  92. package/dist/utils/pretty-date.d.ts +6 -0
  93. package/dist/utils/pretty-date.js +30 -0
  94. package/package.json +100 -0
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @publish.os/nextjs
2
+
3
+ PublishOS Next.js runtime package for generated `publish.os/` applications.
4
+
5
+ ## License
6
+
7
+ Proprietary. All rights reserved.
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/cache/tags.ts
21
+ var tags_exports = {};
22
+ __export(tags_exports, {
23
+ tags: () => tags
24
+ });
25
+ module.exports = __toCommonJS(tags_exports);
26
+ var import_node_crypto = require("crypto");
27
+ var MAX_TAG_LEN = 256;
28
+ var MAX_SEGMENT_LEN = 80;
29
+ var TAG_PATTERN = /^[a-z0-9:_./-]+$/;
30
+ function sha256(value) {
31
+ return (0, import_node_crypto.createHash)("sha256").update(value).digest("hex").slice(0, 16);
32
+ }
33
+ function safeSegment(value) {
34
+ const raw = value.trim().toLowerCase() || "root";
35
+ const normalized = raw.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/^\//, "").replace(/\/$/, "").replace(/[^a-z0-9:_./-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
36
+ const segment = normalized || "root";
37
+ if (segment.length <= MAX_SEGMENT_LEN) return segment;
38
+ return `${segment.slice(0, 48)}.${sha256(segment)}`;
39
+ }
40
+ function assertTag(tag) {
41
+ if (tag.length > MAX_TAG_LEN || !TAG_PATTERN.test(tag)) {
42
+ return `tag:${sha256(tag)}`;
43
+ }
44
+ return tag;
45
+ }
46
+ var tags = {
47
+ site() {
48
+ return "site";
49
+ },
50
+ pages() {
51
+ return "pages";
52
+ },
53
+ group(group) {
54
+ return assertTag(`group:${safeSegment(group)}`);
55
+ },
56
+ page(group, slug) {
57
+ const path = Array.isArray(slug) ? slug.join("/") : slug;
58
+ return assertTag(`page:${safeSegment(group)}:${safeSegment(path)}`);
59
+ },
60
+ manifest(contentHash) {
61
+ return assertTag(`manifest:${safeSegment(contentHash)}`);
62
+ },
63
+ sitemap() {
64
+ return "sitemap";
65
+ },
66
+ robots() {
67
+ return "robots";
68
+ },
69
+ llms(scope = "root") {
70
+ return assertTag(`llms:${safeSegment(scope)}`);
71
+ }
72
+ };
73
+ // Annotate the CommonJS export names for ESM import in node:
74
+ 0 && (module.exports = {
75
+ tags
76
+ });
@@ -0,0 +1,12 @@
1
+ declare const tags: {
2
+ site(): string;
3
+ pages(): string;
4
+ group(group: string): string;
5
+ page(group: string, slug: string | string[]): string;
6
+ manifest(contentHash: string): string;
7
+ sitemap(): string;
8
+ robots(): string;
9
+ llms(scope?: string): string;
10
+ };
11
+
12
+ export { tags };
@@ -0,0 +1,12 @@
1
+ declare const tags: {
2
+ site(): string;
3
+ pages(): string;
4
+ group(group: string): string;
5
+ page(group: string, slug: string | string[]): string;
6
+ manifest(contentHash: string): string;
7
+ sitemap(): string;
8
+ robots(): string;
9
+ llms(scope?: string): string;
10
+ };
11
+
12
+ export { tags };
@@ -0,0 +1,51 @@
1
+ // src/cache/tags.ts
2
+ import { createHash } from "crypto";
3
+ var MAX_TAG_LEN = 256;
4
+ var MAX_SEGMENT_LEN = 80;
5
+ var TAG_PATTERN = /^[a-z0-9:_./-]+$/;
6
+ function sha256(value) {
7
+ return createHash("sha256").update(value).digest("hex").slice(0, 16);
8
+ }
9
+ function safeSegment(value) {
10
+ const raw = value.trim().toLowerCase() || "root";
11
+ const normalized = raw.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/^\//, "").replace(/\/$/, "").replace(/[^a-z0-9:_./-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
12
+ const segment = normalized || "root";
13
+ if (segment.length <= MAX_SEGMENT_LEN) return segment;
14
+ return `${segment.slice(0, 48)}.${sha256(segment)}`;
15
+ }
16
+ function assertTag(tag) {
17
+ if (tag.length > MAX_TAG_LEN || !TAG_PATTERN.test(tag)) {
18
+ return `tag:${sha256(tag)}`;
19
+ }
20
+ return tag;
21
+ }
22
+ var tags = {
23
+ site() {
24
+ return "site";
25
+ },
26
+ pages() {
27
+ return "pages";
28
+ },
29
+ group(group) {
30
+ return assertTag(`group:${safeSegment(group)}`);
31
+ },
32
+ page(group, slug) {
33
+ const path = Array.isArray(slug) ? slug.join("/") : slug;
34
+ return assertTag(`page:${safeSegment(group)}:${safeSegment(path)}`);
35
+ },
36
+ manifest(contentHash) {
37
+ return assertTag(`manifest:${safeSegment(contentHash)}`);
38
+ },
39
+ sitemap() {
40
+ return "sitemap";
41
+ },
42
+ robots() {
43
+ return "robots";
44
+ },
45
+ llms(scope = "root") {
46
+ return assertTag(`llms:${safeSegment(scope)}`);
47
+ }
48
+ };
49
+ export {
50
+ tags
51
+ };
@@ -0,0 +1,408 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/components/color-palette.tsx
22
+ var color_palette_exports = {};
23
+ __export(color_palette_exports, {
24
+ default: () => ColorPalette
25
+ });
26
+ module.exports = __toCommonJS(color_palette_exports);
27
+ var import_react = require("react");
28
+ var import_jsx_runtime = require("react/jsx-runtime");
29
+ var GLOBALS_CSS = `
30
+ :root {
31
+ --foreground-1: #100f0f;
32
+ --foreground-2: #403e3c;
33
+ --foreground-3: #6f6e69;
34
+ --foreground-4: #878580;
35
+ --surface-background: #fffcf0;
36
+ --surface-1: #fffcf0;
37
+ --surface-2: #fff8e3;
38
+ --surface-3: #f2ecd8;
39
+ --surface-4: #e6ddc8;
40
+ --surface-hover: var(--surface-3);
41
+ --surface-active: var(--surface-4);
42
+ --surface-overlay: var(--surface-3);
43
+ --surface-menu: #100f0f;
44
+ --surface-menu-foreground: #fffcf0;
45
+ --accent-1: #d84200;
46
+ --accent-2: #ff6b35;
47
+ --accent-3: #ff9f40;
48
+ --accent-4: #ffe7d6;
49
+ --stroke-1: #878580;
50
+ --stroke-2: #b7ad99;
51
+ --stroke-3: #d9cfba;
52
+ --stroke-4: #e6ddc8;
53
+ --focus-ring: var(--accent-2);
54
+ --typography-links: var(--accent-1);
55
+ --typography-variable: var(--accent-1);
56
+ --typography-pre-bg: #f2ecd8;
57
+ --typography-pre-border: #d9cfba;
58
+ --my-custom-variable: rgb(102, 128, 11);
59
+ /*--my-custom-variable: oklch(
60
+ from var(--accent-1) calc(l + 0.5) calc(c + 0.15) h / calc(alpha - 0.1)
61
+ );*/
62
+ --my-custom-extended-variable: oklch(
63
+ from var(--my-custom-variable) l c h /
64
+ calc(alpha - 0.1)
65
+ );
66
+ }
67
+ .dark {
68
+ --foreground-1: #fffcf0;
69
+ --foreground-2: #cecdc3;
70
+ --foreground-3: #878580;
71
+ --foreground-4: #6f6e69;
72
+ --surface-background: #100f0f;
73
+ --surface-1: #100f0f;
74
+ --surface-2: #1c1b1a;
75
+ --surface-3: #282726;
76
+ --surface-4: #343331;
77
+ --surface-hover: var(--surface-3);
78
+ --surface-active: var(--surface-4);
79
+ --surface-overlay: var(--surface-3);
80
+ --surface-menu: #fffcf0;
81
+ --surface-menu-foreground: #100f0f;
82
+ --accent-1: #ff9f40;
83
+ --accent-2: #ff8c1a;
84
+ --accent-3: #b54d00;
85
+ --accent-4: #3d1e00;
86
+ --stroke-1: #878580;
87
+ --stroke-2: #575653;
88
+ --stroke-3: #403e3c;
89
+ --stroke-4: #343331;
90
+ --focus-ring: var(--accent-1);
91
+ --typography-links: var(--accent-1);
92
+ --typography-variable: var(--accent-1);
93
+ --typography-pre-bg: #1c1b1a;
94
+ --typography-pre-border: #403e3c;
95
+ }
96
+ `;
97
+ function parseTokenNames(css) {
98
+ const stripped = css.replace(/\/\*[\s\S]*?\*\//g, "");
99
+ const seen = /* @__PURE__ */ new Set();
100
+ const names = [];
101
+ for (const m of stripped.matchAll(/--([a-zA-Z0-9_-]+)\s*:/g)) {
102
+ const name = m[1];
103
+ if (name && !seen.has(name)) {
104
+ seen.add(name);
105
+ names.push(name);
106
+ }
107
+ }
108
+ return names;
109
+ }
110
+ var TOKEN_NAMES = parseTokenNames(GLOBALS_CSS);
111
+ function deriveGroup(name) {
112
+ const p = name.split("-");
113
+ if (p.length === 1) return "base";
114
+ const last = p[p.length - 1];
115
+ if (last && /^\d+$/.test(last)) return p.slice(0, -1).join("-");
116
+ return p[0] ?? "base";
117
+ }
118
+ function parseRgbString(s) {
119
+ const m = s.match(/rgba?\(\s*([\d.]+)[,\s]\s*([\d.]+)[,\s]\s*([\d.]+)/);
120
+ if (!m) return null;
121
+ const [, r, g, b] = m;
122
+ if (!r || !g || !b) return null;
123
+ return [Math.round(+r), Math.round(+g), Math.round(+b)];
124
+ }
125
+ function toHex(r, g, b) {
126
+ return "#" + [r, g, b].map((x) => x.toString(16).padStart(2, "0")).join("").toUpperCase();
127
+ }
128
+ function toHsl(r, g, b) {
129
+ r /= 255;
130
+ g /= 255;
131
+ b /= 255;
132
+ const mx = Math.max(r, g, b), mn = Math.min(r, g, b);
133
+ let h = 0, s = 0;
134
+ const l = (mx + mn) / 2;
135
+ if (mx !== mn) {
136
+ const d = mx - mn;
137
+ s = l > 0.5 ? d / (2 - mx - mn) : d / (mx + mn);
138
+ if (mx === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
139
+ else if (mx === g) h = ((b - r) / d + 2) / 6;
140
+ else h = ((r - g) / d + 4) / 6;
141
+ }
142
+ return `hsl(${Math.round(h * 360)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`;
143
+ }
144
+ function toOklch(r, g, b) {
145
+ const tl = (c) => {
146
+ c /= 255;
147
+ return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
148
+ };
149
+ const [lr, lg, lb] = [tl(r), tl(g), tl(b)];
150
+ const l = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;
151
+ const m = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;
152
+ const s = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;
153
+ const [l_, m_, s_] = [Math.cbrt(l), Math.cbrt(m), Math.cbrt(s)];
154
+ const L = 0.2104542553 * l_ + 0.793617785 * m_ - 4072047e-9 * s_;
155
+ const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
156
+ const bv = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
157
+ const C = Math.sqrt(a * a + bv * bv);
158
+ let H = Math.atan2(bv, a) * (180 / Math.PI);
159
+ if (H < 0) H += 360;
160
+ return `oklch(${L.toFixed(3)} ${C.toFixed(3)} ${H.toFixed(1)})`;
161
+ }
162
+ function formatColor(r, g, b, fmt) {
163
+ switch (fmt) {
164
+ case "hex":
165
+ return toHex(r, g, b);
166
+ case "rgb":
167
+ return `rgb(${r}, ${g}, ${b})`;
168
+ case "hsl":
169
+ return toHsl(r, g, b);
170
+ case "oklch":
171
+ return toOklch(r, g, b);
172
+ }
173
+ }
174
+ function isLight(r, g, b) {
175
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255 > 0.52;
176
+ }
177
+ function readToken(name, container) {
178
+ const probe = document.createElement("div");
179
+ probe.style.cssText = `position:absolute;width:1px;height:1px;pointer-events:none;background:var(--${name})`;
180
+ container.appendChild(probe);
181
+ const computed = getComputedStyle(probe).backgroundColor;
182
+ container.removeChild(probe);
183
+ return parseRgbString(computed);
184
+ }
185
+ var FORMAT_OPTIONS = [
186
+ { label: "HEX", value: "hex" },
187
+ { label: "RGB", value: "rgb" },
188
+ { label: "HSL", value: "hsl" },
189
+ { label: "OKLCH", value: "oklch" }
190
+ ];
191
+ function Swatch({
192
+ name,
193
+ rgb,
194
+ format,
195
+ onFormatChange,
196
+ onCopy
197
+ }) {
198
+ const [menuOpen, setMenuOpen] = (0, import_react.useState)(false);
199
+ const menuRef = (0, import_react.useRef)(null);
200
+ (0, import_react.useEffect)(() => {
201
+ if (!menuOpen) return;
202
+ const h = (e) => {
203
+ if (!menuRef.current?.contains(e.target)) setMenuOpen(false);
204
+ };
205
+ document.addEventListener("mousedown", h);
206
+ return () => document.removeEventListener("mousedown", h);
207
+ }, [menuOpen]);
208
+ const displayVal = rgb ? formatColor(...rgb, format) : null;
209
+ const light = rgb ? isLight(...rgb) : true;
210
+ const bg = rgb ? toHex(...rgb) : void 0;
211
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col shrink-0 w-24", children: [
212
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
213
+ "button",
214
+ {
215
+ type: "button",
216
+ disabled: !rgb,
217
+ onClick: () => displayVal && onCopy(displayVal),
218
+ title: displayVal ?? "Unresolvable",
219
+ className: "relative overflow-hidden shrink-0 rounded-xl group transition-transform duration-150 hover:scale-105 active:scale-95 disabled:cursor-default disabled:hover:scale-100",
220
+ style: {
221
+ width: 96,
222
+ height: 80,
223
+ border: "0.5px solid rgba(128,128,128,0.2)",
224
+ background: bg ?? "color-mix(in srgb, currentColor 8%, transparent)"
225
+ },
226
+ children: rgb ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
227
+ "span",
228
+ {
229
+ className: "absolute inset-0 flex items-center justify-center text-[10px] font-bold tracking-widest uppercase opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none",
230
+ style: {
231
+ color: light ? "rgba(0,0,0,0.45)" : "rgba(255,255,255,0.65)"
232
+ },
233
+ children: "copy"
234
+ }
235
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
236
+ "span",
237
+ {
238
+ className: "absolute inset-0 rounded-xl pointer-events-none",
239
+ style: {
240
+ backgroundImage: "repeating-conic-gradient(#aaa 0% 25%, transparent 0% 50%)",
241
+ backgroundSize: "12px 12px",
242
+ opacity: 0.2
243
+ }
244
+ }
245
+ )
246
+ }
247
+ ),
248
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
249
+ "p",
250
+ {
251
+ className: "mt-1.5 truncate font-bold leading-tight text-[10px]",
252
+ title: name,
253
+ children: name
254
+ }
255
+ ),
256
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { ref: menuRef, className: "relative w-24", children: [
257
+ rgb ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
258
+ "button",
259
+ {
260
+ type: "button",
261
+ onClick: () => setMenuOpen((o) => !o),
262
+ className: "truncate text-left leading-normal mt-0.5 text-[9px] text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100 transition-colors w-24",
263
+ style: {
264
+ fontFamily: "inherit",
265
+ background: "none",
266
+ border: "none",
267
+ padding: 0,
268
+ cursor: "pointer"
269
+ },
270
+ children: displayVal
271
+ }
272
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "block mt-0.5 text-[9px] italic text-gray-400 dark:text-gray-600", children: "unresolved" }),
273
+ menuOpen && rgb && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
274
+ "div",
275
+ {
276
+ className: "absolute left-0 z-50 overflow-hidden rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-xl",
277
+ style: { top: "100%", marginTop: 4, minWidth: 176 },
278
+ children: FORMAT_OPTIONS.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
279
+ "button",
280
+ {
281
+ type: "button",
282
+ onClick: () => {
283
+ onFormatChange(opt.value);
284
+ setMenuOpen(false);
285
+ },
286
+ className: `flex items-center gap-2 w-full text-left px-3 py-1.5 text-[10px] transition-colors ${format === opt.value ? "bg-gray-900 text-white dark:bg-white dark:text-gray-900" : "text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800"}`,
287
+ style: {
288
+ fontFamily: "inherit",
289
+ border: "none",
290
+ cursor: "pointer"
291
+ },
292
+ children: [
293
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "font-bold w-11 shrink-0", children: opt.label }),
294
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[9px] opacity-55 truncate", children: formatColor(...rgb, opt.value) })
295
+ ]
296
+ },
297
+ opt.value
298
+ ))
299
+ }
300
+ )
301
+ ] })
302
+ ] });
303
+ }
304
+ function ColorPalette() {
305
+ const [format, setFormat] = (0, import_react.useState)("hex");
306
+ const [notice, setNotice] = (0, import_react.useState)("");
307
+ const [resolved, setResolved] = (0, import_react.useState)({});
308
+ const probeRef = (0, import_react.useRef)(null);
309
+ const noticeTimer = (0, import_react.useRef)(null);
310
+ const readAll = (0, import_react.useCallback)(() => {
311
+ const container = probeRef.current;
312
+ if (!container) return;
313
+ const next = {};
314
+ TOKEN_NAMES.forEach((name) => {
315
+ next[name] = readToken(name, container);
316
+ });
317
+ setResolved(next);
318
+ }, []);
319
+ (0, import_react.useEffect)(() => {
320
+ readAll();
321
+ const obs = new MutationObserver(readAll);
322
+ obs.observe(document.documentElement, {
323
+ attributes: true,
324
+ attributeFilter: ["class", "data-theme"]
325
+ });
326
+ return () => obs.disconnect();
327
+ }, [readAll]);
328
+ (0, import_react.useEffect)(() => {
329
+ return () => {
330
+ if (noticeTimer.current) clearTimeout(noticeTimer.current);
331
+ };
332
+ }, []);
333
+ const handleCopy = (0, import_react.useCallback)((txt) => {
334
+ navigator.clipboard.writeText(txt).catch(() => {
335
+ });
336
+ setNotice(`Copied ${txt}`);
337
+ if (noticeTimer.current) clearTimeout(noticeTimer.current);
338
+ noticeTimer.current = setTimeout(() => setNotice(""), 1800);
339
+ }, []);
340
+ const groups = {};
341
+ const groupOrder = [];
342
+ TOKEN_NAMES.forEach((name) => {
343
+ const g = deriveGroup(name);
344
+ if (!groups[g]) {
345
+ groups[g] = [];
346
+ groupOrder.push(g);
347
+ }
348
+ groups[g].push(name);
349
+ });
350
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
351
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
352
+ "div",
353
+ {
354
+ ref: probeRef,
355
+ "aria-hidden": true,
356
+ style: {
357
+ position: "absolute",
358
+ width: 0,
359
+ height: 0,
360
+ overflow: "hidden",
361
+ pointerEvents: "none"
362
+ }
363
+ }
364
+ ),
365
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
366
+ "div",
367
+ {
368
+ style: {
369
+ fontFamily: "var(--font-mono, ui-monospace, 'Fira Code', monospace)"
370
+ },
371
+ children: [
372
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-3 mb-5 flex-wrap", children: [
373
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex gap-1 rounded-lg p-0.5 bg-gray-100 dark:bg-gray-800", children: FORMAT_OPTIONS.map((f) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
374
+ "button",
375
+ {
376
+ type: "button",
377
+ onClick: () => setFormat(f.value),
378
+ className: `px-3 py-1 rounded-md text-[11px] font-bold transition-all ${format === f.value ? "bg-gray-900 text-white dark:bg-white dark:text-gray-900" : "text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200"}`,
379
+ style: {
380
+ fontFamily: "inherit",
381
+ border: "none",
382
+ cursor: "pointer"
383
+ },
384
+ children: f.label
385
+ },
386
+ f.value
387
+ )) }),
388
+ notice && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[11px] text-gray-400", children: notice })
389
+ ] }),
390
+ groupOrder.map((g) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "mb-7", children: [
391
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-[10px] font-bold uppercase tracking-[.18em] text-gray-400 dark:text-gray-600 pb-2 border-b border-gray-100 dark:border-gray-800 mb-3", children: g }),
392
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap gap-4", children: (groups[g] ?? []).map((name) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
393
+ Swatch,
394
+ {
395
+ name,
396
+ rgb: resolved[name] ?? null,
397
+ format,
398
+ onFormatChange: setFormat,
399
+ onCopy: handleCopy
400
+ },
401
+ name
402
+ )) })
403
+ ] }, g))
404
+ ]
405
+ }
406
+ )
407
+ ] });
408
+ }
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function ColorPalette(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { ColorPalette as default };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function ColorPalette(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { ColorPalette as default };