sdui-web 0.6.0 → 0.7.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/SduiRenderer.tsx","../../src/utils.ts","../../src/modifiers.ts","../../src/components/text.ts","../../src/components/image.ts","../../src/components/box.ts","../../src/components/column.ts","../../src/components/row.ts","../../src/components/lazy-column.ts","../../src/components/index.ts","../../src/render.ts","../../src/component-meta.ts","../../src/index.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { render } from '../index';\n\nexport interface SduiRendererProps {\n json: string;\n theme?: 'light' | 'dark';\n deviceWidth: number;\n deviceHeight: number;\n filePreviewMap?: Record<string, string>;\n selectedId?: string | null;\n onClickNode?: (nodeId: string) => void;\n onClickOutside?: () => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function SduiRenderer({\n json,\n theme = 'light',\n deviceWidth,\n deviceHeight,\n filePreviewMap,\n selectedId,\n onClickNode,\n onClickOutside,\n className,\n style,\n}: SduiRendererProps) {\n const renderRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerSize, setContainerSize] = useState({ w: 0, h: 0 });\n const [error, setError] = useState<string | null>(null);\n\n // Container-aware scaling\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const { width, height } = entries[0].contentRect;\n setContainerSize({ w: width, h: height });\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // Render with sdui-web\n useEffect(() => {\n const el = renderRef.current;\n if (!el) return;\n\n try {\n let renderJson = json;\n if (filePreviewMap) {\n for (const [fileName, blobUrl] of Object.entries(filePreviewMap)) {\n renderJson = renderJson.replaceAll(JSON.stringify(fileName), JSON.stringify(blobUrl));\n }\n }\n JSON.parse(renderJson);\n setError(null);\n render(renderJson, el, { theme });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Render error');\n el.innerHTML = '';\n }\n }, [json, theme, filePreviewMap]);\n\n // Selection highlight\n useEffect(() => {\n const el = renderRef.current;\n if (!el) return;\n el.querySelectorAll('[data-sdui-selected]').forEach(node => {\n node.removeAttribute('data-sdui-selected');\n });\n if (selectedId) {\n const selected = el.querySelector(`[data-sdui-id=\"${selectedId}\"]`);\n if (selected) {\n selected.setAttribute('data-sdui-selected', 'true');\n }\n }\n }, [selectedId, json]);\n\n // Click handler for node selection\n useEffect(() => {\n const el = renderRef.current;\n if (!el || !onClickNode) return;\n function handleClick(e: MouseEvent) {\n e.stopPropagation();\n const target = (e.target as HTMLElement).closest('[data-sdui-id]');\n if (target) {\n onClickNode!((target as HTMLElement).dataset.sduiId!);\n }\n }\n el.addEventListener('click', handleClick);\n return () => el.removeEventListener('click', handleClick);\n }, [onClickNode]);\n\n const padding = 48;\n const totalH = deviceHeight + 10;\n const scaleW = containerSize.w > 0 && deviceWidth > containerSize.w - padding ? (containerSize.w - padding) / deviceWidth : 1;\n const scaleH = containerSize.h > 0 && totalH > containerSize.h - padding ? (containerSize.h - padding) / totalH : 1;\n const scale = Math.min(scaleW, scaleH, 1);\n\n let rootScrollable = false;\n try {\n const parsed = JSON.parse(json);\n const root = parsed.root;\n if (root) {\n rootScrollable = root.type === 'lazy_column' || root.properties?.canScroll === true;\n }\n } catch { /* ignore */ }\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'flex-start',\n padding: '24px 16px',\n ...style,\n }}\n onClick={onClickOutside}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n position: 'relative',\n alignSelf: 'flex-start',\n width: `${deviceWidth}px`,\n transform: scale < 1 ? `scale(${scale})` : undefined,\n transformOrigin: 'top center',\n }}\n >\n {/* Device outer shell */}\n <div\n style={{\n borderRadius: '36px',\n padding: '3px',\n background: 'linear-gradient(145deg, rgba(255,255,255,0.12), rgba(255,255,255,0.04))',\n boxShadow: '0 24px 80px rgba(0,0,0,0.5), 0 8px 32px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.06)',\n }}\n >\n <div style={{ borderRadius: '33px', overflow: 'hidden', background: '#1c1c1e' }}>\n {/* Status bar */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '8px 24px', height: '28px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600, color: 'rgba(255,255,255,0.7)', fontFamily: 'system-ui' }}>9:41</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill=\"none\">\n <rect x=\"0\" y=\"6\" width=\"2.5\" height=\"4\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n <rect x=\"3.8\" y=\"4\" width=\"2.5\" height=\"6\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n <rect x=\"7.6\" y=\"2\" width=\"2.5\" height=\"8\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n <rect x=\"11.4\" y=\"0\" width=\"2.5\" height=\"10\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n </svg>\n <svg width=\"20\" height=\"10\" viewBox=\"0 0 20 10\" fill=\"none\">\n <rect x=\"0.5\" y=\"0.5\" width=\"16\" height=\"9\" rx=\"2\" stroke=\"rgba(255,255,255,0.4)\" strokeWidth=\"1\" />\n <rect x=\"17\" y=\"3\" width=\"2\" height=\"4\" rx=\"0.5\" fill=\"rgba(255,255,255,0.3)\" />\n <rect x=\"1.5\" y=\"1.5\" width=\"14\" height=\"7\" rx=\"1\" fill=\"rgba(255,255,255,0.5)\" />\n </svg>\n </div>\n </div>\n {/* Dynamic Island */}\n <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '4px' }}>\n <div style={{ width: '120px', height: '28px', background: '#000', borderRadius: '14px' }} />\n </div>\n {/* Screen content */}\n <div\n ref={renderRef}\n style={{\n background: theme === 'dark' ? '#121212' : '#ffffff',\n color: theme === 'dark' ? '#ffffff' : '#000000',\n height: `${deviceHeight - 60}px`,\n borderBottomLeftRadius: '33px',\n borderBottomRightRadius: '33px',\n overflow: rootScrollable ? 'auto' : 'hidden',\n }}\n />\n </div>\n </div>\n {/* Home indicator */}\n <div style={{ display: 'flex', justifyContent: 'center', marginTop: '-18px', position: 'relative', zIndex: 10 }}>\n <div style={{ width: '120px', height: '4px', background: 'rgba(255,255,255,0.2)', borderRadius: '2px' }} />\n </div>\n </div>\n {error && (\n <div style={{\n position: 'absolute', bottom: '24px', left: '50%', transform: 'translateX(-50%)',\n width: '100%', maxWidth: '375px', padding: '12px', borderRadius: '8px',\n background: 'rgba(239,68,68,0.1)', border: '1px solid rgba(239,68,68,0.2)',\n }}>\n <p style={{ fontSize: '13px', fontFamily: 'monospace', color: '#ef4444', wordBreak: 'break-all' }}>{error}</p>\n </div>\n )}\n </div>\n );\n}\n","import type { ColorModel, SizeModel, SpacingModel, Theme } from './types'\n\nexport function resolveColor(color: ColorModel | undefined, theme: Theme): string | undefined {\n if (!color) return undefined\n if (theme === 'dark') {\n return color.dark ?? color.light\n }\n return color.light ?? color.dark\n}\n\nexport function resolveSize(size: SizeModel | undefined): string | undefined {\n if (!size || !size.unit) return undefined\n switch (size.unit) {\n case 'dp':\n return `${size.value ?? 0}px`\n case 'match_parent':\n return '100%'\n case 'wrap_content':\n return 'fit-content'\n default:\n return undefined\n }\n}\n\nexport function resolveSpacing(spacing: SpacingModel | undefined): {\n top?: string\n bottom?: string\n left?: string\n right?: string\n} {\n if (!spacing) return {}\n return {\n top: spacing.top != null ? `${spacing.top}px` : undefined,\n bottom: spacing.bottom != null ? `${spacing.bottom}px` : undefined,\n left: spacing.start != null ? `${spacing.start}px` : undefined,\n right: spacing.end != null ? `${spacing.end}px` : undefined,\n }\n}\n","import type { BackgroundColorModel, ContainerUiModifier, ImageUiModifier, ModifierBase, TextUiModifier, Theme } from './types'\nimport { resolveColor, resolveSize, resolveSpacing } from './utils'\n\nexport function applyModifier(element: HTMLElement, modifier: ModifierBase | undefined, theme: Theme): void {\n if (!modifier) return\n\n const s = element.style\n\n // alignment → align-self (+ justify-self for 2-axis Box alignments)\n if (modifier.alignment) {\n switch (modifier.alignment) {\n // Single-axis (Column / Row children)\n case 'center':\n case 'center_horizontally':\n case 'center_vertically':\n s.alignSelf = 'center'\n break\n case 'start':\n case 'top':\n s.alignSelf = 'flex-start'\n break\n case 'end':\n case 'bottom':\n s.alignSelf = 'flex-end'\n break\n // Two-axis (Box children — grid layout)\n case 'top_start':\n s.alignSelf = 'start'; s.justifySelf = 'start'\n break\n case 'top_center':\n s.alignSelf = 'start'; s.justifySelf = 'center'\n break\n case 'top_end':\n s.alignSelf = 'start'; s.justifySelf = 'end'\n break\n case 'center_start':\n s.alignSelf = 'center'; s.justifySelf = 'start'\n break\n case 'center_end':\n s.alignSelf = 'center'; s.justifySelf = 'end'\n break\n case 'bottom_start':\n s.alignSelf = 'end'; s.justifySelf = 'start'\n break\n case 'bottom_center':\n s.alignSelf = 'end'; s.justifySelf = 'center'\n break\n case 'bottom_end':\n s.alignSelf = 'end'; s.justifySelf = 'end'\n break\n }\n }\n\n // weight → flex\n if (modifier.weight != null) {\n s.flex = `${modifier.weight}`\n s.minWidth = '0'\n s.minHeight = '0'\n }\n\n // action → click handler\n if (modifier.action) {\n const action = modifier.action\n s.cursor = 'pointer'\n element.addEventListener('click', (e) => {\n e.stopPropagation()\n element.dispatchEvent(new CustomEvent('sdui:action', {\n bubbles: true,\n detail: { type: action.type, params: action.params },\n }))\n })\n }\n\n // Extended modifier fields (width, height, padding, margin, backgroundColor, aspectRatio)\n const mod = modifier as ContainerUiModifier | ImageUiModifier | TextUiModifier\n\n const hasAspectRatio = 'aspectRatio' in mod && mod.aspectRatio != null\n const hasWidth = 'width' in mod && mod.width\n const hasHeight = 'height' in mod && (mod as ContainerUiModifier).height\n\n if (hasWidth) {\n const w = resolveSize(mod.width)\n if (w) s.width = w\n }\n\n if (hasHeight && !(hasAspectRatio && hasWidth)) {\n const h = resolveSize((mod as ContainerUiModifier).height)\n if (h) s.height = h\n }\n\n if (hasAspectRatio) {\n s.aspectRatio = `${(mod as ContainerUiModifier).aspectRatio}`\n }\n\n if ('padding' in mod && mod.padding) {\n const p = resolveSpacing((mod as ContainerUiModifier).padding)\n if (p.top) s.paddingTop = p.top\n if (p.bottom) s.paddingBottom = p.bottom\n if (p.left) s.paddingLeft = p.left\n if (p.right) s.paddingRight = p.right\n }\n\n if ('margin' in mod && mod.margin) {\n const m = resolveSpacing(mod.margin)\n if (m.top) s.marginTop = m.top\n if (m.bottom) s.marginBottom = m.bottom\n if (m.left) s.marginLeft = m.left\n if (m.right) s.marginRight = m.right\n }\n\n if ('backgroundColor' in mod && mod.backgroundColor) {\n applyBackground(s, (mod as ContainerUiModifier).backgroundColor!, theme)\n }\n}\n\nfunction applyBackground(s: CSSStyleDeclaration, bg: BackgroundColorModel, theme: Theme): void {\n if (!bg.colors || bg.colors.length === 0) return\n\n const colors = bg.colors.map((c) => resolveColor(c, theme)).filter(Boolean) as string[]\n if (colors.length === 0) return\n\n switch (bg.type) {\n case 'single':\n s.backgroundColor = colors[0]\n break\n case 'vertical_gradient':\n s.background = `linear-gradient(to bottom, ${colors.join(', ')})`\n break\n case 'horizontal_gradient':\n s.background = `linear-gradient(to right, ${colors.join(', ')})`\n break\n case 'linear_gradient':\n s.background = `linear-gradient(${colors.join(', ')})`\n break\n default:\n if (colors.length === 1) {\n s.backgroundColor = colors[0]\n }\n break\n }\n}\n","import type { SduiComponent, TextUiProperties, Theme } from '../types'\nimport { resolveColor } from '../utils'\nimport { applyModifier } from '../modifiers'\n\nexport function renderText(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as TextUiProperties | undefined\n const el = document.createElement('span')\n\n el.textContent = props?.text ?? ''\n\n if (props?.fontSize != null) {\n el.style.fontSize = `${props.fontSize}px`\n }\n\n if (props?.color) {\n const c = resolveColor(props.color, theme)\n if (c) el.style.color = c\n }\n\n if (props?.fontWeight) {\n switch (props.fontWeight) {\n case 'bold':\n el.style.fontWeight = '700'\n break\n case 'semi_bold':\n el.style.fontWeight = '600'\n break\n case 'medium':\n el.style.fontWeight = '500'\n break\n case 'normal':\n el.style.fontWeight = '400'\n break\n }\n }\n\n if (props?.textAlign) {\n el.style.display = 'block'\n switch (props.textAlign) {\n case 'left':\n case 'start':\n el.style.textAlign = 'left'\n break\n case 'right':\n case 'end':\n el.style.textAlign = 'right'\n break\n case 'center':\n el.style.textAlign = 'center'\n break\n case 'justify':\n el.style.textAlign = 'justify'\n break\n }\n }\n\n if (props?.overflow === 'ellipsis') {\n el.style.textOverflow = 'ellipsis'\n el.style.overflow = 'hidden'\n el.style.whiteSpace = 'nowrap'\n }\n\n if (props?.maxLines != null) {\n el.style.display = '-webkit-box'\n el.style.webkitLineClamp = `${props.maxLines}`\n ;(el.style as unknown as Record<string, string>)['-webkit-box-orient'] = 'vertical'\n el.style.overflow = 'hidden'\n }\n\n if (props?.minLines != null) {\n el.style.minHeight = `${props.minLines * (props.fontSize ?? 16) * 1.4}px`\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, ImageUiProperties, Theme } from '../types'\nimport { resolveColor } from '../utils'\nimport { applyModifier } from '../modifiers'\n\nexport function renderImage(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as ImageUiProperties | undefined\n const el = document.createElement('img') as HTMLImageElement\n el.style.display = 'block'\n el.style.boxSizing = 'border-box'\n\n if (props?.image) {\n el.src = props.image\n }\n\n if (props?.contentDescription) {\n el.alt = props.contentDescription\n }\n\n switch (props?.scaleType) {\n case 'crop':\n el.style.objectFit = 'cover'\n break\n case 'fill_bounds':\n el.style.objectFit = 'fill'\n break\n case 'fill_width':\n el.style.objectFit = 'cover'\n el.style.width = '100%'\n break\n case 'fill_height':\n el.style.objectFit = 'cover'\n el.style.height = '100%'\n break\n case 'none':\n el.style.objectFit = 'none'\n break\n default:\n el.style.objectFit = 'contain'\n break\n }\n\n if (props?.tintColor) {\n const c = resolveColor(props.tintColor, theme)\n if (c) {\n el.style.filter = `opacity(0.5) drop-shadow(0 0 0 ${c})`\n }\n }\n\n if (props?.aspectRatio != null) {\n el.style.aspectRatio = `${props.aspectRatio}`\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, BoxUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderBox(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as BoxUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'grid'\n el.style.position = 'relative'\n\n // All children share the same grid cell (like Compose FrameLayout)\n // Default alignment for all children\n if (props?.alignment) {\n switch (props.alignment) {\n case 'top_start':\n el.style.justifyItems = 'start'\n el.style.alignItems = 'start'\n break\n case 'top_center':\n el.style.justifyItems = 'center'\n el.style.alignItems = 'start'\n break\n case 'top_end':\n el.style.justifyItems = 'end'\n el.style.alignItems = 'start'\n break\n case 'center_start':\n el.style.justifyItems = 'start'\n el.style.alignItems = 'center'\n break\n case 'center':\n el.style.justifyItems = 'center'\n el.style.alignItems = 'center'\n break\n case 'center_end':\n el.style.justifyItems = 'end'\n el.style.alignItems = 'center'\n break\n case 'bottom_start':\n el.style.justifyItems = 'start'\n el.style.alignItems = 'end'\n break\n case 'bottom_center':\n el.style.justifyItems = 'center'\n el.style.alignItems = 'end'\n break\n case 'bottom_end':\n el.style.justifyItems = 'end'\n el.style.alignItems = 'end'\n break\n }\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, ColumnUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderColumn(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as ColumnUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'flex'\n el.style.flexDirection = 'column'\n\n if (props?.verticalArrangement) {\n const arr = props.verticalArrangement\n switch (arr.type) {\n case 'top':\n el.style.justifyContent = 'flex-start'\n break\n case 'center':\n el.style.justifyContent = 'center'\n break\n case 'bottom':\n el.style.justifyContent = 'flex-end'\n break\n case 'space_between':\n el.style.justifyContent = 'space-between'\n break\n case 'space_evenly':\n el.style.justifyContent = 'space-evenly'\n break\n case 'space_around':\n el.style.justifyContent = 'space-around'\n break\n case 'spaced_by':\n el.style.justifyContent = 'flex-start'\n if (arr.spacing != null) {\n el.style.gap = `${arr.spacing}px`\n }\n break\n }\n }\n\n if (props?.horizontalAlignment) {\n switch (props.horizontalAlignment) {\n case 'start':\n el.style.alignItems = 'flex-start'\n break\n case 'end':\n el.style.alignItems = 'flex-end'\n break\n case 'center_horizontally':\n el.style.alignItems = 'center'\n break\n }\n }\n\n if (props?.canScroll) {\n el.style.overflowY = 'auto'\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, RowUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderRow(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as RowUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'flex'\n el.style.flexDirection = 'row'\n\n if (props?.horizontalArrangement) {\n const arr = props.horizontalArrangement\n switch (arr.type) {\n case 'start':\n el.style.justifyContent = 'flex-start'\n break\n case 'center':\n el.style.justifyContent = 'center'\n break\n case 'end':\n el.style.justifyContent = 'flex-end'\n break\n case 'space_between':\n el.style.justifyContent = 'space-between'\n break\n case 'space_evenly':\n el.style.justifyContent = 'space-evenly'\n break\n case 'space_around':\n el.style.justifyContent = 'space-around'\n break\n case 'spaced_by':\n el.style.justifyContent = 'flex-start'\n if (arr.spacing != null) {\n el.style.gap = `${arr.spacing}px`\n }\n break\n }\n }\n\n if (props?.verticalAlignment) {\n switch (props.verticalAlignment) {\n case 'top':\n el.style.alignItems = 'flex-start'\n break\n case 'bottom':\n el.style.alignItems = 'flex-end'\n break\n case 'center_vertically':\n el.style.alignItems = 'center'\n break\n }\n }\n\n if (props?.canScroll) {\n el.style.overflowX = 'auto'\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, LazyColumnUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderLazyColumn(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as LazyColumnUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'flex'\n el.style.flexDirection = 'column'\n el.style.overflowY = 'auto'\n\n if (props?.verticalArrangement) {\n const arr = props.verticalArrangement\n switch (arr.type) {\n case 'top':\n el.style.justifyContent = 'flex-start'\n break\n case 'center':\n el.style.justifyContent = 'center'\n break\n case 'bottom':\n el.style.justifyContent = 'flex-end'\n break\n case 'space_between':\n el.style.justifyContent = 'space-between'\n break\n case 'space_evenly':\n el.style.justifyContent = 'space-evenly'\n break\n case 'space_around':\n el.style.justifyContent = 'space-around'\n break\n case 'spaced_by':\n el.style.justifyContent = 'flex-start'\n if (arr.spacing != null) {\n el.style.gap = `${arr.spacing}px`\n }\n break\n }\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, Theme } from '../types'\nimport { renderText } from './text'\nimport { renderImage } from './image'\nimport { renderBox } from './box'\nimport { renderColumn } from './column'\nimport { renderRow } from './row'\nimport { renderLazyColumn } from './lazy-column'\n\nexport type ComponentRenderer = (component: SduiComponent, theme: Theme) => HTMLElement\n\nconst renderers: Record<string, ComponentRenderer> = {\n text: renderText,\n image: renderImage,\n box: renderBox,\n column: renderColumn,\n row: renderRow,\n lazy_column: renderLazyColumn,\n}\n\nexport function getRenderer(type: string): ComponentRenderer | undefined {\n return renderers[type]\n}\n","import type { SduiComponent, Theme } from './types'\nimport { getRenderer } from './components'\n\nexport function renderComponent(component: SduiComponent, theme: Theme): HTMLElement {\n const renderer = getRenderer(component.type)\n\n if (!renderer) {\n console.warn(`[sdui] Unknown component type: \"${component.type}\"`)\n const el = document.createElement('div')\n el.dataset.sduiUnknown = component.type\n return el\n }\n\n const el = renderer(component, theme)\n el.dataset.sduiType = component.type\n if ((component as any).__builderId) {\n el.dataset.sduiId = (component as any).__builderId\n }\n\n if (component.children && component.children.length > 0) {\n for (const child of component.children) {\n el.appendChild(renderComponent(child, theme))\n }\n }\n\n return el\n}\n","import type { ComponentMeta, PropertyDescriptor } from './types'\n\n// === Reusable sub-object property builders ===\n\nfunction sizeModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'value', label: 'Value', type: 'number' },\n { name: 'unit', label: 'Unit', type: 'enum', enumValues: ['dp', 'match_parent', 'wrap_content'] },\n ]\n}\n\nfunction spacingModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'top', label: 'Top', type: 'number' },\n { name: 'bottom', label: 'Bottom', type: 'number' },\n { name: 'start', label: 'Start', type: 'number' },\n { name: 'end', label: 'End', type: 'number' },\n ]\n}\n\nfunction colorModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'light', label: 'Light', type: 'color' },\n { name: 'dark', label: 'Dark', type: 'color' },\n ]\n}\n\nfunction actionModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'type', label: 'Action Type', type: 'string' },\n { name: 'params', label: 'Parameters', type: 'object' },\n ]\n}\n\nfunction backgroundColorModelProperties(): PropertyDescriptor[] {\n return [\n {\n name: 'colors',\n label: 'Colors',\n type: 'object',\n isArray: true,\n properties: colorModelProperties(),\n },\n {\n name: 'type',\n label: 'Background Type',\n type: 'enum',\n enumValues: ['single', 'vertical_gradient', 'horizontal_gradient', 'linear_gradient'],\n },\n ]\n}\n\n// === Modifier builders ===\n\nfunction modifierBaseProperties(): PropertyDescriptor[] {\n return [\n {\n name: 'alignment',\n label: 'Alignment',\n type: 'enum',\n enumValues: ['start', 'end', 'center', 'center_horizontally', 'center_vertically', 'top', 'bottom', 'top_start', 'top_center', 'top_end', 'center_start', 'center_end', 'bottom_start', 'bottom_center', 'bottom_end'],\n },\n { name: 'weight', label: 'Weight', type: 'number' },\n { name: 'action', label: 'Action', type: 'object', properties: actionModelProperties() },\n ]\n}\n\nfunction textModifierDescriptor(): PropertyDescriptor {\n return {\n name: 'modifier',\n label: 'Modifier',\n type: 'object',\n properties: [\n ...modifierBaseProperties(),\n { name: 'width', label: 'Width', type: 'object', properties: sizeModelProperties() },\n { name: 'margin', label: 'Margin', type: 'object', properties: spacingModelProperties() },\n ],\n }\n}\n\nfunction imageModifierDescriptor(): PropertyDescriptor {\n return {\n name: 'modifier',\n label: 'Modifier',\n type: 'object',\n properties: [\n ...modifierBaseProperties(),\n { name: 'width', label: 'Width', type: 'object', properties: sizeModelProperties() },\n { name: 'height', label: 'Height', type: 'object', properties: sizeModelProperties() },\n { name: 'padding', label: 'Padding', type: 'object', properties: spacingModelProperties() },\n { name: 'margin', label: 'Margin', type: 'object', properties: spacingModelProperties() },\n ],\n }\n}\n\nfunction containerModifierDescriptor(): PropertyDescriptor {\n return {\n name: 'modifier',\n label: 'Modifier',\n type: 'object',\n properties: [\n ...modifierBaseProperties(),\n { name: 'backgroundColor', label: 'Background Color', type: 'object', properties: backgroundColorModelProperties() },\n { name: 'width', label: 'Width', type: 'object', properties: sizeModelProperties() },\n { name: 'height', label: 'Height', type: 'object', properties: sizeModelProperties() },\n { name: 'padding', label: 'Padding', type: 'object', properties: spacingModelProperties() },\n { name: 'margin', label: 'Margin', type: 'object', properties: spacingModelProperties() },\n { name: 'aspectRatio', label: 'Aspect Ratio', type: 'number' },\n ],\n }\n}\n\n// === Arrangement descriptors ===\n\nfunction verticalArrangementDescriptor(): PropertyDescriptor {\n return {\n name: 'verticalArrangement',\n label: 'Vertical Arrangement',\n type: 'object',\n properties: [\n {\n name: 'type',\n label: 'Type',\n type: 'enum',\n enumValues: ['top', 'center', 'bottom', 'space_evenly', 'space_between', 'space_around', 'spaced_by'],\n },\n { name: 'spacing', label: 'Spacing', type: 'number' },\n ],\n }\n}\n\nfunction horizontalArrangementDescriptor(): PropertyDescriptor {\n return {\n name: 'horizontalArrangement',\n label: 'Horizontal Arrangement',\n type: 'object',\n properties: [\n {\n name: 'type',\n label: 'Type',\n type: 'enum',\n enumValues: ['start', 'center', 'end', 'space_between', 'space_evenly', 'space_around', 'spaced_by'],\n },\n { name: 'spacing', label: 'Spacing', type: 'number' },\n ],\n }\n}\n\n// === Component definitions ===\n\nconst COMPONENT_DEFINITIONS: ComponentMeta[] = [\n {\n type: 'text',\n label: 'Text',\n acceptsChildren: false,\n properties: [\n { name: 'text', label: 'Text', type: 'string', required: true, defaultValue: 'Text' },\n { name: 'fontSize', label: 'Font Size', type: 'number' },\n { name: 'color', label: 'Color', type: 'object', properties: colorModelProperties() },\n { name: 'fontWeight', label: 'Font Weight', type: 'enum', enumValues: ['bold', 'medium', 'normal', 'semi_bold'] },\n { name: 'textAlign', label: 'Text Align', type: 'enum', enumValues: ['left', 'right', 'center', 'justify', 'start', 'end', 'unspecified'] },\n { name: 'overflow', label: 'Overflow', type: 'enum', enumValues: ['none', 'ellipsis'] },\n { name: 'maxLines', label: 'Max Lines', type: 'number' },\n { name: 'minLines', label: 'Min Lines', type: 'number', defaultValue: 1 },\n textModifierDescriptor(),\n ],\n },\n {\n type: 'image',\n label: 'Image',\n acceptsChildren: false,\n properties: [\n { name: 'image', label: 'Image URL', type: 'string', required: true },\n { name: 'scaleType', label: 'Scale Type', type: 'enum', enumValues: ['fit', 'crop', 'fill_height', 'fill_width', 'fill_bounds', 'inside', 'none'] },\n { name: 'contentDescription', label: 'Content Description', type: 'string' },\n { name: 'aspectRatio', label: 'Aspect Ratio', type: 'number' },\n { name: 'tintColor', label: 'Tint Color', type: 'object', properties: colorModelProperties() },\n imageModifierDescriptor(),\n ],\n },\n {\n type: 'box',\n label: 'Box',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n {\n name: 'alignment',\n label: 'Alignment',\n type: 'enum',\n enumValues: ['top_start', 'top_center', 'top_end', 'center_start', 'center', 'center_end', 'bottom_start', 'bottom_center', 'bottom_end'],\n },\n ],\n },\n {\n type: 'column',\n label: 'Column',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n verticalArrangementDescriptor(),\n { name: 'horizontalAlignment', label: 'Horizontal Alignment', type: 'enum', enumValues: ['start', 'end', 'center_horizontally'] },\n { name: 'canScroll', label: 'Can Scroll', type: 'boolean' },\n ],\n },\n {\n type: 'row',\n label: 'Row',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n { name: 'verticalAlignment', label: 'Vertical Alignment', type: 'enum', enumValues: ['top', 'bottom', 'center_vertically'] },\n horizontalArrangementDescriptor(),\n { name: 'canScroll', label: 'Can Scroll', type: 'boolean' },\n ],\n },\n {\n type: 'lazy_column',\n label: 'Lazy Column',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n verticalArrangementDescriptor(),\n ],\n },\n]\n\n// === Public API ===\n\nexport function getComponents(): ComponentMeta[] {\n return JSON.parse(JSON.stringify(COMPONENT_DEFINITIONS))\n}\n","import type { SduiScreen, Theme } from './types'\nimport { renderComponent } from './render'\n\nexport interface RenderOptions {\n theme?: Theme\n}\n\nexport function render(json: string, container: HTMLElement, options?: RenderOptions): void {\n const screen: SduiScreen = JSON.parse(json)\n const theme: Theme = options?.theme ?? 'light'\n\n const root = renderComponent(screen.root, theme)\n\n container.innerHTML = ''\n container.appendChild(root)\n}\n\nexport { getComponents } from './component-meta'\nexport { getDevicePresets } from './device-presets'\nexport type { DevicePreset, DeviceCategory } from './device-presets'\n\nexport type {\n // Root models\n SduiScreen,\n SduiComponent,\n Theme,\n // Properties\n PropertiesModel,\n TextUiProperties,\n ImageUiProperties,\n BoxUiProperties,\n ColumnUiProperties,\n RowUiProperties,\n LazyColumnUiProperties,\n DefaultUiProperties,\n // Modifiers\n ModifierBase,\n TextUiModifier,\n ContainerUiModifier,\n ImageUiModifier,\n // Base models\n ColorModel,\n SizeModel,\n SpacingModel,\n ActionModel,\n BackgroundColorModel,\n HorizontalArrangementModel,\n VerticalArrangementModel,\n // Enums\n ComponentType,\n AlignmentType,\n FontWeightType,\n SizeUnitType,\n BackgroundColorType,\n ContentScaleType,\n TextAlignType,\n TextOverflowType,\n HorizontalAlignmentType,\n VerticalAlignmentType,\n HorizontalArrangementType,\n VerticalArrangementType,\n // Metadata\n ComponentMeta,\n PropertyDescriptor,\n PropertyType,\n} from './types'\n"],"mappings":"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","names":["el"]}
1
+ {"version":3,"sources":["../../src/react/SduiRenderer.tsx","../../src/utils.ts","../../src/modifiers.ts","../../src/components/text.ts","../../src/components/image.ts","../../src/components/box.ts","../../src/components/column.ts","../../src/components/row.ts","../../src/components/lazy-column.ts","../../src/components/index.ts","../../src/render.ts","../../src/component-meta.ts","../../src/index.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { render } from '../index';\n\nexport interface SduiRendererProps {\n json: string;\n theme?: 'light' | 'dark';\n deviceWidth: number;\n deviceHeight: number;\n filePreviewMap?: Record<string, string>;\n selectedId?: string | null;\n onClickNode?: (nodeId: string) => void;\n onClickOutside?: () => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function SduiRenderer({\n json,\n theme = 'light',\n deviceWidth,\n deviceHeight,\n filePreviewMap,\n selectedId,\n onClickNode,\n onClickOutside,\n className,\n style,\n}: SduiRendererProps) {\n const renderRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerSize, setContainerSize] = useState({ w: 0, h: 0 });\n const [error, setError] = useState<string | null>(null);\n\n // Container-aware scaling\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const { width, height } = entries[0].contentRect;\n setContainerSize({ w: width, h: height });\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n // Render with sdui-web\n useEffect(() => {\n const el = renderRef.current;\n if (!el) return;\n\n try {\n let renderJson = json;\n if (filePreviewMap) {\n for (const [fileName, blobUrl] of Object.entries(filePreviewMap)) {\n renderJson = renderJson.replaceAll(JSON.stringify(fileName), JSON.stringify(blobUrl));\n }\n }\n JSON.parse(renderJson);\n setError(null);\n render(renderJson, el, { theme });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Render error');\n el.innerHTML = '';\n }\n }, [json, theme, filePreviewMap]);\n\n // Selection highlight\n useEffect(() => {\n const el = renderRef.current;\n if (!el) return;\n el.querySelectorAll('[data-sdui-selected]').forEach(node => {\n node.removeAttribute('data-sdui-selected');\n });\n if (selectedId) {\n const selected = el.querySelector(`[data-sdui-id=\"${selectedId}\"]`);\n if (selected) {\n selected.setAttribute('data-sdui-selected', 'true');\n }\n }\n }, [selectedId, json]);\n\n // Click handler for node selection\n useEffect(() => {\n const el = renderRef.current;\n if (!el || !onClickNode) return;\n function handleClick(e: MouseEvent) {\n e.stopPropagation();\n const target = (e.target as HTMLElement).closest('[data-sdui-id]');\n if (target) {\n onClickNode!((target as HTMLElement).dataset.sduiId!);\n }\n }\n el.addEventListener('click', handleClick);\n return () => el.removeEventListener('click', handleClick);\n }, [onClickNode]);\n\n const padding = 48;\n const totalH = deviceHeight + 10;\n const scaleW = containerSize.w > 0 && deviceWidth > containerSize.w - padding ? (containerSize.w - padding) / deviceWidth : 1;\n const scaleH = containerSize.h > 0 && totalH > containerSize.h - padding ? (containerSize.h - padding) / totalH : 1;\n const scale = Math.min(scaleW, scaleH, 1);\n\n let rootScrollable = false;\n try {\n const parsed = JSON.parse(json);\n const root = parsed.root;\n if (root) {\n rootScrollable = root.type === 'lazy_column' || root.properties?.canScroll === true;\n }\n } catch { /* ignore */ }\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'flex-start',\n padding: '24px 16px',\n ...style,\n }}\n onClick={onClickOutside}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n position: 'relative',\n alignSelf: 'flex-start',\n width: `${deviceWidth}px`,\n transform: scale < 1 ? `scale(${scale})` : undefined,\n transformOrigin: 'top center',\n }}\n >\n {/* Device outer shell */}\n <div\n style={{\n borderRadius: '36px',\n padding: '3px',\n background: 'linear-gradient(145deg, rgba(255,255,255,0.12), rgba(255,255,255,0.04))',\n boxShadow: '0 24px 80px rgba(0,0,0,0.5), 0 8px 32px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.06)',\n }}\n >\n <div style={{ borderRadius: '33px', overflow: 'hidden', background: '#1c1c1e' }}>\n {/* Status bar */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '8px 24px', height: '28px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600, color: 'rgba(255,255,255,0.7)', fontFamily: 'system-ui' }}>9:41</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill=\"none\">\n <rect x=\"0\" y=\"6\" width=\"2.5\" height=\"4\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n <rect x=\"3.8\" y=\"4\" width=\"2.5\" height=\"6\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n <rect x=\"7.6\" y=\"2\" width=\"2.5\" height=\"8\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n <rect x=\"11.4\" y=\"0\" width=\"2.5\" height=\"10\" rx=\"0.5\" fill=\"rgba(255,255,255,0.5)\" />\n </svg>\n <svg width=\"20\" height=\"10\" viewBox=\"0 0 20 10\" fill=\"none\">\n <rect x=\"0.5\" y=\"0.5\" width=\"16\" height=\"9\" rx=\"2\" stroke=\"rgba(255,255,255,0.4)\" strokeWidth=\"1\" />\n <rect x=\"17\" y=\"3\" width=\"2\" height=\"4\" rx=\"0.5\" fill=\"rgba(255,255,255,0.3)\" />\n <rect x=\"1.5\" y=\"1.5\" width=\"14\" height=\"7\" rx=\"1\" fill=\"rgba(255,255,255,0.5)\" />\n </svg>\n </div>\n </div>\n {/* Dynamic Island */}\n <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '4px' }}>\n <div style={{ width: '120px', height: '28px', background: '#000', borderRadius: '14px' }} />\n </div>\n {/* Screen content */}\n <div\n ref={renderRef}\n style={{\n background: theme === 'dark' ? '#121212' : '#ffffff',\n color: theme === 'dark' ? '#ffffff' : '#000000',\n height: `${deviceHeight - 60}px`,\n borderBottomLeftRadius: '33px',\n borderBottomRightRadius: '33px',\n overflow: rootScrollable ? 'auto' : 'hidden',\n }}\n />\n </div>\n </div>\n {/* Home indicator */}\n <div style={{ display: 'flex', justifyContent: 'center', marginTop: '-18px', position: 'relative', zIndex: 10 }}>\n <div style={{ width: '120px', height: '4px', background: 'rgba(255,255,255,0.2)', borderRadius: '2px' }} />\n </div>\n </div>\n {error && (\n <div style={{\n position: 'absolute', bottom: '24px', left: '50%', transform: 'translateX(-50%)',\n width: '100%', maxWidth: '375px', padding: '12px', borderRadius: '8px',\n background: 'rgba(239,68,68,0.1)', border: '1px solid rgba(239,68,68,0.2)',\n }}>\n <p style={{ fontSize: '13px', fontFamily: 'monospace', color: '#ef4444', wordBreak: 'break-all' }}>{error}</p>\n </div>\n )}\n </div>\n );\n}\n","import type { ColorModel, SizeModel, SpacingModel, Theme } from './types'\n\nexport function resolveColor(color: ColorModel | undefined, theme: Theme): string | undefined {\n if (!color) return undefined\n if (theme === 'dark') {\n return color.dark ?? color.light\n }\n return color.light ?? color.dark\n}\n\nexport function resolveSize(size: SizeModel | undefined): string | undefined {\n if (!size || !size.unit) return undefined\n switch (size.unit) {\n case 'dp':\n return `${size.value ?? 0}px`\n case 'match_parent':\n return '100%'\n case 'wrap_content':\n return 'fit-content'\n default:\n return undefined\n }\n}\n\nexport function resolveSpacing(spacing: SpacingModel | undefined): {\n top?: string\n bottom?: string\n left?: string\n right?: string\n} {\n if (!spacing) return {}\n return {\n top: spacing.top != null ? `${spacing.top}px` : undefined,\n bottom: spacing.bottom != null ? `${spacing.bottom}px` : undefined,\n left: spacing.start != null ? `${spacing.start}px` : undefined,\n right: spacing.end != null ? `${spacing.end}px` : undefined,\n }\n}\n","import type { BackgroundColorModel, ContainerUiModifier, ImageUiModifier, ModifierBase, TextUiModifier, Theme } from './types'\nimport { resolveColor, resolveSize, resolveSpacing } from './utils'\n\nexport function applyModifier(element: HTMLElement, modifier: ModifierBase | undefined, theme: Theme): void {\n if (!modifier) return\n\n const s = element.style\n\n // alignment → align-self (+ justify-self for 2-axis Box alignments)\n if (modifier.alignment) {\n switch (modifier.alignment) {\n // Single-axis (Column / Row children)\n case 'center':\n case 'center_horizontally':\n case 'center_vertically':\n s.alignSelf = 'center'\n break\n case 'start':\n case 'top':\n s.alignSelf = 'flex-start'\n break\n case 'end':\n case 'bottom':\n s.alignSelf = 'flex-end'\n break\n // Two-axis (Box children — grid layout)\n case 'top_start':\n s.alignSelf = 'start'; s.justifySelf = 'start'\n break\n case 'top_center':\n s.alignSelf = 'start'; s.justifySelf = 'center'\n break\n case 'top_end':\n s.alignSelf = 'start'; s.justifySelf = 'end'\n break\n case 'center_start':\n s.alignSelf = 'center'; s.justifySelf = 'start'\n break\n case 'center_end':\n s.alignSelf = 'center'; s.justifySelf = 'end'\n break\n case 'bottom_start':\n s.alignSelf = 'end'; s.justifySelf = 'start'\n break\n case 'bottom_center':\n s.alignSelf = 'end'; s.justifySelf = 'center'\n break\n case 'bottom_end':\n s.alignSelf = 'end'; s.justifySelf = 'end'\n break\n }\n }\n\n // weight → flex\n if (modifier.weight != null) {\n s.flex = `${modifier.weight}`\n s.minWidth = '0'\n s.minHeight = '0'\n }\n\n // action → click handler\n if (modifier.action) {\n const action = modifier.action\n s.cursor = 'pointer'\n element.addEventListener('click', (e) => {\n e.stopPropagation()\n element.dispatchEvent(new CustomEvent('sdui:action', {\n bubbles: true,\n detail: { type: action.type, params: action.params },\n }))\n })\n }\n\n // Extended modifier fields (width, height, padding, margin, backgroundColor, aspectRatio)\n const mod = modifier as ContainerUiModifier | ImageUiModifier | TextUiModifier\n\n const hasAspectRatio = 'aspectRatio' in mod && mod.aspectRatio != null\n const hasWidth = 'width' in mod && mod.width\n const hasHeight = 'height' in mod && (mod as ContainerUiModifier).height\n\n if (hasWidth) {\n const w = resolveSize(mod.width)\n if (w) s.width = w\n }\n\n if (hasHeight && !(hasAspectRatio && hasWidth)) {\n const h = resolveSize((mod as ContainerUiModifier).height)\n if (h) s.height = h\n }\n\n if (hasAspectRatio) {\n s.aspectRatio = `${(mod as ContainerUiModifier).aspectRatio}`\n }\n\n if ('padding' in mod && mod.padding) {\n const p = resolveSpacing((mod as ContainerUiModifier).padding)\n if (p.top) s.paddingTop = p.top\n if (p.bottom) s.paddingBottom = p.bottom\n if (p.left) s.paddingLeft = p.left\n if (p.right) s.paddingRight = p.right\n }\n\n if ('margin' in mod && mod.margin) {\n const m = resolveSpacing(mod.margin)\n if (m.top) s.marginTop = m.top\n if (m.bottom) s.marginBottom = m.bottom\n if (m.left) s.marginLeft = m.left\n if (m.right) s.marginRight = m.right\n }\n\n if ('backgroundColor' in mod && mod.backgroundColor) {\n applyBackground(s, (mod as ContainerUiModifier).backgroundColor!, theme)\n }\n}\n\nfunction applyBackground(s: CSSStyleDeclaration, bg: BackgroundColorModel, theme: Theme): void {\n if (!bg.colors || bg.colors.length === 0) return\n\n const colors = bg.colors.map((c) => resolveColor(c, theme)).filter(Boolean) as string[]\n if (colors.length === 0) return\n\n switch (bg.type) {\n case 'single':\n s.backgroundColor = colors[0]\n break\n case 'vertical_gradient':\n s.background = `linear-gradient(to bottom, ${colors.join(', ')})`\n break\n case 'horizontal_gradient':\n s.background = `linear-gradient(to right, ${colors.join(', ')})`\n break\n case 'linear_gradient':\n s.background = `linear-gradient(${colors.join(', ')})`\n break\n default:\n if (colors.length === 1) {\n s.backgroundColor = colors[0]\n }\n break\n }\n}\n","import type { SduiComponent, TextUiProperties, Theme } from '../types'\nimport { resolveColor } from '../utils'\nimport { applyModifier } from '../modifiers'\n\nexport function renderText(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as TextUiProperties | undefined\n const el = document.createElement('span')\n\n el.textContent = props?.text ?? ''\n\n if (props?.fontSize != null) {\n el.style.fontSize = `${props.fontSize}px`\n }\n\n if (props?.color) {\n const c = resolveColor(props.color, theme)\n if (c) el.style.color = c\n }\n\n if (props?.fontWeight) {\n switch (props.fontWeight) {\n case 'bold':\n el.style.fontWeight = '700'\n break\n case 'semi_bold':\n el.style.fontWeight = '600'\n break\n case 'medium':\n el.style.fontWeight = '500'\n break\n case 'normal':\n el.style.fontWeight = '400'\n break\n }\n }\n\n if (props?.textAlign) {\n el.style.display = 'block'\n switch (props.textAlign) {\n case 'left':\n case 'start':\n el.style.textAlign = 'left'\n break\n case 'right':\n case 'end':\n el.style.textAlign = 'right'\n break\n case 'center':\n el.style.textAlign = 'center'\n break\n case 'justify':\n el.style.textAlign = 'justify'\n break\n }\n }\n\n if (props?.overflow === 'ellipsis') {\n el.style.textOverflow = 'ellipsis'\n el.style.overflow = 'hidden'\n el.style.whiteSpace = 'nowrap'\n }\n\n if (props?.maxLines != null) {\n el.style.display = '-webkit-box'\n el.style.webkitLineClamp = `${props.maxLines}`\n ;(el.style as unknown as Record<string, string>)['-webkit-box-orient'] = 'vertical'\n el.style.overflow = 'hidden'\n }\n\n if (props?.minLines != null) {\n el.style.minHeight = `${props.minLines * (props.fontSize ?? 16) * 1.4}px`\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, ImageUiProperties, Theme } from '../types'\nimport { resolveColor } from '../utils'\nimport { applyModifier } from '../modifiers'\n\nexport function renderImage(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as ImageUiProperties | undefined\n const el = document.createElement('img') as HTMLImageElement\n el.style.display = 'block'\n el.style.boxSizing = 'border-box'\n\n if (props?.image) {\n el.src = props.image\n }\n\n if (props?.contentDescription) {\n el.alt = props.contentDescription\n }\n\n switch (props?.scaleType) {\n case 'crop':\n el.style.objectFit = 'cover'\n break\n case 'fill_bounds':\n el.style.objectFit = 'fill'\n break\n case 'fill_width':\n el.style.objectFit = 'cover'\n el.style.width = '100%'\n break\n case 'fill_height':\n el.style.objectFit = 'cover'\n el.style.height = '100%'\n break\n case 'none':\n el.style.objectFit = 'none'\n break\n default:\n el.style.objectFit = 'contain'\n break\n }\n\n if (props?.tintColor) {\n const c = resolveColor(props.tintColor, theme)\n if (c) {\n el.style.filter = `opacity(0.5) drop-shadow(0 0 0 ${c})`\n }\n }\n\n if (props?.aspectRatio != null) {\n el.style.aspectRatio = `${props.aspectRatio}`\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, BoxUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderBox(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as BoxUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'grid'\n el.style.position = 'relative'\n el.style.overflow = 'hidden'\n\n // All children share the same grid cell (like Compose FrameLayout)\n // Default alignment for all children\n if (props?.contentAlignment) {\n switch (props.contentAlignment) {\n case 'top_start':\n el.style.justifyItems = 'start'\n el.style.alignItems = 'start'\n break\n case 'top_center':\n el.style.justifyItems = 'center'\n el.style.alignItems = 'start'\n break\n case 'top_end':\n el.style.justifyItems = 'end'\n el.style.alignItems = 'start'\n break\n case 'center_start':\n el.style.justifyItems = 'start'\n el.style.alignItems = 'center'\n break\n case 'center':\n el.style.justifyItems = 'center'\n el.style.alignItems = 'center'\n break\n case 'center_end':\n el.style.justifyItems = 'end'\n el.style.alignItems = 'center'\n break\n case 'bottom_start':\n el.style.justifyItems = 'start'\n el.style.alignItems = 'end'\n break\n case 'bottom_center':\n el.style.justifyItems = 'center'\n el.style.alignItems = 'end'\n break\n case 'bottom_end':\n el.style.justifyItems = 'end'\n el.style.alignItems = 'end'\n break\n }\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, ColumnUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderColumn(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as ColumnUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'flex'\n el.style.flexDirection = 'column'\n\n if (props?.verticalArrangement) {\n const arr = props.verticalArrangement\n switch (arr.type) {\n case 'top':\n el.style.justifyContent = 'flex-start'\n break\n case 'center':\n el.style.justifyContent = 'center'\n break\n case 'bottom':\n el.style.justifyContent = 'flex-end'\n break\n case 'space_between':\n el.style.justifyContent = 'space-between'\n break\n case 'space_evenly':\n el.style.justifyContent = 'space-evenly'\n break\n case 'space_around':\n el.style.justifyContent = 'space-around'\n break\n case 'spaced_by':\n el.style.justifyContent = 'flex-start'\n if (arr.spacing != null) {\n el.style.gap = `${arr.spacing}px`\n }\n break\n }\n }\n\n if (props?.horizontalAlignment) {\n switch (props.horizontalAlignment) {\n case 'start':\n el.style.alignItems = 'flex-start'\n break\n case 'end':\n el.style.alignItems = 'flex-end'\n break\n case 'center_horizontally':\n el.style.alignItems = 'center'\n break\n }\n }\n\n if (props?.canScroll) {\n el.style.overflowY = 'auto'\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, RowUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderRow(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as RowUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'flex'\n el.style.flexDirection = 'row'\n\n if (props?.horizontalArrangement) {\n const arr = props.horizontalArrangement\n switch (arr.type) {\n case 'start':\n el.style.justifyContent = 'flex-start'\n break\n case 'center':\n el.style.justifyContent = 'center'\n break\n case 'end':\n el.style.justifyContent = 'flex-end'\n break\n case 'space_between':\n el.style.justifyContent = 'space-between'\n break\n case 'space_evenly':\n el.style.justifyContent = 'space-evenly'\n break\n case 'space_around':\n el.style.justifyContent = 'space-around'\n break\n case 'spaced_by':\n el.style.justifyContent = 'flex-start'\n if (arr.spacing != null) {\n el.style.gap = `${arr.spacing}px`\n }\n break\n }\n }\n\n if (props?.verticalAlignment) {\n switch (props.verticalAlignment) {\n case 'top':\n el.style.alignItems = 'flex-start'\n break\n case 'bottom':\n el.style.alignItems = 'flex-end'\n break\n case 'center_vertically':\n el.style.alignItems = 'center'\n break\n }\n }\n\n if (props?.canScroll) {\n el.style.overflowX = 'auto'\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, LazyColumnUiProperties, Theme } from '../types'\nimport { applyModifier } from '../modifiers'\n\nexport function renderLazyColumn(component: SduiComponent, theme: Theme): HTMLElement {\n const props = component.properties as LazyColumnUiProperties | undefined\n const el = document.createElement('div')\n\n el.style.display = 'flex'\n el.style.flexDirection = 'column'\n el.style.overflowY = 'auto'\n\n if (props?.verticalArrangement) {\n const arr = props.verticalArrangement\n switch (arr.type) {\n case 'top':\n el.style.justifyContent = 'flex-start'\n break\n case 'center':\n el.style.justifyContent = 'center'\n break\n case 'bottom':\n el.style.justifyContent = 'flex-end'\n break\n case 'space_between':\n el.style.justifyContent = 'space-between'\n break\n case 'space_evenly':\n el.style.justifyContent = 'space-evenly'\n break\n case 'space_around':\n el.style.justifyContent = 'space-around'\n break\n case 'spaced_by':\n el.style.justifyContent = 'flex-start'\n if (arr.spacing != null) {\n el.style.gap = `${arr.spacing}px`\n }\n break\n }\n }\n\n applyModifier(el, props?.modifier, theme)\n\n return el\n}\n","import type { SduiComponent, Theme } from '../types'\nimport { renderText } from './text'\nimport { renderImage } from './image'\nimport { renderBox } from './box'\nimport { renderColumn } from './column'\nimport { renderRow } from './row'\nimport { renderLazyColumn } from './lazy-column'\n\nexport type ComponentRenderer = (component: SduiComponent, theme: Theme) => HTMLElement\n\nconst renderers: Record<string, ComponentRenderer> = {\n text: renderText,\n image: renderImage,\n box: renderBox,\n column: renderColumn,\n row: renderRow,\n lazy_column: renderLazyColumn,\n}\n\nexport function getRenderer(type: string): ComponentRenderer | undefined {\n return renderers[type]\n}\n","import type { SduiComponent, Theme } from './types'\nimport { getRenderer } from './components'\n\nexport function renderComponent(component: SduiComponent, theme: Theme): HTMLElement {\n const renderer = getRenderer(component.type)\n\n if (!renderer) {\n console.warn(`[sdui] Unknown component type: \"${component.type}\"`)\n const el = document.createElement('div')\n el.dataset.sduiUnknown = component.type\n return el\n }\n\n const el = renderer(component, theme)\n el.dataset.sduiType = component.type\n if ((component as any).__builderId) {\n el.dataset.sduiId = (component as any).__builderId\n }\n\n if (component.children && component.children.length > 0) {\n for (const child of component.children) {\n el.appendChild(renderComponent(child, theme))\n }\n }\n\n return el\n}\n","import type { ComponentMeta, PropertyDescriptor } from './types'\n\n// === Reusable sub-object property builders ===\n\nfunction sizeModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'value', label: 'Value', type: 'number' },\n { name: 'unit', label: 'Unit', type: 'enum', enumValues: ['dp', 'match_parent', 'wrap_content'] },\n ]\n}\n\nfunction spacingModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'top', label: 'Top', type: 'number' },\n { name: 'bottom', label: 'Bottom', type: 'number' },\n { name: 'start', label: 'Start', type: 'number' },\n { name: 'end', label: 'End', type: 'number' },\n ]\n}\n\nfunction colorModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'light', label: 'Light', type: 'color' },\n { name: 'dark', label: 'Dark', type: 'color' },\n ]\n}\n\nfunction actionModelProperties(): PropertyDescriptor[] {\n return [\n { name: 'type', label: 'Action Type', type: 'string' },\n { name: 'params', label: 'Parameters', type: 'object' },\n ]\n}\n\nfunction backgroundColorModelProperties(): PropertyDescriptor[] {\n return [\n {\n name: 'type',\n label: 'Background Type',\n type: 'enum',\n enumValues: ['single', 'vertical_gradient', 'horizontal_gradient', 'linear_gradient'],\n },\n {\n name: 'colors',\n label: 'Colors',\n type: 'object',\n isArray: true,\n properties: colorModelProperties(),\n },\n ]\n}\n\n// === Modifier builders ===\n\nfunction modifierBaseProperties(): PropertyDescriptor[] {\n return [\n {\n name: 'alignment',\n label: 'Alignment',\n type: 'enum',\n enumValues: ['start', 'end', 'center', 'center_horizontally', 'center_vertically', 'top', 'bottom', 'top_start', 'top_center', 'top_end', 'center_start', 'center_end', 'bottom_start', 'bottom_center', 'bottom_end'],\n },\n { name: 'weight', label: 'Weight', type: 'number' },\n { name: 'action', label: 'Action', type: 'object', properties: actionModelProperties() },\n ]\n}\n\nfunction textModifierDescriptor(): PropertyDescriptor {\n return {\n name: 'modifier',\n label: 'Modifier',\n type: 'object',\n properties: [\n ...modifierBaseProperties(),\n { name: 'width', label: 'Width', type: 'object', properties: sizeModelProperties() },\n { name: 'margin', label: 'Margin', type: 'object', properties: spacingModelProperties() },\n ],\n }\n}\n\nfunction imageModifierDescriptor(): PropertyDescriptor {\n return {\n name: 'modifier',\n label: 'Modifier',\n type: 'object',\n properties: [\n ...modifierBaseProperties(),\n { name: 'width', label: 'Width', type: 'object', properties: sizeModelProperties() },\n { name: 'height', label: 'Height', type: 'object', properties: sizeModelProperties() },\n { name: 'padding', label: 'Padding', type: 'object', properties: spacingModelProperties() },\n { name: 'margin', label: 'Margin', type: 'object', properties: spacingModelProperties() },\n ],\n }\n}\n\nfunction containerModifierDescriptor(): PropertyDescriptor {\n return {\n name: 'modifier',\n label: 'Modifier',\n type: 'object',\n properties: [\n ...modifierBaseProperties(),\n { name: 'backgroundColor', label: 'Background Color', type: 'object', properties: backgroundColorModelProperties() },\n { name: 'width', label: 'Width', type: 'object', properties: sizeModelProperties() },\n { name: 'height', label: 'Height', type: 'object', properties: sizeModelProperties() },\n { name: 'padding', label: 'Padding', type: 'object', properties: spacingModelProperties() },\n { name: 'margin', label: 'Margin', type: 'object', properties: spacingModelProperties() },\n { name: 'aspectRatio', label: 'Aspect Ratio', type: 'number' },\n ],\n }\n}\n\n// === Arrangement descriptors ===\n\nfunction verticalArrangementDescriptor(): PropertyDescriptor {\n return {\n name: 'verticalArrangement',\n label: 'Vertical Arrangement',\n type: 'object',\n properties: [\n {\n name: 'type',\n label: 'Type',\n type: 'enum',\n enumValues: ['top', 'center', 'bottom', 'space_evenly', 'space_between', 'space_around', 'spaced_by'],\n },\n { name: 'spacing', label: 'Spacing', type: 'number' },\n ],\n }\n}\n\nfunction horizontalArrangementDescriptor(): PropertyDescriptor {\n return {\n name: 'horizontalArrangement',\n label: 'Horizontal Arrangement',\n type: 'object',\n properties: [\n {\n name: 'type',\n label: 'Type',\n type: 'enum',\n enumValues: ['start', 'center', 'end', 'space_between', 'space_evenly', 'space_around', 'spaced_by'],\n },\n { name: 'spacing', label: 'Spacing', type: 'number' },\n ],\n }\n}\n\n// === Component definitions ===\n\nconst COMPONENT_DEFINITIONS: ComponentMeta[] = [\n {\n type: 'text',\n label: 'Text',\n acceptsChildren: false,\n properties: [\n { name: 'text', label: 'Text', type: 'string', required: true, defaultValue: 'Text' },\n { name: 'fontSize', label: 'Font Size', type: 'number' },\n { name: 'color', label: 'Color', type: 'object', properties: colorModelProperties() },\n { name: 'fontWeight', label: 'Font Weight', type: 'enum', enumValues: ['bold', 'medium', 'normal', 'semi_bold'] },\n { name: 'textAlign', label: 'Text Align', type: 'enum', enumValues: ['left', 'right', 'center', 'justify', 'start', 'end', 'unspecified'] },\n { name: 'overflow', label: 'Overflow', type: 'enum', enumValues: ['none', 'ellipsis'] },\n { name: 'maxLines', label: 'Max Lines', type: 'number' },\n { name: 'minLines', label: 'Min Lines', type: 'number', defaultValue: 1 },\n textModifierDescriptor(),\n ],\n },\n {\n type: 'image',\n label: 'Image',\n acceptsChildren: false,\n properties: [\n { name: 'image', label: 'Image URL', type: 'string', required: true },\n { name: 'scaleType', label: 'Scale Type', type: 'enum', enumValues: ['fit', 'crop', 'fill_height', 'fill_width', 'fill_bounds', 'inside', 'none'] },\n { name: 'contentDescription', label: 'Content Description', type: 'string' },\n { name: 'aspectRatio', label: 'Aspect Ratio', type: 'number' },\n { name: 'tintColor', label: 'Tint Color', type: 'object', properties: colorModelProperties() },\n imageModifierDescriptor(),\n ],\n },\n {\n type: 'box',\n label: 'Box',\n acceptsChildren: true,\n properties: [\n {\n name: 'contentAlignment',\n label: 'Content Alignment',\n type: 'enum',\n enumValues: ['top_start', 'top_center', 'top_end', 'center_start', 'center', 'center_end', 'bottom_start', 'bottom_center', 'bottom_end'],\n },\n containerModifierDescriptor(),\n ],\n },\n {\n type: 'column',\n label: 'Column',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n verticalArrangementDescriptor(),\n { name: 'horizontalAlignment', label: 'Horizontal Alignment', type: 'enum', enumValues: ['start', 'end', 'center_horizontally'] },\n { name: 'canScroll', label: 'Can Scroll', type: 'boolean' },\n ],\n },\n {\n type: 'row',\n label: 'Row',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n { name: 'verticalAlignment', label: 'Vertical Alignment', type: 'enum', enumValues: ['top', 'bottom', 'center_vertically'] },\n horizontalArrangementDescriptor(),\n { name: 'canScroll', label: 'Can Scroll', type: 'boolean' },\n ],\n },\n {\n type: 'lazy_column',\n label: 'Lazy Column',\n acceptsChildren: true,\n properties: [\n containerModifierDescriptor(),\n verticalArrangementDescriptor(),\n ],\n },\n]\n\n// === Public API ===\n\nexport function getComponents(): ComponentMeta[] {\n return JSON.parse(JSON.stringify(COMPONENT_DEFINITIONS))\n}\n","import type { SduiScreen, Theme } from './types'\nimport { renderComponent } from './render'\n\nexport interface RenderOptions {\n theme?: Theme\n}\n\nexport function render(json: string, container: HTMLElement, options?: RenderOptions): void {\n const screen: SduiScreen = JSON.parse(json)\n const theme: Theme = options?.theme ?? 'light'\n\n const root = renderComponent(screen.root, theme)\n\n container.innerHTML = ''\n container.appendChild(root)\n}\n\nexport { getComponents } from './component-meta'\nexport { getDevicePresets } from './device-presets'\nexport type { DevicePreset, DeviceCategory } from './device-presets'\n\nexport type {\n // Root models\n SduiScreen,\n SduiComponent,\n Theme,\n // Properties\n PropertiesModel,\n TextUiProperties,\n ImageUiProperties,\n BoxUiProperties,\n ColumnUiProperties,\n RowUiProperties,\n LazyColumnUiProperties,\n DefaultUiProperties,\n // Modifiers\n ModifierBase,\n TextUiModifier,\n ContainerUiModifier,\n ImageUiModifier,\n // Base models\n ColorModel,\n SizeModel,\n SpacingModel,\n ActionModel,\n BackgroundColorModel,\n HorizontalArrangementModel,\n VerticalArrangementModel,\n // Enums\n ComponentType,\n AlignmentType,\n FontWeightType,\n SizeUnitType,\n BackgroundColorType,\n ContentScaleType,\n TextAlignType,\n TextOverflowType,\n HorizontalAlignmentType,\n VerticalAlignmentType,\n HorizontalArrangementType,\n VerticalArrangementType,\n // Metadata\n ComponentMeta,\n PropertyDescriptor,\n PropertyType,\n} from './types'\n"],"mappings":"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","names":["el"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdui-web",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Server-Driven UI renderer for the web — turns JSON component trees into DOM elements",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",