@021.is/brand-studio 0.6.0 → 0.6.7

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.
@@ -20,7 +20,10 @@ type BrandStudioProps = {
20
20
  animatedLogo?: ReactNode;
21
21
  /** Host app's own glyphs for the Icons section. The lib ships none. */
22
22
  icons?: BrandIcon[];
23
+ /** Real wordmark lockups: Overview headline + Download previews. */
24
+ wordmark?: ReactNode;
25
+ wordmarkDark?: ReactNode;
23
26
  };
24
- declare function BrandStudio({ config, route, basePath, staticLogo, staticLogoDark, animatedLogo, icons, }: BrandStudioProps): react_jsx_runtime.JSX.Element;
27
+ declare function BrandStudio({ config, route, basePath, staticLogo, staticLogoDark, animatedLogo, icons, wordmark, wordmarkDark, }: BrandStudioProps): react_jsx_runtime.JSX.Element;
25
28
 
26
29
  export { type BrandIcon as B, BrandStudio as a, type BrandStudioProps as b };
@@ -1,4 +1,4 @@
1
- export { B as BrandIcon, a as BrandStudio, b as BrandStudioProps } from '../BrandStudio-D1QR4hIC.js';
1
+ export { B as BrandIcon, a as BrandStudio, b as BrandStudioProps } from '../BrandStudio-ksHBhiX3.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import { ReactNode } from 'react';
4
4
  import { c as BrandStudioSection } from '../types-BycZ2igw.js';
package/dist/app/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { BrandStudio, Navigation, buildNavigation } from '../chunk-JGLPUAM6.js';
2
+ export { BrandStudio, Navigation, buildNavigation } from '../chunk-H3LCFXCK.js';
3
3
  import '../chunk-YDZA26YU.js';
4
4
  import '../chunk-MDTU2JR5.js';
5
5
  export { contrastBadge, contrastRatio, relativeLuminance } from '../chunk-JQV3ASME.js';
@@ -10,7 +10,6 @@ var ITEMS = [
10
10
  { section: BrandStudioSection.Colors, label: "Colors" },
11
11
  { section: BrandStudioSection.Typography, label: "Type" },
12
12
  { section: BrandStudioSection.Icons, label: "Icons" },
13
- { section: BrandStudioSection.Motion, label: "Motion" },
14
13
  { section: BrandStudioSection.Download, label: "Download" }
15
14
  ];
16
15
  function buildNavigation(basePath) {
@@ -30,7 +29,7 @@ function Navigation({ current, basePath, renderLink }) {
30
29
  gap: "1.5rem",
31
30
  listStyle: "none",
32
31
  margin: 0,
33
- padding: "0 0 0.75rem 0",
32
+ padding: 0,
34
33
  fontFamily: "var(--bs-mono, ui-monospace, monospace)",
35
34
  fontSize: "0.78rem",
36
35
  letterSpacing: "0.12em",
@@ -182,7 +181,9 @@ var WORDMARK_HEIGHTS = [32, 48, 64, 96, 128];
182
181
  function DownloadSection({
183
182
  config,
184
183
  staticLogo,
185
- staticLogoDark
184
+ staticLogoDark,
185
+ wordmark,
186
+ wordmarkDark
186
187
  }) {
187
188
  const iconLightRef = useRef(null);
188
189
  const iconDarkRef = useRef(null);
@@ -204,7 +205,12 @@ function DownloadSection({
204
205
  const iconDark = findEntry(downloads, DownloadKind.Icon, DownloadMode.Dark, iconSize);
205
206
  const logoLight = findEntry(downloads, DownloadKind.Logo, DownloadMode.Light, wmHeight);
206
207
  const logoDark = findEntry(downloads, DownloadKind.Logo, DownloadMode.Dark, wmHeight);
207
- function downloadIcon(mode) {
208
+ async function downloadIcon(mode) {
209
+ const entry = mode === "light" ? iconLight : iconDark;
210
+ if (entry) {
211
+ await fetchAndSave(entry.url, entry.filename ?? lastSegment(entry.url));
212
+ return;
213
+ }
208
214
  const ref = mode === "light" ? iconLightRef : iconDarkRef;
209
215
  const svg = ref.current?.querySelector("svg");
210
216
  if (!svg) return;
@@ -218,6 +224,11 @@ function DownloadSection({
218
224
  );
219
225
  }
220
226
  async function downloadWordmark(mode) {
227
+ const entry = mode === "light" ? logoLight : logoDark;
228
+ if (entry) {
229
+ await fetchAndSave(entry.url, entry.filename ?? lastSegment(entry.url));
230
+ return;
231
+ }
221
232
  await document.fonts?.ready;
222
233
  const text = measureRef.current?.querySelector("text");
223
234
  if (!text) return;
@@ -265,7 +276,9 @@ function DownloadSection({
265
276
  style: {
266
277
  display: "grid",
267
278
  gap: "1.5rem",
268
- gridTemplateColumns: "repeat(auto-fit, minmax(20rem, 1fr))"
279
+ // min(20rem, 100%) so the 20rem floor never exceeds the container on
280
+ // narrow viewports (which would force horizontal overflow).
281
+ gridTemplateColumns: "repeat(auto-fit, minmax(min(20rem, 100%), 1fr))"
269
282
  },
270
283
  children: [
271
284
  /* @__PURE__ */ jsxs("div", { style: cardStyle, children: [
@@ -308,8 +321,8 @@ function DownloadSection({
308
321
  /* @__PURE__ */ jsxs("div", { style: cardStyle, children: [
309
322
  /* @__PURE__ */ jsx("p", { style: eyebrowStyle, children: "Wordmark \xB7 logo text" }),
310
323
  /* @__PURE__ */ jsxs("div", { style: previewRow, children: [
311
- /* @__PURE__ */ jsx(PreviewPane, { bg: lightBg, label: "Light", labelColor: lightLabel, children: /* @__PURE__ */ jsx(WordmarkPreview, { name: config.name, sans, color: lightInk }) }),
312
- /* @__PURE__ */ jsx(PreviewPane, { bg: darkBg, label: "Dark", labelColor: darkLabel, children: /* @__PURE__ */ jsx(WordmarkPreview, { name: config.name, sans, color: darkInk }) })
324
+ /* @__PURE__ */ jsx(PreviewPane, { bg: lightBg, label: "Light", labelColor: lightLabel, children: wordmark ?? /* @__PURE__ */ jsx(WordmarkPreview, { name: config.name, sans, color: lightInk }) }),
325
+ /* @__PURE__ */ jsx(PreviewPane, { bg: darkBg, label: "Dark", labelColor: darkLabel, children: wordmarkDark ?? wordmark ?? /* @__PURE__ */ jsx(WordmarkPreview, { name: config.name, sans, color: darkInk }) })
313
326
  ] }),
314
327
  /* @__PURE__ */ jsx(
315
328
  Dropdown,
@@ -404,6 +417,23 @@ function triggerBlobDownload(svgString, filename) {
404
417
  a.remove();
405
418
  window.setTimeout(() => URL.revokeObjectURL(url), 1e3);
406
419
  }
420
+ async function fetchAndSave(url, filename) {
421
+ try {
422
+ const res = await fetch(url, { cache: "no-store" });
423
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
424
+ const blob = await res.blob();
425
+ const objectUrl = URL.createObjectURL(blob);
426
+ const a = document.createElement("a");
427
+ a.href = objectUrl;
428
+ a.download = filename;
429
+ document.body.appendChild(a);
430
+ a.click();
431
+ a.remove();
432
+ window.setTimeout(() => URL.revokeObjectURL(objectUrl), 1e3);
433
+ } catch {
434
+ window.open(url, "_blank", "noopener,noreferrer");
435
+ }
436
+ }
407
437
  function UrlPair({ light, dark }) {
408
438
  return /* @__PURE__ */ jsxs(
409
439
  "div",
@@ -423,12 +453,40 @@ function UrlPair({ light, dark }) {
423
453
  function UrlRow({ label, entry }) {
424
454
  const [copied, setCopied] = useState(false);
425
455
  const url = entry?.url ?? null;
426
- function onCopy() {
427
- if (!url || typeof navigator === "undefined" || !navigator.clipboard) return;
428
- navigator.clipboard.writeText(toAbsolute(url)).then(() => {
456
+ async function onCopy() {
457
+ if (!url || typeof window === "undefined") return;
458
+ const text = toAbsolute(url);
459
+ let ok = false;
460
+ if (typeof navigator !== "undefined" && navigator.clipboard) {
461
+ try {
462
+ await navigator.clipboard.writeText(text);
463
+ ok = true;
464
+ } catch {
465
+ ok = false;
466
+ }
467
+ }
468
+ if (!ok) {
469
+ try {
470
+ const ta = document.createElement("textarea");
471
+ ta.value = text;
472
+ ta.setAttribute("readonly", "");
473
+ ta.style.position = "fixed";
474
+ ta.style.top = "0";
475
+ ta.style.left = "0";
476
+ ta.style.opacity = "0";
477
+ document.body.appendChild(ta);
478
+ ta.focus();
479
+ ta.select();
480
+ ok = document.execCommand("copy");
481
+ document.body.removeChild(ta);
482
+ } catch {
483
+ ok = false;
484
+ }
485
+ }
486
+ if (ok) {
429
487
  setCopied(true);
430
- window.setTimeout(() => setCopied(false), 1200);
431
- });
488
+ window.setTimeout(() => setCopied(false), 1600);
489
+ }
432
490
  }
433
491
  const disabled = !url;
434
492
  const downloadName = entry?.filename ?? lastSegment(url ?? "");
@@ -477,12 +535,15 @@ function UrlRow({ label, entry }) {
477
535
  type: "button",
478
536
  onClick: onCopy,
479
537
  disabled,
480
- title: "Copy URL",
538
+ title: copied ? "URL copied" : "Copy URL",
539
+ "aria-live": "polite",
481
540
  style: {
482
541
  ...copyButtonStyle,
542
+ background: copied ? "var(--md-primary)" : copyButtonStyle.background,
543
+ color: copied ? "var(--md-on-primary)" : copyButtonStyle.color,
483
544
  cursor: disabled ? "not-allowed" : "pointer"
484
545
  },
485
- children: copied ? "Copied" : "Copy"
546
+ children: copied ? "\u2713 Copied" : "Copy"
486
547
  }
487
548
  )
488
549
  ]
@@ -621,7 +682,11 @@ var cardStyle = {
621
682
  border: "1px solid var(--md-outline-variant)",
622
683
  borderRadius: "0.85rem",
623
684
  padding: "1.25rem",
624
- background: "var(--md-surface-container-low)"
685
+ background: "var(--md-surface-container-low)",
686
+ // Grid items default to min-width:auto (won't shrink below content min-content),
687
+ // so the URL row's truncating <a> can't shrink and the row overflows the card.
688
+ // minWidth:0 lets the card shrink and the ellipsis do its job.
689
+ minWidth: 0
625
690
  };
626
691
  var eyebrowStyle = {
627
692
  fontFamily: "var(--bs-mono, ui-monospace, monospace)",
@@ -747,7 +812,7 @@ function IconsSection({ staticLogo, icons }) {
747
812
  gap: "1.5rem"
748
813
  },
749
814
  children: [
750
- staticLogo ? /* @__PURE__ */ jsx(Tile, { label: "logo", children: staticLogo }) : null,
815
+ staticLogo && items.length === 0 ? /* @__PURE__ */ jsx(Tile, { label: "logo", children: staticLogo }) : null,
751
816
  items.map((it, i) => /* @__PURE__ */ jsx(Tile, { label: it.label, children: it.node }, it.label ?? `icon-${i}`))
752
817
  ]
753
818
  }
@@ -890,128 +955,13 @@ var eyebrow4 = {
890
955
  color: "var(--md-primary)",
891
956
  margin: 0
892
957
  };
893
- var PRIMITIVES = [
894
- ["Sweep", "Wipe a highlight across a mark"],
895
- ["Drift", "Gentle idle float"],
896
- ["PulseLoop", "Scale + fade breathing"],
897
- ["RingDraw", "Stroke a ring into place"],
898
- ["Wobble", "Playful rotate-settle"],
899
- ["AppearGrow", "Pop in from nothing"],
900
- ["Sequence", "Compose steps, persist + loop"],
901
- ["Strikethrough", "Draw a line through"]
902
- ];
903
- function MotionPlaygroundSection({
904
- animatedLogo
958
+ function OverviewSection({
959
+ config,
960
+ lockup
905
961
  }) {
906
962
  return /* @__PURE__ */ jsxs("section", { children: [
907
- /* @__PURE__ */ jsxs("header", { children: [
908
- /* @__PURE__ */ jsx("p", { style: eyebrow4, children: "Motion" }),
909
- /* @__PURE__ */ jsx(
910
- "h2",
911
- {
912
- style: {
913
- fontSize: "clamp(1.5rem, 3vw, 2.25rem)",
914
- letterSpacing: "-0.02em",
915
- margin: "0.4rem 0 0",
916
- fontWeight: 600,
917
- color: "var(--md-on-surface)"
918
- },
919
- children: "Loading."
920
- }
921
- ),
922
- /* @__PURE__ */ jsxs(
923
- "p",
924
- {
925
- style: { maxWidth: "56ch", color: "var(--md-on-surface-variant)", marginTop: "0.75rem" },
926
- children: [
927
- "The brand mark as a loading state. Pass your own animated mark via",
928
- " ",
929
- /* @__PURE__ */ jsx("code", { style: { fontFamily: "var(--bs-mono)" }, children: "animatedLogo" }),
930
- "; otherwise a neutral spinner stands in."
931
- ]
932
- }
933
- )
934
- ] }),
935
- /* @__PURE__ */ jsx(
936
- "div",
937
- {
938
- style: {
939
- marginTop: "2rem",
940
- display: "flex",
941
- justifyContent: "center",
942
- padding: "3rem",
943
- borderRadius: "0.75rem",
944
- background: "var(--md-surface-container)",
945
- border: "1px solid var(--md-outline-variant)",
946
- color: "var(--md-primary)"
947
- },
948
- children: animatedLogo ?? /* @__PURE__ */ jsx(SpinnerLoadingMark, { size: 220, foreground: "var(--md-primary)" })
949
- }
950
- ),
951
- /* @__PURE__ */ jsxs("div", { style: { marginTop: "2.5rem" }, children: [
952
- /* @__PURE__ */ jsx("p", { style: { ...eyebrow4, fontSize: "0.7rem", marginBottom: "1rem" }, children: "Motion primitives" }),
953
- /* @__PURE__ */ jsx(
954
- "div",
955
- {
956
- style: {
957
- display: "grid",
958
- gap: "0.6rem",
959
- gridTemplateColumns: "repeat(auto-fill, minmax(220px, 1fr))"
960
- },
961
- children: PRIMITIVES.map(([name, desc]) => /* @__PURE__ */ jsxs(
962
- "div",
963
- {
964
- style: {
965
- padding: "0.9rem 1.1rem",
966
- borderRadius: "0.6rem",
967
- border: "1px solid var(--md-outline-variant)",
968
- background: "var(--md-surface-container-low)"
969
- },
970
- children: [
971
- /* @__PURE__ */ jsx(
972
- "p",
973
- {
974
- style: {
975
- margin: 0,
976
- fontFamily: "var(--bs-mono)",
977
- fontSize: "0.82rem",
978
- color: "var(--md-on-surface)"
979
- },
980
- children: name
981
- }
982
- ),
983
- /* @__PURE__ */ jsx(
984
- "p",
985
- {
986
- style: {
987
- margin: "0.3rem 0 0",
988
- fontSize: "0.8rem",
989
- color: "var(--md-on-surface-variant)"
990
- },
991
- children: desc
992
- }
993
- )
994
- ]
995
- },
996
- name
997
- ))
998
- }
999
- )
1000
- ] })
1001
- ] });
1002
- }
1003
- var eyebrow5 = {
1004
- fontFamily: "var(--bs-mono)",
1005
- fontSize: "0.72rem",
1006
- letterSpacing: "0.18em",
1007
- textTransform: "uppercase",
1008
- color: "var(--md-primary)",
1009
- margin: 0
1010
- };
1011
- function OverviewSection({ config }) {
1012
- return /* @__PURE__ */ jsxs("section", { children: [
1013
- /* @__PURE__ */ jsx("p", { style: eyebrow5, children: "Brand kit" }),
1014
- /* @__PURE__ */ jsxs(
963
+ /* @__PURE__ */ jsx("p", { style: eyebrow4, children: "Brand kit" }),
964
+ lockup ? /* @__PURE__ */ jsx("div", { style: { margin: "1.25rem 0 0", maxWidth: "22rem" }, children: lockup }) : /* @__PURE__ */ jsxs(
1015
965
  "h1",
1016
966
  {
1017
967
  style: {
@@ -1040,7 +990,7 @@ function OverviewSection({ config }) {
1040
990
  }
1041
991
  ) : null,
1042
992
  config.voice && config.voice.length > 0 ? /* @__PURE__ */ jsxs("div", { style: { marginTop: "2.5rem" }, children: [
1043
- /* @__PURE__ */ jsx("p", { style: { ...eyebrow5, fontSize: "0.7rem", letterSpacing: "0.16em" }, children: "Voice" }),
993
+ /* @__PURE__ */ jsx("p", { style: { ...eyebrow4, fontSize: "0.7rem", letterSpacing: "0.16em" }, children: "Voice" }),
1044
994
  /* @__PURE__ */ jsx(
1045
995
  "ul",
1046
996
  {
@@ -1222,7 +1172,6 @@ function resolveSection(route) {
1222
1172
  case BrandStudioSection.Colors:
1223
1173
  case BrandStudioSection.Typography:
1224
1174
  case BrandStudioSection.Icons:
1225
- case BrandStudioSection.Motion:
1226
1175
  case BrandStudioSection.Download:
1227
1176
  return head;
1228
1177
  default:
@@ -1236,7 +1185,9 @@ function BrandStudio({
1236
1185
  staticLogo,
1237
1186
  staticLogoDark,
1238
1187
  animatedLogo,
1239
- icons
1188
+ icons,
1189
+ wordmark,
1190
+ wordmarkDark
1240
1191
  }) {
1241
1192
  const section = resolveSection(route);
1242
1193
  const scheme = config.scheme ?? generateScheme(config.color);
@@ -1253,11 +1204,13 @@ function BrandStudio({
1253
1204
  {
1254
1205
  href,
1255
1206
  style: {
1207
+ display: "inline-block",
1256
1208
  color: isActive ? "var(--md-primary)" : "var(--md-on-surface-variant)",
1257
1209
  textDecoration: "none",
1258
1210
  fontWeight: isActive ? 600 : 400,
1259
1211
  borderBottom: isActive ? "2px solid var(--md-primary)" : "2px solid transparent",
1260
- paddingBottom: "0.4rem"
1212
+ paddingBottom: "0.6rem",
1213
+ marginBottom: "-1px"
1261
1214
  },
1262
1215
  children
1263
1216
  }
@@ -1281,18 +1234,19 @@ function BrandStudio({
1281
1234
  /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: cssText } }),
1282
1235
  /* @__PURE__ */ jsx(Navigation, { current: section, basePath, renderLink: link }),
1283
1236
  /* @__PURE__ */ jsxs("div", { style: { marginTop: "3rem" }, children: [
1284
- section === BrandStudioSection.Overview && /* @__PURE__ */ jsx(OverviewSection, { config }),
1237
+ section === BrandStudioSection.Overview && /* @__PURE__ */ jsx(OverviewSection, { config, lockup: wordmark }),
1285
1238
  section === BrandStudioSection.Logo && /* @__PURE__ */ jsx(LogoSection, { config, staticLogo, animatedLogo }),
1286
1239
  section === BrandStudioSection.Colors && /* @__PURE__ */ jsx(ColorsSection, { scheme }),
1287
1240
  section === BrandStudioSection.Typography && /* @__PURE__ */ jsx(TypographySection, { config }),
1288
1241
  section === BrandStudioSection.Icons && /* @__PURE__ */ jsx(IconsSection, { staticLogo, icons }),
1289
- section === BrandStudioSection.Motion && /* @__PURE__ */ jsx(MotionPlaygroundSection, { animatedLogo, staticLogo }),
1290
1242
  section === BrandStudioSection.Download && /* @__PURE__ */ jsx(
1291
1243
  DownloadSection,
1292
1244
  {
1293
1245
  config,
1294
1246
  staticLogo,
1295
- staticLogoDark
1247
+ staticLogoDark,
1248
+ wordmark,
1249
+ wordmarkDark
1296
1250
  }
1297
1251
  )
1298
1252
  ] }),
@@ -1316,7 +1270,6 @@ function BrandStudio({
1316
1270
  "Powered by ",
1317
1271
  /* @__PURE__ */ jsx("span", { style: { color: "var(--md-primary)" }, children: "@021.is/brand-studio" })
1318
1272
  ] }),
1319
- config.operator ? /* @__PURE__ */ jsx("span", { children: config.operator }) : null,
1320
1273
  config.domain ? /* @__PURE__ */ jsx("span", { children: config.domain }) : null
1321
1274
  ]
1322
1275
  }
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { B as BrandConfig, a as BrandDownload, b as BrandDownloads, c as BrandSt
5
5
  export { B as BrandScheme, C as ColorScheme, a as ColorSpec, H as Hex, R as ROLE, b as ROLE_GROUPS, c as ROLE_ORDER, d as Role, S as SchemeVariant, g as generateScheme } from './generateScheme-BDDcIzA3.js';
6
6
  export { cssVarName, schemeToCssText, schemeVars } from './color/index.js';
7
7
  export { C as ContrastTier, c as contrastBadge, a as contrastRatio, r as relativeLuminance } from './contrast-TVW3pzdd.js';
8
- export { a as BrandStudio, b as BrandStudioProps } from './BrandStudio-D1QR4hIC.js';
8
+ export { a as BrandStudio, b as BrandStudioProps } from './BrandStudio-ksHBhiX3.js';
9
9
  export { STANDARD_ICON_SIZES, STANDARD_LOGO_SIZES, StandardDownloadsInput, buildStandardDownloads, defineBrand, slugify } from './define/index.js';
10
10
  import 'react/jsx-runtime';
11
11
  import 'react';
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  export { Disc, Ring, Squircle } from './chunk-LJ4HZCAP.js';
3
3
  export { AppearGrow, Drift, PulseLoop, RingDraw, Sequence, SequenceStep, Strikethrough, Sweep, Wobble } from './chunk-7325RQRP.js';
4
4
  export { LoadingMark, PulseLoadingMark, RingLoadingMark } from './chunk-F4CFQDS7.js';
5
- export { BrandStudio } from './chunk-JGLPUAM6.js';
5
+ export { BrandStudio } from './chunk-H3LCFXCK.js';
6
6
  export { SpinnerLoadingMark } from './chunk-YDZA26YU.js';
7
7
  export { STANDARD_ICON_SIZES, STANDARD_LOGO_SIZES, buildStandardDownloads, defineBrand, slugify } from './chunk-6J2NFZLN.js';
8
8
  export { BrandStudioSection, DownloadFormat, DownloadKind, DownloadMode, LoadingVariant, MotionState } from './chunk-MDTU2JR5.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@021.is/brand-studio",
3
- "version": "0.6.0",
4
- "description": "Generic MD3 brand-kit toolkit: seed full light + dark role set, composable SVG shapes + motion + loading marks, mountable <BrandStudio> /brand page, mandatory icon + logo download-URL contract. Ships no brand content every app supplies its own logo, icons, and seed colour.",
3
+ "version": "0.6.7",
4
+ "description": "Generic MD3 brand-kit toolkit: seed \u2192 full light + dark role set, composable SVG shapes + motion + loading marks, mountable <BrandStudio> /brand page, mandatory icon + logo download-URL contract. Ships no brand content \u2014 every app supplies its own logo, icons, and seed colour.",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "name": "edvone",
@@ -30,7 +30,12 @@
30
30
  "private": false,
31
31
  "type": "module",
32
32
  "sideEffects": false,
33
- "files": ["dist", "LICENSE", "README.md", "AGENTS.md"],
33
+ "files": [
34
+ "dist",
35
+ "LICENSE",
36
+ "README.md",
37
+ "AGENTS.md"
38
+ ],
34
39
  "exports": {
35
40
  ".": {
36
41
  "types": "./dist/index.d.ts",