@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.
- package/LICENSE +21 -0
- package/package.json +16 -14
- package/src/admin/api/media-file.ts +39 -0
- package/src/admin/api/media.ts +199 -0
- package/src/admin/layouts/CMSDashboardLayout.astro +178 -0
- package/src/admin/layouts/DefaultParentLayout.astro +50 -0
- package/src/admin/pages/assets.astro +424 -0
- package/src/admin/pages/byline-schema.astro +62 -0
- package/src/admin/pages/bylines.astro +16 -0
- package/src/admin/pages/categories.astro +21 -0
- package/src/admin/pages/content-types.astro +55 -0
- package/src/admin/pages/dashboard.astro +61 -0
- package/src/admin/pages/pages-edit.astro +595 -0
- package/src/admin/pages/pages-index.astro +146 -0
- package/src/admin/pages/pages-new.astro +130 -0
- package/src/admin/pages/pages-preview.astro +111 -0
- package/src/admin/pages/pages-review.astro +236 -0
- package/src/admin/pages/settings.astro +203 -0
- package/src/admin/pages/tags.astro +21 -0
- package/src/admin/pages/templates-edit.astro +234 -0
- package/src/admin/pages/templates-index.astro +95 -0
- package/src/admin/pages/templates-new.astro +193 -0
- package/src/admin/pages/users.astro +74 -0
- package/src/admin/pages/versions.astro +74 -0
- package/src/astro/BlockRenderer.astro +44 -96
- package/src/astro/PageRenderer.astro +9 -2
- package/src/astro/blocks/CalloutBlock.astro +7 -7
- package/src/astro/blocks/CardBlock.astro +5 -5
- package/src/astro/blocks/CodeBlock.astro +2 -2
- package/src/astro/blocks/FileTreeBlock.astro +7 -7
- package/src/astro/blocks/ImageBlock.astro +2 -2
- package/src/astro/blocks/OrderedListBlock.astro +2 -2
- package/src/astro/blocks/ParagraphBlock.astro +3 -3
- package/src/astro/blocks/SectionBlock.astro +6 -6
- package/src/astro/blocks/StepItemBlock.astro +3 -3
- package/src/astro/blocks/StepsBlock.astro +1 -1
- package/src/astro/blocks/TableBlock.astro +6 -6
- package/src/astro/blocks/TabsBlock.astro +9 -9
- package/src/astro/blocks/UnorderedListBlock.astro +2 -2
- package/src/astro/blocks/index.ts +35 -0
- package/src/client/components/RimelightBlock.tsx +19 -19
- package/src/client/components/RimelightBlockPicker.tsx +9 -13
- package/src/client/components/RimelightBylinesManager.tsx +438 -0
- package/src/client/components/RimelightEditor.tsx +3 -3
- package/src/client/components/RimelightPreview.tsx +37 -45
- package/src/client/components/RimelightPropertiesPanel.tsx +368 -26
- package/src/client/components/RimelightTaxonomyManager.tsx +369 -0
- package/src/client/components/RimelightTaxonomyMasterDetail.tsx +412 -0
- package/src/client/components/RimelightTemplateEditor.tsx +6 -8
- package/src/client/components/editors/CalloutEditor.tsx +2 -4
- package/src/client/components/editors/CardsEditor.tsx +2 -4
- package/src/client/components/editors/CodeEditor.tsx +1 -3
- package/src/client/components/editors/FileTreeEditor.tsx +2 -4
- package/src/client/components/editors/ImageEditor.tsx +3 -3
- package/src/client/components/editors/ParagraphEditor.tsx +2 -2
- package/src/client/components/editors/SceneEditor.tsx +6 -12
- package/src/client/components/editors/ScriptEditor.tsx +8 -16
- package/src/client/components/editors/SectionEditor.tsx +4 -4
- package/src/client/components/editors/StepItemEditor.tsx +2 -2
- package/src/client/components/editors/StepsEditor.tsx +2 -4
- package/src/client/components/editors/TabItemEditor.tsx +3 -3
- package/src/client/components/editors/TableEditor.tsx +5 -5
- package/src/client/components/editors/TabsEditor.tsx +2 -4
- package/src/client/components/index.ts +3 -0
- package/src/client/loader.ts +3 -0
- package/src/core/diff.ts +145 -0
- package/src/core/excerpt.ts +159 -0
- package/src/core/preview.ts +87 -0
- package/src/core/registry.ts +0 -39
- package/src/core/types/blocks.ts +83 -6
- package/src/core/types/bylines.ts +14 -0
- package/src/core/types/media.ts +13 -0
- package/src/core/types/taxonomies.ts +20 -0
- package/src/cron/scheduled.ts +57 -0
- package/src/docs/agent.ts +116 -0
- package/src/docs/config.ts +25 -0
- package/src/docs/index.ts +5 -0
- package/src/docs/routing.ts +104 -0
- package/src/docs/sidebar.ts +251 -0
- package/src/docs/toc.ts +47 -0
- package/src/env.d.ts +13 -0
- package/src/index.ts +40 -6
- package/src/integration.ts +196 -0
- package/src/loader/live.ts +254 -0
- package/src/markdown/index.ts +0 -1
- package/src/mcp/index.ts +228 -0
- package/src/schema/bylines.ts +23 -0
- package/src/schema/index.ts +3 -0
- package/src/schema/page_versions.ts +2 -0
- package/src/schema/pages.ts +2 -0
- package/src/schema/site_settings.ts +41 -0
- package/src/schema/taxonomies.ts +49 -0
- package/src/services/bylines.ts +74 -0
- package/src/services/search-indexer.ts +61 -0
- package/src/services/site-settings.ts +108 -0
- package/src/services/taxonomies.ts +276 -0
- package/src/storage/index.ts +253 -0
- package/src/astro/blocks/DialogueBlock.astro +0 -23
- package/src/astro/blocks/SceneBlock.astro +0 -65
- package/src/astro/blocks/ScriptBlock.astro +0 -59
- package/src/core/template-sync.ts +0 -75
- package/src/markdown/parser.ts +0 -347
- package/src/migration.ts +0 -155
- 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
|
|
16
|
-
{caption && <figcaption class="mt-2 text-center text-xs text-neutral-500
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
31
|
-
3: "text-2xl font-semibold text-neutral-900
|
|
32
|
-
4: "text-xl font-medium text-neutral-900
|
|
33
|
-
5: "text-lg font-medium text-neutral-800
|
|
34
|
-
6: "text-base font-normal text-neutral-700
|
|
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-
|
|
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-
|
|
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
|
|
20
|
-
{description && <p class="text-sm text-neutral-600
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
34
|
+
<tbody class="divide-y divide-neutral-200 bg-default">
|
|
35
35
|
{rows.map((row: any) => (
|
|
36
|
-
<tr class="hover:bg-neutral-50/50
|
|
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
|
|
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
|
|
16
|
-
<div class="flex items-center gap-1 border-b border-neutral-200
|
|
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
|
-
|
|
26
|
-
|
|
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
|
|
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', '
|
|
52
|
-
b.classList.add('text-neutral-600', '
|
|
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', '
|
|
55
|
-
btn.classList.remove('text-neutral-600', '
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
482
|
-
Block type: <span class="font-semibold text-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
274
|
-
classList={{ "bg-neutral-100
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
</>
|