@fewbox/den-app 0.1.43
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/index-app.d.ts +13 -0
- package/index.css +1 -0
- package/index.js +2 -0
- package/index.js.map +1 -0
- package/jest.setup.d.ts +1 -0
- package/package.json +26 -0
- package/scripts/copy-templates.js +29 -0
- package/scripts/generate-packages.js +41 -0
- package/src/components/Auth/FigmaSignin/index.d.ts +9 -0
- package/src/components/Auth/GoogleGrant/index.d.ts +41 -0
- package/src/components/Auth/GoogleSignin/index.d.ts +18 -0
- package/src/components/Auth/WeComSignin/index.d.ts +8 -0
- package/src/components/Auth/util.d.ts +17 -0
- package/src/components/Debug/index.d.ts +6 -0
- package/src/components/Engine/Base/NativeAttributeMap.d.ts +2 -0
- package/src/components/Engine/Base/ViewAttributes.d.ts +2 -0
- package/src/components/Engine/Base/index.d.ts +61 -0
- package/src/components/Engine/index.d.ts +125 -0
- package/src/components/Layout/Display/index.d.ts +18 -0
- package/src/components/Layout/Dock/index.d.ts +42 -0
- package/src/components/Layout/Flex/index.d.ts +45 -0
- package/src/components/Layout/FlexItem/index.d.ts +18 -0
- package/src/components/Layout/Position/index.d.ts +32 -0
- package/src/components/Layout/PositionArea/index.d.ts +10 -0
- package/src/components/Layout/Responsive/index.d.ts +8 -0
- package/src/components/Layout/SBaseline/index.d.ts +5 -0
- package/src/components/Layout/SBottom/index.d.ts +6 -0
- package/src/components/Layout/SCenter/index.d.ts +5 -0
- package/src/components/Layout/SLeft/index.d.ts +5 -0
- package/src/components/Layout/SMiddle/index.d.ts +5 -0
- package/src/components/Layout/SRight/index.d.ts +5 -0
- package/src/components/Layout/SStretch/index.d.ts +5 -0
- package/src/components/Layout/STop/index.d.ts +5 -0
- package/src/components/Layout/X/index.d.ts +5 -0
- package/src/components/Layout/XAround/index.d.ts +5 -0
- package/src/components/Layout/XAutoBoth/index.d.ts +5 -0
- package/src/components/Layout/XAutoCenter/index.d.ts +5 -0
- package/src/components/Layout/XAutoLeft/index.d.ts +5 -0
- package/src/components/Layout/XAutoLefts/index.d.ts +5 -0
- package/src/components/Layout/XAutoRight/index.d.ts +5 -0
- package/src/components/Layout/XAutoRights/index.d.ts +5 -0
- package/src/components/Layout/XBase/index.d.ts +18 -0
- package/src/components/Layout/XBetween/index.d.ts +5 -0
- package/src/components/Layout/XCenter/index.d.ts +5 -0
- package/src/components/Layout/XCustom/index.d.ts +7 -0
- package/src/components/Layout/XCustomBoth/index.d.ts +7 -0
- package/src/components/Layout/XEvenly/index.d.ts +5 -0
- package/src/components/Layout/XLeft/index.d.ts +5 -0
- package/src/components/Layout/XRight/index.d.ts +5 -0
- package/src/components/Layout/XWrapAround/index.d.ts +5 -0
- package/src/components/Layout/XWrapBetween/index.d.ts +5 -0
- package/src/components/Layout/XWrapBottom/index.d.ts +5 -0
- package/src/components/Layout/XWrapEvenly/index.d.ts +5 -0
- package/src/components/Layout/XWrapMiddle/index.d.ts +5 -0
- package/src/components/Layout/XWrapTop/index.d.ts +5 -0
- package/src/components/Layout/Y/index.d.ts +5 -0
- package/src/components/Layout/YAround/index.d.ts +5 -0
- package/src/components/Layout/YAutoBoth/index.d.ts +5 -0
- package/src/components/Layout/YAutoBottom/index.d.ts +5 -0
- package/src/components/Layout/YAutoBottoms/index.d.ts +5 -0
- package/src/components/Layout/YAutoCenter/index.d.ts +5 -0
- package/src/components/Layout/YAutoTop/index.d.ts +5 -0
- package/src/components/Layout/YAutoTops/index.d.ts +5 -0
- package/src/components/Layout/YBase/index.d.ts +18 -0
- package/src/components/Layout/YBetween/index.d.ts +5 -0
- package/src/components/Layout/YBottom/index.d.ts +5 -0
- package/src/components/Layout/YCustom/index.d.ts +7 -0
- package/src/components/Layout/YCustomBoth/index.d.ts +7 -0
- package/src/components/Layout/YEvenly/index.d.ts +5 -0
- package/src/components/Layout/YMiddle/index.d.ts +5 -0
- package/src/components/Layout/YTop/index.d.ts +5 -0
- package/src/components/Layout/YWrapAround/index.d.ts +5 -0
- package/src/components/Layout/YWrapBetween/index.d.ts +5 -0
- package/src/components/Layout/YWrapCenter/index.d.ts +5 -0
- package/src/components/Layout/YWrapEvenly/index.d.ts +5 -0
- package/src/components/Layout/YWrapLeft/index.d.ts +5 -0
- package/src/components/Layout/YWrapRight/index.d.ts +5 -0
- package/src/components/Layout/index.d.ts +8 -0
- package/src/components/Layout/util.d.ts +6 -0
- package/src/components/View/VActionForm/index.d.ts +7 -0
- package/src/components/View/VAnimation/index.d.ts +127 -0
- package/src/components/View/VAudio/index.d.ts +10 -0
- package/src/components/View/VAvatar/index.d.ts +12 -0
- package/src/components/View/VBackground/index.d.ts +18 -0
- package/src/components/View/VBadge/index.d.ts +6 -0
- package/src/components/View/VBlock/index.d.ts +9 -0
- package/src/components/View/VBoundary/index.d.ts +6 -0
- package/src/components/View/VCard/index.d.ts +8 -0
- package/src/components/View/VCardMedia/index.d.ts +9 -0
- package/src/components/View/VCardSocial/index.d.ts +13 -0
- package/src/components/View/VCardWindow/index.d.ts +15 -0
- package/src/components/View/VChromeExtensionValidator/index.d.ts +23 -0
- package/src/components/View/VDynamic/index.d.ts +7 -0
- package/src/components/View/VErrorBoundary/index.d.ts +18 -0
- package/src/components/View/VFooter/index.d.ts +5 -0
- package/src/components/View/VForm/index.d.ts +13 -0
- package/src/components/View/VFrame/index.d.ts +12 -0
- package/src/components/View/VGoogleFont/index.d.ts +18 -0
- package/src/components/View/VHR/index.d.ts +5 -0
- package/src/components/View/VHeader/index.d.ts +5 -0
- package/src/components/View/VHyperlink/index.d.ts +13 -0
- package/src/components/View/VImage/index.d.ts +13 -0
- package/src/components/View/VInput/VBase64File/index.d.ts +10 -0
- package/src/components/View/VInput/VCheckBox/index.d.ts +6 -0
- package/src/components/View/VInput/VColor/index.d.ts +7 -0
- package/src/components/View/VInput/VDate/index.d.ts +7 -0
- package/src/components/View/VInput/VDatetimeLocal/index.d.ts +7 -0
- package/src/components/View/VInput/VDropdown/index.d.ts +38 -0
- package/src/components/View/VInput/VEmail/index.d.ts +5 -0
- package/src/components/View/VInput/VFile/index.d.ts +29 -0
- package/src/components/View/VInput/VGroup/index.d.ts +10 -0
- package/src/components/View/VInput/VHidden/index.d.ts +5 -0
- package/src/components/View/VInput/VMonth/index.d.ts +5 -0
- package/src/components/View/VInput/VNumber/index.d.ts +5 -0
- package/src/components/View/VInput/VPassword/index.d.ts +5 -0
- package/src/components/View/VInput/VRadio/index.d.ts +6 -0
- package/src/components/View/VInput/VRange/index.d.ts +10 -0
- package/src/components/View/VInput/VSearch/index.d.ts +5 -0
- package/src/components/View/VInput/VSubmit/index.d.ts +8 -0
- package/src/components/View/VInput/VSubmitWrapper/index.d.ts +6 -0
- package/src/components/View/VInput/VTel/index.d.ts +5 -0
- package/src/components/View/VInput/VTextBox/index.d.ts +6 -0
- package/src/components/View/VInput/VTime/index.d.ts +5 -0
- package/src/components/View/VInput/VUrl/index.d.ts +5 -0
- package/src/components/View/VInput/VWeek/index.d.ts +5 -0
- package/src/components/View/VInput/index.d.ts +29 -0
- package/src/components/View/VLabel/index.d.ts +57 -0
- package/src/components/View/VLoading/index.d.ts +8 -0
- package/src/components/View/VMain/index.d.ts +5 -0
- package/src/components/View/VMask/index.d.ts +5 -0
- package/src/components/View/VMount/index.d.ts +5 -0
- package/src/components/View/VPhoto/index.d.ts +20 -0
- package/src/components/View/VRoot/index.d.ts +15 -0
- package/src/components/View/VSection/index.d.ts +5 -0
- package/src/components/View/VSelect/index.d.ts +14 -0
- package/src/components/View/VShadow/index.d.ts +15 -0
- package/src/components/View/VShape/VEllipse/index.d.ts +10 -0
- package/src/components/View/VShape/VLine/index.d.ts +10 -0
- package/src/components/View/VShape/VRectangle/index.d.ts +10 -0
- package/src/components/View/VStack/index.d.ts +5 -0
- package/src/components/View/VSvg/index.d.ts +15 -0
- package/src/components/View/VSwitch/index.d.ts +13 -0
- package/src/components/View/VTemplate/index.d.ts +5 -0
- package/src/components/View/VText/index.d.ts +23 -0
- package/src/components/View/VTextArea/index.d.ts +12 -0
- package/src/components/View/VTheme/index.d.ts +42 -0
- package/src/components/View/VTooltip/index.d.ts +17 -0
- package/src/components/View/VTree/Block/index.d.ts +14 -0
- package/src/components/View/VTree/index.d.ts +15 -0
- package/src/components/View/VVideo/index.d.ts +10 -0
- package/src/components/View/VZone/index.d.ts +14 -0
- package/src/components/app.d.ts +11 -0
- package/src/components/consts.d.ts +2 -0
- package/src/components/core.d.ts +117 -0
- package/src/components/util.d.ts +1 -0
- package/src/components/web.d.ts +9 -0
- package/src/fewbox/index.d.ts +42 -0
- package/src/language/index.d.ts +13 -0
- package/src/network/FormHeaders.d.ts +2 -0
- package/src/network/IGraphQL.d.ts +6 -0
- package/src/network/JsonHeaders.d.ts +5 -0
- package/src/network/Network.d.ts +45 -0
- package/src/network/NetworkObservableBase.d.ts +14 -0
- package/src/network/StreamObservableBase.d.ts +11 -0
- package/src/network/UploadHeaders.d.ts +2 -0
- package/src/network/WS.d.ts +11 -0
- package/src/network/ajax/default/Delete.d.ts +5 -0
- package/src/network/ajax/default/DeleteText.d.ts +5 -0
- package/src/network/ajax/default/Get.d.ts +5 -0
- package/src/network/ajax/default/GetLocal.d.ts +5 -0
- package/src/network/ajax/default/GetText.d.ts +5 -0
- package/src/network/ajax/default/NetworkObservableAjax.d.ts +7 -0
- package/src/network/ajax/default/Patch.d.ts +5 -0
- package/src/network/ajax/default/PatchText.d.ts +5 -0
- package/src/network/ajax/default/Post.d.ts +5 -0
- package/src/network/ajax/default/PostText.d.ts +5 -0
- package/src/network/ajax/default/Put.d.ts +5 -0
- package/src/network/ajax/default/PutText.d.ts +5 -0
- package/src/network/ajax/external/DeleteExternal.d.ts +5 -0
- package/src/network/ajax/external/DeleteTextExternal.d.ts +5 -0
- package/src/network/ajax/external/GetExternal.d.ts +5 -0
- package/src/network/ajax/external/GetTextExternal.d.ts +5 -0
- package/src/network/ajax/external/NetworkObservableAjaxExternal.d.ts +8 -0
- package/src/network/ajax/external/PatchExternal.d.ts +5 -0
- package/src/network/ajax/external/PatchTextExternal.d.ts +5 -0
- package/src/network/ajax/external/PostExternal.d.ts +5 -0
- package/src/network/ajax/external/PostTextExternal.d.ts +5 -0
- package/src/network/ajax/external/PutExternal.d.ts +5 -0
- package/src/network/ajax/external/PutTextExternal.d.ts +5 -0
- package/src/network/fetch/default/DeleteFetch.d.ts +5 -0
- package/src/network/fetch/default/GetFetch.d.ts +5 -0
- package/src/network/fetch/default/NetworkObservableFetch.d.ts +7 -0
- package/src/network/fetch/default/PatchFetch.d.ts +5 -0
- package/src/network/fetch/default/PostFetch.d.ts +5 -0
- package/src/network/fetch/default/PutFetch.d.ts +5 -0
- package/src/network/fetch/external/DeleteFetchExternal.d.ts +5 -0
- package/src/network/fetch/external/GetFetchExternal.d.ts +5 -0
- package/src/network/fetch/external/NetworkObservableFetchExternal.d.ts +8 -0
- package/src/network/fetch/external/PatchFetchExternal.d.ts +5 -0
- package/src/network/fetch/external/PostFetchExternal.d.ts +5 -0
- package/src/network/fetch/external/PutFetchExternal.d.ts +5 -0
- package/src/network/graphql/default/GQL.d.ts +6 -0
- package/src/network/graphql/default/GQLUpload.d.ts +5 -0
- package/src/network/graphql/default/NetworkObservableGQL.d.ts +7 -0
- package/src/network/graphql/external/GQLExternal.d.ts +6 -0
- package/src/network/graphql/external/GQLExternalUpload.d.ts +6 -0
- package/src/network/graphql/external/NetworkObservableGQLExternal.d.ts +7 -0
- package/src/network/index.d.ts +47 -0
- package/src/network/sse/default/GetSSE.d.ts +5 -0
- package/src/network/sse/default/PostSSE.d.ts +5 -0
- package/src/network/sse/default/StreamObservableSSE.d.ts +5 -0
- package/src/network/sse/external/GetSSEExternal.d.ts +5 -0
- package/src/network/sse/external/PostSSEExternal.d.ts +5 -0
- package/src/network/sse/external/StreamObservableSSEExternal.d.ts +6 -0
- package/src/network/util.d.ts +5 -0
- package/src/store/EnumDictionary.d.ts +3 -0
- package/src/store/IContinuePaging.d.ts +4 -0
- package/src/store/IList.d.ts +3 -0
- package/src/store/IMetaResponse.d.ts +5 -0
- package/src/store/IPaging.d.ts +6 -0
- package/src/store/IPayloadResponse.d.ts +4 -0
- package/src/store/Json.d.ts +9 -0
- package/src/store/index.d.ts +7 -0
- package/templates/.claude/skills/fewbox-den/SKILL.md +1111 -0
- package/templates/FEWBOX.md +72 -0
- package/templates/style/_core.scss +288 -0
- package/templates/style/_root-properties.scss +55 -0
- package/templates/style/_root.scss +6 -0
- package/templates/style/_variables.scss +193 -0
|
@@ -0,0 +1,1111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fewbox-den
|
|
3
|
+
description: Use when writing React UI with the fewbox-den component library. Provides component API reference for layouts (X/Y/S series), views (VLabel, VForm, VInput, etc.), network clients (Fetch, SSE, GraphQL, WebSocket), styling (ColorType, FontSizeType), and common patterns (page layout, forms, cards). Invoke this skill when you see Den.Components imports or need to create UI with fewbox-den.
|
|
4
|
+
allowed-tools: Read, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# FewBox Den - Component Library Reference
|
|
8
|
+
|
|
9
|
+
When writing code that uses fewbox-den, follow the patterns and API documented below.
|
|
10
|
+
|
|
11
|
+
## Import Pattern
|
|
12
|
+
|
|
13
|
+
All components are accessed through the `Den` namespace:
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { Den } from '@fewbox/den'; // core variant
|
|
17
|
+
import { Den } from '@fewbox/den-app'; // app variant (includes network/store)
|
|
18
|
+
import { Den } from '@fewbox/den-web'; // web variant
|
|
19
|
+
|
|
20
|
+
// Components accessed via:
|
|
21
|
+
Den.Components.XCenter
|
|
22
|
+
Den.Components.VLabel
|
|
23
|
+
Den.Components.ColorType // enums are also under Components
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Variant Exports
|
|
27
|
+
|
|
28
|
+
- **core**: Layout (X/Y/S/Flex/Position/Dock/Display/Responsive), View (VBoundary, VLabel, VText, VForm, VInput/*, VSelect, VDropdown, VSwitch, VImage, VSvg, VBackground, VAnimation, VTooltip, VLoading, VErrorBoundary, VShape/*, VHyperlink, VMask, VFrame, VTheme, VHeader/VMain/VFooter, VHR, VSection, VZone, VAudio, VVideo, VShadow)
|
|
29
|
+
- **web**: core + Debug, VGoogleFont, VChromeExtensionValidator, GoogleGrant, GoogleSignin, FigmaSignin, WeComSignin
|
|
30
|
+
- **app**: web + VDynamic, VAvatar, VBlock, VCard, VCardMedia, VCardSocial, VCardWindow, VPhoto, VStack, VTree
|
|
31
|
+
|
|
32
|
+
## Core Concepts
|
|
33
|
+
|
|
34
|
+
### Common Props (IBaseProps)
|
|
35
|
+
|
|
36
|
+
All components extend `IBaseProps` which provides these shared props:
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Description |
|
|
39
|
+
|------|------|-------------|
|
|
40
|
+
| `className` | `string` | Additional CSS classes |
|
|
41
|
+
| `style` | `CSSProperties` | Inline styles |
|
|
42
|
+
| `fontSize` | `FontSizeType \| string` | Font size preset or custom value |
|
|
43
|
+
| `fontWeight` | `FontWeightType` | Font weight (Thin through Black) |
|
|
44
|
+
| `frontColor` | `ColorType \| string` | Text/foreground color |
|
|
45
|
+
| `backgroundColor` | `ColorType \| string` | Background color |
|
|
46
|
+
| `borderColor` | `ColorType \| string` | Border color |
|
|
47
|
+
| `borderDirection` | `DirectionType` | Which sides get the border |
|
|
48
|
+
| `padding` | `string` | CSS padding |
|
|
49
|
+
| `margin` | `string` | CSS margin |
|
|
50
|
+
| `width` | `string` | CSS width |
|
|
51
|
+
| `height` | `string` | CSS height |
|
|
52
|
+
| `minWidth` | `string` | CSS min-width |
|
|
53
|
+
| `minHeight` | `string` | CSS min-height |
|
|
54
|
+
| `maxWidth` | `string` | CSS max-width |
|
|
55
|
+
| `maxHeight` | `string` | CSS max-height |
|
|
56
|
+
| `borderRadius` | `string` | CSS border-radius |
|
|
57
|
+
| `borderWidth` | `string` | CSS border-width |
|
|
58
|
+
| `borderStyle` | `string` | CSS border-style |
|
|
59
|
+
| `opacity` | `number` | CSS opacity |
|
|
60
|
+
| `display` | `string` | CSS display |
|
|
61
|
+
| `overflow` | `string` | CSS overflow |
|
|
62
|
+
| `cursor` | `string` | CSS cursor |
|
|
63
|
+
| `selfShrink` | `number` | flex-shrink for the component itself |
|
|
64
|
+
| `selfGrow` | `number` | flex-grow for the component itself |
|
|
65
|
+
| `selfBasis` | `string` | flex-basis for the component itself |
|
|
66
|
+
| `isDefaultValue` | `boolean` | Apply default transparency and color resets |
|
|
67
|
+
|
|
68
|
+
### Color System (ColorType)
|
|
69
|
+
|
|
70
|
+
Pre-defined semantic colors with opacity variants:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
ColorType.Font // #000
|
|
74
|
+
ColorType.Body // #f5f8fa
|
|
75
|
+
ColorType.White // #fff
|
|
76
|
+
ColorType.Black // #000
|
|
77
|
+
ColorType.Light // light gray
|
|
78
|
+
ColorType.Dark // dark gray
|
|
79
|
+
ColorType.Primary // magenta
|
|
80
|
+
ColorType.Secondary // pink
|
|
81
|
+
ColorType.Tertiary // gold
|
|
82
|
+
ColorType.Info // blue
|
|
83
|
+
ColorType.Success // green
|
|
84
|
+
ColorType.Warning // yellow
|
|
85
|
+
ColorType.Error // red
|
|
86
|
+
ColorType.Border // border color
|
|
87
|
+
ColorType.Placeholder // placeholder color
|
|
88
|
+
ColorType.Transparent // transparent
|
|
89
|
+
|
|
90
|
+
// Each color has opacity variants:
|
|
91
|
+
ColorType.Primary75 // 75% opacity
|
|
92
|
+
ColorType.Primary50 // 50% opacity
|
|
93
|
+
ColorType.Primary25 // 25% opacity
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Font Size System (FontSizeType)
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
FontSizeType.ExtraSmall
|
|
100
|
+
FontSizeType.Small
|
|
101
|
+
FontSizeType.Normal
|
|
102
|
+
FontSizeType.Default
|
|
103
|
+
FontSizeType.Large
|
|
104
|
+
FontSizeType.ExtraLarge
|
|
105
|
+
|
|
106
|
+
// Auto-responsive variants:
|
|
107
|
+
FontSizeType.AutoExtraSmall
|
|
108
|
+
FontSizeType.AutoSmall
|
|
109
|
+
FontSizeType.AutoNormal
|
|
110
|
+
FontSizeType.AutoLarge
|
|
111
|
+
FontSizeType.AutoExtraLarge
|
|
112
|
+
|
|
113
|
+
// Custom font size (string):
|
|
114
|
+
fontSize="custom" // applies class "font-size-custom", define in CSS
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Font Weight System (FontWeightType)
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
FontWeightType.Thin // 100
|
|
121
|
+
FontWeightType.ExtraLight // 200
|
|
122
|
+
FontWeightType.Light // 300
|
|
123
|
+
FontWeightType.Regular // 400
|
|
124
|
+
FontWeightType.Medium // 500
|
|
125
|
+
FontWeightType.SemiBold // 600
|
|
126
|
+
FontWeightType.Bold // 700
|
|
127
|
+
FontWeightType.ExtraBold // 800
|
|
128
|
+
FontWeightType.Black // 900
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Layout Components
|
|
134
|
+
|
|
135
|
+
### X-Series (Horizontal Layout, flex-direction: row)
|
|
136
|
+
|
|
137
|
+
All X-series components accept `gap`, `cross`, `itemsShrink` props in addition to common props.
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
// Basic horizontal layout (default: justify-content: flex-start)
|
|
141
|
+
<Den.Components.X gap="1em">
|
|
142
|
+
<Child1 /> <Child2 /> <Child3 />
|
|
143
|
+
</Den.Components.X>
|
|
144
|
+
|
|
145
|
+
// Justify-content variants:
|
|
146
|
+
<Den.Components.XLeft>...</Den.Components.XLeft> // flex-start
|
|
147
|
+
<Den.Components.XCenter>...</Den.Components.XCenter> // center
|
|
148
|
+
<Den.Components.XRight>...</Den.Components.XRight> // flex-end
|
|
149
|
+
<Den.Components.XBetween>...</Den.Components.XBetween> // space-between
|
|
150
|
+
<Den.Components.XAround>...</Den.Components.XAround> // space-around
|
|
151
|
+
<Den.Components.XEvenly>...</Den.Components.XEvenly> // space-evenly
|
|
152
|
+
|
|
153
|
+
// Auto-margin variants (margin-based centering):
|
|
154
|
+
<Den.Components.XAutoLeft>...</Den.Components.XAutoLeft> // first child margin-right: auto
|
|
155
|
+
<Den.Components.XAutoCenter>...</Den.Components.XAutoCenter> // center child with auto margins
|
|
156
|
+
<Den.Components.XAutoRight>...</Den.Components.XAutoRight> // last child margin-left: auto
|
|
157
|
+
<Den.Components.XAutoLefts>...</Den.Components.XAutoLefts> // all items margin-right: auto
|
|
158
|
+
<Den.Components.XAutoRights>...</Den.Components.XAutoRights> // all items margin-left: auto
|
|
159
|
+
<Den.Components.XAutoBoth>...</Den.Components.XAutoBoth> // first and last with auto margins
|
|
160
|
+
|
|
161
|
+
// Custom flex-basis distribution:
|
|
162
|
+
<Den.Components.XCustom basises={['20%', '30%', '50%']}>
|
|
163
|
+
<Child1 /> <Child2 /> <Child3 />
|
|
164
|
+
</Den.Components.XCustom>
|
|
165
|
+
|
|
166
|
+
// Uniform flex-basis with auto-margin sides:
|
|
167
|
+
<Den.Components.XCustomBoth basis="10%">
|
|
168
|
+
<Child1 /> <Child2 /> <Child3 />
|
|
169
|
+
</Den.Components.XCustomBoth>
|
|
170
|
+
|
|
171
|
+
// Wrap variants (flex-wrap: wrap with align-content):
|
|
172
|
+
<Den.Components.XWrapTop>...</Den.Components.XWrapTop> // align-content: flex-start
|
|
173
|
+
<Den.Components.XWrapMiddle>...</Den.Components.XWrapMiddle> // align-content: center
|
|
174
|
+
<Den.Components.XWrapBottom>...</Den.Components.XWrapBottom> // align-content: flex-end
|
|
175
|
+
<Den.Components.XWrapAround>...</Den.Components.XWrapAround> // align-content: space-around
|
|
176
|
+
<Den.Components.XWrapBetween>...</Den.Components.XWrapBetween> // align-content: space-between
|
|
177
|
+
<Den.Components.XWrapEvenly>...</Den.Components.XWrapEvenly> // align-content: space-evenly
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Cross-axis alignment** (align-items) via the `cross` prop on X components:
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
<Den.Components.X cross={Den.Components.XCrossType.Top}> // align-items: flex-start
|
|
184
|
+
<Den.Components.X cross={Den.Components.XCrossType.Middle}> // align-items: center
|
|
185
|
+
<Den.Components.X cross={Den.Components.XCrossType.Bottom}> // align-items: flex-end
|
|
186
|
+
<Den.Components.X cross={Den.Components.XCrossType.Stretch}> // align-items: stretch
|
|
187
|
+
<Den.Components.X cross={Den.Components.XCrossType.Baseline}> // align-items: baseline
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Y-Series (Vertical Layout, flex-direction: column)
|
|
191
|
+
|
|
192
|
+
Mirrors X-series but vertically:
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
<Den.Components.Y gap="1em">...</Den.Components.Y> // default
|
|
196
|
+
<Den.Components.YTop>...</Den.Components.YTop> // justify-content: flex-start
|
|
197
|
+
<Den.Components.YMiddle>...</Den.Components.YMiddle> // justify-content: center
|
|
198
|
+
<Den.Components.YBottom>...</Den.Components.YBottom> // justify-content: flex-end
|
|
199
|
+
<Den.Components.YBetween>...</Den.Components.YBetween> // space-between
|
|
200
|
+
<Den.Components.YAround>...</Den.Components.YAround> // space-around
|
|
201
|
+
<Den.Components.YEvenly>...</Den.Components.YEvenly> // space-evenly
|
|
202
|
+
|
|
203
|
+
// Auto-margin variants:
|
|
204
|
+
<Den.Components.YAutoTop>...</Den.Components.YAutoTop>
|
|
205
|
+
<Den.Components.YAutoCenter>...</Den.Components.YAutoCenter>
|
|
206
|
+
<Den.Components.YAutoBottom>...</Den.Components.YAutoBottom>
|
|
207
|
+
<Den.Components.YAutoTops>...</Den.Components.YAutoTops>
|
|
208
|
+
<Den.Components.YAutoBottoms>...</Den.Components.YAutoBottoms>
|
|
209
|
+
<Den.Components.YAutoBoth>...</Den.Components.YAutoBoth>
|
|
210
|
+
|
|
211
|
+
// Custom:
|
|
212
|
+
<Den.Components.YCustom basises={['auto', '1fr', 'auto']}>...</Den.Components.YCustom>
|
|
213
|
+
<Den.Components.YCustomBoth basis="10%">...</Den.Components.YCustomBoth>
|
|
214
|
+
|
|
215
|
+
// Wrap variants:
|
|
216
|
+
<Den.Components.YWrapLeft>...</Den.Components.YWrapLeft>
|
|
217
|
+
<Den.Components.YWrapCenter>...</Den.Components.YWrapCenter>
|
|
218
|
+
<Den.Components.YWrapRight>...</Den.Components.YWrapRight>
|
|
219
|
+
<Den.Components.YWrapAround>...</Den.Components.YWrapAround>
|
|
220
|
+
<Den.Components.YWrapBetween>...</Den.Components.YWrapBetween>
|
|
221
|
+
<Den.Components.YWrapEvenly>...</Den.Components.YWrapEvenly>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Cross-axis alignment** (align-items) via the `cross` prop on Y components:
|
|
225
|
+
|
|
226
|
+
```tsx
|
|
227
|
+
<Den.Components.Y cross={Den.Components.YCrossType.Left}> // align-items: flex-start
|
|
228
|
+
<Den.Components.Y cross={Den.Components.YCrossType.Center}> // align-items: center
|
|
229
|
+
<Den.Components.Y cross={Den.Components.YCrossType.Right}> // align-items: flex-end
|
|
230
|
+
<Den.Components.Y cross={Den.Components.YCrossType.Stretch}> // align-items: stretch
|
|
231
|
+
<Den.Components.Y cross={Den.Components.YCrossType.Baseline}> // align-items: baseline
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### S-Series (Individual Item Cross-axis Override)
|
|
235
|
+
|
|
236
|
+
Wrap a child in an S-component to override the parent's cross-axis alignment for that child only:
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
<Den.Components.XCenter cross={Den.Components.XCrossType.Bottom} height="6em">
|
|
240
|
+
<Child1 /> {/* aligned to bottom */}
|
|
241
|
+
<Child2 /> {/* aligned to bottom */}
|
|
242
|
+
<Den.Components.STop>
|
|
243
|
+
<Child3 /> {/* overridden to top */}
|
|
244
|
+
</Den.Components.STop>
|
|
245
|
+
</Den.Components.XCenter>
|
|
246
|
+
|
|
247
|
+
// In X containers (cross-axis is vertical):
|
|
248
|
+
<Den.Components.STop>...</Den.Components.STop> // align-self: flex-start
|
|
249
|
+
<Den.Components.SMiddle>...</Den.Components.SMiddle> // align-self: center
|
|
250
|
+
<Den.Components.SBottom>...</Den.Components.SBottom> // align-self: flex-end
|
|
251
|
+
<Den.Components.SStretch>...</Den.Components.SStretch> // align-self: stretch
|
|
252
|
+
<Den.Components.SBaseline>...</Den.Components.SBaseline>// align-self: baseline
|
|
253
|
+
|
|
254
|
+
// In Y containers (cross-axis is horizontal):
|
|
255
|
+
<Den.Components.SLeft>...</Den.Components.SLeft> // align-self: flex-start
|
|
256
|
+
<Den.Components.SCenter>...</Den.Components.SCenter> // align-self: center
|
|
257
|
+
<Den.Components.SRight>...</Den.Components.SRight> // align-self: flex-end
|
|
258
|
+
<Den.Components.SStretch>...</Den.Components.SStretch> // align-self: stretch
|
|
259
|
+
<Den.Components.SBaseline>...</Den.Components.SBaseline>// align-self: baseline
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Position & PositionArea
|
|
263
|
+
|
|
264
|
+
```tsx
|
|
265
|
+
// PositionArea establishes a positioning context (position: relative) on its child.
|
|
266
|
+
// PositionCategory.Area = position: absolute (for items inside)
|
|
267
|
+
<Den.Components.PositionArea category={Den.Components.PositionAreaCategory.FullSize}>
|
|
268
|
+
<Den.Components.VBoundary height="250px" backgroundColor={Den.Components.ColorType.Dark}>
|
|
269
|
+
<Den.Components.Position category={Den.Components.PositionCategory.Area} type={Den.Components.PositionType.Center}>
|
|
270
|
+
<Content />
|
|
271
|
+
</Den.Components.Position>
|
|
272
|
+
</Den.Components.VBoundary>
|
|
273
|
+
</Den.Components.PositionArea>
|
|
274
|
+
|
|
275
|
+
// PositionAreaCategory:
|
|
276
|
+
// Default = inline-block container
|
|
277
|
+
// FullSize = block container
|
|
278
|
+
|
|
279
|
+
// PositionCategory:
|
|
280
|
+
// Edge = position: sticky
|
|
281
|
+
// Window = position: fixed
|
|
282
|
+
// Area = position: absolute
|
|
283
|
+
// Self = position: relative
|
|
284
|
+
|
|
285
|
+
// PositionType (predefined positions):
|
|
286
|
+
// Top, Right, Bottom, Left, LeftTop, RightTop, LeftBottom, RightBottom, Center
|
|
287
|
+
|
|
288
|
+
// Custom positioning (omit type, set top/right/bottom/left):
|
|
289
|
+
<Den.Components.Position category={Den.Components.PositionCategory.Area} top="20px" left="30px">
|
|
290
|
+
<Content />
|
|
291
|
+
</Den.Components.Position>
|
|
292
|
+
|
|
293
|
+
// Sticky navbar example:
|
|
294
|
+
<Den.Components.Position category={Den.Components.PositionCategory.Edge} top="0px" isFullWidth zIndex={10}>
|
|
295
|
+
<NavBar />
|
|
296
|
+
</Den.Components.Position>
|
|
297
|
+
|
|
298
|
+
// Position props: category (required), type, top, right, bottom, left, zIndex, isFullWidth
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Dock (Anchored Overlay Positioning)
|
|
302
|
+
|
|
303
|
+
```tsx
|
|
304
|
+
// Dock positions an overlay relative to its children.
|
|
305
|
+
// renderOverlay is REQUIRED — returns the overlay element.
|
|
306
|
+
<Den.Components.Dock
|
|
307
|
+
category={Den.Components.DockCategory.Top}
|
|
308
|
+
offset={4}
|
|
309
|
+
renderOverlay={() => <div>Tooltip above</div>}
|
|
310
|
+
>
|
|
311
|
+
<button>Hover me</button>
|
|
312
|
+
</Den.Components.Dock>
|
|
313
|
+
|
|
314
|
+
// DockCategory:
|
|
315
|
+
// Top, Right, Bottom, Left
|
|
316
|
+
// LeftTop, RightTop, LeftBottom, RightBottom
|
|
317
|
+
// InnerTop, InnerRight, InnerBottom, InnerLeft
|
|
318
|
+
// InnerLeftTop, InnerRightTop, InnerLeftBottom, InnerRightBottom
|
|
319
|
+
|
|
320
|
+
// DockAlignment (only for corner categories like LeftTop, RightTop, etc.):
|
|
321
|
+
// Horizontal, Vertical
|
|
322
|
+
|
|
323
|
+
// Corner with alignment:
|
|
324
|
+
<Den.Components.Dock
|
|
325
|
+
category={Den.Components.DockCategory.LeftTop}
|
|
326
|
+
alignment={Den.Components.DockAlignment.Horizontal}
|
|
327
|
+
offset={4}
|
|
328
|
+
renderOverlay={() => <DropdownMenu />}
|
|
329
|
+
>
|
|
330
|
+
<TriggerButton />
|
|
331
|
+
</Den.Components.Dock>
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Display (Responsive Show/Hide)
|
|
335
|
+
|
|
336
|
+
**Important:** Display uses `cloneElement` to inject className — child must accept `className` prop.
|
|
337
|
+
|
|
338
|
+
```tsx
|
|
339
|
+
// DisplayCategory: Visiable, Hidden
|
|
340
|
+
// DisplayType: Only, Up, Down
|
|
341
|
+
|
|
342
|
+
// Always visible
|
|
343
|
+
<Den.Components.Display category={Den.Components.DisplayCategory.Visiable}>
|
|
344
|
+
<div>Always shown</div>
|
|
345
|
+
</Den.Components.Display>
|
|
346
|
+
|
|
347
|
+
// Always hidden
|
|
348
|
+
<Den.Components.Display category={Den.Components.DisplayCategory.Hidden}>
|
|
349
|
+
<div>Always hidden</div>
|
|
350
|
+
</Den.Components.Display>
|
|
351
|
+
|
|
352
|
+
// Responsive: visible only on Medium breakpoint
|
|
353
|
+
<Den.Components.Display
|
|
354
|
+
category={Den.Components.DisplayCategory.Visiable}
|
|
355
|
+
type={Den.Components.DisplayType.Only}
|
|
356
|
+
breakpoint={Den.Components.BreakpointType.Medium}
|
|
357
|
+
>
|
|
358
|
+
<div>Medium only</div>
|
|
359
|
+
</Den.Components.Display>
|
|
360
|
+
|
|
361
|
+
// Hidden on Small and below
|
|
362
|
+
<Den.Components.Display
|
|
363
|
+
category={Den.Components.DisplayCategory.Hidden}
|
|
364
|
+
type={Den.Components.DisplayType.Down}
|
|
365
|
+
breakpoint={Den.Components.BreakpointType.Small}
|
|
366
|
+
>
|
|
367
|
+
<div>Hidden on mobile</div>
|
|
368
|
+
</Den.Components.Display>
|
|
369
|
+
|
|
370
|
+
// Multiple breakpoints (array):
|
|
371
|
+
<Den.Components.Display
|
|
372
|
+
category={Den.Components.DisplayCategory.Visiable}
|
|
373
|
+
breakpoint={[Den.Components.BreakpointType.Small, Den.Components.BreakpointType.Large]}
|
|
374
|
+
>
|
|
375
|
+
<div>Visible on Small and Large</div>
|
|
376
|
+
</Den.Components.Display>
|
|
377
|
+
|
|
378
|
+
// BreakpointType: ExtraSmall, Small, Medium, Large, ExtraLarge, ExtraExtraLarge
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Responsive (Desktop/Mobile Switch)
|
|
382
|
+
|
|
383
|
+
```tsx
|
|
384
|
+
// Shorthand for showing desktop or mobile content based on breakpoint.
|
|
385
|
+
// Children must accept className prop (uses Display internally).
|
|
386
|
+
<Den.Components.Responsive
|
|
387
|
+
breakpointType={Den.Components.BreakpointType.Medium}
|
|
388
|
+
desktop={<div>Desktop layout</div>}
|
|
389
|
+
mobile={<div>Mobile layout</div>}
|
|
390
|
+
/>
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### VZone (Responsive Container)
|
|
394
|
+
|
|
395
|
+
```tsx
|
|
396
|
+
// Like Bootstrap's Container — constrains max-width and centers content.
|
|
397
|
+
// Category controls at which breakpoint max-width starts applying.
|
|
398
|
+
// Below the breakpoint: full width. Above: max-width grows per tier.
|
|
399
|
+
<Den.Components.VZone category={Den.Components.ZoneCategory.Small} padding="1em">
|
|
400
|
+
<Content />
|
|
401
|
+
</Den.Components.VZone>
|
|
402
|
+
|
|
403
|
+
// ZoneCategory:
|
|
404
|
+
// Fluid — always 100%, no max-width
|
|
405
|
+
// Small — constrained from ≥576px (540→720→960→1140→1320)
|
|
406
|
+
// Medium — constrained from ≥768px (720→960→1140→1320)
|
|
407
|
+
// Large — constrained from ≥992px (960→1140→1320)
|
|
408
|
+
// ExtraLarge — constrained from ≥1200px (1140→1320)
|
|
409
|
+
// ExtraExtraLarge — constrained from ≥1400px (1320)
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Flex & FlexItem (Low-level Control)
|
|
413
|
+
|
|
414
|
+
```tsx
|
|
415
|
+
// Flex — full flexbox control
|
|
416
|
+
<Den.Components.Flex
|
|
417
|
+
direction={Den.Components.FlexDirectionType.Row}
|
|
418
|
+
wrap={Den.Components.FlexWrapType.Wrap}
|
|
419
|
+
justifyContent={Den.Components.FlexJustifyContentType.SpaceBetween}
|
|
420
|
+
alignItems={Den.Components.FlexAlignItemsType.Center}
|
|
421
|
+
gap="1em"
|
|
422
|
+
>
|
|
423
|
+
...
|
|
424
|
+
</Den.Components.Flex>
|
|
425
|
+
|
|
426
|
+
// FlexItem — wraps a child with flex item properties
|
|
427
|
+
<Den.Components.FlexItem grow={1} shrink={0} basis="200px" order={2}>
|
|
428
|
+
<Content />
|
|
429
|
+
</Den.Components.FlexItem>
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## View Components
|
|
435
|
+
|
|
436
|
+
### VBoundary (Generic Container)
|
|
437
|
+
|
|
438
|
+
The basic div wrapper. Use as a general-purpose container:
|
|
439
|
+
|
|
440
|
+
```tsx
|
|
441
|
+
<Den.Components.VBoundary
|
|
442
|
+
padding="1em"
|
|
443
|
+
backgroundColor={Den.Components.ColorType.Light}
|
|
444
|
+
borderRadius={Den.Components.BorderRadiusType.Default}
|
|
445
|
+
width="100%"
|
|
446
|
+
>
|
|
447
|
+
<Content />
|
|
448
|
+
</Den.Components.VBoundary>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### VLabel (Text/Label)
|
|
452
|
+
|
|
453
|
+
For inline text. Renders as `<span>` by default, configurable to any inline/heading element:
|
|
454
|
+
|
|
455
|
+
```tsx
|
|
456
|
+
// Basic label
|
|
457
|
+
<Den.Components.VLabel caption="Hello World" />
|
|
458
|
+
|
|
459
|
+
// With heading category
|
|
460
|
+
<Den.Components.VLabel
|
|
461
|
+
category={Den.Components.LabelCategory.H1}
|
|
462
|
+
caption="Page Title"
|
|
463
|
+
/>
|
|
464
|
+
|
|
465
|
+
// Styled label
|
|
466
|
+
<Den.Components.VLabel
|
|
467
|
+
fontSize={Den.Components.FontSizeType.Large}
|
|
468
|
+
fontWeight={Den.Components.FontWeightType.Bold}
|
|
469
|
+
frontColor={Den.Components.ColorType.Primary}
|
|
470
|
+
caption="Important Text"
|
|
471
|
+
/>
|
|
472
|
+
|
|
473
|
+
// Circle label (badge)
|
|
474
|
+
<Den.Components.VLabel
|
|
475
|
+
type={Den.Components.LabelType.Circle}
|
|
476
|
+
frontColor={Den.Components.ColorType.White}
|
|
477
|
+
backgroundColor={Den.Components.ColorType.Black}
|
|
478
|
+
caption="X"
|
|
479
|
+
/>
|
|
480
|
+
|
|
481
|
+
// Text overflow (ellipsis)
|
|
482
|
+
<Den.Components.VLabel
|
|
483
|
+
isTextOverflow
|
|
484
|
+
width="12em"
|
|
485
|
+
caption="This very long text will be truncated with ellipsis..."
|
|
486
|
+
/>
|
|
487
|
+
|
|
488
|
+
// Alignment
|
|
489
|
+
<Den.Components.VLabel
|
|
490
|
+
alignType={Den.Components.LabelAlignType.Center}
|
|
491
|
+
caption="Centered text"
|
|
492
|
+
/>
|
|
493
|
+
|
|
494
|
+
// i18n with React Intl
|
|
495
|
+
<Den.Components.VLabel caption={<FormattedMessage id="Label.Hello" />} />
|
|
496
|
+
|
|
497
|
+
// Available categories:
|
|
498
|
+
// LabelCategory.Div, Span, H1-H6, Abbr, Strong, Em, Code, Pre,
|
|
499
|
+
// Blockquote, Mark, Del, Ins, Small, Sub, Sup, etc.
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### VText (Block Text)
|
|
503
|
+
|
|
504
|
+
For block-level text (p, article, section, etc.):
|
|
505
|
+
|
|
506
|
+
```tsx
|
|
507
|
+
<Den.Components.VText
|
|
508
|
+
category={Den.Components.TextCategory.P}
|
|
509
|
+
caption="Paragraph text content."
|
|
510
|
+
/>
|
|
511
|
+
|
|
512
|
+
<Den.Components.VText
|
|
513
|
+
alignType={Den.Components.TextAlignType.Center}
|
|
514
|
+
renderContent={() => <span>Complex <strong>content</strong></span>}
|
|
515
|
+
/>
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### VHyperlink
|
|
519
|
+
|
|
520
|
+
```tsx
|
|
521
|
+
// Renders an <a> tag. Requires category and to props.
|
|
522
|
+
<Den.Components.VHyperlink
|
|
523
|
+
category={Den.Components.HyperlinkCategory.Self}
|
|
524
|
+
to="/about"
|
|
525
|
+
>
|
|
526
|
+
Click me
|
|
527
|
+
</Den.Components.VHyperlink>
|
|
528
|
+
|
|
529
|
+
// Open in new window
|
|
530
|
+
<Den.Components.VHyperlink
|
|
531
|
+
category={Den.Components.HyperlinkCategory.NewWindow}
|
|
532
|
+
to="https://example.com"
|
|
533
|
+
>
|
|
534
|
+
External link
|
|
535
|
+
</Den.Components.VHyperlink>
|
|
536
|
+
|
|
537
|
+
// HyperlinkCategory: NewWindow (_blank), Self (_self), Parent (_parent), Top (_top)
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### Form Components
|
|
541
|
+
|
|
542
|
+
#### VForm (Form Container)
|
|
543
|
+
|
|
544
|
+
```tsx
|
|
545
|
+
<Den.Components.VForm
|
|
546
|
+
handleSubmit={(data) => {
|
|
547
|
+
// data is automatically converted from FormData to nested JSON
|
|
548
|
+
// e.g., { form: { username: "value", password: "value" } }
|
|
549
|
+
console.log(data);
|
|
550
|
+
}}
|
|
551
|
+
handleValidateError={(input) => {
|
|
552
|
+
// Called when HTML5 validation fails
|
|
553
|
+
input.focus();
|
|
554
|
+
}}
|
|
555
|
+
>
|
|
556
|
+
<Den.Components.Y gap="0.5em">
|
|
557
|
+
<Den.Components.VTextBox name="form.username" placeholder="Username" />
|
|
558
|
+
<Den.Components.VPassword name="form.password" placeholder="Password" />
|
|
559
|
+
<Den.Components.VSubmit caption="Submit" />
|
|
560
|
+
</Den.Components.Y>
|
|
561
|
+
</Den.Components.VForm>
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
**Form data naming conventions:**
|
|
565
|
+
- `name="form.username"` -> `{ form: { username: "value" } }`
|
|
566
|
+
- `name="form.roles[]"` -> `{ form: { roles: ["value1", "value2"] } }`
|
|
567
|
+
- `name="#form.data[]"` -> Parses JSON string values in the array
|
|
568
|
+
|
|
569
|
+
#### Input Components
|
|
570
|
+
|
|
571
|
+
```tsx
|
|
572
|
+
// Text input
|
|
573
|
+
<Den.Components.VTextBox
|
|
574
|
+
name="form.name"
|
|
575
|
+
placeholder="Enter name"
|
|
576
|
+
label="Name" // Floating label
|
|
577
|
+
icon={<IconElement />} // Prefix icon
|
|
578
|
+
enableClear // Show clear (X) button
|
|
579
|
+
required // HTML5 validation
|
|
580
|
+
value="default" // Initial value
|
|
581
|
+
/>
|
|
582
|
+
|
|
583
|
+
// Controlled input with hooks
|
|
584
|
+
const [value, setValue] = useState('');
|
|
585
|
+
<Den.Components.VTextBox
|
|
586
|
+
name="form.search"
|
|
587
|
+
valueHook={value}
|
|
588
|
+
setStateHook={setValue}
|
|
589
|
+
/>
|
|
590
|
+
|
|
591
|
+
// With suffix options
|
|
592
|
+
<Den.Components.VTextBox
|
|
593
|
+
renderOptions={(inputRef) => (
|
|
594
|
+
<Den.Components.VSvg onClick={() => alert(inputRef.current?.value)}>
|
|
595
|
+
<SearchIcon />
|
|
596
|
+
</Den.Components.VSvg>
|
|
597
|
+
)}
|
|
598
|
+
/>
|
|
599
|
+
|
|
600
|
+
// Other input types:
|
|
601
|
+
<Den.Components.VEmail name="form.email" required placeholder="Email" />
|
|
602
|
+
<Den.Components.VPassword name="form.password" placeholder="Password" />
|
|
603
|
+
<Den.Components.VNumber name="form.count" min={0} max={100} />
|
|
604
|
+
<Den.Components.VDate name="form.date" />
|
|
605
|
+
<Den.Components.VDatetimeLocal name="form.datetime" />
|
|
606
|
+
<Den.Components.VTime name="form.time" />
|
|
607
|
+
<Den.Components.VColor name="form.color" />
|
|
608
|
+
<Den.Components.VTel name="form.phone" />
|
|
609
|
+
<Den.Components.VUrl name="form.website" />
|
|
610
|
+
<Den.Components.VSearch name="form.search" />
|
|
611
|
+
<Den.Components.VRange name="form.volume" min={0} max={100} />
|
|
612
|
+
|
|
613
|
+
// TextArea
|
|
614
|
+
<Den.Components.VTextArea name="form.bio" rows={6} placeholder="Bio" />
|
|
615
|
+
|
|
616
|
+
// Checkbox
|
|
617
|
+
<Den.Components.VCheckBox
|
|
618
|
+
id="form.agree"
|
|
619
|
+
name="form.agree"
|
|
620
|
+
label="I agree"
|
|
621
|
+
isChecked={true}
|
|
622
|
+
frontColor={Den.Components.ColorType.Primary}
|
|
623
|
+
/>
|
|
624
|
+
|
|
625
|
+
// Radio
|
|
626
|
+
<Den.Components.VRadio id="opt1" name="form.option" value="A" label="Option A" />
|
|
627
|
+
<Den.Components.VRadio id="opt2" name="form.option" value="B" label="Option B" />
|
|
628
|
+
|
|
629
|
+
// Hidden field
|
|
630
|
+
<Den.Components.VHidden name="form.id" value="123" />
|
|
631
|
+
|
|
632
|
+
// Select (native <select>)
|
|
633
|
+
<Den.Components.VSelect
|
|
634
|
+
name="form.country"
|
|
635
|
+
items={[
|
|
636
|
+
{ caption: 'USA', value: 'us' },
|
|
637
|
+
{ caption: 'China', value: 'cn' }
|
|
638
|
+
]}
|
|
639
|
+
value="us"
|
|
640
|
+
/>
|
|
641
|
+
|
|
642
|
+
// Dropdown (custom dropdown with icons)
|
|
643
|
+
<Den.Components.VDropdown
|
|
644
|
+
name="form.category"
|
|
645
|
+
items={[
|
|
646
|
+
{ caption: 'Option A', value: 'a', icon: <IconA /> },
|
|
647
|
+
{ caption: 'Option B', value: 'b' }
|
|
648
|
+
]}
|
|
649
|
+
emptyIcon={<EmptyIcon />} // required
|
|
650
|
+
downIcon={<DownArrowIcon />} // required
|
|
651
|
+
upIcon={<UpArrowIcon />} // required
|
|
652
|
+
enableClear
|
|
653
|
+
handleChange={(value) => console.log(value)}
|
|
654
|
+
/>
|
|
655
|
+
|
|
656
|
+
// Switch
|
|
657
|
+
<Den.Components.VSwitch
|
|
658
|
+
isOn={true}
|
|
659
|
+
icon={<SwitchIcon />}
|
|
660
|
+
onSwitch={(isOn) => console.log(isOn)}
|
|
661
|
+
/>
|
|
662
|
+
|
|
663
|
+
// File upload
|
|
664
|
+
<Den.Components.VFile
|
|
665
|
+
name="form.avatar"
|
|
666
|
+
isPreview // Show image preview
|
|
667
|
+
accept=".jpg,.png"
|
|
668
|
+
appearance={<UploadIcon />} // Custom trigger element
|
|
669
|
+
/>
|
|
670
|
+
|
|
671
|
+
// File with base64 output
|
|
672
|
+
<Den.Components.VBase64File
|
|
673
|
+
name="form.file"
|
|
674
|
+
accept=".jpg,.jpeg,.png"
|
|
675
|
+
base64Image="iVBOR..." // Default base64 preview
|
|
676
|
+
/>
|
|
677
|
+
|
|
678
|
+
// Submit button
|
|
679
|
+
<Den.Components.VSubmit
|
|
680
|
+
caption="Submit"
|
|
681
|
+
fontSize={Den.Components.FontSizeType.Small}
|
|
682
|
+
backgroundColor={Den.Components.ColorType.Primary}
|
|
683
|
+
frontColor={Den.Components.ColorType.White}
|
|
684
|
+
/>
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
### Media Components
|
|
688
|
+
|
|
689
|
+
```tsx
|
|
690
|
+
// Image
|
|
691
|
+
<Den.Components.VImage
|
|
692
|
+
src="/path/to/image.jpg"
|
|
693
|
+
alt="Description"
|
|
694
|
+
category={Den.Components.ImageCategory.Circle} // Circle, Squared, FullSize, Scale
|
|
695
|
+
/>
|
|
696
|
+
|
|
697
|
+
// SVG (wraps imported SVG components)
|
|
698
|
+
import IconSvg from './icon.svg';
|
|
699
|
+
<Den.Components.VSvg
|
|
700
|
+
fontSize={Den.Components.FontSizeType.Large}
|
|
701
|
+
frontColor={Den.Components.ColorType.Primary}
|
|
702
|
+
>
|
|
703
|
+
<IconSvg />
|
|
704
|
+
</Den.Components.VSvg>
|
|
705
|
+
|
|
706
|
+
// Background image
|
|
707
|
+
<Den.Components.VBackground
|
|
708
|
+
image="/path/to/bg.jpg"
|
|
709
|
+
imageWidth="100%"
|
|
710
|
+
imageHeight="400px"
|
|
711
|
+
position={Den.Components.BackgroundPositionType.Center}
|
|
712
|
+
>
|
|
713
|
+
<OverlayContent />
|
|
714
|
+
</Den.Components.VBackground>
|
|
715
|
+
|
|
716
|
+
// Audio / Video
|
|
717
|
+
<Den.Components.VAudio src="/audio.mp3" />
|
|
718
|
+
<Den.Components.VVideo src="/video.mp4" />
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
### VTooltip
|
|
722
|
+
|
|
723
|
+
```tsx
|
|
724
|
+
// Tooltip uses Dock internally. Requires renderOverlay and dockCategory.
|
|
725
|
+
<Den.Components.VTooltip
|
|
726
|
+
category={Den.Components.TooltipCategory.Hover}
|
|
727
|
+
dockCategory={Den.Components.DockCategory.Top}
|
|
728
|
+
renderOverlay={() => <div>Tooltip content</div>}
|
|
729
|
+
>
|
|
730
|
+
<button>Hover me</button>
|
|
731
|
+
</Den.Components.VTooltip>
|
|
732
|
+
|
|
733
|
+
// TooltipCategory: Hover (default), Click
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
### VAnimation
|
|
737
|
+
|
|
738
|
+
```tsx
|
|
739
|
+
// Uses animate.css library. category is required.
|
|
740
|
+
<Den.Components.VAnimation
|
|
741
|
+
category={Den.Components.AnimationCategory.Bounce}
|
|
742
|
+
speed={Den.Components.AnimationSpeed.Fast}
|
|
743
|
+
delay={Den.Components.AnimationDelay.Delay1Second}
|
|
744
|
+
repeat={Den.Components.AnimationRepeat.Infinite}
|
|
745
|
+
>
|
|
746
|
+
<Content />
|
|
747
|
+
</Den.Components.VAnimation>
|
|
748
|
+
|
|
749
|
+
// AnimationCategory: Bounce, Flash, Pulse, RubberBand, ShakeX, Swing, Tada,
|
|
750
|
+
// Wobble, Jello, HeartBeat, FadeIn, FadeOut, ZoomIn, ZoomOut,
|
|
751
|
+
// SlideInDown, SlideInUp, SlideInLeft, SlideInRight,
|
|
752
|
+
// BounceIn, BounceOut, RotateIn, RotateOut, RollIn, RollOut, etc. (150+)
|
|
753
|
+
// AnimationSpeed: Slow (2s), Slower (3s), Fast (800ms), Faster (500ms)
|
|
754
|
+
// AnimationDelay: Delay1Second, Delay2Second, Delay3Second, Delay4Second, Delay5Second
|
|
755
|
+
// AnimationRepeat: Once, Twice, Thrice, Infinite
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
### Shape Components
|
|
759
|
+
|
|
760
|
+
```tsx
|
|
761
|
+
<Den.Components.VEllipse width="100px" height="100px" backgroundColor={Den.Components.ColorType.Primary} />
|
|
762
|
+
<Den.Components.VRectangle width="200px" height="50px" backgroundColor={Den.Components.ColorType.Info} />
|
|
763
|
+
<Den.Components.VLine />
|
|
764
|
+
<Den.Components.VShadow category={Den.Components.ShadowCategory.Small}><Content /></Den.Components.VShadow>
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### App-only Components (app variant)
|
|
768
|
+
|
|
769
|
+
```tsx
|
|
770
|
+
// VCard — structured card with head and body
|
|
771
|
+
<Den.Components.VCard
|
|
772
|
+
head={<Den.Components.VLabel caption="Card Title" />}
|
|
773
|
+
body={<Den.Components.VText caption="Card content" />}
|
|
774
|
+
isDraggable={false}
|
|
775
|
+
/>
|
|
776
|
+
|
|
777
|
+
// VCardMedia — card with media, head, body, foot sections
|
|
778
|
+
<Den.Components.VCardMedia
|
|
779
|
+
media={<Den.Components.VImage src="/image.jpg" category={Den.Components.ImageCategory.FullSize} />}
|
|
780
|
+
head={<Den.Components.VLabel caption="Title" />}
|
|
781
|
+
body={<Den.Components.VText caption="Description" />}
|
|
782
|
+
foot={<button>Action</button>}
|
|
783
|
+
/>
|
|
784
|
+
|
|
785
|
+
// VCardWindow — card with background image
|
|
786
|
+
<Den.Components.VCardWindow
|
|
787
|
+
backgroundUrl="/bg.jpg"
|
|
788
|
+
backgroundSize={Den.Components.CardWindowSizeType.Cover}
|
|
789
|
+
>
|
|
790
|
+
<OverlayContent />
|
|
791
|
+
</Den.Components.VCardWindow>
|
|
792
|
+
|
|
793
|
+
// VBlock — structured block with icon, action, caption, subCaption
|
|
794
|
+
<Den.Components.VBlock
|
|
795
|
+
icon={<Icon />}
|
|
796
|
+
action={<button>Edit</button>}
|
|
797
|
+
caption={<Den.Components.VLabel caption="Title" />}
|
|
798
|
+
subCaption={<Den.Components.VLabel caption="Subtitle" />}
|
|
799
|
+
/>
|
|
800
|
+
|
|
801
|
+
// VStack — stacks children with z-index layering
|
|
802
|
+
<Den.Components.VStack>
|
|
803
|
+
<Layer1 />
|
|
804
|
+
<Layer2 />
|
|
805
|
+
</Den.Components.VStack>
|
|
806
|
+
|
|
807
|
+
// VTree — hierarchical tree view
|
|
808
|
+
<Den.Components.VTree nodes={treeData} />
|
|
809
|
+
|
|
810
|
+
// VDynamic — renders component by name from registry
|
|
811
|
+
<Den.Components.VDynamic
|
|
812
|
+
components={{ MyWidget: WidgetComponent, MyChart: ChartComponent }}
|
|
813
|
+
name="MyWidget"
|
|
814
|
+
customProp="value" // extra props are passed to the resolved component
|
|
815
|
+
notFindMessage="Component not found"
|
|
816
|
+
/>
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
### Other View Components
|
|
820
|
+
|
|
821
|
+
```tsx
|
|
822
|
+
// Semantic HTML wrappers
|
|
823
|
+
<Den.Components.VHeader>...</Den.Components.VHeader>
|
|
824
|
+
<Den.Components.VMain>...</Den.Components.VMain>
|
|
825
|
+
<Den.Components.VFooter>...</Den.Components.VFooter>
|
|
826
|
+
<Den.Components.VSection>...</Den.Components.VSection>
|
|
827
|
+
<Den.Components.VHR />
|
|
828
|
+
|
|
829
|
+
// Mask overlay
|
|
830
|
+
<Den.Components.VMask><Content /></Den.Components.VMask>
|
|
831
|
+
|
|
832
|
+
// Iframe
|
|
833
|
+
<Den.Components.VFrame src="https://example.com" />
|
|
834
|
+
|
|
835
|
+
// Theme
|
|
836
|
+
<Den.Components.VTheme category={Den.Components.ThemeCategory.Light}>
|
|
837
|
+
<App />
|
|
838
|
+
</Den.Components.VTheme>
|
|
839
|
+
|
|
840
|
+
// Loading indicator
|
|
841
|
+
<Den.Components.VLoading />
|
|
842
|
+
|
|
843
|
+
// Error boundary
|
|
844
|
+
<Den.Components.VErrorBoundary>
|
|
845
|
+
<RiskyComponent />
|
|
846
|
+
</Den.Components.VErrorBoundary>
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
---
|
|
850
|
+
|
|
851
|
+
## Network Module (App/Append variants only)
|
|
852
|
+
|
|
853
|
+
### Bootstrap Configuration
|
|
854
|
+
|
|
855
|
+
Before using network features, initialize the bootstrap:
|
|
856
|
+
|
|
857
|
+
```tsx
|
|
858
|
+
import { Den } from '@fewbox/den-app';
|
|
859
|
+
|
|
860
|
+
Den.boot({
|
|
861
|
+
getToken: () => localStorage.getItem('token') || '',
|
|
862
|
+
getAppSettings: () => ({
|
|
863
|
+
endpoint: {
|
|
864
|
+
PROTOCOL: 'https',
|
|
865
|
+
HOST: 'api.example.com',
|
|
866
|
+
PORT: '',
|
|
867
|
+
BASEPATH: '/v1'
|
|
868
|
+
},
|
|
869
|
+
externalService: {
|
|
870
|
+
PROTOCOL: 'https',
|
|
871
|
+
HOST: 'external.com',
|
|
872
|
+
PORT: '',
|
|
873
|
+
BASEPATH: '/api'
|
|
874
|
+
}
|
|
875
|
+
}),
|
|
876
|
+
getLanguages: (lang) => ({ /* i18n messages */ }),
|
|
877
|
+
getHeaders: () => ({ 'X-Custom-Header': 'value' }),
|
|
878
|
+
handleIsNotSuccessful: (data) => console.error('API error:', data),
|
|
879
|
+
handleError: (error) => console.error(error),
|
|
880
|
+
handleWarning: (error) => console.warn(error),
|
|
881
|
+
handleNetworkError: (error) => console.error('Network error:', error),
|
|
882
|
+
isDebug: process.env.NODE_ENV === 'development'
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
// Or use the Boot component:
|
|
886
|
+
<Den.Components.Boot options={bootOptions}><App /></Den.Components.Boot>
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
### HTTP Clients (Observable-based for Redux Observable)
|
|
890
|
+
|
|
891
|
+
All network clients return RxJS Observables for use in Redux Observable epics:
|
|
892
|
+
|
|
893
|
+
```tsx
|
|
894
|
+
import { Den } from '@fewbox/den-app';
|
|
895
|
+
|
|
896
|
+
// GET, POST, PUT, PATCH, DELETE (uses app settings endpoint)
|
|
897
|
+
new Den.Network.GetFetch('/users', (payload) => ({ type: 'USERS_LOADED', payload }));
|
|
898
|
+
new Den.Network.PostFetch('/users', body, (payload) => ({ type: 'USER_CREATED', payload }));
|
|
899
|
+
new Den.Network.PutFetch('/users/1', body, processAction);
|
|
900
|
+
new Den.Network.PatchFetch('/users/1', body, processAction);
|
|
901
|
+
new Den.Network.DeleteFetch('/users/1', processAction);
|
|
902
|
+
|
|
903
|
+
// External endpoint (bypasses app settings)
|
|
904
|
+
new Den.Network.GetFetchExternal('externalService', '/data', processAction);
|
|
905
|
+
|
|
906
|
+
// GraphQL
|
|
907
|
+
new Den.Network.GQL({ query: 'query { users { id name } }' }, processAction);
|
|
908
|
+
new Den.Network.GQLExternal('externalService', { query: 'mutation { createUser(name: "test") { id } }' }, processAction);
|
|
909
|
+
|
|
910
|
+
// Server-Sent Events
|
|
911
|
+
new Den.Network.GetSSE('/events', processAction);
|
|
912
|
+
|
|
913
|
+
// WebSocket
|
|
914
|
+
new Den.Network.WS({ url: 'wss://example.com/ws' });
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
### Redux Observable Epic Pattern
|
|
918
|
+
|
|
919
|
+
```tsx
|
|
920
|
+
import { ofType } from 'redux-observable';
|
|
921
|
+
import { switchMap } from 'rxjs/operators';
|
|
922
|
+
|
|
923
|
+
const fetchUsersEpic = (action$) =>
|
|
924
|
+
action$.pipe(
|
|
925
|
+
ofType('FETCH_USERS'),
|
|
926
|
+
switchMap(() =>
|
|
927
|
+
new Den.Network.GetFetch('/users', (payload) => ({
|
|
928
|
+
type: 'USERS_LOADED',
|
|
929
|
+
payload
|
|
930
|
+
}))
|
|
931
|
+
)
|
|
932
|
+
);
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
### Retry Behavior
|
|
936
|
+
|
|
937
|
+
- **Network errors** (timeout, CORS, DNS): retry 3x with 1s, 2s, 4s delays
|
|
938
|
+
- **4xx client errors**: no retry (immediate failure)
|
|
939
|
+
- **5xx server errors**: retry with exponential backoff
|
|
940
|
+
|
|
941
|
+
---
|
|
942
|
+
|
|
943
|
+
## Styling Guide
|
|
944
|
+
|
|
945
|
+
### CSS Variables
|
|
946
|
+
|
|
947
|
+
All CSS variables use the `--den-` prefix. Override in your root stylesheet:
|
|
948
|
+
|
|
949
|
+
```css
|
|
950
|
+
:root {
|
|
951
|
+
--den-font-color: #333;
|
|
952
|
+
--den-primary-color: #6200ea;
|
|
953
|
+
}
|
|
954
|
+
```
|
|
955
|
+
|
|
956
|
+
### Importing Styles
|
|
957
|
+
|
|
958
|
+
```scss
|
|
959
|
+
@import 'fewbox-den/templates/style/variables';
|
|
960
|
+
@import 'fewbox-den/templates/style/root-properties';
|
|
961
|
+
@import 'fewbox-den/templates/style/core';
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
### Border Directions (DirectionType)
|
|
965
|
+
|
|
966
|
+
```
|
|
967
|
+
All, Top, Right, Bottom, Left,
|
|
968
|
+
ExceptTop, ExceptRight, ExceptBottom, ExceptLeft,
|
|
969
|
+
RightTop, RightBottom, LeftTop, LeftBottom, TopBottom, LeftRight
|
|
970
|
+
```
|
|
971
|
+
|
|
972
|
+
### Border Radius (BorderRadiusType)
|
|
973
|
+
|
|
974
|
+
```tsx
|
|
975
|
+
Den.Components.BorderRadiusType.Default // default radius from CSS variable
|
|
976
|
+
Den.Components.BorderRadiusType.Fixed // fixed radius
|
|
977
|
+
Den.Components.BorderRadiusType.Max // maximum rounding (pill shape)
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
---
|
|
981
|
+
|
|
982
|
+
## Common Patterns
|
|
983
|
+
|
|
984
|
+
### Page Layout (header + content + footer)
|
|
985
|
+
|
|
986
|
+
```tsx
|
|
987
|
+
<Den.Components.Y height="100vh">
|
|
988
|
+
<Den.Components.VBoundary padding="1em" backgroundColor={Den.Components.ColorType.Primary}>
|
|
989
|
+
<Header />
|
|
990
|
+
</Den.Components.VBoundary>
|
|
991
|
+
<Den.Components.VBoundary selfGrow={1} overflow="auto" padding="1em">
|
|
992
|
+
<MainContent />
|
|
993
|
+
</Den.Components.VBoundary>
|
|
994
|
+
<Den.Components.VBoundary padding="1em" backgroundColor={Den.Components.ColorType.Dark}>
|
|
995
|
+
<Footer />
|
|
996
|
+
</Den.Components.VBoundary>
|
|
997
|
+
</Den.Components.Y>
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
### Centered Content
|
|
1001
|
+
|
|
1002
|
+
```tsx
|
|
1003
|
+
<Den.Components.XCenter height="100%">
|
|
1004
|
+
<Den.Components.SCenter><Content /></Den.Components.SCenter>
|
|
1005
|
+
</Den.Components.XCenter>
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
### Sidebar Layout
|
|
1009
|
+
|
|
1010
|
+
```tsx
|
|
1011
|
+
<Den.Components.X height="100vh">
|
|
1012
|
+
<Den.Components.VBoundary width="250px" backgroundColor={Den.Components.ColorType.Dark}>
|
|
1013
|
+
<Sidebar />
|
|
1014
|
+
</Den.Components.VBoundary>
|
|
1015
|
+
<Den.Components.VBoundary selfGrow={1}><MainContent /></Den.Components.VBoundary>
|
|
1016
|
+
</Den.Components.X>
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
### Sticky Navigation Bar
|
|
1020
|
+
|
|
1021
|
+
```tsx
|
|
1022
|
+
<Den.Components.Position category={Den.Components.PositionCategory.Edge} top="0px" isFullWidth zIndex={10}>
|
|
1023
|
+
<Den.Components.XBetween height="48px" padding="0 1em" backgroundColor={Den.Components.ColorType.Primary}>
|
|
1024
|
+
<Den.Components.VLabel caption="Logo" frontColor={Den.Components.ColorType.White} />
|
|
1025
|
+
<Den.Components.XRight gap="1em">
|
|
1026
|
+
<Den.Components.VHyperlink category={Den.Components.HyperlinkCategory.Self} to="/about">About</Den.Components.VHyperlink>
|
|
1027
|
+
<Den.Components.VHyperlink category={Den.Components.HyperlinkCategory.Self} to="/contact">Contact</Den.Components.VHyperlink>
|
|
1028
|
+
</Den.Components.XRight>
|
|
1029
|
+
</Den.Components.XBetween>
|
|
1030
|
+
</Den.Components.Position>
|
|
1031
|
+
```
|
|
1032
|
+
|
|
1033
|
+
### Form with Validation
|
|
1034
|
+
|
|
1035
|
+
```tsx
|
|
1036
|
+
<Den.Components.VForm
|
|
1037
|
+
handleSubmit={(data) => api.login(data.form)}
|
|
1038
|
+
handleValidateError={(input) => { input.focus(); input.scrollIntoView({ behavior: 'smooth' }); }}>
|
|
1039
|
+
<Den.Components.Y gap="1em" padding="2em">
|
|
1040
|
+
<Den.Components.VEmail name="form.email" required placeholder="Email" label="Email" />
|
|
1041
|
+
<Den.Components.VPassword name="form.password" required minLength={8} placeholder="Password" label="Password" />
|
|
1042
|
+
<Den.Components.VSubmit caption="Sign In" backgroundColor={Den.Components.ColorType.Primary}
|
|
1043
|
+
frontColor={Den.Components.ColorType.White} borderRadius="0.5em" padding="0.8em 2em" />
|
|
1044
|
+
</Den.Components.Y>
|
|
1045
|
+
</Den.Components.VForm>
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
### Card Grid (app variant)
|
|
1049
|
+
|
|
1050
|
+
```tsx
|
|
1051
|
+
<Den.Components.XWrapEvenly gap="1em" padding="1em">
|
|
1052
|
+
{items.map(item => (
|
|
1053
|
+
<Den.Components.VCardMedia
|
|
1054
|
+
key={item.id}
|
|
1055
|
+
width="300px"
|
|
1056
|
+
borderRadius="0.5em"
|
|
1057
|
+
borderColor={Den.Components.ColorType.Border}
|
|
1058
|
+
borderStyle="solid"
|
|
1059
|
+
borderWidth="1px"
|
|
1060
|
+
media={<Den.Components.VImage src={item.image} category={Den.Components.ImageCategory.FullSize} />}
|
|
1061
|
+
head={<Den.Components.VLabel category={Den.Components.LabelCategory.H3} caption={item.title} />}
|
|
1062
|
+
body={<Den.Components.VText caption={item.description} />}
|
|
1063
|
+
/>
|
|
1064
|
+
))}
|
|
1065
|
+
</Den.Components.XWrapEvenly>
|
|
1066
|
+
```
|
|
1067
|
+
|
|
1068
|
+
### Absolute Positioning Inside Container
|
|
1069
|
+
|
|
1070
|
+
```tsx
|
|
1071
|
+
<Den.Components.PositionArea category={Den.Components.PositionAreaCategory.FullSize}>
|
|
1072
|
+
<Den.Components.VBoundary height="300px" backgroundColor={Den.Components.ColorType.Dark}>
|
|
1073
|
+
<Den.Components.Position category={Den.Components.PositionCategory.Area} type={Den.Components.PositionType.LeftTop}>
|
|
1074
|
+
<TopLeftContent />
|
|
1075
|
+
</Den.Components.Position>
|
|
1076
|
+
<Den.Components.Position category={Den.Components.PositionCategory.Area} type={Den.Components.PositionType.Center}>
|
|
1077
|
+
<CenterContent />
|
|
1078
|
+
</Den.Components.Position>
|
|
1079
|
+
</Den.Components.VBoundary>
|
|
1080
|
+
</Den.Components.PositionArea>
|
|
1081
|
+
```
|
|
1082
|
+
|
|
1083
|
+
### Responsive Layout
|
|
1084
|
+
|
|
1085
|
+
```tsx
|
|
1086
|
+
<Den.Components.Responsive
|
|
1087
|
+
breakpointType={Den.Components.BreakpointType.Medium}
|
|
1088
|
+
desktop={<Den.Components.X gap="1em">
|
|
1089
|
+
<Sidebar />
|
|
1090
|
+
<MainContent />
|
|
1091
|
+
</Den.Components.X>}
|
|
1092
|
+
mobile={<Den.Components.Y gap="1em">
|
|
1093
|
+
<MainContent />
|
|
1094
|
+
</Den.Components.Y>}
|
|
1095
|
+
/>
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
---
|
|
1099
|
+
|
|
1100
|
+
## Tips
|
|
1101
|
+
|
|
1102
|
+
1. Prefer semantic layout components (XCenter, YBetween) over manual Flexbox.
|
|
1103
|
+
2. Use `gap` prop on X/Y instead of margins on children.
|
|
1104
|
+
3. Nest X and Y freely for complex layouts.
|
|
1105
|
+
4. Use S-components inside X/Y to override individual child alignment.
|
|
1106
|
+
5. Form names use dot notation: `name="form.user.email"` -> `{ form: { user: { email: "..." } } }`.
|
|
1107
|
+
6. `selfGrow={1}` fills remaining space (flex-grow: 1).
|
|
1108
|
+
7. VBoundary is the safe default container.
|
|
1109
|
+
8. All components forward standard HTML attributes (onClick, id, aria-*, data-*).
|
|
1110
|
+
9. Display/PositionArea use `cloneElement` — children must accept `className` prop.
|
|
1111
|
+
10. Use `height`/`width` as direct props (not in `style`) for highest CSS priority.
|