radiant-docs 0.1.37 → 0.1.39

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 (38) hide show
  1. package/package.json +1 -1
  2. package/template/astro.config.mjs +2 -0
  3. package/template/src/components/Footer.astro +1 -1
  4. package/template/src/components/Header.astro +8 -8
  5. package/template/src/components/OpenApiPage.astro +18 -18
  6. package/template/src/components/Search.astro +18 -18
  7. package/template/src/components/Sidebar.astro +4 -2
  8. package/template/src/components/SidebarDropdown.astro +82 -79
  9. package/template/src/components/SidebarSegmented.astro +5 -5
  10. package/template/src/components/TableOfContents.astro +24 -15
  11. package/template/src/components/ThemeSwitcher.astro +15 -8
  12. package/template/src/components/chat/AskAiWidget.tsx +4 -3
  13. package/template/src/components/endpoint/PlaygroundBar.astro +3 -3
  14. package/template/src/components/endpoint/PlaygroundButton.astro +2 -2
  15. package/template/src/components/endpoint/PlaygroundField.astro +53 -53
  16. package/template/src/components/endpoint/PlaygroundForm.astro +38 -22
  17. package/template/src/components/endpoint/RequestSnippets.astro +54 -21
  18. package/template/src/components/endpoint/ResponseDisplay.astro +24 -24
  19. package/template/src/components/endpoint/ResponseFieldTree.astro +12 -12
  20. package/template/src/components/endpoint/ResponseFields.astro +19 -19
  21. package/template/src/components/endpoint/ResponseSnippets.astro +66 -29
  22. package/template/src/components/ui/CodeTabEdge.astro +6 -4
  23. package/template/src/components/ui/Field.astro +7 -7
  24. package/template/src/components/ui/demo/Demo.astro +1 -1
  25. package/template/src/components/user/Accordion.astro +3 -3
  26. package/template/src/components/user/Callout.astro +8 -8
  27. package/template/src/components/user/CodeBlock.astro +63 -25
  28. package/template/src/components/user/CodeGroup.astro +259 -22
  29. package/template/src/components/user/ComponentPreviewBlock.astro +36 -10
  30. package/template/src/components/user/Image.astro +2 -2
  31. package/template/src/components/user/Step.astro +4 -4
  32. package/template/src/components/user/Tab.astro +1 -1
  33. package/template/src/components/user/Tabs.astro +142 -42
  34. package/template/src/layouts/Layout.astro +1 -1
  35. package/template/src/lib/code/code-block.ts +150 -15
  36. package/template/src/lib/mdx/remark-resolve-internal-links.ts +639 -0
  37. package/template/src/pages/404.astro +44 -0
  38. package/template/src/styles/global.css +51 -19
@@ -33,15 +33,15 @@ for (const heading of headings) {
33
33
  aria-label="Table of Contents"
34
34
  data-slugs={JSON.stringify(headings.map((h) => h.slug))}
35
35
  >
36
- <div class="text-sm font-medium mb-3">On this page</div>
37
- <div class="flex text-neutral-600/90">
36
+ <div class="text-sm font-medium mb-3 text-neutral-900 dark:text-neutral-100">On this page</div>
37
+ <div class="flex text-neutral-600/90 dark:text-neutral-300/90">
38
38
  <svg viewBox="0 0 22 100" width="22px" height="100" class="shrink-0">
39
39
  <path
40
40
  id="toc-bg-path"
41
41
  d=""
42
42
  stroke-width="1.2"
43
43
  vector-effect="non-scaling-stroke"
44
- class="stroke-neutral-200"
44
+ class="stroke-neutral-200 dark:stroke-neutral-700/70"
45
45
  fill="none"
46
46
  stroke-linecap="round"
47
47
  stroke-linejoin="round"></path>
@@ -50,7 +50,7 @@ for (const heading of headings) {
50
50
  d=""
51
51
  stroke-width="1.4"
52
52
  vector-effect="non-scaling-stroke"
53
- class="stroke-blue-700/60 transition-[stroke-dasharray] duration-200"
53
+ class="stroke-neutral-700/70 dark:stroke-neutral-300/80 transition-[stroke-dasharray] duration-200"
54
54
  fill="none"
55
55
  stroke-linecap="round"
56
56
  stroke-linejoin="round"></path>
@@ -63,7 +63,7 @@ for (const heading of headings) {
63
63
  {heading.text && (
64
64
  <a
65
65
  href={`#${heading.slug}`}
66
- class="block transition duration-200 hover:text-neutral-900"
66
+ class="block transition duration-200 hover:text-neutral-900 dark:hover:text-neutral-100"
67
67
  data-slug={heading.slug}
68
68
  >
69
69
  {heading.text}
@@ -75,7 +75,7 @@ for (const heading of headings) {
75
75
  <li class:list={["", heading.text ? "mt-3" : "mt-0"]}>
76
76
  <a
77
77
  href={`#${subHeading.slug}`}
78
- class="block transition duration-200 hover:text-neutral-900"
78
+ class="block transition duration-200 hover:text-neutral-900 dark:hover:text-neutral-100"
79
79
  data-slug={subHeading.slug}
80
80
  >
81
81
  {subHeading.text}
@@ -239,10 +239,11 @@ for (const heading of headings) {
239
239
  );
240
240
  circle.setAttribute("cx", String(item.x));
241
241
  circle.setAttribute("cy", String(midY));
242
- circle.setAttribute("r", "2.5");
242
+ circle.setAttribute("r", "2.25");
243
243
  circle.setAttribute("fill", "currentColor");
244
244
  circle.classList.add(
245
245
  "fill-neutral-300",
246
+ "dark:fill-neutral-600",
246
247
  "transition-all",
247
248
  "duration-200"
248
249
  );
@@ -328,13 +329,21 @@ for (const heading of headings) {
328
329
  circles?.forEach((circle) => {
329
330
  const slug = (circle as SVGCircleElement).dataset.slug;
330
331
  if (slug && visibleSlugs.has(slug)) {
331
- circle.classList.remove("fill-neutral-300");
332
- circle.classList.add("fill-blue-700", "delay-100");
333
- circle.setAttribute("r", "3");
332
+ circle.classList.remove("fill-neutral-300", "dark:fill-neutral-600");
333
+ circle.classList.add(
334
+ "fill-neutral-700",
335
+ "dark:fill-neutral-200",
336
+ "delay-100"
337
+ );
338
+ circle.setAttribute("r", "2.75");
334
339
  } else {
335
- circle.classList.remove("fill-blue-700", "delay-100");
336
- circle.classList.add("fill-neutral-300");
337
- circle.setAttribute("r", "2.5");
340
+ circle.classList.remove(
341
+ "fill-neutral-700",
342
+ "dark:fill-neutral-200",
343
+ "delay-100"
344
+ );
345
+ circle.classList.add("fill-neutral-300", "dark:fill-neutral-600");
346
+ circle.setAttribute("r", "2.25");
338
347
  }
339
348
  });
340
349
 
@@ -343,9 +352,9 @@ for (const heading of headings) {
343
352
  tocLinks?.forEach((link) => {
344
353
  const slug = (link as HTMLAnchorElement).dataset.slug;
345
354
  if (slug && visibleSlugs.has(slug)) {
346
- link.classList.add("text-neutral-900");
355
+ link.classList.add("text-neutral-900", "dark:text-neutral-100");
347
356
  } else {
348
- link.classList.remove("text-neutral-900");
357
+ link.classList.remove("text-neutral-900", "dark:text-neutral-100");
349
358
  }
350
359
  });
351
360
  }
@@ -9,6 +9,7 @@ import { Icon } from "astro-icon/components";
9
9
  return mode === 'light' || mode === 'dark' ? mode : null;
10
10
  })(),
11
11
  theme: localStorage.getItem('theme') || 'system',
12
+ themeSwitchFrameId: null,
12
13
  init() {
13
14
  if (this.forcedTheme) {
14
15
  this.theme = this.forcedTheme;
@@ -43,16 +44,22 @@ import { Icon } from "astro-icon/components";
43
44
  });
44
45
  },
45
46
  updateDOM() {
46
- document.documentElement.classList.add('is-switching-theme')
47
+ const root = document.documentElement;
48
+ root.classList.add('is-switching-theme');
47
49
  const activeTheme = this.forcedTheme || this.theme;
48
50
  const isDark = activeTheme === 'dark' ||
49
51
  (activeTheme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches);
50
52
 
51
- document.documentElement.classList.toggle('dark', isDark);
52
- document.documentElement.dataset.theme = isDark ? 'dark' : 'light';
53
- setTimeout(() => {
54
- document.documentElement.classList.remove('is-switching-theme');
55
- }, 200);
53
+ root.classList.toggle('dark', isDark);
54
+ root.dataset.theme = isDark ? 'dark' : 'light';
55
+
56
+ if (this.themeSwitchFrameId !== null) {
57
+ cancelAnimationFrame(this.themeSwitchFrameId);
58
+ }
59
+ this.themeSwitchFrameId = requestAnimationFrame(() => {
60
+ root.classList.remove('is-switching-theme');
61
+ this.themeSwitchFrameId = null;
62
+ });
56
63
  },
57
64
  markerStyle: { left: null, width: null },
58
65
  updateMarker() {
@@ -67,10 +74,10 @@ import { Icon } from "astro-icon/components";
67
74
  }
68
75
  }
69
76
  }"
70
- class="relative flex gap-[3px] p-px bg-neutral-100 dark:bg-neutral-800 rounded-full w-fit inset-shadow-sm inset-shadow-neutral-100/80 text-neutral-500"
77
+ class="relative flex gap-[3px] p-px bg-background-dark dark:bg-neutral-800/40 rounded-full w-fit text-neutral-500"
71
78
  >
72
79
  <div
73
- class="anchor-pill absolute top-px bottom-px bg-white dark:bg-neutral-700 rounded-full shadow-xs border-[0.5px] border-neutral-200/80 ease-out z-0 flex items-center justify-center animate-[scaleIn_0.5s_ease-out]"
80
+ class="anchor-pill absolute top-px dark:top-0.5 bottom-px dark:bottom-0.5 bg-white dark:bg-neutral-800 rounded-full shadow-xs border-[0.5px] border-neutral-200/80 dark:border-neutral-700/50 ease-out z-0 flex items-center justify-center animate-[scaleIn_0.5s_ease-out]"
74
81
  style="left: 3px;"
75
82
  :style="markerStyle.width ? `left: ${markerStyle.left}; width: ${markerStyle.width}` : ''"
76
83
  >
@@ -1707,10 +1707,10 @@ export default function AskAiWidget({
1707
1707
  }
1708
1708
  `}</style>
1709
1709
  {!isOpen ? (
1710
- <div className="fixed bottom-5 right-6 size-12 z-40 bg-white rounded-full hover:scale-105 transition duration-300 ease-in-out">
1710
+ <div className="fixed bottom-5 right-5 size-12 z-40 bg-background rounded-full hover:scale-105 transition duration-300 ease-in-out">
1711
1711
  <button
1712
1712
  type="button"
1713
- className="w-full h-full inline-flex items-center justify-center gap-2 rounded-full bg-linear-to-b from-neutral-900/85 to-neutral-900 shadow-xl dark:bg-white cursor-pointer"
1713
+ className="w-full h-full inline-flex items-center justify-center gap-2 rounded-full bg-linear-to-b from-neutral-900/85 to-neutral-900 dark:from-neutral-100 dark:to-neutral-200 shadow-xl dark:shadow-white/5 cursor-pointer"
1714
1714
  onClick={() => handleOpenChange(true)}
1715
1715
  data-pagefind-ignore
1716
1716
  >
@@ -1729,6 +1729,7 @@ export default function AskAiWidget({
1729
1729
  open={isOpen}
1730
1730
  onOpenChange={handleOpenChange}
1731
1731
  disablePreventScroll={true}
1732
+ repositionInputs={false}
1732
1733
  >
1733
1734
  <Drawer.Portal>
1734
1735
  <Drawer.Overlay className="fixed inset-0 z-50 bg-black/40" />
@@ -1743,7 +1744,7 @@ export default function AskAiWidget({
1743
1744
  </Drawer.Root>
1744
1745
  ) : isOpen ? (
1745
1746
  <div
1746
- className="fixed bottom-4 right-5 z-50"
1747
+ className="fixed bottom-4 right-4 z-50"
1747
1748
  data-pagefind-ignore
1748
1749
  onWheelCapture={handleDesktopWheelCapture}
1749
1750
  >
@@ -12,7 +12,7 @@ const { route, serverUrl } = Astro.props;
12
12
  ---
13
13
 
14
14
  <div
15
- class="min-w-0 flex-1 flex items-center p-1 border bg-white rounded-xl shadow-xs overflow-hidden"
15
+ class="min-w-0 flex-1 flex items-center p-1 border border-neutral-200 bg-white rounded-xl shadow-xs overflow-hidden dark:border-neutral-800 dark:bg-(--rd-code-surface)"
16
16
  >
17
17
  <span
18
18
  class:list={[
@@ -23,7 +23,7 @@ const { route, serverUrl } = Astro.props;
23
23
  {route.openApiMethod}
24
24
  </span>
25
25
  <code
26
- class="group flex-1 mx-2 h-[30px] flex items-center text-[13px] text-neutral-600 min-w-0 relative cursor-pointer"
26
+ class="group flex-1 mx-2 h-[30px] flex items-center text-[13px] text-neutral-600 dark:text-neutral-300 min-w-0 relative cursor-pointer"
27
27
  @click="copyPath()"
28
28
  x-data=`{
29
29
  copied: false,
@@ -45,7 +45,7 @@ const { route, serverUrl } = Astro.props;
45
45
  {route.openApiPath}
46
46
  </span>
47
47
  <div
48
- class="absolute right-0 top-1/2 -translate-y-1/2 flex items-center gap-1 text-[12px] px-1.5 py-px bg-white border border-neutral-200 rounded-md duration-200 opacity-0 scale-75 group-hover:scale-100 group-hover:opacity-100 group-hover:duration-200 group-hover:ease-out group-hover:delay-75"
48
+ class="absolute right-0 top-1/2 -translate-y-1/2 flex items-center gap-1 text-[12px] px-1.5 py-px bg-white border border-neutral-200 rounded-md duration-200 opacity-0 scale-75 group-hover:scale-100 group-hover:opacity-100 group-hover:duration-200 group-hover:ease-out group-hover:delay-75 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-300"
49
49
  >
50
50
  <Icon
51
51
  name="lucide:copy"
@@ -38,7 +38,7 @@ import { Icon } from "astro-icon/components";
38
38
  >
39
39
  <button
40
40
  x-on:click="open = true"
41
- class="font-[350] m-px flex h-8 items-center gap-2 rounded-lg [corner-shape:superellipse(1.2)] bg-linear-to-b from-neutral-900/85 to-neutral-900 px-3 text-[13px] text-white shadow-sm dark:bg-white dark:text-neutral-900 transition-all duration-200 whitespace-nowrap cursor-pointer"
41
+ class="font-[350] dark:font-[450] flex h-8 items-center gap-2 rounded-lg [corner-shape:superellipse(1.2)] bg-linear-to-b from-neutral-900/85 to-neutral-900 dark:from-neutral-100 dark:to-neutral-200 px-3 text-[13px] text-white dark:text-neutral-950 shadow-sm transition-all duration-200 whitespace-nowrap cursor-pointer"
42
42
  >
43
43
  <Icon class="-ml-px size-3.5" name="lucide:square-mouse-pointer" />
44
44
  Try it
@@ -71,7 +71,7 @@ import { Icon } from "astro-icon/components";
71
71
  x-on:click.stop
72
72
  x-on:pointerdown.stop="backdropInteractionStarted = false"
73
73
  x-trap.noscroll.inert="open"
74
- class="relative flex max-h-[calc(100dvh-4rem)] max-w-7xl w-full overflow-hidden rounded-xl bg-white p-4 sm:p-6 pb-0! shadow-lg"
74
+ class="relative flex max-h-[calc(100dvh-4rem)] max-w-7xl w-full overflow-hidden rounded-xl bg-white p-4 sm:p-6 pb-0! shadow-lg dark:bg-neutral-900"
75
75
  >
76
76
  <slot />
77
77
  </div>
@@ -644,19 +644,19 @@ const layoutClass = isObjectLikeField
644
644
  x-for={`(mapKey, mapIndex) in getMapEntryKeys()`}
645
645
  :key={`${fieldNameKey} + '-map-' + mapKey + '-' + mapIndex`}
646
646
  >
647
- <div class="rounded-lg border border-neutral-200 bg-neutral-50/50 p-2.5">
647
+ <div class="rounded-lg border border-neutral-200 bg-neutral-50/50 p-2.5 dark:border-neutral-800 dark:bg-neutral-900/50">
648
648
  <div class="mb-2 flex items-center gap-2">
649
649
  <input
650
650
  type="text"
651
651
  :value="mapKey"
652
652
  @change="renameMapKey(mapKey, $event.target.value)"
653
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white"
653
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:placeholder:text-neutral-500 dark:focus:border-neutral-600"
654
654
  placeholder="Property key"
655
655
  />
656
656
  <button
657
657
  type="button"
658
658
  @click="removeMapEntry(mapKey)"
659
- class="h-[31px] px-2 rounded-md border border-neutral-200 text-neutral-500 hover:text-neutral-700 hover:border-neutral-300 hover:bg-white transition-colors duration-200 cursor-pointer"
659
+ class="h-[31px] px-2 rounded-md border border-neutral-200 text-neutral-500 hover:text-neutral-700 hover:border-neutral-300 hover:bg-white transition-colors duration-200 cursor-pointer dark:border-neutral-700 dark:text-neutral-400 dark:hover:border-neutral-600 dark:hover:bg-neutral-800/70 dark:hover:text-neutral-200"
660
660
  aria-label={`Remove ${field.name} key`}
661
661
  >
662
662
  <Icon class="size-4" name="lucide:x" />
@@ -668,7 +668,7 @@ const layoutClass = isObjectLikeField
668
668
  rows="3"
669
669
  :value="getMapJsonValue(mapKey)"
670
670
  @input="setMapJsonValue(mapKey, $event.target.value)"
671
- class="w-full px-3 py-2 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white font-mono"
671
+ class="w-full px-3 py-2 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white font-mono dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:placeholder:text-neutral-500 dark:focus:border-neutral-600"
672
672
  placeholder="JSON value"
673
673
  />
674
674
  ) : field.enum && field.enum.length > 0 ? (
@@ -676,8 +676,8 @@ const layoutClass = isObjectLikeField
676
676
  <select
677
677
  :value="getMapValue(mapKey)"
678
678
  @change="setMapValue(mapKey, $event.target.value, $event.target)"
679
- :class="getMapValue(mapKey) ? 'text-neutral-700' : 'text-neutral-400'"
680
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none"
679
+ :class="getMapValue(mapKey) ? 'text-neutral-700 dark:text-neutral-200' : 'text-neutral-400 dark:text-neutral-500'"
680
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none dark:border-neutral-700 dark:bg-neutral-900 dark:focus:border-neutral-600"
681
681
  >
682
682
  <option value="" disabled hidden>Select value</option>
683
683
  <option value="__clear__">Clear selection</option>
@@ -695,8 +695,8 @@ const layoutClass = isObjectLikeField
695
695
  <select
696
696
  :value="getMapBooleanValue(mapKey)"
697
697
  @change="setMapBooleanValue(mapKey, $event.target.value)"
698
- :class="getMapBooleanValue(mapKey) ? 'text-neutral-700' : 'text-neutral-400'"
699
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none"
698
+ :class="getMapBooleanValue(mapKey) ? 'text-neutral-700 dark:text-neutral-200' : 'text-neutral-400 dark:text-neutral-500'"
699
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none dark:border-neutral-700 dark:bg-neutral-900 dark:focus:border-neutral-600"
700
700
  >
701
701
  <option value="" disabled hidden>Select value</option>
702
702
  <option value="__clear__">Clear selection</option>
@@ -719,7 +719,7 @@ const layoutClass = isObjectLikeField
719
719
  step={numericInputStep}
720
720
  minlength={textInputMinLength}
721
721
  maxlength={textInputMaxLength}
722
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white"
722
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:placeholder:text-neutral-500 dark:focus:border-neutral-600"
723
723
  placeholder="Property value"
724
724
  />
725
725
  )
@@ -729,7 +729,7 @@ const layoutClass = isObjectLikeField
729
729
  <button
730
730
  type="button"
731
731
  @click="addMapEntry()"
732
- class="inline-flex items-center gap-1 text-xs font-medium text-neutral-700 hover:text-neutral-900 cursor-pointer transition-colors duration-200"
732
+ class="inline-flex items-center gap-1 text-xs font-medium text-neutral-700 hover:text-neutral-900 cursor-pointer transition-colors duration-200 dark:text-neutral-300 dark:hover:text-neutral-100"
733
733
  >
734
734
  <Icon class="size-3.5" name="lucide:plus" />
735
735
  Add property
@@ -743,17 +743,17 @@ const layoutClass = isObjectLikeField
743
743
  :key={`${fieldNameKey} + '-item-' + index`}
744
744
  >
745
745
  <div
746
- class="rounded-lg border border-neutral-200 bg-neutral-50/50 p-2.5"
746
+ class="rounded-lg border border-neutral-200 bg-neutral-50/50 p-2.5 dark:border-neutral-800 dark:bg-neutral-900/50"
747
747
  x-init="ensureArrayObjectItem(index)"
748
748
  >
749
749
  <div class="mb-2 flex items-center justify-between">
750
- <span class="text-xs font-medium text-neutral-600">
750
+ <span class="text-xs font-medium text-neutral-600 dark:text-neutral-400">
751
751
  Item <span x-text="index + 1" />
752
752
  </span>
753
753
  <button
754
754
  type="button"
755
755
  @click="removeArrayObjectValue(index)"
756
- class="inline-flex h-6 items-center rounded-md border border-neutral-200 px-2 text-[11px] font-medium text-neutral-600 hover:border-neutral-300 hover:bg-white hover:text-neutral-700 transition-colors duration-200 cursor-pointer"
756
+ class="inline-flex h-6 items-center rounded-md border border-neutral-200 px-2 text-[11px] font-medium text-neutral-600 hover:border-neutral-300 hover:bg-white hover:text-neutral-700 transition-colors duration-200 cursor-pointer dark:border-neutral-700 dark:text-neutral-400 dark:hover:border-neutral-600 dark:hover:bg-neutral-800/70 dark:hover:text-neutral-200"
757
757
  aria-label={`Remove ${field.name} item`}
758
758
  >
759
759
  Remove
@@ -761,7 +761,7 @@ const layoutClass = isObjectLikeField
761
761
  </div>
762
762
  <div class="space-y-3">
763
763
  {field.nested?.map((nestedField) => (
764
- <div class="border-b border-b-neutral-100 last:border-none pb-3 last:pb-0">
764
+ <div class="border-b border-b-neutral-100 dark:border-b-neutral-800 last:border-none pb-3 last:pb-0">
765
765
  <Astro.self
766
766
  field={nestedField}
767
767
  requestPart={requestPart}
@@ -774,19 +774,19 @@ const layoutClass = isObjectLikeField
774
774
  <div class:list={["space-y-2", hasNestedFields && "pt-1"]}>
775
775
  {hasOneOfVariants ? (
776
776
  <>
777
- <p class="text-xs text-neutral-500">
777
+ <p class="text-xs text-neutral-500 dark:text-neutral-400">
778
778
  Select one variant.
779
779
  </p>
780
- <div class="inline-flex max-w-full flex-wrap items-center gap-1 rounded-lg bg-neutral-100 p-1">
780
+ <div class="inline-flex max-w-full flex-wrap items-center gap-1 rounded-lg bg-neutral-100 p-1 dark:bg-neutral-900/60">
781
781
  {field.variants.map((variant, variantIndex) => (
782
782
  <button
783
783
  type="button"
784
784
  @click={`selectArrayItemVariant(index, ${variantIndex})`}
785
785
  :class={`{
786
- 'bg-white text-neutral-900 shadow-xs ring-1 ring-neutral-200': getSelectedArrayItemVariant(index) === ${variantIndex},
787
- 'text-neutral-600 hover:bg-neutral-50 hover:text-neutral-800': getSelectedArrayItemVariant(index) !== ${variantIndex}
786
+ 'bg-white text-neutral-900 shadow-xs ring-1 ring-neutral-200 dark:bg-(--rd-code-surface) dark:text-neutral-100 dark:ring-neutral-700/70': getSelectedArrayItemVariant(index) === ${variantIndex},
787
+ 'text-neutral-600 hover:bg-neutral-50 hover:text-neutral-800 dark:text-neutral-400 dark:hover:bg-neutral-800/70 dark:hover:text-neutral-200': getSelectedArrayItemVariant(index) !== ${variantIndex}
788
788
  }`}
789
- class="inline-flex h-7 items-center justify-center whitespace-nowrap rounded-md px-2.5 text-[11px] font-medium transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-300"
789
+ class="inline-flex h-7 items-center justify-center whitespace-nowrap rounded-md px-2.5 text-[11px] font-medium transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-300 dark:focus-visible:ring-neutral-700"
790
790
  >
791
791
  {variant.label}
792
792
  </button>
@@ -797,13 +797,13 @@ const layoutClass = isObjectLikeField
797
797
  x-show={`getSelectedArrayItemVariant(index) === ${variantIndex}`}
798
798
  x-cloak
799
799
  >
800
- <div class="rounded-md border border-neutral-200 bg-white p-2.5">
801
- <div class="mb-2 text-xs font-medium text-neutral-600">
800
+ <div class="rounded-md border border-neutral-200 bg-white p-2.5 dark:border-neutral-800 dark:bg-neutral-900/60">
801
+ <div class="mb-2 text-xs font-medium text-neutral-600 dark:text-neutral-400">
802
802
  {variant.label}
803
803
  </div>
804
804
  <div class="space-y-3">
805
805
  {variant.fields.map((variantField) => (
806
- <div class="border-b border-b-neutral-100 last:border-none pb-3 last:pb-0">
806
+ <div class="border-b border-b-neutral-100 dark:border-b-neutral-800 last:border-none pb-3 last:pb-0">
807
807
  <Astro.self
808
808
  field={variantField}
809
809
  requestPart={requestPart}
@@ -819,17 +819,17 @@ const layoutClass = isObjectLikeField
819
819
  </>
820
820
  ) : (
821
821
  <>
822
- <p class="text-xs text-neutral-500">
822
+ <p class="text-xs text-neutral-500 dark:text-neutral-400">
823
823
  One or more variants may apply.
824
824
  </p>
825
825
  {field.variants.map((variant) => (
826
- <div class="rounded-md border border-neutral-200 bg-white p-2.5">
827
- <div class="mb-2 text-xs font-medium text-neutral-600">
826
+ <div class="rounded-md border border-neutral-200 bg-white p-2.5 dark:border-neutral-800 dark:bg-neutral-900/60">
827
+ <div class="mb-2 text-xs font-medium text-neutral-600 dark:text-neutral-400">
828
828
  {variant.label}
829
829
  </div>
830
830
  <div class="space-y-3">
831
831
  {variant.fields.map((variantField) => (
832
- <div class="border-b border-b-neutral-100 last:border-none pb-3 last:pb-0">
832
+ <div class="border-b border-b-neutral-100 dark:border-b-neutral-800 last:border-none pb-3 last:pb-0">
833
833
  <Astro.self
834
834
  field={variantField}
835
835
  requestPart={requestPart}
@@ -851,7 +851,7 @@ const layoutClass = isObjectLikeField
851
851
  <button
852
852
  type="button"
853
853
  @click="addArrayObjectValue()"
854
- class="inline-flex items-center gap-1 text-xs font-medium text-neutral-700 hover:text-neutral-900 cursor-pointer transition-colors duration-200"
854
+ class="inline-flex items-center gap-1 text-xs font-medium text-neutral-700 hover:text-neutral-900 cursor-pointer transition-colors duration-200 dark:text-neutral-300 dark:hover:text-neutral-100"
855
855
  >
856
856
  <Icon class="size-3.5" name="lucide:plus" />
857
857
  Add item
@@ -869,8 +869,8 @@ const layoutClass = isObjectLikeField
869
869
  :value="value"
870
870
  @change={`setArrayValue(index, $event.target.value, $event.target)`}
871
871
  :required={`index === 0 && ${isRequiredField ? "true" : "false"}`}
872
- :class="value ? 'text-neutral-700' : 'text-neutral-400'"
873
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none"
872
+ :class="value ? 'text-neutral-700 dark:text-neutral-200' : 'text-neutral-400 dark:text-neutral-500'"
873
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none dark:border-neutral-700 dark:bg-neutral-900 dark:focus:border-neutral-600"
874
874
  >
875
875
  <option value="" disabled hidden>Select value</option>
876
876
  <option value="__clear__">Clear selection</option>
@@ -891,8 +891,8 @@ const layoutClass = isObjectLikeField
891
891
  :value="getArrayBooleanValue(index)"
892
892
  @change={`setArrayBooleanValue(index, $event.target.value)`}
893
893
  :required={`index === 0 && ${isRequiredField ? "true" : "false"}`}
894
- :class="getArrayBooleanValue(index) ? 'text-neutral-700' : 'text-neutral-400'"
895
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none"
894
+ :class="getArrayBooleanValue(index) ? 'text-neutral-700 dark:text-neutral-200' : 'text-neutral-400 dark:text-neutral-500'"
895
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none dark:border-neutral-700 dark:bg-neutral-900 dark:focus:border-neutral-600"
896
896
  >
897
897
  <option value="" disabled hidden>Select value</option>
898
898
  <option value="__clear__">Clear selection</option>
@@ -918,7 +918,7 @@ const layoutClass = isObjectLikeField
918
918
  step={numericInputStep}
919
919
  minlength={textInputMinLength}
920
920
  maxlength={textInputMaxLength}
921
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200"
921
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:placeholder:text-neutral-500 dark:focus:border-neutral-600"
922
922
  />
923
923
  )
924
924
  )
@@ -926,7 +926,7 @@ const layoutClass = isObjectLikeField
926
926
  <button
927
927
  type="button"
928
928
  @click="removeArrayValue(index)"
929
- class="h-[31px] px-2 rounded-md border border-neutral-200 text-neutral-500 hover:text-neutral-700 hover:border-neutral-300 hover:bg-neutral-50 transition-colors duration-200 cursor-pointer"
929
+ class="h-[31px] px-2 rounded-md border border-neutral-200 text-neutral-500 hover:text-neutral-700 hover:border-neutral-300 hover:bg-neutral-50 transition-colors duration-200 cursor-pointer dark:border-neutral-700 dark:text-neutral-400 dark:hover:border-neutral-600 dark:hover:bg-neutral-800/70 dark:hover:text-neutral-200"
930
930
  aria-label={`Remove ${field.name} value`}
931
931
  >
932
932
  <Icon class="size-4" name="lucide:x" />
@@ -936,7 +936,7 @@ const layoutClass = isObjectLikeField
936
936
  <button
937
937
  type="button"
938
938
  @click="addArrayValue()"
939
- class="inline-flex items-center gap-1 text-xs font-medium text-neutral-700 hover:text-neutral-900 cursor-pointer transition-colors duration-200"
939
+ class="inline-flex items-center gap-1 text-xs font-medium text-neutral-700 hover:text-neutral-900 cursor-pointer transition-colors duration-200 dark:text-neutral-300 dark:hover:text-neutral-100"
940
940
  >
941
941
  <Icon class="size-3.5" name="lucide:plus" />
942
942
  Add value
@@ -944,10 +944,10 @@ const layoutClass = isObjectLikeField
944
944
  </div>
945
945
  )
946
946
  ) : hasNestedFields || hasFieldVariants ? (
947
- <div class="rounded-lg border border-neutral-200 bg-neutral-50/50 p-2.5">
947
+ <div class="rounded-lg border border-neutral-200 bg-neutral-50/50 p-2.5 dark:border-neutral-800 dark:bg-neutral-900/50">
948
948
  <div class="space-y-3">
949
949
  {field.nested?.map((nestedField) => (
950
- <div class="border-b border-b-neutral-100 last:border-none pb-3 last:pb-0">
950
+ <div class="border-b border-b-neutral-100 dark:border-b-neutral-800 last:border-none pb-3 last:pb-0">
951
951
  <Astro.self
952
952
  field={nestedField}
953
953
  requestPart={requestPart}
@@ -960,19 +960,19 @@ const layoutClass = isObjectLikeField
960
960
  <div class:list={["space-y-2", hasNestedFields && "pt-1"]}>
961
961
  {hasOneOfVariants ? (
962
962
  <>
963
- <p class="text-xs text-neutral-500">
963
+ <p class="text-xs text-neutral-500 dark:text-neutral-400">
964
964
  Select one variant.
965
965
  </p>
966
- <div class="inline-flex max-w-full flex-wrap items-center gap-1 rounded-lg bg-neutral-100 p-1">
966
+ <div class="inline-flex max-w-full flex-wrap items-center gap-1 rounded-lg bg-neutral-100 p-1 dark:bg-neutral-900/60">
967
967
  {field.variants.map((variant, variantIndex) => (
968
968
  <button
969
969
  type="button"
970
970
  @click={`selectOneOfVariant(${variantIndex})`}
971
971
  :class={`{
972
- 'bg-white text-neutral-900 shadow-xs ring-1 ring-neutral-200': getSelectedOneOfVariant() === ${variantIndex},
973
- 'text-neutral-600 hover:bg-neutral-50 hover:text-neutral-800': getSelectedOneOfVariant() !== ${variantIndex}
972
+ 'bg-white text-neutral-900 shadow-xs ring-1 ring-neutral-200 dark:bg-(--rd-code-surface) dark:text-neutral-100 dark:ring-neutral-700/70': getSelectedOneOfVariant() === ${variantIndex},
973
+ 'text-neutral-600 hover:bg-neutral-50 hover:text-neutral-800 dark:text-neutral-400 dark:hover:bg-neutral-800/70 dark:hover:text-neutral-200': getSelectedOneOfVariant() !== ${variantIndex}
974
974
  }`}
975
- class="inline-flex h-7 items-center justify-center whitespace-nowrap rounded-md px-2.5 text-[11px] font-medium transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-300"
975
+ class="inline-flex h-7 items-center justify-center whitespace-nowrap rounded-md px-2.5 text-[11px] font-medium transition-all duration-200 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-300 dark:focus-visible:ring-neutral-700"
976
976
  >
977
977
  {variant.label}
978
978
  </button>
@@ -983,13 +983,13 @@ const layoutClass = isObjectLikeField
983
983
  x-show={`getSelectedOneOfVariant() === ${variantIndex}`}
984
984
  x-cloak
985
985
  >
986
- <div class="rounded-md border border-neutral-200 bg-white p-2.5">
987
- <div class="mb-2 text-xs font-medium text-neutral-600">
986
+ <div class="rounded-md border border-neutral-200 bg-white p-2.5 dark:border-neutral-800 dark:bg-neutral-900/60">
987
+ <div class="mb-2 text-xs font-medium text-neutral-600 dark:text-neutral-400">
988
988
  {variant.label}
989
989
  </div>
990
990
  <div class="space-y-3">
991
991
  {variant.fields.map((variantField) => (
992
- <div class="border-b border-b-neutral-100 last:border-none pb-3 last:pb-0">
992
+ <div class="border-b border-b-neutral-100 dark:border-b-neutral-800 last:border-none pb-3 last:pb-0">
993
993
  <Astro.self
994
994
  field={variantField}
995
995
  requestPart={requestPart}
@@ -1005,17 +1005,17 @@ const layoutClass = isObjectLikeField
1005
1005
  </>
1006
1006
  ) : (
1007
1007
  <>
1008
- <p class="text-xs text-neutral-500">
1008
+ <p class="text-xs text-neutral-500 dark:text-neutral-400">
1009
1009
  One or more variants may apply.
1010
1010
  </p>
1011
1011
  {field.variants.map((variant) => (
1012
- <div class="rounded-md border border-neutral-200 bg-white p-2.5">
1013
- <div class="mb-2 text-xs font-medium text-neutral-600">
1012
+ <div class="rounded-md border border-neutral-200 bg-white p-2.5 dark:border-neutral-800 dark:bg-neutral-900/60">
1013
+ <div class="mb-2 text-xs font-medium text-neutral-600 dark:text-neutral-400">
1014
1014
  {variant.label}
1015
1015
  </div>
1016
1016
  <div class="space-y-3">
1017
1017
  {variant.fields.map((variantField) => (
1018
- <div class="border-b border-b-neutral-100 last:border-none pb-3 last:pb-0">
1018
+ <div class="border-b border-b-neutral-100 dark:border-b-neutral-800 last:border-none pb-3 last:pb-0">
1019
1019
  <Astro.self
1020
1020
  field={variantField}
1021
1021
  requestPart={requestPart}
@@ -1042,8 +1042,8 @@ const layoutClass = isObjectLikeField
1042
1042
  :value="getFieldValue()"
1043
1043
  @change="setFieldValue($event.target.value, $event.target)"
1044
1044
  required={isRequiredField}
1045
- :class="getFieldValue() ? 'text-neutral-700' : 'text-neutral-400'"
1046
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none"
1045
+ :class="getFieldValue() ? 'text-neutral-700 dark:text-neutral-200' : 'text-neutral-400 dark:text-neutral-500'"
1046
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none dark:border-neutral-700 dark:bg-neutral-900 dark:focus:border-neutral-600"
1047
1047
  >
1048
1048
  <option value="" disabled hidden>Select value</option>
1049
1049
  <option value="__clear__">Clear selection</option>
@@ -1063,8 +1063,8 @@ const layoutClass = isObjectLikeField
1063
1063
  :value="getBooleanFieldValue()"
1064
1064
  @change="setBooleanFieldValue($event.target.value)"
1065
1065
  required={isRequiredField}
1066
- :class="getBooleanFieldValue() ? 'text-neutral-700' : 'text-neutral-400'"
1067
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none"
1066
+ :class="getBooleanFieldValue() ? 'text-neutral-700 dark:text-neutral-200' : 'text-neutral-400 dark:text-neutral-500'"
1067
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow transition-all duration-200 bg-white appearance-none dark:border-neutral-700 dark:bg-neutral-900 dark:focus:border-neutral-600"
1068
1068
  >
1069
1069
  <option value="" disabled hidden>Select value</option>
1070
1070
  <option value="__clear__">Clear selection</option>
@@ -1090,7 +1090,7 @@ const layoutClass = isObjectLikeField
1090
1090
  step={numericInputStep}
1091
1091
  minlength={textInputMinLength}
1092
1092
  maxlength={textInputMaxLength}
1093
- class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200"
1093
+ class="w-full px-3 py-1.5 text-sm border border-neutral-200 focus:border-neutral-300 outline-none rounded-md shadow-xs focus:shadow placeholder:text-neutral-400 transition-all duration-200 bg-white dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:placeholder:text-neutral-500 dark:focus:border-neutral-600"
1094
1094
  />
1095
1095
  )}
1096
1096
  </>