react-native-divkit 0.1.0-alpha.1
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 +176 -0
- package/README.md +340 -0
- package/dist/DivKit.d.ts +68 -0
- package/dist/DivKit.d.ts.map +1 -0
- package/dist/DivKit.js +400 -0
- package/dist/DivKit.js.map +1 -0
- package/dist/actions/array.d.ts +8 -0
- package/dist/actions/array.d.ts.map +1 -0
- package/dist/actions/array.js +139 -0
- package/dist/actions/array.js.map +1 -0
- package/dist/actions/copyToClipboard.d.ts +22 -0
- package/dist/actions/copyToClipboard.d.ts.map +1 -0
- package/dist/actions/copyToClipboard.js +63 -0
- package/dist/actions/copyToClipboard.js.map +1 -0
- package/dist/actions/dict.d.ts +6 -0
- package/dist/actions/dict.d.ts.map +1 -0
- package/dist/actions/dict.js +58 -0
- package/dist/actions/dict.js.map +1 -0
- package/dist/actions/index.d.ts +11 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +11 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/updateStructure.d.ts +6 -0
- package/dist/actions/updateStructure.d.ts.map +1 -0
- package/dist/actions/updateStructure.js +116 -0
- package/dist/actions/updateStructure.js.map +1 -0
- package/dist/components/DivComponent.d.ts +29 -0
- package/dist/components/DivComponent.d.ts.map +1 -0
- package/dist/components/DivComponent.js +62 -0
- package/dist/components/DivComponent.js.map +1 -0
- package/dist/components/container/DivContainer.d.ts +26 -0
- package/dist/components/container/DivContainer.d.ts.map +1 -0
- package/dist/components/container/DivContainer.js +172 -0
- package/dist/components/container/DivContainer.js.map +1 -0
- package/dist/components/container/index.d.ts +3 -0
- package/dist/components/container/index.d.ts.map +1 -0
- package/dist/components/container/index.js +2 -0
- package/dist/components/container/index.js.map +1 -0
- package/dist/components/image/DivImage.d.ts +29 -0
- package/dist/components/image/DivImage.d.ts.map +1 -0
- package/dist/components/image/DivImage.js +122 -0
- package/dist/components/image/DivImage.js.map +1 -0
- package/dist/components/image/index.d.ts +3 -0
- package/dist/components/image/index.d.ts.map +1 -0
- package/dist/components/image/index.js +2 -0
- package/dist/components/image/index.js.map +1 -0
- package/dist/components/index.d.ts +14 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +11 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/state/DivState.d.ts +26 -0
- package/dist/components/state/DivState.d.ts.map +1 -0
- package/dist/components/state/DivState.js +121 -0
- package/dist/components/state/DivState.js.map +1 -0
- package/dist/components/state/index.d.ts +3 -0
- package/dist/components/state/index.d.ts.map +1 -0
- package/dist/components/state/index.js +2 -0
- package/dist/components/state/index.js.map +1 -0
- package/dist/components/text/DivText.d.ts +28 -0
- package/dist/components/text/DivText.d.ts.map +1 -0
- package/dist/components/text/DivText.js +143 -0
- package/dist/components/text/DivText.js.map +1 -0
- package/dist/components/text/index.d.ts +3 -0
- package/dist/components/text/index.d.ts.map +1 -0
- package/dist/components/text/index.js +2 -0
- package/dist/components/text/index.js.map +1 -0
- package/dist/components/utilities/Outer.d.ts +17 -0
- package/dist/components/utilities/Outer.d.ts.map +1 -0
- package/dist/components/utilities/Outer.js +210 -0
- package/dist/components/utilities/Outer.js.map +1 -0
- package/dist/components/utilities/Unknown.d.ts +11 -0
- package/dist/components/utilities/Unknown.d.ts.map +1 -0
- package/dist/components/utilities/Unknown.js +50 -0
- package/dist/components/utilities/Unknown.js.map +1 -0
- package/dist/components/utilities/index.d.ts +5 -0
- package/dist/components/utilities/index.d.ts.map +1 -0
- package/dist/components/utilities/index.js +3 -0
- package/dist/components/utilities/index.js.map +1 -0
- package/dist/context/ActionContext.d.ts +25 -0
- package/dist/context/ActionContext.d.ts.map +1 -0
- package/dist/context/ActionContext.js +20 -0
- package/dist/context/ActionContext.js.map +1 -0
- package/dist/context/DivKitContext.d.ts +33 -0
- package/dist/context/DivKitContext.d.ts.map +1 -0
- package/dist/context/DivKitContext.js +14 -0
- package/dist/context/DivKitContext.js.map +1 -0
- package/dist/context/EnabledContext.d.ts +31 -0
- package/dist/context/EnabledContext.d.ts.map +1 -0
- package/dist/context/EnabledContext.js +31 -0
- package/dist/context/EnabledContext.js.map +1 -0
- package/dist/context/StateContext.d.ts +57 -0
- package/dist/context/StateContext.d.ts.map +1 -0
- package/dist/context/StateContext.js +20 -0
- package/dist/context/StateContext.js.map +1 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +9 -0
- package/dist/context/index.js.map +1 -0
- package/dist/expressions/bigint.d.ts +8 -0
- package/dist/expressions/bigint.d.ts.map +1 -0
- package/dist/expressions/bigint.js +31 -0
- package/dist/expressions/bigint.js.map +1 -0
- package/dist/expressions/const.d.ts +15 -0
- package/dist/expressions/const.d.ts.map +1 -0
- package/dist/expressions/const.js +15 -0
- package/dist/expressions/const.js.map +1 -0
- package/dist/expressions/eval.d.ts +77 -0
- package/dist/expressions/eval.d.ts.map +1 -0
- package/dist/expressions/eval.js +459 -0
- package/dist/expressions/eval.js.map +1 -0
- package/dist/expressions/expressions.d.ts +7 -0
- package/dist/expressions/expressions.d.ts.map +1 -0
- package/dist/expressions/expressions.js +3191 -0
- package/dist/expressions/expressions.js.map +1 -0
- package/dist/expressions/funcs/array.d.ts +2 -0
- package/dist/expressions/funcs/array.d.ts.map +1 -0
- package/dist/expressions/funcs/array.js +381 -0
- package/dist/expressions/funcs/array.js.map +1 -0
- package/dist/expressions/funcs/colors.d.ts +2 -0
- package/dist/expressions/funcs/colors.d.ts.map +1 -0
- package/dist/expressions/funcs/colors.js +75 -0
- package/dist/expressions/funcs/colors.js.map +1 -0
- package/dist/expressions/funcs/customFuncs.d.ts +8 -0
- package/dist/expressions/funcs/customFuncs.d.ts.map +1 -0
- package/dist/expressions/funcs/customFuncs.js +114 -0
- package/dist/expressions/funcs/customFuncs.js.map +1 -0
- package/dist/expressions/funcs/datetime.d.ts +2 -0
- package/dist/expressions/funcs/datetime.d.ts.map +1 -0
- package/dist/expressions/funcs/datetime.js +182 -0
- package/dist/expressions/funcs/datetime.js.map +1 -0
- package/dist/expressions/funcs/dict.d.ts +2 -0
- package/dist/expressions/funcs/dict.d.ts.map +1 -0
- package/dist/expressions/funcs/dict.js +170 -0
- package/dist/expressions/funcs/dict.js.map +1 -0
- package/dist/expressions/funcs/funcs.d.ts +80 -0
- package/dist/expressions/funcs/funcs.d.ts.map +1 -0
- package/dist/expressions/funcs/funcs.js +146 -0
- package/dist/expressions/funcs/funcs.js.map +1 -0
- package/dist/expressions/funcs/index.d.ts +2 -0
- package/dist/expressions/funcs/index.d.ts.map +1 -0
- package/dist/expressions/funcs/index.js +23 -0
- package/dist/expressions/funcs/index.js.map +1 -0
- package/dist/expressions/funcs/interval.d.ts +2 -0
- package/dist/expressions/funcs/interval.d.ts.map +1 -0
- package/dist/expressions/funcs/interval.js +61 -0
- package/dist/expressions/funcs/interval.js.map +1 -0
- package/dist/expressions/funcs/math.d.ts +2 -0
- package/dist/expressions/funcs/math.d.ts.map +1 -0
- package/dist/expressions/funcs/math.js +324 -0
- package/dist/expressions/funcs/math.js.map +1 -0
- package/dist/expressions/funcs/std.d.ts +2 -0
- package/dist/expressions/funcs/std.d.ts.map +1 -0
- package/dist/expressions/funcs/std.js +293 -0
- package/dist/expressions/funcs/std.js.map +1 -0
- package/dist/expressions/funcs/stored.d.ts +4 -0
- package/dist/expressions/funcs/stored.d.ts.map +1 -0
- package/dist/expressions/funcs/stored.js +62 -0
- package/dist/expressions/funcs/stored.js.map +1 -0
- package/dist/expressions/funcs/strings.d.ts +2 -0
- package/dist/expressions/funcs/strings.d.ts.map +1 -0
- package/dist/expressions/funcs/strings.js +158 -0
- package/dist/expressions/funcs/strings.js.map +1 -0
- package/dist/expressions/funcs/trigonometry.d.ts +2 -0
- package/dist/expressions/funcs/trigonometry.d.ts.map +1 -0
- package/dist/expressions/funcs/trigonometry.js +92 -0
- package/dist/expressions/funcs/trigonometry.js.map +1 -0
- package/dist/expressions/json.d.ts +18 -0
- package/dist/expressions/json.d.ts.map +1 -0
- package/dist/expressions/json.js +271 -0
- package/dist/expressions/json.js.map +1 -0
- package/dist/expressions/parserCache.d.ts +4 -0
- package/dist/expressions/parserCache.d.ts.map +1 -0
- package/dist/expressions/parserCache.js +23 -0
- package/dist/expressions/parserCache.js.map +1 -0
- package/dist/expressions/simpleUnescapeString.d.ts +2 -0
- package/dist/expressions/simpleUnescapeString.d.ts.map +1 -0
- package/dist/expressions/simpleUnescapeString.js +61 -0
- package/dist/expressions/simpleUnescapeString.js.map +1 -0
- package/dist/expressions/utils.d.ts +29 -0
- package/dist/expressions/utils.d.ts.map +1 -0
- package/dist/expressions/utils.js +236 -0
- package/dist/expressions/utils.js.map +1 -0
- package/dist/expressions/variable.d.ts +82 -0
- package/dist/expressions/variable.d.ts.map +1 -0
- package/dist/expressions/variable.js +337 -0
- package/dist/expressions/variable.js.map +1 -0
- package/dist/expressions/walk.d.ts +7 -0
- package/dist/expressions/walk.d.ts.map +1 -0
- package/dist/expressions/walk.js +39 -0
- package/dist/expressions/walk.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +11 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAction.d.ts +102 -0
- package/dist/hooks/useAction.d.ts.map +1 -0
- package/dist/hooks/useAction.js +116 -0
- package/dist/hooks/useAction.js.map +1 -0
- package/dist/hooks/useDerivedFromVars.d.ts +72 -0
- package/dist/hooks/useDerivedFromVars.d.ts.map +1 -0
- package/dist/hooks/useDerivedFromVars.js +100 -0
- package/dist/hooks/useDerivedFromVars.js.map +1 -0
- package/dist/hooks/useVariable.d.ts +86 -0
- package/dist/hooks/useVariable.d.ts.map +1 -0
- package/dist/hooks/useVariable.js +130 -0
- package/dist/hooks/useVariable.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/stores/createObservable.d.ts +38 -0
- package/dist/stores/createObservable.d.ts.map +1 -0
- package/dist/stores/createObservable.js +49 -0
- package/dist/stores/createObservable.js.map +1 -0
- package/dist/utils/applyTemplate.d.ts +8 -0
- package/dist/utils/applyTemplate.d.ts.map +1 -0
- package/dist/utils/applyTemplate.js +94 -0
- package/dist/utils/applyTemplate.js.map +1 -0
- package/dist/utils/correctColor.d.ts +18 -0
- package/dist/utils/correctColor.d.ts.map +1 -0
- package/dist/utils/correctColor.js +79 -0
- package/dist/utils/correctColor.js.map +1 -0
- package/dist/utils/escapeRegExp.d.ts +2 -0
- package/dist/utils/escapeRegExp.d.ts.map +1 -0
- package/dist/utils/escapeRegExp.js +4 -0
- package/dist/utils/escapeRegExp.js.map +1 -0
- package/dist/utils/formatDate.d.ts +6 -0
- package/dist/utils/formatDate.d.ts.map +1 -0
- package/dist/utils/formatDate.js +325 -0
- package/dist/utils/formatDate.js.map +1 -0
- package/dist/utils/padLeft.d.ts +2 -0
- package/dist/utils/padLeft.d.ts.map +1 -0
- package/dist/utils/padLeft.js +7 -0
- package/dist/utils/padLeft.js.map +1 -0
- package/dist/utils/uniq.d.ts +2 -0
- package/dist/utils/uniq.d.ts.map +1 -0
- package/dist/utils/uniq.js +4 -0
- package/dist/utils/uniq.js.map +1 -0
- package/dist/utils/wrapError.d.ts +10 -0
- package/dist/utils/wrapError.d.ts.map +1 -0
- package/dist/utils/wrapError.js +9 -0
- package/dist/utils/wrapError.js.map +1 -0
- package/package.json +58 -0
- package/src/DivKit.tsx +542 -0
- package/src/actions/array.ts +170 -0
- package/src/actions/copyToClipboard.ts +82 -0
- package/src/actions/dict.ts +71 -0
- package/src/actions/index.ts +11 -0
- package/src/actions/updateStructure.ts +134 -0
- package/src/components/DivComponent.tsx +75 -0
- package/src/components/README.md +230 -0
- package/src/components/container/DivContainer.tsx +222 -0
- package/src/components/container/index.ts +2 -0
- package/src/components/image/DivImage.tsx +172 -0
- package/src/components/image/index.ts +2 -0
- package/src/components/index.ts +20 -0
- package/src/components/state/DivState.tsx +146 -0
- package/src/components/state/index.ts +2 -0
- package/src/components/text/DivText.tsx +186 -0
- package/src/components/text/index.ts +2 -0
- package/src/components/utilities/Outer.tsx +239 -0
- package/src/components/utilities/README.md +175 -0
- package/src/components/utilities/Unknown.tsx +60 -0
- package/src/components/utilities/index.ts +4 -0
- package/src/context/ActionContext.tsx +37 -0
- package/src/context/DivKitContext.tsx +54 -0
- package/src/context/EnabledContext.tsx +50 -0
- package/src/context/StateContext.tsx +75 -0
- package/src/context/index.ts +33 -0
- package/src/expressions/ast.d.ts +101 -0
- package/src/expressions/bigint.ts +38 -0
- package/src/expressions/const.ts +16 -0
- package/src/expressions/eval.ts +669 -0
- package/src/expressions/expressions.peggy +235 -0
- package/src/expressions/expressions.ts +2854 -0
- package/src/expressions/funcs/array.ts +412 -0
- package/src/expressions/funcs/colors.ts +100 -0
- package/src/expressions/funcs/customFuncs.ts +139 -0
- package/src/expressions/funcs/datetime.ts +232 -0
- package/src/expressions/funcs/dict.ts +207 -0
- package/src/expressions/funcs/funcs.ts +323 -0
- package/src/expressions/funcs/index.ts +23 -0
- package/src/expressions/funcs/interval.ts +76 -0
- package/src/expressions/funcs/math.ts +395 -0
- package/src/expressions/funcs/std.ts +392 -0
- package/src/expressions/funcs/stored.ts +62 -0
- package/src/expressions/funcs/strings.ts +200 -0
- package/src/expressions/funcs/trigonometry.ts +108 -0
- package/src/expressions/json.ts +367 -0
- package/src/expressions/parserCache.ts +32 -0
- package/src/expressions/simpleUnescapeString.ts +57 -0
- package/src/expressions/utils.ts +271 -0
- package/src/expressions/variable.ts +429 -0
- package/src/expressions/walk.ts +43 -0
- package/src/hooks/README.md +265 -0
- package/src/hooks/index.ts +28 -0
- package/src/hooks/useAction.ts +152 -0
- package/src/hooks/useDerivedFromVars.ts +187 -0
- package/src/hooks/useVariable.ts +157 -0
- package/src/index.ts +97 -0
- package/src/stores/createObservable.ts +64 -0
- package/src/types/alignment.d.ts +13 -0
- package/src/types/background.d.ts +71 -0
- package/src/types/base.d.ts +224 -0
- package/src/types/border.d.ts +46 -0
- package/src/types/componentContext.d.ts +98 -0
- package/src/types/container.d.ts +40 -0
- package/src/types/edgeInserts.d.ts +9 -0
- package/src/types/general.d.ts +3 -0
- package/src/types/image.d.ts +33 -0
- package/src/types/imageScale.d.ts +1 -0
- package/src/types/layoutParams.d.ts +27 -0
- package/src/types/sizes.d.ts +37 -0
- package/src/types/state.d.ts +19 -0
- package/src/types/text.d.ts +126 -0
- package/src/utils/applyTemplate.ts +145 -0
- package/src/utils/correctColor.ts +102 -0
- package/src/utils/escapeRegExp.ts +3 -0
- package/src/utils/formatDate.ts +385 -0
- package/src/utils/padLeft.ts +6 -0
- package/src/utils/uniq.ts +3 -0
- package/src/utils/wrapError.ts +21 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# DivKit React Native Components - Phase 5 Complete
|
|
2
|
+
|
|
3
|
+
## MVP Components Implemented
|
|
4
|
+
|
|
5
|
+
### 1. DivText (`text/DivText.tsx`)
|
|
6
|
+
Text rendering component with variable substitution and styling.
|
|
7
|
+
|
|
8
|
+
**Features:**
|
|
9
|
+
- ✅ Text rendering with variable substitution
|
|
10
|
+
- ✅ Font styling (size, weight, color, family)
|
|
11
|
+
- ✅ Text alignment (horizontal, RTL support)
|
|
12
|
+
- ✅ Max lines with ellipsize
|
|
13
|
+
- ✅ Line height, letter spacing
|
|
14
|
+
- ✅ Text decorations (underline, strikethrough)
|
|
15
|
+
- ✅ Font feature settings (basic)
|
|
16
|
+
|
|
17
|
+
**Deferred:**
|
|
18
|
+
- Text ranges (nested styling)
|
|
19
|
+
- Text images
|
|
20
|
+
- Text gradients
|
|
21
|
+
- Text shadows
|
|
22
|
+
- Auto ellipsize
|
|
23
|
+
- Selectable text with custom actions
|
|
24
|
+
|
|
25
|
+
### 2. DivContainer (`container/DivContainer.tsx`)
|
|
26
|
+
Flex container component for layout management.
|
|
27
|
+
|
|
28
|
+
**Features:**
|
|
29
|
+
- ✅ Vertical/horizontal/overlap orientation
|
|
30
|
+
- ✅ Content alignment (horizontal & vertical)
|
|
31
|
+
- ✅ Item spacing (gap)
|
|
32
|
+
- ✅ Flex layout with proper alignment
|
|
33
|
+
- ✅ RTL support
|
|
34
|
+
|
|
35
|
+
**Deferred:**
|
|
36
|
+
- Wrap layout mode
|
|
37
|
+
- Separators (visual dividers)
|
|
38
|
+
- Line separators (for wrap mode)
|
|
39
|
+
- Aspect ratio constraints
|
|
40
|
+
- Item builder (dynamic items from data)
|
|
41
|
+
- Clip to bounds
|
|
42
|
+
|
|
43
|
+
### 3. DivImage (`image/DivImage.tsx`)
|
|
44
|
+
Image component with network loading and scaling.
|
|
45
|
+
|
|
46
|
+
**Features:**
|
|
47
|
+
- ✅ Network image loading
|
|
48
|
+
- ✅ Scaling modes (fill, fit, stretch, no_scale)
|
|
49
|
+
- ✅ Placeholder color while loading
|
|
50
|
+
- ✅ Loading indicator
|
|
51
|
+
- ✅ Error handling
|
|
52
|
+
- ✅ Aspect ratio
|
|
53
|
+
|
|
54
|
+
**Deferred:**
|
|
55
|
+
- GIF support (requires react-native-gif)
|
|
56
|
+
- Image preview (blur-up technique)
|
|
57
|
+
- Tint color and tint modes
|
|
58
|
+
- Image filters (blur, etc.)
|
|
59
|
+
- Appearance animations
|
|
60
|
+
- High priority preview
|
|
61
|
+
- react-native-fast-image integration
|
|
62
|
+
|
|
63
|
+
### 4. DivState (`state/DivState.tsx`)
|
|
64
|
+
State management component for switching between different UI states.
|
|
65
|
+
|
|
66
|
+
**Features:**
|
|
67
|
+
- ✅ State selection by state_id
|
|
68
|
+
- ✅ Default state
|
|
69
|
+
- ✅ State switching via actions (set_state)
|
|
70
|
+
- ✅ State registration in StateContext
|
|
71
|
+
- ✅ State variable binding (state_id_variable)
|
|
72
|
+
- ✅ Two-way binding with variables
|
|
73
|
+
|
|
74
|
+
**Deferred:**
|
|
75
|
+
- Transition animations (in/out/change)
|
|
76
|
+
- Animation timing and interpolation
|
|
77
|
+
- Clip to bounds
|
|
78
|
+
- Advanced state management
|
|
79
|
+
- Multiple concurrent state transitions
|
|
80
|
+
|
|
81
|
+
### 5. DivComponent (`DivComponent.tsx`)
|
|
82
|
+
Universal component router that dispatches to appropriate component based on type.
|
|
83
|
+
|
|
84
|
+
**Supported Types:**
|
|
85
|
+
- `text` → DivText
|
|
86
|
+
- `container` → DivContainer
|
|
87
|
+
- `image` / `gif` → DivImage
|
|
88
|
+
- `state` → DivState
|
|
89
|
+
|
|
90
|
+
**Deferred Types:**
|
|
91
|
+
- `gallery`, `pager`, `tabs`
|
|
92
|
+
- `slider`, `indicator`
|
|
93
|
+
- `input`, `select`, `switch`
|
|
94
|
+
- `video`, `custom`
|
|
95
|
+
- `separator`, `grid`
|
|
96
|
+
|
|
97
|
+
## Utility Components
|
|
98
|
+
|
|
99
|
+
### Outer (`utilities/Outer.tsx`)
|
|
100
|
+
Base wrapper component providing common functionality for all components.
|
|
101
|
+
|
|
102
|
+
**Features:**
|
|
103
|
+
- Visibility handling (visible/invisible/gone)
|
|
104
|
+
- Sizing (width/height with fixed/match_parent/wrap_content)
|
|
105
|
+
- Padding and margins
|
|
106
|
+
- Background (solid colors)
|
|
107
|
+
- Borders and border radius
|
|
108
|
+
- Shadows
|
|
109
|
+
- Opacity/alpha
|
|
110
|
+
- Action handling (onPress)
|
|
111
|
+
|
|
112
|
+
### Unknown (`utilities/Unknown.tsx`)
|
|
113
|
+
Fallback component for unsupported types.
|
|
114
|
+
|
|
115
|
+
## Architecture
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
DivComponent (router)
|
|
119
|
+
├── DivText
|
|
120
|
+
│ └── Outer
|
|
121
|
+
├── DivContainer
|
|
122
|
+
│ ├── Outer
|
|
123
|
+
│ └── DivComponent (recursive for children)
|
|
124
|
+
├── DivImage
|
|
125
|
+
│ └── Outer
|
|
126
|
+
└── DivState
|
|
127
|
+
├── Outer
|
|
128
|
+
└── DivComponent (recursive for active state)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Integration with Context System
|
|
132
|
+
|
|
133
|
+
All components integrate with:
|
|
134
|
+
- **DivKitContext**: Access to variables, actions, configuration
|
|
135
|
+
- **StateContext**: State management and transitions
|
|
136
|
+
- **ActionContext**: Action execution
|
|
137
|
+
- **EnabledContext**: Visibility and enabled state
|
|
138
|
+
|
|
139
|
+
## Integration with Hooks
|
|
140
|
+
|
|
141
|
+
All components use reactive hooks:
|
|
142
|
+
- `useDerivedFromVarsSimple`: Variable substitution
|
|
143
|
+
- `useAction`, `useActionHandler`: Action execution
|
|
144
|
+
- `useDivKitContext`, `useStateContext`: Context access
|
|
145
|
+
|
|
146
|
+
## Usage Example
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
import { DivComponent } from 'react-native-divkit';
|
|
150
|
+
|
|
151
|
+
const json = {
|
|
152
|
+
type: 'container',
|
|
153
|
+
orientation: 'vertical',
|
|
154
|
+
items: [
|
|
155
|
+
{
|
|
156
|
+
type: 'text',
|
|
157
|
+
text: 'Hello @{userName}!',
|
|
158
|
+
font_size: 24
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'image',
|
|
162
|
+
image_url: 'https://example.com/image.png',
|
|
163
|
+
scale: 'fit'
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const componentContext = {
|
|
169
|
+
json,
|
|
170
|
+
variables: variablesMap,
|
|
171
|
+
// ... other context props
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
<DivComponent componentContext={componentContext} />
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Next Steps (Phase 6)
|
|
178
|
+
|
|
179
|
+
1. Create main DivKit component
|
|
180
|
+
2. Implement component context creation
|
|
181
|
+
3. Setup variable initialization
|
|
182
|
+
4. Implement template resolution
|
|
183
|
+
5. Create DivKitView wrapper
|
|
184
|
+
6. Build public API exports
|
|
185
|
+
|
|
186
|
+
## File Structure
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
src/components/
|
|
190
|
+
├── DivComponent.tsx # Universal router
|
|
191
|
+
├── text/
|
|
192
|
+
│ ├── DivText.tsx # Text component
|
|
193
|
+
│ └── index.ts
|
|
194
|
+
├── container/
|
|
195
|
+
│ ├── DivContainer.tsx # Container component
|
|
196
|
+
│ └── index.ts
|
|
197
|
+
├── image/
|
|
198
|
+
│ ├── DivImage.tsx # Image component
|
|
199
|
+
│ └── index.ts
|
|
200
|
+
├── state/
|
|
201
|
+
│ ├── DivState.tsx # State component
|
|
202
|
+
│ └── index.ts
|
|
203
|
+
├── utilities/
|
|
204
|
+
│ ├── Outer.tsx # Base wrapper
|
|
205
|
+
│ ├── Unknown.tsx # Fallback
|
|
206
|
+
│ └── index.ts
|
|
207
|
+
└── index.ts # Public exports
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Testing TODO
|
|
211
|
+
|
|
212
|
+
- [ ] Unit tests for each component
|
|
213
|
+
- [ ] Integration tests with variables
|
|
214
|
+
- [ ] State transition tests
|
|
215
|
+
- [ ] Layout tests (snapshot testing)
|
|
216
|
+
- [ ] Action execution tests
|
|
217
|
+
- [ ] Error handling tests
|
|
218
|
+
|
|
219
|
+
## Known Limitations (MVP)
|
|
220
|
+
|
|
221
|
+
1. **Text ranges**: Nested text styling not supported
|
|
222
|
+
2. **Wrap layout**: Container wrap mode not implemented
|
|
223
|
+
3. **Separators**: Visual dividers between items not implemented
|
|
224
|
+
4. **GIF animations**: Requires additional native modules
|
|
225
|
+
5. **Image tinting**: Tint modes not implemented
|
|
226
|
+
6. **Transitions**: State transitions are instant (no animations)
|
|
227
|
+
7. **Templates**: Not yet integrated (Phase 6)
|
|
228
|
+
8. **Item builder**: Dynamic items from data not supported
|
|
229
|
+
|
|
230
|
+
These limitations will be addressed in post-MVP versions.
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { View, ViewStyle } from 'react-native';
|
|
3
|
+
import type { ComponentContext } from '../../types/componentContext';
|
|
4
|
+
import type { DivContainerData, ContainerOrientation } from '../../types/container';
|
|
5
|
+
import type { ContentAlignmentHorizontal, ContentAlignmentVertical } from '../../types/alignment';
|
|
6
|
+
import { Outer } from '../utilities/Outer';
|
|
7
|
+
import { DivComponent } from '../DivComponent';
|
|
8
|
+
import { useDerivedFromVarsSimple } from '../../hooks/useDerivedFromVars';
|
|
9
|
+
import { useDivKitContext } from '../../context/DivKitContext';
|
|
10
|
+
|
|
11
|
+
export interface DivContainerProps {
|
|
12
|
+
componentContext: ComponentContext<DivContainerData>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* DivContainer component - renders a flex container with child items
|
|
17
|
+
* MVP implementation with basic features:
|
|
18
|
+
* - Vertical/horizontal/overlap orientation
|
|
19
|
+
* - Content alignment (horizontal & vertical)
|
|
20
|
+
* - Item spacing (gap)
|
|
21
|
+
* - Flex layout with proper alignment
|
|
22
|
+
*
|
|
23
|
+
* Deferred for post-MVP:
|
|
24
|
+
* - Wrap layout mode
|
|
25
|
+
* - Separators (show_at_start, show_between, show_at_end)
|
|
26
|
+
* - Line separators (for wrap mode)
|
|
27
|
+
* - Aspect ratio constraints
|
|
28
|
+
* - Item builder (dynamic items from data)
|
|
29
|
+
* - Clip to bounds
|
|
30
|
+
*
|
|
31
|
+
* Based on Web Container.svelte
|
|
32
|
+
*/
|
|
33
|
+
export function DivContainer({ componentContext }: DivContainerProps) {
|
|
34
|
+
const { direction } = useDivKitContext();
|
|
35
|
+
const { json, variables } = componentContext;
|
|
36
|
+
|
|
37
|
+
// Reactive properties
|
|
38
|
+
const orientation = useDerivedFromVarsSimple<ContainerOrientation>(
|
|
39
|
+
json.orientation || 'vertical',
|
|
40
|
+
variables || new Map()
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const contentAlignmentHorizontal = useDerivedFromVarsSimple<ContentAlignmentHorizontal>(
|
|
44
|
+
json.content_alignment_horizontal || 'start',
|
|
45
|
+
variables || new Map()
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const contentAlignmentVertical = useDerivedFromVarsSimple<ContentAlignmentVertical>(
|
|
49
|
+
json.content_alignment_vertical || 'top',
|
|
50
|
+
variables || new Map()
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const itemSpacing = useDerivedFromVarsSimple<number>(
|
|
54
|
+
json.item_spacing || 0,
|
|
55
|
+
variables || new Map()
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// Build container style
|
|
59
|
+
const containerStyle = useMemo((): ViewStyle => {
|
|
60
|
+
const style: ViewStyle = {
|
|
61
|
+
display: 'flex'
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Orientation -> flexDirection
|
|
65
|
+
if (orientation === 'horizontal') {
|
|
66
|
+
style.flexDirection = 'row';
|
|
67
|
+
} else if (orientation === 'vertical') {
|
|
68
|
+
style.flexDirection = 'column';
|
|
69
|
+
} else if (orientation === 'overlap') {
|
|
70
|
+
// Overlap is like CSS position: relative with absolute children
|
|
71
|
+
// In React Native, this is achieved differently
|
|
72
|
+
// For MVP, we'll use a simple approach with View
|
|
73
|
+
style.position = 'relative';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Content alignment horizontal
|
|
77
|
+
// Maps to justifyContent for row, alignItems for column
|
|
78
|
+
if (orientation === 'horizontal') {
|
|
79
|
+
// Horizontal orientation: content_alignment_horizontal -> justifyContent
|
|
80
|
+
style.justifyContent = mapContentAlignmentToJustify(contentAlignmentHorizontal, direction);
|
|
81
|
+
// content_alignment_vertical -> alignItems (cross axis)
|
|
82
|
+
style.alignItems = mapContentAlignmentToAlign(contentAlignmentVertical);
|
|
83
|
+
} else if (orientation === 'vertical') {
|
|
84
|
+
// Vertical orientation: content_alignment_vertical -> justifyContent
|
|
85
|
+
style.justifyContent = mapContentAlignmentToJustify(contentAlignmentVertical, direction);
|
|
86
|
+
// content_alignment_horizontal -> alignItems (cross axis)
|
|
87
|
+
style.alignItems = mapContentAlignmentToAlign(contentAlignmentHorizontal, direction);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Item spacing (gap between items)
|
|
91
|
+
// React Native 0.71+ supports gap property
|
|
92
|
+
if (itemSpacing && itemSpacing > 0 && orientation !== 'overlap') {
|
|
93
|
+
style.gap = itemSpacing;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return style;
|
|
97
|
+
}, [orientation, contentAlignmentHorizontal, contentAlignmentVertical, itemSpacing, direction]);
|
|
98
|
+
|
|
99
|
+
// For overlap mode, we need to position children absolutely
|
|
100
|
+
const childWrapperStyle = useMemo((): ViewStyle | undefined => {
|
|
101
|
+
if (orientation === 'overlap') {
|
|
102
|
+
return {
|
|
103
|
+
position: 'absolute',
|
|
104
|
+
top: 0,
|
|
105
|
+
left: 0,
|
|
106
|
+
right: 0,
|
|
107
|
+
bottom: 0
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}, [orientation]);
|
|
112
|
+
|
|
113
|
+
// Render children
|
|
114
|
+
// We'll import DivComponent dynamically or assume it's available
|
|
115
|
+
// For now, we'll use a placeholder and fix this in the integration phase
|
|
116
|
+
const renderChildren = () => {
|
|
117
|
+
if (!json.items || json.items.length === 0) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return json.items.map((item, index) => {
|
|
122
|
+
const childContext = componentContext.produceChildContext(item, {
|
|
123
|
+
path: index,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
if (!childContext) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const child = (
|
|
131
|
+
<DivComponent
|
|
132
|
+
key={item.id || `item-${index}`}
|
|
133
|
+
componentContext={childContext}
|
|
134
|
+
/>
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Wrap in positioned View for overlap mode
|
|
138
|
+
if (orientation === 'overlap' && childWrapperStyle) {
|
|
139
|
+
return (
|
|
140
|
+
<View key={item.id || `item-${index}`} style={childWrapperStyle}>
|
|
141
|
+
{child}
|
|
142
|
+
</View>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return child;
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<Outer componentContext={componentContext}>
|
|
152
|
+
<View style={containerStyle}>
|
|
153
|
+
{renderChildren()}
|
|
154
|
+
</View>
|
|
155
|
+
</Outer>
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Maps DivKit ContentAlignment to React Native justifyContent
|
|
161
|
+
* Used for main axis alignment
|
|
162
|
+
*/
|
|
163
|
+
function mapContentAlignmentToJustify(
|
|
164
|
+
alignment: ContentAlignmentHorizontal | ContentAlignmentVertical | undefined,
|
|
165
|
+
_direction: 'ltr' | 'rtl' = 'ltr'
|
|
166
|
+
): ViewStyle['justifyContent'] {
|
|
167
|
+
if (!alignment) return 'flex-start';
|
|
168
|
+
|
|
169
|
+
switch (alignment) {
|
|
170
|
+
case 'start':
|
|
171
|
+
case 'left':
|
|
172
|
+
case 'top':
|
|
173
|
+
return 'flex-start';
|
|
174
|
+
case 'center':
|
|
175
|
+
return 'center';
|
|
176
|
+
case 'end':
|
|
177
|
+
case 'right':
|
|
178
|
+
case 'bottom':
|
|
179
|
+
return 'flex-end';
|
|
180
|
+
case 'space-between':
|
|
181
|
+
return 'space-between';
|
|
182
|
+
case 'space-around':
|
|
183
|
+
return 'space-around';
|
|
184
|
+
case 'space-evenly':
|
|
185
|
+
return 'space-evenly';
|
|
186
|
+
default:
|
|
187
|
+
return 'flex-start';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Maps DivKit ContentAlignment to React Native alignItems
|
|
193
|
+
* Used for cross axis alignment
|
|
194
|
+
*/
|
|
195
|
+
function mapContentAlignmentToAlign(
|
|
196
|
+
alignment: ContentAlignmentHorizontal | ContentAlignmentVertical | undefined,
|
|
197
|
+
_direction: 'ltr' | 'rtl' = 'ltr'
|
|
198
|
+
): ViewStyle['alignItems'] {
|
|
199
|
+
if (!alignment) return 'flex-start';
|
|
200
|
+
|
|
201
|
+
switch (alignment) {
|
|
202
|
+
case 'start':
|
|
203
|
+
case 'left':
|
|
204
|
+
case 'top':
|
|
205
|
+
return 'flex-start';
|
|
206
|
+
case 'center':
|
|
207
|
+
return 'center';
|
|
208
|
+
case 'end':
|
|
209
|
+
case 'right':
|
|
210
|
+
case 'bottom':
|
|
211
|
+
return 'flex-end';
|
|
212
|
+
case 'baseline':
|
|
213
|
+
return 'baseline';
|
|
214
|
+
// space-* values don't apply to cross axis
|
|
215
|
+
case 'space-between':
|
|
216
|
+
case 'space-around':
|
|
217
|
+
case 'space-evenly':
|
|
218
|
+
return 'flex-start';
|
|
219
|
+
default:
|
|
220
|
+
return 'flex-start';
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import React, { useMemo, useState } from 'react';
|
|
2
|
+
import { Image, View, ViewStyle, ImageStyle, ActivityIndicator } from 'react-native';
|
|
3
|
+
import type { ComponentContext } from '../../types/componentContext';
|
|
4
|
+
import type { DivImageData } from '../../types/image';
|
|
5
|
+
import type { ImageScale } from '../../types/imageScale';
|
|
6
|
+
import { Outer } from '../utilities/Outer';
|
|
7
|
+
import { useDerivedFromVarsSimple } from '../../hooks/useDerivedFromVars';
|
|
8
|
+
import { wrapError } from '../../utils/wrapError';
|
|
9
|
+
|
|
10
|
+
export interface DivImageProps {
|
|
11
|
+
componentContext: ComponentContext<DivImageData>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* DivImage component - renders images from network URLs
|
|
16
|
+
* MVP implementation with basic features:
|
|
17
|
+
* - Network image loading
|
|
18
|
+
* - Scaling modes (fill, fit, stretch, no_scale)
|
|
19
|
+
* - Placeholder color while loading
|
|
20
|
+
* - Content alignment (horizontal & vertical)
|
|
21
|
+
* - Aspect ratio
|
|
22
|
+
*
|
|
23
|
+
* Deferred for post-MVP:
|
|
24
|
+
* - GIF support (requires native module or library)
|
|
25
|
+
* - Image preview (blur-up technique)
|
|
26
|
+
* - Tint color and tint modes
|
|
27
|
+
* - Image filters (blur, etc.)
|
|
28
|
+
* - Appearance animations
|
|
29
|
+
* - High priority preview
|
|
30
|
+
* - Preload required flag
|
|
31
|
+
* - react-native-fast-image integration
|
|
32
|
+
*
|
|
33
|
+
* Based on Web Image.svelte
|
|
34
|
+
*/
|
|
35
|
+
export function DivImage({ componentContext }: DivImageProps) {
|
|
36
|
+
const { json, variables } = componentContext;
|
|
37
|
+
const [loading, setLoading] = useState(true);
|
|
38
|
+
const [error, setError] = useState(false);
|
|
39
|
+
|
|
40
|
+
// Reactive properties
|
|
41
|
+
const imageUrl = useDerivedFromVarsSimple<string | undefined>(
|
|
42
|
+
json.image_url || json.gif_url,
|
|
43
|
+
variables || new Map()
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const scale = useDerivedFromVarsSimple<ImageScale>(
|
|
47
|
+
json.scale || 'fill',
|
|
48
|
+
variables || new Map()
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const placeholderColor = useDerivedFromVarsSimple<string | undefined>(
|
|
52
|
+
json.placeholder_color,
|
|
53
|
+
variables || new Map()
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Map DivKit scale to React Native resizeMode
|
|
57
|
+
const resizeMode = useMemo((): ImageStyle['resizeMode'] => {
|
|
58
|
+
switch (scale) {
|
|
59
|
+
case 'fill':
|
|
60
|
+
return 'cover'; // Fills the area, may crop
|
|
61
|
+
case 'fit':
|
|
62
|
+
return 'contain'; // Fits within area, no crop
|
|
63
|
+
case 'stretch':
|
|
64
|
+
return 'stretch'; // Stretches to fill, may distort
|
|
65
|
+
case 'no_scale':
|
|
66
|
+
return 'center'; // Original size, centered
|
|
67
|
+
default:
|
|
68
|
+
return 'cover';
|
|
69
|
+
}
|
|
70
|
+
}, [scale]);
|
|
71
|
+
|
|
72
|
+
// Container style (for placeholder and loading)
|
|
73
|
+
const containerStyle = useMemo((): ViewStyle => {
|
|
74
|
+
const style: ViewStyle = {
|
|
75
|
+
overflow: 'hidden'
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// Placeholder background
|
|
79
|
+
if (placeholderColor && loading) {
|
|
80
|
+
style.backgroundColor = placeholderColor;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Aspect ratio
|
|
84
|
+
if (json.aspect?.ratio) {
|
|
85
|
+
style.aspectRatio = json.aspect.ratio;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return style;
|
|
89
|
+
}, [placeholderColor, loading, json.aspect]);
|
|
90
|
+
|
|
91
|
+
// Image style
|
|
92
|
+
const imageStyle = useMemo((): ImageStyle => {
|
|
93
|
+
const style: ImageStyle = {
|
|
94
|
+
width: '100%',
|
|
95
|
+
height: '100%'
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// Aspect ratio
|
|
99
|
+
if (json.aspect?.ratio) {
|
|
100
|
+
style.aspectRatio = json.aspect.ratio;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return style;
|
|
104
|
+
}, [json.aspect]);
|
|
105
|
+
|
|
106
|
+
// Handle image load events
|
|
107
|
+
const handleLoadStart = () => {
|
|
108
|
+
setLoading(true);
|
|
109
|
+
setError(false);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const handleLoadEnd = () => {
|
|
113
|
+
setLoading(false);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const handleError = () => {
|
|
117
|
+
setLoading(false);
|
|
118
|
+
setError(true);
|
|
119
|
+
componentContext.logError(wrapError(new Error(`Failed to load image: ${imageUrl}`)));
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// Render error state
|
|
123
|
+
if (error) {
|
|
124
|
+
return (
|
|
125
|
+
<Outer componentContext={componentContext}>
|
|
126
|
+
<View style={[containerStyle, { backgroundColor: placeholderColor || '#EEEEEE' }]}>
|
|
127
|
+
{/* Error placeholder - could be customized */}
|
|
128
|
+
</View>
|
|
129
|
+
</Outer>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Render loading state
|
|
134
|
+
if (!imageUrl) {
|
|
135
|
+
return (
|
|
136
|
+
<Outer componentContext={componentContext}>
|
|
137
|
+
<View style={[containerStyle, { backgroundColor: placeholderColor || '#EEEEEE' }]} />
|
|
138
|
+
</Outer>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
<Outer componentContext={componentContext}>
|
|
144
|
+
<View style={containerStyle}>
|
|
145
|
+
<Image
|
|
146
|
+
source={{ uri: imageUrl }}
|
|
147
|
+
style={imageStyle}
|
|
148
|
+
resizeMode={resizeMode}
|
|
149
|
+
onLoadStart={handleLoadStart}
|
|
150
|
+
onLoadEnd={handleLoadEnd}
|
|
151
|
+
onError={handleError}
|
|
152
|
+
/>
|
|
153
|
+
{loading && (
|
|
154
|
+
<View
|
|
155
|
+
style={{
|
|
156
|
+
position: 'absolute',
|
|
157
|
+
top: 0,
|
|
158
|
+
left: 0,
|
|
159
|
+
right: 0,
|
|
160
|
+
bottom: 0,
|
|
161
|
+
justifyContent: 'center',
|
|
162
|
+
alignItems: 'center',
|
|
163
|
+
backgroundColor: placeholderColor || 'transparent'
|
|
164
|
+
}}
|
|
165
|
+
>
|
|
166
|
+
<ActivityIndicator size="small" color="#999999" />
|
|
167
|
+
</View>
|
|
168
|
+
)}
|
|
169
|
+
</View>
|
|
170
|
+
</Outer>
|
|
171
|
+
);
|
|
172
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Component router
|
|
2
|
+
export { DivComponent } from './DivComponent';
|
|
3
|
+
export type { DivComponentProps } from './DivComponent';
|
|
4
|
+
|
|
5
|
+
// Individual components
|
|
6
|
+
export { DivText } from './text';
|
|
7
|
+
export { DivContainer } from './container';
|
|
8
|
+
export { DivImage } from './image';
|
|
9
|
+
export { DivState } from './state';
|
|
10
|
+
|
|
11
|
+
// Utilities
|
|
12
|
+
export { Outer } from './utilities/Outer';
|
|
13
|
+
export { Unknown } from './utilities/Unknown';
|
|
14
|
+
|
|
15
|
+
// Types
|
|
16
|
+
export type { DivTextProps } from './text';
|
|
17
|
+
export type { DivContainerProps } from './container';
|
|
18
|
+
export type { DivImageProps } from './image';
|
|
19
|
+
export type { DivStateProps } from './state';
|
|
20
|
+
export type { OuterProps } from './utilities/Outer';
|