@janbox/storefront-builder 1.0.5 → 1.0.6
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/README.md +47 -44
- package/dist/editor/hooks/use-editor-state.d.ts +13 -1
- package/dist/editor/lib/index.d.ts +4 -1
- package/dist/editor.js +356 -351
- package/dist/{index-DrJkOkbq.js → index-BU9pvpw_.js} +250 -243
- package/dist/index.js +428 -419
- package/package.json +2 -4
- package/dist/editor/lib/events.d.ts +0 -5
- package/lib/accordion/README.md +0 -39
- package/lib/accordion-content/README.md +0 -36
- package/lib/accordion-group/README.md +0 -106
- package/lib/accordion-summary/README.md +0 -37
- package/lib/box/README.md +0 -107
- package/lib/button/README.md +0 -94
- package/lib/cell/README.md +0 -119
- package/lib/countdown-timer/README.md +0 -157
- package/lib/flex-item/README.md +0 -111
- package/lib/flexbox/README.md +0 -120
- package/lib/grid/README.md +0 -133
- package/lib/heading/README.md +0 -53
- package/lib/icon/README.md +0 -98
- package/lib/image/README.md +0 -107
- package/lib/link/README.md +0 -111
- package/lib/list-item/README.md +0 -31
- package/lib/marquee/README.md +0 -111
- package/lib/marquee-item/README.md +0 -31
- package/lib/paragraph/README.md +0 -82
- package/lib/root/README.md +0 -33
- package/lib/swiper/README.md +0 -108
- package/lib/swiper-slide/README.md +0 -32
- package/lib/tab/README.md +0 -35
- package/lib/tab-content/README.md +0 -35
- package/lib/tab-list/README.md +0 -35
- package/lib/tab-panel/README.md +0 -35
- package/lib/tabs/README.md +0 -90
- package/lib/text/README.md +0 -90
- package/lib/unknown/README.md +0 -48
- package/lib/unordered-list/README.md +0 -82
- package/lib/video/README.md +0 -91
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# TabContentNode
|
|
2
|
-
|
|
3
|
-
Container cho danh sách tab panels. Chỉ chấp nhận `TabPanelNode` children.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`TabContent`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
Không có props riêng. Styling được control qua parent `TabsNode`.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```tsx
|
|
16
|
-
import { TabContentNode, TabPanelNode } from '@janbox/storefront-builder';
|
|
17
|
-
|
|
18
|
-
<TabContentNode>
|
|
19
|
-
<TabPanelNode>Panel 1 content</TabPanelNode>
|
|
20
|
-
<TabPanelNode>Panel 2 content</TabPanelNode>
|
|
21
|
-
<TabPanelNode>Panel 3 content</TabPanelNode>
|
|
22
|
-
</TabContentNode>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Rules
|
|
26
|
-
|
|
27
|
-
- **Canvas**: yes — chứa `TabPanelNode` children.
|
|
28
|
-
- **Selectable**: no.
|
|
29
|
-
- **canMoveIn**: chỉ chấp nhận `TabPanelNode`.
|
|
30
|
-
- **Parent**: phải là `TabsNode`.
|
|
31
|
-
|
|
32
|
-
## Related nodes
|
|
33
|
-
|
|
34
|
-
- [`TabsNode`](../tabs/README.md) — root container
|
|
35
|
-
- [`TabPanelNode`](../tab-panel/README.md) — mỗi panel content
|
package/lib/tab-list/README.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# TabListNode
|
|
2
|
-
|
|
3
|
-
Container cho danh sách tab headers. Chỉ chấp nhận `TabNode` children.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`TabList`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
Không có props riêng. Styling được control qua parent `TabsNode`.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```tsx
|
|
16
|
-
import { TabListNode, TabNode } from '@janbox/storefront-builder';
|
|
17
|
-
|
|
18
|
-
<TabListNode>
|
|
19
|
-
<TabNode dangerouslySetInnerHTML={{ __html: 'Tab 1' }} />
|
|
20
|
-
<TabNode dangerouslySetInnerHTML={{ __html: 'Tab 2' }} />
|
|
21
|
-
<TabNode dangerouslySetInnerHTML={{ __html: 'Tab 3' }} />
|
|
22
|
-
</TabListNode>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Rules
|
|
26
|
-
|
|
27
|
-
- **Canvas**: yes — chứa `TabNode` children.
|
|
28
|
-
- **Selectable**: no.
|
|
29
|
-
- **canMoveIn**: chỉ chấp nhận `TabNode`.
|
|
30
|
-
- **Parent**: phải là `TabsNode`.
|
|
31
|
-
|
|
32
|
-
## Related nodes
|
|
33
|
-
|
|
34
|
-
- [`TabsNode`](../tabs/README.md) — root container
|
|
35
|
-
- [`TabNode`](../tab/README.md) — tab header button
|
package/lib/tab-panel/README.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# TabPanelNode
|
|
2
|
-
|
|
3
|
-
Nội dung của một tab — hiển thị khi tab tương ứng được active. Là canvas node — chứa bất kỳ node con nào.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`TabPanel`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
Không có props riêng.
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
```tsx
|
|
16
|
-
import { TabPanelNode, ParagraphNode } from '@janbox/storefront-builder';
|
|
17
|
-
|
|
18
|
-
<TabPanelNode>
|
|
19
|
-
<ParagraphNode>
|
|
20
|
-
Tab panel content goes here. Can contain any nodes.
|
|
21
|
-
</ParagraphNode>
|
|
22
|
-
</TabPanelNode>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Rules
|
|
26
|
-
|
|
27
|
-
- **Canvas**: yes — chứa bất kỳ node con nào.
|
|
28
|
-
- **Selectable**: no.
|
|
29
|
-
- **Parent**: phải là `TabContentNode`.
|
|
30
|
-
|
|
31
|
-
## Related nodes
|
|
32
|
-
|
|
33
|
-
- [`TabsNode`](../tabs/README.md) — root container
|
|
34
|
-
- [`TabContentNode`](../tab-content/README.md) — parent container
|
|
35
|
-
- [`TabNode`](../tab/README.md) — tab header tương ứng
|
package/lib/tabs/README.md
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# TabsNode
|
|
2
|
-
|
|
3
|
-
Root container cho tabs component. Quản lý active state và chứa `TabListNode` (headers) + `TabContentNode` (panels).
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`Tabs`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
### Top-level props
|
|
12
|
-
|
|
13
|
-
| Prop | Type | Description |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| `defaultActiveIndex` | `number` | Index của tab active mặc định (0-based) |
|
|
16
|
-
|
|
17
|
-
### `sx` props
|
|
18
|
-
|
|
19
|
-
```ts
|
|
20
|
-
sx?: {
|
|
21
|
-
// size
|
|
22
|
-
width?: number | string
|
|
23
|
-
|
|
24
|
-
// spacing
|
|
25
|
-
paddingTop?: number
|
|
26
|
-
paddingRight?: number
|
|
27
|
-
paddingBottom?: number
|
|
28
|
-
paddingLeft?: number
|
|
29
|
-
marginTop?: number
|
|
30
|
-
marginRight?: number
|
|
31
|
-
marginBottom?: number
|
|
32
|
-
marginLeft?: number
|
|
33
|
-
|
|
34
|
-
// border
|
|
35
|
-
borderStyle?: string
|
|
36
|
-
borderColor?: string
|
|
37
|
-
borderTopWidth?: number
|
|
38
|
-
borderRightWidth?: number
|
|
39
|
-
borderBottomWidth?: number
|
|
40
|
-
borderLeftWidth?: number
|
|
41
|
-
borderTopLeftRadius?: number | string
|
|
42
|
-
borderTopRightRadius?: number | string
|
|
43
|
-
borderBottomRightRadius?: number | string
|
|
44
|
-
borderBottomLeftRadius?: number | string
|
|
45
|
-
|
|
46
|
-
// background
|
|
47
|
-
backgroundColor?: string
|
|
48
|
-
backgroundImage?: string
|
|
49
|
-
backgroundPosition?: string
|
|
50
|
-
backgroundRepeat?: string
|
|
51
|
-
backgroundSize?: string
|
|
52
|
-
backgroundAttachment?: string
|
|
53
|
-
background?: string
|
|
54
|
-
|
|
55
|
-
// responsive overrides
|
|
56
|
-
sm?: { /* same keys above */ }
|
|
57
|
-
md?: { /* same keys above */ }
|
|
58
|
-
lg?: { /* same keys above */ }
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Usage
|
|
63
|
-
|
|
64
|
-
```tsx
|
|
65
|
-
import { TabsNode } from '@janbox/storefront-builder';
|
|
66
|
-
|
|
67
|
-
<TabsNode
|
|
68
|
-
defaultActiveIndex={0}
|
|
69
|
-
sx={{
|
|
70
|
-
width: '100%',
|
|
71
|
-
paddingTop: 16,
|
|
72
|
-
paddingBottom: 16,
|
|
73
|
-
}}
|
|
74
|
-
>
|
|
75
|
-
{/* TabListNode và TabContentNode tự động được thêm bởi editor */}
|
|
76
|
-
</TabsNode>
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Rules
|
|
80
|
-
|
|
81
|
-
- **Canvas**: no.
|
|
82
|
-
- **Children**: phải có `TabListNode` và `TabContentNode`.
|
|
83
|
-
- Inspector có "Items management" để add/remove/reorder tabs — sync giữa `TabNode` và `TabPanelNode`.
|
|
84
|
-
|
|
85
|
-
## Related nodes
|
|
86
|
-
|
|
87
|
-
- [`TabListNode`](../tab-list/README.md) — container cho tab headers
|
|
88
|
-
- [`TabNode`](../tab/README.md) — mỗi tab header button
|
|
89
|
-
- [`TabContentNode`](../tab-content/README.md) — container cho tab panels
|
|
90
|
-
- [`TabPanelNode`](../tab-panel/README.md) — nội dung của mỗi tab
|
package/lib/text/README.md
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# TextNode
|
|
2
|
-
|
|
3
|
-
Inline/block text node có thể chỉnh typography. Render ra bất kỳ HTML tag nào qua prop `as`. Hỗ trợ inline editing trong canvas.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`Text`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
### Top-level props
|
|
12
|
-
|
|
13
|
-
| Prop | Type | Description |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| `as` | `HTMLElementType` | HTML tag render ra (mặc định `p`) |
|
|
16
|
-
| `sizeVariant` | `TypographySizeVariant` | Preset typography size từ theme |
|
|
17
|
-
|
|
18
|
-
`sizeVariant` hỗ trợ responsive: `sizeVariant="base"` xs, `md={{ sizeVariant: 'lg' }}` desktop.
|
|
19
|
-
|
|
20
|
-
**`TypographySizeVariant`:** `'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl'`
|
|
21
|
-
|
|
22
|
-
### `sx` props
|
|
23
|
-
|
|
24
|
-
```ts
|
|
25
|
-
sx?: {
|
|
26
|
-
// typography (áp dụng toàn breakpoint — không responsive)
|
|
27
|
-
color?: string
|
|
28
|
-
fontStyle?: 'normal' | 'italic'
|
|
29
|
-
fontWeight?: number | string
|
|
30
|
-
textDecorationLine?: 'none' | 'underline' | 'line-through'
|
|
31
|
-
textAlign?: 'left' | 'center' | 'right' | 'justify'
|
|
32
|
-
textTransform?: 'none' | 'uppercase' | 'lowercase' | 'capitalize'
|
|
33
|
-
|
|
34
|
-
// size
|
|
35
|
-
width?: number | string
|
|
36
|
-
|
|
37
|
-
// spacing
|
|
38
|
-
paddingTop?: number
|
|
39
|
-
paddingRight?: number
|
|
40
|
-
paddingBottom?: number
|
|
41
|
-
paddingLeft?: number
|
|
42
|
-
marginTop?: number
|
|
43
|
-
marginRight?: number
|
|
44
|
-
marginBottom?: number
|
|
45
|
-
marginLeft?: number
|
|
46
|
-
|
|
47
|
-
// responsive overrides
|
|
48
|
-
sm?: { /* same keys above */ }
|
|
49
|
-
md?: { /* same keys above */ }
|
|
50
|
-
lg?: { /* same keys above */ }
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
> `color`, `fontStyle`, `textDecorationLine`, `textAlign`, `textTransform` được editor set ở breakpoint `xs` (áp dụng toàn bộ). `fontWeight` và `sizeVariant` hỗ trợ responsive.
|
|
55
|
-
|
|
56
|
-
## Usage
|
|
57
|
-
|
|
58
|
-
```tsx
|
|
59
|
-
import { TextNode } from '@janbox/storefront-builder';
|
|
60
|
-
|
|
61
|
-
// Text đơn giản
|
|
62
|
-
<TextNode>Hello world</TextNode>
|
|
63
|
-
|
|
64
|
-
// Đổi tag, size variant
|
|
65
|
-
<TextNode as="span" sizeVariant="sm">
|
|
66
|
-
Small label
|
|
67
|
-
</TextNode>
|
|
68
|
-
|
|
69
|
-
// sizeVariant responsive
|
|
70
|
-
<TextNode sizeVariant="base" md={{ sizeVariant: 'lg' }}>
|
|
71
|
-
Body text
|
|
72
|
-
</TextNode>
|
|
73
|
-
|
|
74
|
-
// Màu, căn giữa, font weight responsive
|
|
75
|
-
<TextNode
|
|
76
|
-
sx={{
|
|
77
|
-
color: '#333333',
|
|
78
|
-
textAlign: 'center',
|
|
79
|
-
fontWeight: 400,
|
|
80
|
-
md: { fontWeight: 600 },
|
|
81
|
-
}}
|
|
82
|
-
>
|
|
83
|
-
Styled text
|
|
84
|
-
</TextNode>
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Rules
|
|
88
|
-
|
|
89
|
-
- **Canvas**: no — không chứa node con.
|
|
90
|
-
- **Inline editing**: có thể double-click để chỉnh nội dung trực tiếp trong canvas.
|
package/lib/unknown/README.md
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# UnknownNode
|
|
2
|
-
|
|
3
|
-
Fallback node hiển thị khi một node trong serialized data có `resolvedName` không tồn tại trong resolver.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`Unknown`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
Không có props.
|
|
12
|
-
|
|
13
|
-
## Behavior
|
|
14
|
-
|
|
15
|
-
- **Render mode** (`enabled: false`): render nothing — hoàn toàn invisible.
|
|
16
|
-
- **Editor mode** (`enabled: true`): hiển thị placeholder "Section is not available" kèm nút **Remove** để xóa node.
|
|
17
|
-
|
|
18
|
-
## Khi nào xảy ra
|
|
19
|
-
|
|
20
|
-
`Canvas` tự động thay thế node bằng `UnknownNode` khi load `SerializedNodes` mà `resolvedName` không có trong resolver:
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
// Trong Canvas component
|
|
24
|
-
const resolvedNode = resolver[resolvedName];
|
|
25
|
-
if (!resolvedNode) {
|
|
26
|
-
value.type = { resolvedName: CoreNodeResolvedEnum.Unknown };
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Thường xảy ra khi:
|
|
31
|
-
- Custom node bị xóa khỏi codebase nhưng data cũ vẫn còn lưu
|
|
32
|
-
- Resolver không được pass đầy đủ node types
|
|
33
|
-
|
|
34
|
-
## Usage
|
|
35
|
-
|
|
36
|
-
Không cần dùng trực tiếp. Được xử lý tự động bởi `Canvas`.
|
|
37
|
-
|
|
38
|
-
Nếu muốn tránh `UnknownNode` xuất hiện, đảm bảo truyền đầy đủ resolver khi mount `Composer`:
|
|
39
|
-
|
|
40
|
-
```tsx
|
|
41
|
-
import { MyCustomNode } from './my-custom-node';
|
|
42
|
-
|
|
43
|
-
<Composer resolver={{ MyCustomNode }}>
|
|
44
|
-
<Canvas data={savedNodes}>
|
|
45
|
-
<RootNode />
|
|
46
|
-
</Canvas>
|
|
47
|
-
</Composer>
|
|
48
|
-
```
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# UnorderedListNode
|
|
2
|
-
|
|
3
|
-
Danh sách dọc (`ul`) — container cho các `ListItemNode`. Không render bullet mặc định, layout dùng flexbox column.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`UnorderedList`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
### `sx` props
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
sx?: {
|
|
15
|
-
// layout
|
|
16
|
-
width?: number | string
|
|
17
|
-
rowGap?: number // khoảng cách giữa các items
|
|
18
|
-
alignItems?: 'flex-start' | 'flex-end' | 'center' // căn ngang các items
|
|
19
|
-
|
|
20
|
-
// spacing
|
|
21
|
-
paddingTop?: number
|
|
22
|
-
paddingRight?: number
|
|
23
|
-
paddingBottom?: number
|
|
24
|
-
paddingLeft?: number
|
|
25
|
-
marginTop?: number
|
|
26
|
-
marginRight?: number
|
|
27
|
-
marginBottom?: number
|
|
28
|
-
marginLeft?: number
|
|
29
|
-
|
|
30
|
-
// border
|
|
31
|
-
borderStyle?: string
|
|
32
|
-
borderColor?: string
|
|
33
|
-
borderTopWidth?: number
|
|
34
|
-
borderRightWidth?: number
|
|
35
|
-
borderBottomWidth?: number
|
|
36
|
-
borderLeftWidth?: number
|
|
37
|
-
borderTopLeftRadius?: number | string
|
|
38
|
-
borderTopRightRadius?: number | string
|
|
39
|
-
borderBottomRightRadius?: number | string
|
|
40
|
-
borderBottomLeftRadius?: number | string
|
|
41
|
-
|
|
42
|
-
// responsive overrides
|
|
43
|
-
sm?: { /* same keys above */ }
|
|
44
|
-
md?: { /* same keys above */ }
|
|
45
|
-
lg?: { /* same keys above */ }
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Usage
|
|
50
|
-
|
|
51
|
-
```tsx
|
|
52
|
-
import { UnorderedListNode, ListItemNode, TextNode, IconNode } from '@janbox/storefront-builder';
|
|
53
|
-
|
|
54
|
-
// Danh sách các text items
|
|
55
|
-
<UnorderedListNode sx={{ rowGap: 8 }}>
|
|
56
|
-
<ListItemNode>
|
|
57
|
-
<TextNode>Item 1</TextNode>
|
|
58
|
-
</ListItemNode>
|
|
59
|
-
<ListItemNode>
|
|
60
|
-
<TextNode>Item 2</TextNode>
|
|
61
|
-
</ListItemNode>
|
|
62
|
-
</UnorderedListNode>
|
|
63
|
-
|
|
64
|
-
// Icon + text, căn giữa dọc
|
|
65
|
-
<UnorderedListNode sx={{ rowGap: 12, width: '100%' }}>
|
|
66
|
-
<ListItemNode>
|
|
67
|
-
<FlexboxNode sx={{ flexDirection: 'row', alignItems: 'center', columnGap: 8 }}>
|
|
68
|
-
<FlexItemNode><IconNode source="..." size={16} /></FlexItemNode>
|
|
69
|
-
<FlexItemNode sx={{ flexGrow: 1 }}><TextNode>Feature description</TextNode></FlexItemNode>
|
|
70
|
-
</FlexboxNode>
|
|
71
|
-
</ListItemNode>
|
|
72
|
-
</UnorderedListNode>
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## Rules
|
|
76
|
-
|
|
77
|
-
- **Canvas**: no — không trực tiếp nhận drop.
|
|
78
|
-
- **Children**: `ListItemNode` — thêm qua inspector.
|
|
79
|
-
|
|
80
|
-
## Related nodes
|
|
81
|
-
|
|
82
|
-
- [`ListItemNode`](../list-item/README.md) — mỗi item trong list
|
package/lib/video/README.md
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# VideoNode
|
|
2
|
-
|
|
3
|
-
Video player node dùng `react-player`. Hỗ trợ nhiều nguồn video: YouTube, Vimeo, file MP4, v.v.
|
|
4
|
-
|
|
5
|
-
## Resolved name
|
|
6
|
-
|
|
7
|
-
`Video`
|
|
8
|
-
|
|
9
|
-
## Configurable props
|
|
10
|
-
|
|
11
|
-
### Top-level props
|
|
12
|
-
|
|
13
|
-
| Prop | Type | Description |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| `src` | `string` | URL video (YouTube, Vimeo, MP4, v.v.) |
|
|
16
|
-
| `light` | `string \| boolean` | URL thumbnail hiển thị trước khi play |
|
|
17
|
-
|
|
18
|
-
### `sx` props
|
|
19
|
-
|
|
20
|
-
```ts
|
|
21
|
-
sx?: {
|
|
22
|
-
// size
|
|
23
|
-
width?: number | string
|
|
24
|
-
aspectRatio?: string // ví dụ: '16 / 9', '1 / 1'
|
|
25
|
-
|
|
26
|
-
// spacing
|
|
27
|
-
paddingTop?: number
|
|
28
|
-
paddingRight?: number
|
|
29
|
-
paddingBottom?: number
|
|
30
|
-
paddingLeft?: number
|
|
31
|
-
marginTop?: number
|
|
32
|
-
marginRight?: number
|
|
33
|
-
marginBottom?: number
|
|
34
|
-
marginLeft?: number
|
|
35
|
-
|
|
36
|
-
// border
|
|
37
|
-
borderStyle?: string
|
|
38
|
-
borderColor?: string
|
|
39
|
-
borderTopWidth?: number
|
|
40
|
-
borderRightWidth?: number
|
|
41
|
-
borderBottomWidth?: number
|
|
42
|
-
borderLeftWidth?: number
|
|
43
|
-
borderTopLeftRadius?: number | string
|
|
44
|
-
borderTopRightRadius?: number | string
|
|
45
|
-
borderBottomRightRadius?: number | string
|
|
46
|
-
borderBottomLeftRadius?: number | string
|
|
47
|
-
|
|
48
|
-
// responsive overrides
|
|
49
|
-
sm?: { /* same keys above */ }
|
|
50
|
-
md?: { /* same keys above */ }
|
|
51
|
-
lg?: { /* same keys above */ }
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Usage
|
|
56
|
-
|
|
57
|
-
```tsx
|
|
58
|
-
import { VideoNode } from '@janbox/storefront-builder';
|
|
59
|
-
|
|
60
|
-
// YouTube video
|
|
61
|
-
<VideoNode
|
|
62
|
-
src="https://www.youtube.com/watch?v=dQw4w9WgXcQ"
|
|
63
|
-
sx={{ width: '100%', aspectRatio: '16 / 9' }}
|
|
64
|
-
/>
|
|
65
|
-
|
|
66
|
-
// MP4 video với thumbnail
|
|
67
|
-
<VideoNode
|
|
68
|
-
src="https://example.com/video.mp4"
|
|
69
|
-
light="https://example.com/thumbnail.jpg"
|
|
70
|
-
sx={{ width: '100%', aspectRatio: '16 / 9' }}
|
|
71
|
-
/>
|
|
72
|
-
|
|
73
|
-
// Responsive width, aspect ratio cố định
|
|
74
|
-
<VideoNode
|
|
75
|
-
src="https://vimeo.com/123456789"
|
|
76
|
-
sx={{
|
|
77
|
-
width: '100%',
|
|
78
|
-
aspectRatio: '16 / 9',
|
|
79
|
-
borderTopLeftRadius: 8,
|
|
80
|
-
borderTopRightRadius: 8,
|
|
81
|
-
borderBottomLeftRadius: 8,
|
|
82
|
-
borderBottomRightRadius: 8,
|
|
83
|
-
md: { width: '80%' },
|
|
84
|
-
}}
|
|
85
|
-
/>
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Rules
|
|
89
|
-
|
|
90
|
-
- **Canvas**: no — không chứa node con.
|
|
91
|
-
- Dùng `react-player` bên dưới — hỗ trợ YouTube, Vimeo, Twitch, SoundCloud, Streamable, Wistia, Facebook, file video, v.v.
|