@rimelight/cms 0.0.1 → 0.0.3

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 (104) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +16 -14
  3. package/src/admin/api/media-file.ts +39 -0
  4. package/src/admin/api/media.ts +199 -0
  5. package/src/admin/layouts/CMSDashboardLayout.astro +178 -0
  6. package/src/admin/layouts/DefaultParentLayout.astro +50 -0
  7. package/src/admin/pages/assets.astro +424 -0
  8. package/src/admin/pages/byline-schema.astro +62 -0
  9. package/src/admin/pages/bylines.astro +16 -0
  10. package/src/admin/pages/categories.astro +21 -0
  11. package/src/admin/pages/content-types.astro +55 -0
  12. package/src/admin/pages/dashboard.astro +61 -0
  13. package/src/admin/pages/pages-edit.astro +595 -0
  14. package/src/admin/pages/pages-index.astro +146 -0
  15. package/src/admin/pages/pages-new.astro +130 -0
  16. package/src/admin/pages/pages-preview.astro +111 -0
  17. package/src/admin/pages/pages-review.astro +236 -0
  18. package/src/admin/pages/settings.astro +203 -0
  19. package/src/admin/pages/tags.astro +21 -0
  20. package/src/admin/pages/templates-edit.astro +234 -0
  21. package/src/admin/pages/templates-index.astro +95 -0
  22. package/src/admin/pages/templates-new.astro +193 -0
  23. package/src/admin/pages/users.astro +74 -0
  24. package/src/admin/pages/versions.astro +74 -0
  25. package/src/astro/BlockRenderer.astro +44 -96
  26. package/src/astro/PageRenderer.astro +9 -2
  27. package/src/astro/blocks/CalloutBlock.astro +7 -7
  28. package/src/astro/blocks/CardBlock.astro +5 -5
  29. package/src/astro/blocks/CodeBlock.astro +2 -2
  30. package/src/astro/blocks/FileTreeBlock.astro +7 -7
  31. package/src/astro/blocks/ImageBlock.astro +2 -2
  32. package/src/astro/blocks/OrderedListBlock.astro +2 -2
  33. package/src/astro/blocks/ParagraphBlock.astro +3 -3
  34. package/src/astro/blocks/SectionBlock.astro +6 -6
  35. package/src/astro/blocks/StepItemBlock.astro +3 -3
  36. package/src/astro/blocks/StepsBlock.astro +1 -1
  37. package/src/astro/blocks/TableBlock.astro +6 -6
  38. package/src/astro/blocks/TabsBlock.astro +9 -9
  39. package/src/astro/blocks/UnorderedListBlock.astro +2 -2
  40. package/src/astro/blocks/index.ts +35 -0
  41. package/src/client/components/RimelightBlock.tsx +19 -19
  42. package/src/client/components/RimelightBlockPicker.tsx +9 -13
  43. package/src/client/components/RimelightBylinesManager.tsx +438 -0
  44. package/src/client/components/RimelightEditor.tsx +3 -3
  45. package/src/client/components/RimelightPreview.tsx +37 -45
  46. package/src/client/components/RimelightPropertiesPanel.tsx +368 -26
  47. package/src/client/components/RimelightTaxonomyManager.tsx +369 -0
  48. package/src/client/components/RimelightTaxonomyMasterDetail.tsx +412 -0
  49. package/src/client/components/RimelightTemplateEditor.tsx +6 -8
  50. package/src/client/components/editors/CalloutEditor.tsx +2 -4
  51. package/src/client/components/editors/CardsEditor.tsx +2 -4
  52. package/src/client/components/editors/CodeEditor.tsx +1 -3
  53. package/src/client/components/editors/FileTreeEditor.tsx +2 -4
  54. package/src/client/components/editors/ImageEditor.tsx +3 -3
  55. package/src/client/components/editors/ParagraphEditor.tsx +2 -2
  56. package/src/client/components/editors/SceneEditor.tsx +6 -12
  57. package/src/client/components/editors/ScriptEditor.tsx +8 -16
  58. package/src/client/components/editors/SectionEditor.tsx +4 -4
  59. package/src/client/components/editors/StepItemEditor.tsx +2 -2
  60. package/src/client/components/editors/StepsEditor.tsx +2 -4
  61. package/src/client/components/editors/TabItemEditor.tsx +3 -3
  62. package/src/client/components/editors/TableEditor.tsx +5 -5
  63. package/src/client/components/editors/TabsEditor.tsx +2 -4
  64. package/src/client/components/index.ts +3 -0
  65. package/src/client/loader.ts +3 -0
  66. package/src/core/diff.ts +145 -0
  67. package/src/core/excerpt.ts +159 -0
  68. package/src/core/preview.ts +87 -0
  69. package/src/core/registry.ts +0 -39
  70. package/src/core/types/blocks.ts +83 -6
  71. package/src/core/types/bylines.ts +14 -0
  72. package/src/core/types/media.ts +13 -0
  73. package/src/core/types/taxonomies.ts +20 -0
  74. package/src/cron/scheduled.ts +57 -0
  75. package/src/docs/agent.ts +116 -0
  76. package/src/docs/config.ts +25 -0
  77. package/src/docs/index.ts +5 -0
  78. package/src/docs/routing.ts +104 -0
  79. package/src/docs/sidebar.ts +251 -0
  80. package/src/docs/toc.ts +47 -0
  81. package/src/env.d.ts +13 -0
  82. package/src/index.ts +40 -6
  83. package/src/integration.ts +196 -0
  84. package/src/loader/live.ts +254 -0
  85. package/src/markdown/index.ts +0 -1
  86. package/src/mcp/index.ts +228 -0
  87. package/src/schema/bylines.ts +23 -0
  88. package/src/schema/index.ts +3 -0
  89. package/src/schema/page_versions.ts +2 -0
  90. package/src/schema/pages.ts +2 -0
  91. package/src/schema/site_settings.ts +41 -0
  92. package/src/schema/taxonomies.ts +49 -0
  93. package/src/services/bylines.ts +74 -0
  94. package/src/services/search-indexer.ts +61 -0
  95. package/src/services/site-settings.ts +108 -0
  96. package/src/services/taxonomies.ts +276 -0
  97. package/src/storage/index.ts +253 -0
  98. package/src/astro/blocks/DialogueBlock.astro +0 -23
  99. package/src/astro/blocks/SceneBlock.astro +0 -65
  100. package/src/astro/blocks/ScriptBlock.astro +0 -59
  101. package/src/core/template-sync.ts +0 -75
  102. package/src/markdown/parser.ts +0 -347
  103. package/src/migration.ts +0 -155
  104. package/src/search/sync.ts +0 -32
@@ -12,6 +12,6 @@ const imageSrc = src || url
12
12
  ---
13
13
 
14
14
  <figure class="cms-image mx-auto my-6 flex flex-col items-center max-w-full" data-block-id={block.id}>
15
- <img src={imageSrc} alt={alt || "Image"} class="h-auto max-w-full rounded-xl object-cover border border-neutral-200 dark:border-neutral-800 shadow-sm" />
16
- {caption && <figcaption class="mt-2 text-center text-xs text-neutral-500 dark:text-neutral-400 italic">{caption}</figcaption>}
15
+ <img src={imageSrc} alt={alt || "Image"} class="h-auto max-w-full rounded-xl object-cover border border-neutral-200 shadow-sm" />
16
+ {caption && <figcaption class="mt-2 text-center text-xs text-neutral-500 italic">{caption}</figcaption>}
17
17
  </figure>
@@ -40,7 +40,7 @@ function renderNodesToHtml(nodes: InlineNode[]): string {
40
40
  const inner = node.children ? renderNodesToHtml(node.children) : escapeHtml((node as any).text || "")
41
41
  const target = node.openInNewTab ? ' target="_blank" rel="noopener noreferrer"' : ""
42
42
  const href = escapeHtml(node.url || "#")
43
- return `<a href="${href}"${target} class="text-blue-500 hover:text-blue-400 underline underline-offset-2">${inner}</a>`
43
+ return `<a href="${href}"${target} class="text-info-500 hover:text-info-400 underline underline-offset-2">${inner}</a>`
44
44
  }
45
45
  return ""
46
46
  })
@@ -48,7 +48,7 @@ function renderNodesToHtml(nodes: InlineNode[]): string {
48
48
  }
49
49
  ---
50
50
 
51
- <ol class="cms-ordered-list list-decimal list-inside space-y-2 my-4 text-base text-neutral-800 dark:text-neutral-200" data-block-id={block.id}>
51
+ <ol class="cms-ordered-list list-decimal list-inside space-y-2 my-4 text-base text-neutral-800" data-block-id={block.id}>
52
52
  {items.map((item: BaseBlock) => (
53
53
  <li set:html={renderNodesToHtml(item.props?.content || [])} />
54
54
  ))}
@@ -40,12 +40,12 @@ function renderNodesToHtml(nodes: InlineNode[]): string {
40
40
  const inner = node.children ? renderNodesToHtml(node.children) : escapeHtml((node as any).text || "")
41
41
  const target = node.openInNewTab ? ' target="_blank" rel="noopener noreferrer"' : ""
42
42
  const href = escapeHtml(node.url || "#")
43
- return `<a href="${href}"${target} class="text-blue-500 hover:text-blue-400 underline underline-offset-2">${inner}</a>`
43
+ return `<a href="${href}"${target} class="text-info-500 hover:text-info-400 underline underline-offset-2">${inner}</a>`
44
44
  }
45
45
  if (node.type === "page_mention") {
46
46
  const title = escapeHtml(node.displayTitle || node.pageSlug || node.pageId || "Page")
47
47
  const href = `/${escapeHtml(node.pageSlug || node.pageId)}`
48
- return `<a href="${href}" class="inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-blue-500/10 text-blue-400 hover:bg-blue-500/20 text-sm font-medium no-underline"><span class="i-lucide-file-text size-3.5"></span>${title}</a>`
48
+ return `<a href="${href}" class="inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-info-500/10 text-info-400 hover:bg-info-500/20 text-sm font-medium no-underline"><span class="i-lucide-file-text size-3.5"></span>${title}</a>`
49
49
  }
50
50
  return ""
51
51
  })
@@ -62,4 +62,4 @@ if (Array.isArray(rawText)) {
62
62
  }
63
63
  ---
64
64
 
65
- <p class="cms-paragraph text-base leading-relaxed text-neutral-800 dark:text-neutral-200 my-4 whitespace-pre-wrap break-words" data-block-id={block.id} set:html={htmlContent} />
65
+ <p class="cms-paragraph text-base leading-relaxed text-neutral-800 my-4 whitespace-pre-wrap break-words" data-block-id={block.id} set:html={htmlContent} />
@@ -27,11 +27,11 @@ const safeLevel = calculateHeadingLevel(sectionDepth)
27
27
  const headingId = title ? slugify(title) : undefined
28
28
 
29
29
  const headingClasses: Record<HeadingLevel, string> = {
30
- 2: "text-3xl font-bold text-neutral-900 dark:text-white mt-6 mb-3 border-b border-gray-200 dark:border-gray-800 pb-2",
31
- 3: "text-2xl font-semibold text-neutral-900 dark:text-white mt-5 mb-2.5",
32
- 4: "text-xl font-medium text-neutral-900 dark:text-white mt-4 mb-2",
33
- 5: "text-lg font-medium text-neutral-800 dark:text-neutral-200 mt-3 mb-1.5",
34
- 6: "text-base font-normal text-neutral-700 dark:text-neutral-300 mt-2 mb-1"
30
+ 2: "text-3xl font-bold text-neutral-900 mt-6 mb-3 border-b border-neutral-200 pb-2",
31
+ 3: "text-2xl font-semibold text-neutral-900 mt-5 mb-2.5",
32
+ 4: "text-xl font-medium text-neutral-900 mt-4 mb-2",
33
+ 5: "text-lg font-medium text-neutral-800 mt-3 mb-1.5",
34
+ 6: "text-base font-normal text-neutral-700 mt-2 mb-1"
35
35
  }
36
36
 
37
37
  const Tag = `h${safeLevel}` as any
@@ -39,7 +39,7 @@ const Tag = `h${safeLevel}` as any
39
39
 
40
40
  <section id={headingId} class="cms-section my-6 scroll-mt-20" data-block-id={block.id}>
41
41
  {title && <Tag class={headingClasses[safeLevel] || headingClasses[2]}>{title}</Tag>}
42
- {description && <p class="text-sm text-gray-500 dark:text-gray-400 mt-1 mb-4 italic">{description}</p>}
42
+ {description && <p class="text-sm text-neutral-500 mt-1 mb-4 italic">{description}</p>}
43
43
  <div class="mt-4">
44
44
  <slot />
45
45
  </div>
@@ -12,12 +12,12 @@ const { title = "", description = "" } = block.props || {}
12
12
  ---
13
13
 
14
14
  <div class="cms-step-item relative" data-block-id={block.id}>
15
- <div class="absolute -left-[35px] top-0 flex size-6 items-center justify-center rounded-full bg-neutral-900 text-white dark:bg-white dark:text-neutral-900 text-xs font-bold ring-4 ring-white dark:ring-neutral-950">
15
+ <div class="absolute -left-[35px] top-0 flex size-6 items-center justify-center rounded-full bg-inverted text-xs font-bold ring-4 ring-neutral-50">
16
16
  {index + 1}
17
17
  </div>
18
18
  <div class="space-y-2">
19
- {title && <h3 class="text-base font-semibold text-neutral-900 dark:text-white mt-0">{title}</h3>}
20
- {description && <p class="text-sm text-neutral-600 dark:text-neutral-400 mt-1">{description}</p>}
19
+ {title && <h3 class="text-base font-semibold text-neutral-900 mt-0">{title}</h3>}
20
+ {description && <p class="text-sm text-neutral-600 mt-1">{description}</p>}
21
21
  <div class="mt-3">
22
22
  <slot />
23
23
  </div>
@@ -9,6 +9,6 @@ interface Props {
9
9
  const { block } = Astro.props
10
10
  ---
11
11
 
12
- <div class="cms-steps my-6 relative border-l-2 border-neutral-200 dark:border-neutral-800 ml-4 pl-6 space-y-6" data-block-id={block.id}>
12
+ <div class="cms-steps my-6 relative border-l-2 border-neutral-200 ml-4 pl-6 space-y-6" data-block-id={block.id}>
13
13
  <slot />
14
14
  </div>
@@ -10,15 +10,15 @@ const { block } = Astro.props
10
10
  const { columns = [], rows = [], caption } = block.props || {}
11
11
  ---
12
12
 
13
- <div class="cms-table my-6 overflow-x-auto rounded-lg border border-neutral-200 dark:border-neutral-800" data-block-id={block.id}>
13
+ <div class="cms-table my-6 overflow-x-auto rounded-lg border border-neutral-200" data-block-id={block.id}>
14
14
  <table class="w-full text-left text-sm border-collapse">
15
15
  {caption && (
16
- <caption class="p-2 text-xs text-neutral-500 dark:text-neutral-400 italic text-left">
16
+ <caption class="p-2 text-xs text-neutral-500 italic text-left">
17
17
  {caption}
18
18
  </caption>
19
19
  )}
20
20
  {columns.length > 0 && (
21
- <thead class="bg-neutral-50 dark:bg-neutral-900 border-b border-neutral-200 dark:border-neutral-800 font-medium text-neutral-700 dark:text-neutral-200">
21
+ <thead class="bg-neutral-50 border-b border-neutral-200 font-medium text-neutral-700">
22
22
  <tr>
23
23
  {columns.map((col: any) => (
24
24
  <th
@@ -31,12 +31,12 @@ const { columns = [], rows = [], caption } = block.props || {}
31
31
  </tr>
32
32
  </thead>
33
33
  )}
34
- <tbody class="divide-y divide-neutral-200 dark:divide-neutral-800 bg-white dark:bg-neutral-950">
34
+ <tbody class="divide-y divide-neutral-200 bg-default">
35
35
  {rows.map((row: any) => (
36
- <tr class="hover:bg-neutral-50/50 dark:hover:bg-neutral-900/50 transition-colors">
36
+ <tr class="hover:bg-neutral-50/50 transition-colors">
37
37
  {columns.map((col: any) => (
38
38
  <td
39
- class="px-4 py-3 text-neutral-800 dark:text-neutral-200"
39
+ class="px-4 py-3 text-neutral-800"
40
40
  style={col.align ? `text-align: ${col.align};` : undefined}
41
41
  >
42
42
  {row[col.key] ?? ""}
@@ -12,8 +12,8 @@ const defaultValue = block.props?.defaultValue || (children[0]?.props?.value ||
12
12
  const tabsId = `tabs-${block.id}`
13
13
  ---
14
14
 
15
- <div class="cms-tabs my-6 border border-neutral-200 dark:border-neutral-800 rounded-xl overflow-hidden" data-block-id={block.id} id={tabsId}>
16
- <div class="flex items-center gap-1 border-b border-neutral-200 dark:border-neutral-800 bg-neutral-50 dark:bg-neutral-900 px-3 pt-2">
15
+ <div class="cms-tabs my-6 border border-neutral-200 rounded-xl overflow-hidden" data-block-id={block.id} id={tabsId}>
16
+ <div class="flex items-center gap-1 border-b border-neutral-200 bg-neutral-50 px-3 pt-2">
17
17
  {children.map((child, index) => {
18
18
  const val = child.props?.value || child.props?.label || `tab-${index}`
19
19
  const isDefault = val === defaultValue || (!defaultValue && index === 0)
@@ -22,8 +22,8 @@ const tabsId = `tabs-${block.id}`
22
22
  type="button"
23
23
  class={`cms-tab-btn px-3 py-1.5 text-xs font-medium rounded-t-md transition-all border-b-2 -mb-px ${
24
24
  isDefault
25
- ? "text-primary-600 dark:text-primary-400 border-primary-500 bg-white dark:bg-neutral-950 font-semibold"
26
- : "text-neutral-600 dark:text-neutral-400 border-transparent hover:text-neutral-900 dark:hover:text-neutral-200"
25
+ ? "text-primary-600 border-primary-500 bg-white font-semibold"
26
+ : "text-neutral-600 border-transparent hover:text-neutral-900"
27
27
  }`}
28
28
  data-tab-target={`${tabsId}-panel-${index}`}
29
29
  >
@@ -33,7 +33,7 @@ const tabsId = `tabs-${block.id}`
33
33
  )
34
34
  })}
35
35
  </div>
36
- <div class="cms-tabs-content p-4 bg-white dark:bg-neutral-950">
36
+ <div class="cms-tabs-content p-4 bg-white">
37
37
  <slot />
38
38
  </div>
39
39
  </div>
@@ -48,11 +48,11 @@ const tabsId = `tabs-${block.id}`
48
48
  btns.forEach((btn, idx) => {
49
49
  btn.addEventListener('click', () => {
50
50
  btns.forEach((b) => {
51
- b.classList.remove('text-primary-600', 'dark:text-primary-400', 'border-primary-500', 'bg-white', 'dark:bg-neutral-950', 'font-semibold');
52
- b.classList.add('text-neutral-600', 'dark:text-neutral-400', 'border-transparent');
51
+ b.classList.remove('text-primary-600', 'border-primary-500', 'bg-white', 'font-semibold');
52
+ b.classList.add('text-neutral-600', 'border-transparent');
53
53
  });
54
- btn.classList.add('text-primary-600', 'dark:text-primary-400', 'border-primary-500', 'bg-white', 'dark:bg-neutral-950', 'font-semibold');
55
- btn.classList.remove('text-neutral-600', 'dark:text-neutral-400', 'border-transparent');
54
+ btn.classList.add('text-primary-600', 'border-primary-500', 'bg-white', 'font-semibold');
55
+ btn.classList.remove('text-neutral-600', 'border-transparent');
56
56
 
57
57
  panels.forEach((p, pIdx) => {
58
58
  if (pIdx === idx) {
@@ -40,7 +40,7 @@ function renderNodesToHtml(nodes: InlineNode[]): string {
40
40
  const inner = node.children ? renderNodesToHtml(node.children) : escapeHtml((node as any).text || "")
41
41
  const target = node.openInNewTab ? ' target="_blank" rel="noopener noreferrer"' : ""
42
42
  const href = escapeHtml(node.url || "#")
43
- return `<a href="${href}"${target} class="text-blue-500 hover:text-blue-400 underline underline-offset-2">${inner}</a>`
43
+ return `<a href="${href}"${target} class="text-info-500 hover:text-info-400 underline underline-offset-2">${inner}</a>`
44
44
  }
45
45
  return ""
46
46
  })
@@ -48,7 +48,7 @@ function renderNodesToHtml(nodes: InlineNode[]): string {
48
48
  }
49
49
  ---
50
50
 
51
- <ul class="cms-unordered-list list-disc list-inside space-y-2 my-4 text-base text-neutral-800 dark:text-neutral-200" data-block-id={block.id}>
51
+ <ul class="cms-unordered-list list-disc list-inside space-y-2 my-4 text-base text-neutral-800" data-block-id={block.id}>
52
52
  {items.map((item: BaseBlock) => (
53
53
  <li set:html={renderNodesToHtml(item.props?.content || [])} />
54
54
  ))}
@@ -0,0 +1,35 @@
1
+ import ParagraphBlock from "./ParagraphBlock.astro"
2
+ import SectionBlock from "./SectionBlock.astro"
3
+ import CalloutBlock from "./CalloutBlock.astro"
4
+ import ImageBlock from "./ImageBlock.astro"
5
+ import CodeBlock from "./CodeBlock.astro"
6
+ import TableBlock from "./TableBlock.astro"
7
+ import TabsBlock from "./TabsBlock.astro"
8
+ import TabItemBlock from "./TabItemBlock.astro"
9
+ import StepsBlock from "./StepsBlock.astro"
10
+ import StepItemBlock from "./StepItemBlock.astro"
11
+ import CardsBlock from "./CardsBlock.astro"
12
+ import CardBlock from "./CardBlock.astro"
13
+ import FileTreeBlock from "./FileTreeBlock.astro"
14
+ import UnorderedListBlock from "./UnorderedListBlock.astro"
15
+ import OrderedListBlock from "./OrderedListBlock.astro"
16
+
17
+ export const defaultBlockComponents: Record<string, any> = {
18
+ ParagraphBlock,
19
+ SectionBlock,
20
+ CalloutBlock,
21
+ ImageBlock,
22
+ CodeBlock,
23
+ TableBlock,
24
+ TabsBlock,
25
+ TabItemBlock,
26
+ StepsBlock,
27
+ StepItemBlock,
28
+ CardsBlock,
29
+ CardBlock,
30
+ FileTreeBlock,
31
+ UnorderedListBlock,
32
+ OrderedListBlock
33
+ }
34
+
35
+ export default defaultBlockComponents
@@ -265,7 +265,7 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
265
265
  setMenuOpen(!menuOpen())
266
266
  }}
267
267
  aria-label="Drag handle and options menu"
268
- class="cms-drag-handle !p-1 text-muted-foreground hover:text-foreground cursor-grab active:cursor-grabbing"
268
+ class="cms-drag-handle !p-1 text-muted hover:text-highlighted cursor-grab active:cursor-grabbing"
269
269
  title="Drag to reorder / Click for options"
270
270
  leading={<RLSIcon name="gripVertical" size="sm" />}
271
271
  />
@@ -274,7 +274,7 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
274
274
  <Show when={menuOpen()}>
275
275
  <div class="absolute left-0 top-7 z-50 w-48 bg-elevated border border-default rounded-xl shadow-xl py-1 text-xs">
276
276
  {isLocked() ? (
277
- <div class="px-3 py-2 text-muted-foreground italic">Locked — templated block</div>
277
+ <div class="px-3 py-2 text-muted italic">Locked — templated block</div>
278
278
  ) : (
279
279
  <>
280
280
  <button
@@ -283,9 +283,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
283
283
  props.onMove(props.block.id, -1)
284
284
  setMenuOpen(false)
285
285
  }}
286
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 dark:hover:bg-neutral-800 cursor-pointer text-foreground transition-colors bg-transparent border-0 text-left"
286
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 cursor-pointer text-highlighted transition-colors bg-transparent border-0 text-left"
287
287
  >
288
- <RLSIcon name="arrowUp" size="xs" class="text-muted-foreground" />
288
+ <RLSIcon name="arrowUp" size="xs" class="text-muted" />
289
289
  <span>Move Up</span>
290
290
  </button>
291
291
  <button
@@ -294,9 +294,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
294
294
  props.onMove(props.block.id, 1)
295
295
  setMenuOpen(false)
296
296
  }}
297
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 dark:hover:bg-neutral-800 cursor-pointer text-foreground transition-colors bg-transparent border-0 text-left"
297
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 cursor-pointer text-highlighted transition-colors bg-transparent border-0 text-left"
298
298
  >
299
- <RLSIcon name="arrowDown" size="xs" class="text-muted-foreground" />
299
+ <RLSIcon name="arrowDown" size="xs" class="text-muted" />
300
300
  <span>Move Down</span>
301
301
  </button>
302
302
  <div class="my-1 border-t border-default" />
@@ -306,9 +306,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
306
306
  props.onAddAdjacent(props.block.id, "before")
307
307
  setMenuOpen(false)
308
308
  }}
309
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 dark:hover:bg-neutral-800 cursor-pointer text-foreground transition-colors bg-transparent border-0 text-left"
309
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 cursor-pointer text-highlighted transition-colors bg-transparent border-0 text-left"
310
310
  >
311
- <RLSIcon name="arrowUpFromLine" size="xs" class="text-muted-foreground" />
311
+ <RLSIcon name="arrowUpFromLine" size="xs" class="text-muted" />
312
312
  <span>Add Block Above</span>
313
313
  </button>
314
314
  <button
@@ -317,9 +317,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
317
317
  props.onAddAdjacent(props.block.id, "after")
318
318
  setMenuOpen(false)
319
319
  }}
320
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 dark:hover:bg-neutral-800 cursor-pointer text-foreground transition-colors bg-transparent border-0 text-left"
320
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 cursor-pointer text-highlighted transition-colors bg-transparent border-0 text-left"
321
321
  >
322
- <RLSIcon name="arrowDownToLine" size="xs" class="text-muted-foreground" />
322
+ <RLSIcon name="arrowDownToLine" size="xs" class="text-muted" />
323
323
  <span>Add Block Below</span>
324
324
  </button>
325
325
  <div class="my-1 border-t border-default" />
@@ -329,9 +329,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
329
329
  props.onDuplicate(props.block.id)
330
330
  setMenuOpen(false)
331
331
  }}
332
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 dark:hover:bg-neutral-800 cursor-pointer text-foreground transition-colors bg-transparent border-0 text-left"
332
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-neutral-100 cursor-pointer text-highlighted transition-colors bg-transparent border-0 text-left"
333
333
  >
334
- <RLSIcon name="copy" size="xs" class="text-muted-foreground" />
334
+ <RLSIcon name="copy" size="xs" class="text-muted" />
335
335
  <span>Duplicate Block</span>
336
336
  </button>
337
337
  <button
@@ -340,9 +340,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
340
340
  setMenuOpen(false)
341
341
  setIsDeleteModalOpen(true)
342
342
  }}
343
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-red-50 dark:hover:bg-red-950/40 text-red-500 hover:text-red-600 cursor-pointer transition-colors bg-transparent border-0 text-left"
343
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-error-50 text-error-500 hover:text-error-600 cursor-pointer transition-colors bg-transparent border-0 text-left"
344
344
  >
345
- <RLSIcon name="trash" size="xs" class="text-red-500" />
345
+ <RLSIcon name="trash" size="xs" class="text-error-500" />
346
346
  <span>Delete Block...</span>
347
347
  </button>
348
348
  </>
@@ -428,9 +428,9 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
428
428
  setToolbarMenuOpen(false)
429
429
  setIsDeleteModalOpen(true)
430
430
  }}
431
- class="flex items-center gap-2 w-full px-3 py-2 hover:bg-red-50 dark:hover:bg-red-950/40 text-red-500 hover:text-red-600 cursor-pointer transition-colors bg-transparent border-0 text-left"
431
+ class="flex items-center gap-2 w-full px-3 py-2 hover:bg-error-50 text-error-500 hover:text-error-600 cursor-pointer transition-colors bg-transparent border-0 text-left"
432
432
  >
433
- <RLSIcon name="trash" size="xs" class="text-red-500" />
433
+ <RLSIcon name="trash" size="xs" class="text-error-500" />
434
434
  <span>Delete Block...</span>
435
435
  </button>
436
436
  </div>
@@ -441,7 +441,7 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
441
441
  {/* Block Editor Body (No border, no bg) */}
442
442
  <div class="w-full relative">
443
443
  {isLocked() && (
444
- <div class="inline-flex items-center gap-1 px-2 py-0.5 bg-neutral-200/50 dark:bg-neutral-800/50 text-neutral-600 dark:text-neutral-300 rounded text-xs mb-2 select-none border border-default">
444
+ <div class="inline-flex items-center gap-1 px-2 py-0.5 bg-neutral-200/50 text-neutral-600 rounded text-xs mb-2 select-none border border-default">
445
445
  🔒 Templated Block (Locked)
446
446
  </div>
447
447
  )}
@@ -478,8 +478,8 @@ export const RimelightBlock: Component<RimelightBlockProps> = (props) => {
478
478
  </>
479
479
  }
480
480
  >
481
- <p class="text-xs text-muted-foreground mt-1">
482
- Block type: <span class="font-semibold text-foreground">{props.block.type}</span>
481
+ <p class="text-xs text-muted mt-1">
482
+ Block type: <span class="font-semibold text-highlighted">{props.block.type}</span>
483
483
  </p>
484
484
  </RLSModal>
485
485
  </div>
@@ -207,7 +207,7 @@ export const RimelightBlockPicker: Component<RimelightBlockPickerProps> = (props
207
207
  >
208
208
  <div class="bg-elevated border border-default rounded-2xl w-full max-w-md shadow-2xl flex flex-col overflow-hidden">
209
209
  <div class="flex items-center justify-between px-4 py-3 border-b border-default">
210
- <div class="text-sm font-semibold text-foreground">
210
+ <div class="text-sm font-semibold text-highlighted">
211
211
  Add Block{" "}
212
212
  {props.containerType ? `to ${props.containerType.replace("Block", "")}` : ""}
213
213
  </div>
@@ -242,9 +242,7 @@ export const RimelightBlockPicker: Component<RimelightBlockPickerProps> = (props
242
242
 
243
243
  <div class="overflow-y-auto max-h-[50vh] pb-2">
244
244
  {filteredBlocks().length === 0 ? (
245
- <div class="text-center py-4 text-muted-foreground text-sm">
246
- No compatible blocks found
247
- </div>
245
+ <div class="text-center py-4 text-muted text-sm">No compatible blocks found</div>
248
246
  ) : (
249
247
  (() => {
250
248
  let currentGroup = ""
@@ -258,7 +256,7 @@ export const RimelightBlockPicker: Component<RimelightBlockPickerProps> = (props
258
256
  return (
259
257
  <>
260
258
  {showHeader && (
261
- <div class="text-[10px] font-bold text-muted-foreground uppercase tracking-widest px-4 py-1.5 mt-2">
259
+ <div class="text-[10px] font-bold text-muted uppercase tracking-widest px-4 py-1.5 mt-2">
262
260
  {block.group}
263
261
  </div>
264
262
  )}
@@ -270,24 +268,22 @@ export const RimelightBlockPicker: Component<RimelightBlockPickerProps> = (props
270
268
  handleSelectBlock(block.type)
271
269
  }}
272
270
  onMouseEnter={() => setSelectedIndex(index())}
273
- class="cms-picker-item flex items-center gap-3 px-4 py-2.5 cursor-pointer transition-colors hover:bg-neutral-100 dark:hover:bg-neutral-800/80 w-full text-left bg-transparent border-none"
274
- classList={{ "bg-neutral-100 dark:bg-neutral-800/80": isSelected }}
271
+ class="cms-picker-item flex items-center gap-3 px-4 py-2.5 cursor-pointer transition-colors hover:bg-neutral-100 w-full text-left bg-transparent border-none"
272
+ classList={{ "bg-neutral-100": isSelected }}
275
273
  >
276
- <div class="text-base w-8 h-8 flex items-center justify-center shrink-0 rounded-lg bg-neutral-100 dark:bg-neutral-800 text-foreground border border-default">
274
+ <div class="text-base w-8 h-8 flex items-center justify-center shrink-0 rounded-lg bg-neutral-100 text-highlighted border border-default">
277
275
  <RLSIcon name={block.icon} size="sm" />
278
276
  </div>
279
277
  <div class="flex flex-col flex-1 min-w-0">
280
278
  <div class="flex items-center justify-between">
281
- <span class="text-sm font-medium text-foreground">
279
+ <span class="text-sm font-medium text-highlighted">
282
280
  {block.label}
283
281
  </span>
284
- <span class="text-[10px] font-mono text-muted-foreground bg-neutral-100 dark:bg-neutral-800 px-1.5 py-0.5 rounded border border-default/50">
282
+ <span class="text-[10px] font-mono text-muted bg-neutral-100 px-1.5 py-0.5 rounded border border-default/50">
285
283
  {block.type}
286
284
  </span>
287
285
  </div>
288
- <span class="text-xs text-muted-foreground mt-0.5 truncate">
289
- {block.desc}
290
- </span>
286
+ <span class="text-xs text-muted mt-0.5 truncate">{block.desc}</span>
291
287
  </div>
292
288
  </button>
293
289
  </>