@fewbox/den 0.1.43 → 0.2.0-preview.21

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.
Files changed (67) hide show
  1. package/engine.js +2 -0
  2. package/engine.js.map +1 -0
  3. package/index-core.d.ts +1 -4
  4. package/index-engine.d.ts +27 -0
  5. package/index.css +1 -1
  6. package/index.js +2 -1
  7. package/index.js.map +1 -1
  8. package/package.json +10 -1
  9. package/scripts/generate-packages.js +12 -0
  10. package/server.js +71 -0
  11. package/src/components/Auth/GoogleGrant/index.d.ts +10 -8
  12. package/src/components/Auth/GoogleSignin/index.d.ts +6 -5
  13. package/src/components/Engine/Base/index.d.ts +21 -22
  14. package/src/components/Engine/index.d.ts +305 -124
  15. package/src/components/Layout/Breakpoint/index.d.ts +28 -0
  16. package/src/components/Layout/Dock/index.d.ts +26 -27
  17. package/src/components/Layout/Flex/index.d.ts +40 -34
  18. package/src/components/Layout/FlexItem/index.d.ts +8 -7
  19. package/src/components/Layout/Position/index.d.ts +19 -17
  20. package/src/components/Layout/PositionArea/index.d.ts +5 -4
  21. package/src/components/Layout/Responsive/index.d.ts +2 -2
  22. package/src/components/Layout/XBase/index.d.ts +10 -8
  23. package/src/components/Layout/YBase/index.d.ts +10 -8
  24. package/src/components/View/VAnimation/index.d.ts +122 -118
  25. package/src/components/View/VAside/index.d.ts +5 -0
  26. package/src/components/View/VAvatar/index.d.ts +0 -1
  27. package/src/components/View/VBackground/index.d.ts +10 -10
  28. package/src/components/View/VCardWindow/index.d.ts +6 -5
  29. package/src/components/View/VChromeExtensionValidator/index.d.ts +8 -7
  30. package/src/components/View/VErrorBoundary/index.d.ts +1 -1
  31. package/src/components/View/VForm/index.d.ts +7 -7
  32. package/src/components/View/VGoogleFont/index.d.ts +5 -4
  33. package/src/components/View/VHyperlink/index.d.ts +7 -6
  34. package/src/components/View/VImage/index.d.ts +12 -8
  35. package/src/components/View/VInput/VColor/index.d.ts +0 -2
  36. package/src/components/View/VInput/VDate/index.d.ts +0 -2
  37. package/src/components/View/VInput/VDatetimeLocal/index.d.ts +0 -2
  38. package/src/components/View/VInput/VDropdown/index.d.ts +2 -0
  39. package/src/components/View/VInput/VFile/index.d.ts +5 -4
  40. package/src/components/View/VInput/VGroup/index.d.ts +1 -1
  41. package/src/components/View/VInput/VRange/index.d.ts +2 -1
  42. package/src/components/View/VInput/index.d.ts +5 -4
  43. package/src/components/View/VLabel/index.d.ts +53 -47
  44. package/src/components/View/VNav/index.d.ts +5 -0
  45. package/src/components/View/VPhoto/index.d.ts +12 -10
  46. package/src/components/View/VRoot/index.d.ts +5 -4
  47. package/src/components/View/VShadow/index.d.ts +5 -4
  48. package/src/components/View/VShape/VEllipse/index.d.ts +5 -4
  49. package/src/components/View/VShape/VLine/index.d.ts +5 -4
  50. package/src/components/View/VShape/VRectangle/index.d.ts +5 -4
  51. package/src/components/View/VSvg/index.d.ts +11 -7
  52. package/src/components/View/VText/index.d.ts +18 -16
  53. package/src/components/View/VTextArea/index.d.ts +2 -0
  54. package/src/components/View/VTheme/index.d.ts +14 -7
  55. package/src/components/View/VTooltip/index.d.ts +5 -4
  56. package/src/components/View/VVideo/index.d.ts +1 -4
  57. package/src/components/View/VZone/index.d.ts +9 -8
  58. package/src/components/core.d.ts +20 -6
  59. package/src/components/web.d.ts +10 -3
  60. package/src/store/index.d.ts +6 -6
  61. package/templates/.claude/skills/fewbox-den/SKILL.md +434 -96
  62. package/templates/style/_core.scss +94 -0
  63. package/templates/style/_root-properties.scss +51 -0
  64. package/templates/style/_variables.scss +166 -3
  65. package/tsconfig.app.tsbuildinfo +1 -0
  66. package/src/components/Layout/Display/index.d.ts +0 -18
  67. package/src/components/Layout/index.d.ts +0 -8
@@ -25,45 +25,61 @@ Den.Components.ColorType // enums are also under Components
25
25
 
26
26
  ### Variant Exports
27
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
28
+ - **core** (`Den.Components`): Layout (X/Y/S/Flex/FlexItem/Position/PositionArea/Dock/BreakpointDisplay/Responsive), View (VBoundary, VLabel, VText, VForm, VActionForm, VInput/*, VSelect, VDropdown, VSwitch, VImage, VSvg, VBackground, VAnimation, VTooltip, VLoading, VErrorBoundary, VShape/*, VHyperlink, VMask, VFrame, VTheme, VHeader/VNav/VMain/VAside/VFooter, VHR, VSection, VZone, VAudio, VVideo, VShadow), Enums, Types, utilities
29
+ - **web** (`Den.Components`): core + Debug, VGoogleFont, VChromeExtensionValidator, GoogleGrant, GoogleSignin, FigmaSignin, WeComSignin, parseJWT
30
+ - **app** (`Den.Components`): web + VDynamic, VAvatar, VBlock, VCard, VCardMedia, VCardSocial, VCardWindow, VPhoto, VStack, VTree
31
+ - **app** also exports: `Den.FewBox`, `Den.Language`, `Den.Network`, `Den.Store`
32
+ - **append** (no Components): `Den.FewBox`, `Den.Language`, `Den.Network`, `Den.Store`
31
33
 
32
34
  ## Core Concepts
33
35
 
34
- ### Common Props (IBaseProps)
36
+ ### Common Props (IViewProps / IBaseProps)
35
37
 
36
- All components extend `IBaseProps` which provides these shared props:
38
+ All components extend `IBaseProps` (which extends `IViewProps`) providing these shared props:
37
39
 
38
40
  | Prop | Type | Description |
39
41
  |------|------|-------------|
40
42
  | `className` | `string` | Additional CSS classes |
41
43
  | `style` | `CSSProperties` | Inline styles |
42
- | `fontSize` | `FontSizeType \| string` | Font size preset or custom value |
44
+ | `fontSize` | `FontSizeType \| Property.FontSize` | Font size preset or custom CSS value |
45
+ | `isAutoSize` | `boolean` | Use auto-responsive font size variant |
43
46
  | `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
+ | `frontColor` | `ColorType \| Property.Color` | Text/foreground color |
48
+ | `backgroundColor` | `ColorType \| Property.Color` | Background color |
49
+ | `borderColor` | `ColorType \| Property.Color` | Border color |
47
50
  | `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 |
51
+ | `borderRadius` | `BorderRadiusType \| Property.BorderRadius` | Border radius preset or custom |
52
+ | `borderStyle` | `BorderStyleType \| Property.BorderStyle` | Border style preset or custom |
53
+ | `borderWidth` | `BorderWidthType \| Property.BorderWidth` | Border width preset or custom |
54
+ | `padding` | `PaddingType \| Property.Padding` | CSS padding (preset or custom) |
55
+ | `margin` | `MarginType \| Property.Margin` | CSS margin (preset or custom) |
56
+ | `opacity` | `OpacityType \| Property.Opacity` | Opacity preset or custom CSS value |
57
+ | `display` | `DisplayType \| Property.Display` | CSS display preset or custom |
58
+ | `visibility` | `VisibilityType \| Property.Visibility` | CSS visibility preset or custom |
59
+ | `cursor` | `CursorType \| Property.Cursor` | CSS cursor preset or custom |
60
+ | `overflow` | `OverflowType \| Property.Overflow` | CSS overflow preset or custom |
61
+ | `overflowX` | `OverflowXType \| Property.OverflowX` | CSS overflow-x preset or custom |
62
+ | `overflowY` | `OverflowYType \| Property.OverflowY` | CSS overflow-y preset or custom |
63
+ | `width` | `Property.Width` | CSS width |
64
+ | `height` | `Property.Height` | CSS height |
65
+ | `minWidth` | `Property.Width` | CSS min-width |
66
+ | `minHeight` | `Property.Width` | CSS min-height |
67
+ | `maxWidth` | `Property.Width` | CSS max-width |
68
+ | `maxHeight` | `Property.Width` | CSS max-height |
69
+ | `zIndex` | `Property.ZIndex` | CSS z-index |
70
+ | `fontFamily` | `Property.FontFamily` | CSS font-family |
71
+ | `letterSpacing` | `LetterSpacingType \| Property.LetterSpacing` | Letter spacing preset or custom CSS value |
72
+ | `lineHeight` | `Property.LineHeight` | CSS line-height |
63
73
  | `selfShrink` | `number` | flex-shrink for the component itself |
64
74
  | `selfGrow` | `number` | flex-grow for the component itself |
65
75
  | `selfBasis` | `string` | flex-basis for the component itself |
66
76
  | `isDefaultValue` | `boolean` | Apply default transparency and color resets |
77
+ | `pseudoType` | `PseudoType` | Pseudo element target (All, Before, After) |
78
+ | `pseudoFrontColor` | `ColorType \| string` | Pseudo element foreground color |
79
+ | `pseudoBackgroundColor` | `ColorType \| string` | Pseudo element background color |
80
+ | `pseudoBorderColor` | `ColorType \| string` | Pseudo element border color |
81
+ | `pseudoBorderDirection` | `DirectionType` | Pseudo element border direction |
82
+ | `customAttributes` | `Object` | Custom HTML attributes to spread |
67
83
 
68
84
  ### Color System (ColorType)
69
85
 
@@ -87,7 +103,7 @@ ColorType.Border // border color
87
103
  ColorType.Placeholder // placeholder color
88
104
  ColorType.Transparent // transparent
89
105
 
90
- // Each color has opacity variants:
106
+ // Each color has opacity variants (Light, Dark, Primary, Secondary, Tertiary, Info, Success, Warning, Error, Border, Placeholder):
91
107
  ColorType.Primary75 // 75% opacity
92
108
  ColorType.Primary50 // 50% opacity
93
109
  ColorType.Primary25 // 25% opacity
@@ -96,10 +112,10 @@ ColorType.Primary25 // 25% opacity
96
112
  ### Font Size System (FontSizeType)
97
113
 
98
114
  ```tsx
115
+ FontSizeType.Default
116
+ FontSizeType.Normal
99
117
  FontSizeType.ExtraSmall
100
118
  FontSizeType.Small
101
- FontSizeType.Normal
102
- FontSizeType.Default
103
119
  FontSizeType.Large
104
120
  FontSizeType.ExtraLarge
105
121
 
@@ -128,6 +144,48 @@ FontWeightType.ExtraBold // 800
128
144
  FontWeightType.Black // 900
129
145
  ```
130
146
 
147
+ ### Preset Enums (class-based styling)
148
+
149
+ These enums generate CSS classes. All `Full*Type` props accept either a preset enum value (applied as className) or a custom CSS value from `csstype` `Property.*` (applied as inline style):
150
+
151
+ ```tsx
152
+ // Border Radius
153
+ BorderRadiusType.Default | .Normal | .ExtraSmall | .Small | .Large | .ExtraLarge | .Max
154
+
155
+ // Border Style
156
+ BorderStyleType.None | .Solid | .Dashed | .Dotted | .Double | .Groove | .Ridge | .Inset | .Outset | .Hidden
157
+
158
+ // Border Width
159
+ BorderWidthType.Default | .Normal | .ExtraSmall | .Small | .Large | .ExtraLarge
160
+
161
+ // Padding
162
+ PaddingType.Default | .Normal | .ExtraSmall | .Small | .Large | .ExtraLarge
163
+
164
+ // Margin
165
+ MarginType.Default | .Normal | .ExtraSmall | .Small | .Large | .ExtraLarge
166
+
167
+ // Gap (for layout components)
168
+ GapType.Default | .Normal | .ExtraSmall | .Small | .Large | .ExtraLarge
169
+
170
+ // Letter Spacing
171
+ LetterSpacingType.Default | .Normal | .ExtraSmall | .Small | .Large | .ExtraLarge
172
+
173
+ // Opacity
174
+ OpacityType._0 | ._10 | ._20 | ._25 | ._30 | ._40 | ._50 | ._60 | ._70 | ._75 | ._80 | ._90 | ._100
175
+
176
+ // Display
177
+ DisplayType.None | .Block | .Inline | .InlineBlock | .Flex | .InlineFlex | .Grid | .InlineGrid | .Table | .TableRow | .TableCell | .Contents | .FlowRoot
178
+
179
+ // Visibility
180
+ VisibilityType.Visible | .Hidden | .Collapse
181
+
182
+ // Cursor
183
+ CursorType.Auto | .Default | .None | .Pointer | .Wait | .Text | .Move | .NotAllowed | .Grab | .Grabbing | ... (30+ options)
184
+
185
+ // Overflow / OverflowX / OverflowY
186
+ OverflowType.Visible | .Hidden | .Scroll | .Auto | .Clip
187
+ ```
188
+
131
189
  ---
132
190
 
133
191
  ## Layout Components
@@ -244,17 +302,13 @@ Wrap a child in an S-component to override the parent's cross-axis alignment for
244
302
  </Den.Components.STop>
245
303
  </Den.Components.XCenter>
246
304
 
247
- // In X containers (cross-axis is vertical):
305
+ // Available S-components:
248
306
  <Den.Components.STop>...</Den.Components.STop> // align-self: flex-start
249
307
  <Den.Components.SMiddle>...</Den.Components.SMiddle> // align-self: center
250
308
  <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
309
+ <Den.Components.SLeft>...</Den.Components.SLeft> // align-self: flex-start (in Y container)
310
+ <Den.Components.SCenter>...</Den.Components.SCenter> // align-self: center (in Y container)
311
+ <Den.Components.SRight>...</Den.Components.SRight> // align-self: flex-end (in Y container)
258
312
  <Den.Components.SStretch>...</Den.Components.SStretch> // align-self: stretch
259
313
  <Den.Components.SBaseline>...</Den.Components.SBaseline>// align-self: baseline
260
314
  ```
@@ -263,7 +317,6 @@ Wrap a child in an S-component to override the parent's cross-axis alignment for
263
317
 
264
318
  ```tsx
265
319
  // PositionArea establishes a positioning context (position: relative) on its child.
266
- // PositionCategory.Area = position: absolute (for items inside)
267
320
  <Den.Components.PositionArea category={Den.Components.PositionAreaCategory.FullSize}>
268
321
  <Den.Components.VBoundary height="250px" backgroundColor={Den.Components.ColorType.Dark}>
269
322
  <Den.Components.Position category={Den.Components.PositionCategory.Area} type={Den.Components.PositionType.Center}>
@@ -331,60 +384,59 @@ Wrap a child in an S-component to override the parent's cross-axis alignment for
331
384
  </Den.Components.Dock>
332
385
  ```
333
386
 
334
- ### Display (Responsive Show/Hide)
387
+ ### BreakpointDisplay (Responsive Show/Hide)
335
388
 
336
- **Important:** Display uses `cloneElement` to inject className — child must accept `className` prop.
389
+ **Important:** BreakpointDisplay uses `cloneElement` to inject className — child must accept `className` prop.
337
390
 
338
391
  ```tsx
339
- // DisplayCategory: Visiable, Hidden
340
- // DisplayType: Only, Up, Down
392
+ // BreakpointCategory: Visible, Hidden
393
+ // BreakpointType: Only, Up, Down
394
+ // ScreenSizeType: ExtraSmall, Small, Medium, Large, ExtraLarge, ExtraExtraLarge
341
395
 
342
396
  // Always visible
343
- <Den.Components.Display category={Den.Components.DisplayCategory.Visiable}>
397
+ <Den.Components.BreakpointDisplay category={Den.Components.BreakpointCategory.Visible}>
344
398
  <div>Always shown</div>
345
- </Den.Components.Display>
399
+ </Den.Components.BreakpointDisplay>
346
400
 
347
401
  // Always hidden
348
- <Den.Components.Display category={Den.Components.DisplayCategory.Hidden}>
402
+ <Den.Components.BreakpointDisplay category={Den.Components.BreakpointCategory.Hidden}>
349
403
  <div>Always hidden</div>
350
- </Den.Components.Display>
404
+ </Den.Components.BreakpointDisplay>
351
405
 
352
406
  // 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}
407
+ <Den.Components.BreakpointDisplay
408
+ category={Den.Components.BreakpointCategory.Visible}
409
+ type={Den.Components.BreakpointType.Only}
410
+ breakpoint={Den.Components.ScreenSizeType.Medium}
357
411
  >
358
412
  <div>Medium only</div>
359
- </Den.Components.Display>
413
+ </Den.Components.BreakpointDisplay>
360
414
 
361
415
  // 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}
416
+ <Den.Components.BreakpointDisplay
417
+ category={Den.Components.BreakpointCategory.Hidden}
418
+ type={Den.Components.BreakpointType.Down}
419
+ breakpoint={Den.Components.ScreenSizeType.Small}
366
420
  >
367
421
  <div>Hidden on mobile</div>
368
- </Den.Components.Display>
422
+ </Den.Components.BreakpointDisplay>
369
423
 
370
424
  // Multiple breakpoints (array):
371
- <Den.Components.Display
372
- category={Den.Components.DisplayCategory.Visiable}
373
- breakpoint={[Den.Components.BreakpointType.Small, Den.Components.BreakpointType.Large]}
425
+ <Den.Components.BreakpointDisplay
426
+ category={Den.Components.BreakpointCategory.Visible}
427
+ breakpoint={[Den.Components.ScreenSizeType.Small, Den.Components.ScreenSizeType.Large]}
374
428
  >
375
429
  <div>Visible on Small and Large</div>
376
- </Den.Components.Display>
377
-
378
- // BreakpointType: ExtraSmall, Small, Medium, Large, ExtraLarge, ExtraExtraLarge
430
+ </Den.Components.BreakpointDisplay>
379
431
  ```
380
432
 
381
433
  ### Responsive (Desktop/Mobile Switch)
382
434
 
383
435
  ```tsx
384
436
  // Shorthand for showing desktop or mobile content based on breakpoint.
385
- // Children must accept className prop (uses Display internally).
437
+ // Children must accept className prop (uses BreakpointDisplay internally).
386
438
  <Den.Components.Responsive
387
- breakpointType={Den.Components.BreakpointType.Medium}
439
+ breakpointType={Den.Components.ScreenSizeType.Medium}
388
440
  desktop={<div>Desktop layout</div>}
389
441
  mobile={<div>Mobile layout</div>}
390
442
  />
@@ -402,11 +454,11 @@ Wrap a child in an S-component to override the parent's cross-axis alignment for
402
454
 
403
455
  // ZoneCategory:
404
456
  // Fluid — always 100%, no max-width
405
- // Small — constrained from 576px (54072096011401320)
406
- // Medium — constrained from 768px (72096011401320)
407
- // Large — constrained from 992px (96011401320)
408
- // ExtraLarge — constrained from 1200px (11401320)
409
- // ExtraExtraLarge — constrained from 1400px (1320)
457
+ // Small — constrained from >=576px (540->720->960->1140->1320)
458
+ // Medium — constrained from >=768px (720->960->1140->1320)
459
+ // Large — constrained from >=992px (960->1140->1320)
460
+ // ExtraLarge — constrained from >=1200px (1140->1320)
461
+ // ExtraExtraLarge — constrained from >=1400px (1320)
410
462
  ```
411
463
 
412
464
  ### Flex & FlexItem (Low-level Control)
@@ -427,6 +479,9 @@ Wrap a child in an S-component to override the parent's cross-axis alignment for
427
479
  <Den.Components.FlexItem grow={1} shrink={0} basis="200px" order={2}>
428
480
  <Content />
429
481
  </Den.Components.FlexItem>
482
+
483
+ // FlexItem also exports FlexItemAlignSelfType
484
+ // Flex also exports FlexAlignContentType
430
485
  ```
431
486
 
432
487
  ---
@@ -497,6 +552,18 @@ For inline text. Renders as `<span>` by default, configurable to any inline/head
497
552
  // Available categories:
498
553
  // LabelCategory.Div, Span, H1-H6, Abbr, Strong, Em, Code, Pre,
499
554
  // Blockquote, Mark, Del, Ins, Small, Sub, Sup, etc.
555
+
556
+ // fontWeight/fontSize with heading categories (H1-H6):
557
+ // When fontWeight or fontSize is set, VLabel adds CSS classes
558
+ // (.v-label-inherit-font-weight / .v-label-inherit-font-size)
559
+ // that apply `inherit` to the inner heading element, overriding
560
+ // browser defaults. Without these props, headings keep their
561
+ // browser default styles (e.g., H1 is bold and 2em).
562
+ <Den.Components.VLabel
563
+ category={Den.Components.LabelCategory.H1}
564
+ fontWeight={Den.Components.FontWeightType.Thin}
565
+ caption="Thin H1"
566
+ />
500
567
  ```
501
568
 
502
569
  ### VText (Block Text)
@@ -548,9 +615,10 @@ For block-level text (p, article, section, etc.):
548
615
  // e.g., { form: { username: "value", password: "value" } }
549
616
  console.log(data);
550
617
  }}
551
- handleValidateError={(input) => {
618
+ handleValidateError={(invalidInputs) => {
552
619
  // Called when HTML5 validation fails
553
- input.focus();
620
+ // invalidInputs is HTMLInputElement[]
621
+ invalidInputs[0]?.focus();
554
622
  }}
555
623
  >
556
624
  <Den.Components.Y gap="0.5em">
@@ -559,6 +627,26 @@ For block-level text (p, article, section, etc.):
559
627
  <Den.Components.VSubmit caption="Submit" />
560
628
  </Den.Components.Y>
561
629
  </Den.Components.VForm>
630
+
631
+ // HandleSubmitCategory: Json (default), FormData
632
+ // Use FormData category to receive raw FormData instead of parsed JSON:
633
+ <Den.Components.VForm
634
+ handleSubmitCategory={Den.Components.HandleSubmitCategory.FormData}
635
+ handleSubmit={(formData) => { /* formData is FormData */ }}
636
+ >
637
+ ...
638
+ </Den.Components.VForm>
639
+ ```
640
+
641
+ #### VActionForm (Simple Form)
642
+
643
+ A simple `<form>` wrapper without JSON conversion or validation handling:
644
+
645
+ ```tsx
646
+ <Den.Components.VActionForm action="/api/submit" method="POST">
647
+ <input name="field" />
648
+ <button type="submit">Submit</button>
649
+ </Den.Components.VActionForm>
562
650
  ```
563
651
 
564
652
  **Form data naming conventions:**
@@ -604,6 +692,8 @@ const [value, setValue] = useState('');
604
692
  <Den.Components.VDate name="form.date" />
605
693
  <Den.Components.VDatetimeLocal name="form.datetime" />
606
694
  <Den.Components.VTime name="form.time" />
695
+ <Den.Components.VMonth name="form.month" />
696
+ <Den.Components.VWeek name="form.week" />
607
697
  <Den.Components.VColor name="form.color" />
608
698
  <Den.Components.VTel name="form.phone" />
609
699
  <Den.Components.VUrl name="form.website" />
@@ -626,6 +716,19 @@ const [value, setValue] = useState('');
626
716
  <Den.Components.VRadio id="opt1" name="form.option" value="A" label="Option A" />
627
717
  <Den.Components.VRadio id="opt2" name="form.option" value="B" label="Option B" />
628
718
 
719
+ // Radio Group (managed state)
720
+ <Den.Components.VGroup
721
+ selectedValue="A"
722
+ renderGroup={(selectedValue, handleSelect) => (
723
+ <>
724
+ <Den.Components.VRadio id="opt1" name="form.option" value="A" label="A"
725
+ isChecked={selectedValue === 'A'} onChange={handleSelect} />
726
+ <Den.Components.VRadio id="opt2" name="form.option" value="B" label="B"
727
+ isChecked={selectedValue === 'B'} onChange={handleSelect} />
728
+ </>
729
+ )}
730
+ />
731
+
629
732
  // Hidden field
630
733
  <Den.Components.VHidden name="form.id" value="123" />
631
734
 
@@ -638,6 +741,7 @@ const [value, setValue] = useState('');
638
741
  ]}
639
742
  value="us"
640
743
  />
744
+ // ISelectItemData: { caption: string; value: string }
641
745
 
642
746
  // Dropdown (custom dropdown with icons)
643
747
  <Den.Components.VDropdown
@@ -650,8 +754,16 @@ const [value, setValue] = useState('');
650
754
  downIcon={<DownArrowIcon />} // required
651
755
  upIcon={<UpArrowIcon />} // required
652
756
  enableClear
757
+ readOnly // renders as VLabel (non-interactive)
758
+ isSelectOnly // prevents manual typing, only allows selection from items
759
+ menuGap="4px" // gap between dropdown menu and trigger
760
+ menuBackgroundColor={Den.Components.ColorType.White}
761
+ menuZIndex={9999}
653
762
  handleChange={(value) => console.log(value)}
763
+ overWriteDropdownMenu={(items) => <CustomMenu items={items} />} // custom menu renderer
764
+ overWriteDropdownItem={(item) => <CustomItem item={item} />} // custom item renderer
654
765
  />
766
+ // IDropdownItemData: { caption: string; value: string; icon?: JSX.Element }
655
767
 
656
768
  // Switch
657
769
  <Den.Components.VSwitch
@@ -667,6 +779,7 @@ const [value, setValue] = useState('');
667
779
  accept=".jpg,.png"
668
780
  appearance={<UploadIcon />} // Custom trigger element
669
781
  />
782
+ // FileCategory enum available for file categories
670
783
 
671
784
  // File with base64 output
672
785
  <Den.Components.VBase64File
@@ -682,6 +795,9 @@ const [value, setValue] = useState('');
682
795
  backgroundColor={Den.Components.ColorType.Primary}
683
796
  frontColor={Den.Components.ColorType.White}
684
797
  />
798
+
799
+ // Submit wrapper (wraps custom body with hidden submit input)
800
+ <Den.Components.VSubmitWrapper body={<button>Custom Submit UI</button>} />
685
801
  ```
686
802
 
687
803
  ### Media Components
@@ -702,6 +818,7 @@ import IconSvg from './icon.svg';
702
818
  >
703
819
  <IconSvg />
704
820
  </Den.Components.VSvg>
821
+ // SvgCategory enum available for SVG categories
705
822
 
706
823
  // Background image
707
824
  <Den.Components.VBackground
@@ -759,11 +876,27 @@ import IconSvg from './icon.svg';
759
876
 
760
877
  ```tsx
761
878
  <Den.Components.VEllipse width="100px" height="100px" backgroundColor={Den.Components.ColorType.Primary} />
879
+ // EllipseCategory enum available
880
+
762
881
  <Den.Components.VRectangle width="200px" height="50px" backgroundColor={Den.Components.ColorType.Info} />
882
+
763
883
  <Den.Components.VLine />
884
+ // LineCategory enum available
885
+
764
886
  <Den.Components.VShadow category={Den.Components.ShadowCategory.Small}><Content /></Den.Components.VShadow>
765
887
  ```
766
888
 
889
+ ### VTheme (Theme Provider)
890
+
891
+ ```tsx
892
+ <Den.Components.VTheme category={Den.Components.ThemeCategory.Light}>
893
+ <App />
894
+ </Den.Components.VTheme>
895
+
896
+ // ThemeCategory: Light, Dark (or custom)
897
+ // ThemeVariables type available for typed CSS variable overrides
898
+ ```
899
+
767
900
  ### App-only Components (app variant)
768
901
 
769
902
  ```tsx
@@ -782,6 +915,9 @@ import IconSvg from './icon.svg';
782
915
  foot={<button>Action</button>}
783
916
  />
784
917
 
918
+ // VCardSocial — social media card variant
919
+ <Den.Components.VCardSocial ... />
920
+
785
921
  // VCardWindow — card with background image
786
922
  <Den.Components.VCardWindow
787
923
  backgroundUrl="/bg.jpg"
@@ -806,6 +942,21 @@ import IconSvg from './icon.svg';
806
942
 
807
943
  // VTree — hierarchical tree view
808
944
  <Den.Components.VTree nodes={treeData} />
945
+ // IVTreeNode type exported for tree node data structure
946
+
947
+ // VPhoto — background-image based photo with sizing
948
+ <Den.Components.VPhoto
949
+ category={Den.Components.PhotoCategory.Cover}
950
+ position={Den.Components.PhotoPositionType.Center}
951
+ src="/photo.jpg"
952
+ width="100%"
953
+ height="300px"
954
+ />
955
+ // PhotoCategory: Auto, Contain, Cover
956
+ // PhotoPositionType: Left, Center, Right
957
+
958
+ // VAvatar — user avatar display
959
+ <Den.Components.VAvatar ... />
809
960
 
810
961
  // VDynamic — renders component by name from registry
811
962
  <Den.Components.VDynamic
@@ -816,12 +967,54 @@ import IconSvg from './icon.svg';
816
967
  />
817
968
  ```
818
969
 
970
+ ### Web-only Components (web variant)
971
+
972
+ ```tsx
973
+ // Debug utility component
974
+ <Den.Components.Debug ... />
975
+
976
+ // Google Font loader
977
+ <Den.Components.VGoogleFont
978
+ type={Den.Components.GoogleFontType...}
979
+ ...
980
+ />
981
+ // GoogleFontType, IGoogleTypeface, IGoogleFont types available
982
+
983
+ // Chrome extension validation
984
+ <Den.Components.VChromeExtensionValidator ... />
985
+ // ExtensionStatus enum exported
986
+
987
+ // Auth components
988
+ <Den.Components.GoogleGrant
989
+ category={Den.Components.GoogleGrantCategory.Implicit}
990
+ uxMode={Den.Components.GoogleGrantUXMode.Popup}
991
+ ...
992
+ />
993
+ // GoogleGrantCategory: Implicit, AuthorizationCode
994
+ // GoogleGrantUXMode: Popup, Redirect
995
+ // GoogleGrantCode, GoogleGrantToken types exported
996
+
997
+ <Den.Components.GoogleSignin
998
+ uxMode={Den.Components.GoogleSigninUXMode...}
999
+ ...
1000
+ />
1001
+
1002
+ <Den.Components.FigmaSignin ... />
1003
+ <Den.Components.WeComSignin ... />
1004
+
1005
+ // JWT utility
1006
+ Den.Components.parseJWT(token) // returns IUserProfile
1007
+ // IUserProfile type exported
1008
+ ```
1009
+
819
1010
  ### Other View Components
820
1011
 
821
1012
  ```tsx
822
1013
  // Semantic HTML wrappers
823
1014
  <Den.Components.VHeader>...</Den.Components.VHeader>
1015
+ <Den.Components.VNav>...</Den.Components.VNav>
824
1016
  <Den.Components.VMain>...</Den.Components.VMain>
1017
+ <Den.Components.VAside>...</Den.Components.VAside>
825
1018
  <Den.Components.VFooter>...</Den.Components.VFooter>
826
1019
  <Den.Components.VSection>...</Den.Components.VSection>
827
1020
  <Den.Components.VHR />
@@ -832,11 +1025,6 @@ import IconSvg from './icon.svg';
832
1025
  // Iframe
833
1026
  <Den.Components.VFrame src="https://example.com" />
834
1027
 
835
- // Theme
836
- <Den.Components.VTheme category={Den.Components.ThemeCategory.Light}>
837
- <App />
838
- </Den.Components.VTheme>
839
-
840
1028
  // Loading indicator
841
1029
  <Den.Components.VLoading />
842
1030
 
@@ -846,6 +1034,13 @@ import IconSvg from './icon.svg';
846
1034
  </Den.Components.VErrorBoundary>
847
1035
  ```
848
1036
 
1037
+ ### Utility Functions (core)
1038
+
1039
+ ```tsx
1040
+ // Convert FormData to nested JSON (used internally by VForm)
1041
+ Den.Components.convertFormDataToJson(formData)
1042
+ ```
1043
+
849
1044
  ---
850
1045
 
851
1046
  ## Network Module (App/Append variants only)
@@ -857,7 +1052,7 @@ Before using network features, initialize the bootstrap:
857
1052
  ```tsx
858
1053
  import { Den } from '@fewbox/den-app';
859
1054
 
860
- Den.boot({
1055
+ Den.FewBox.boot({
861
1056
  getToken: () => localStorage.getItem('token') || '',
862
1057
  getAppSettings: () => ({
863
1058
  endpoint: {
@@ -876,42 +1071,147 @@ Den.boot({
876
1071
  getLanguages: (lang) => ({ /* i18n messages */ }),
877
1072
  getHeaders: () => ({ 'X-Custom-Header': 'value' }),
878
1073
  handleIsNotSuccessful: (data) => console.error('API error:', data),
879
- handleError: (error) => console.error(error),
1074
+ handleError: (error) => console.error(error), // IError: { summary, data }
880
1075
  handleWarning: (error) => console.warn(error),
881
1076
  handleNetworkError: (error) => console.error('Network error:', error),
882
1077
  isDebug: process.env.NODE_ENV === 'development'
883
1078
  });
884
1079
 
885
1080
  // Or use the Boot component:
886
- <Den.Components.Boot options={bootOptions}><App /></Den.Components.Boot>
1081
+ <Den.Components.Boot options={bootOptions} />
1082
+
1083
+ // Types exported from Den.FewBox:
1084
+ // IFewBoxOptions, IAppSettings, IEndpoint, IError, BootClass
887
1085
  ```
888
1086
 
889
- ### HTTP Clients (Observable-based for Redux Observable)
1087
+ ### Fetch-based HTTP Clients (Observable-based for Redux Observable)
890
1088
 
891
- All network clients return RxJS Observables for use in Redux Observable epics:
1089
+ All Fetch clients return RxJS Observables for use in Redux Observable epics:
892
1090
 
893
1091
  ```tsx
894
1092
  import { Den } from '@fewbox/den-app';
895
1093
 
896
- // GET, POST, PUT, PATCH, DELETE (uses app settings endpoint)
1094
+ // Default endpoint (uses app settings endpoint)
897
1095
  new Den.Network.GetFetch('/users', (payload) => ({ type: 'USERS_LOADED', payload }));
898
1096
  new Den.Network.PostFetch('/users', body, (payload) => ({ type: 'USER_CREATED', payload }));
899
1097
  new Den.Network.PutFetch('/users/1', body, processAction);
900
1098
  new Den.Network.PatchFetch('/users/1', body, processAction);
901
1099
  new Den.Network.DeleteFetch('/users/1', processAction);
902
1100
 
903
- // External endpoint (bypasses app settings)
1101
+ // External endpoint (bypasses app settings, uses named endpoint from appSettings)
904
1102
  new Den.Network.GetFetchExternal('externalService', '/data', processAction);
1103
+ new Den.Network.PostFetchExternal('externalService', '/data', body, processAction);
1104
+ new Den.Network.PutFetchExternal('externalService', '/data/1', body, processAction);
1105
+ new Den.Network.PatchFetchExternal('externalService', '/data/1', body, processAction);
1106
+ new Den.Network.DeleteFetchExternal('externalService', '/data/1', processAction);
1107
+ ```
1108
+
1109
+ ### AJAX-based HTTP Clients
1110
+
1111
+ RxJS Ajax-based clients (alternative to Fetch):
1112
+
1113
+ ```tsx
1114
+ // Default endpoint
1115
+ new Den.Network.Get('/users', processAction);
1116
+ new Den.Network.Post('/users', body, processAction);
1117
+ new Den.Network.Put('/users/1', body, processAction);
1118
+ new Den.Network.Patch('/users/1', body, processAction);
1119
+ new Den.Network.Delete('/users/1', processAction);
1120
+
1121
+ // External endpoint
1122
+ new Den.Network.GetExternal('externalService', '/data', processAction);
1123
+ new Den.Network.PostExternal('externalService', '/data', body, processAction);
1124
+ new Den.Network.PutExternal('externalService', '/data/1', body, processAction);
1125
+ new Den.Network.PatchExternal('externalService', '/data/1', body, processAction);
1126
+ new Den.Network.DeleteExternal('externalService', '/data/1', processAction);
1127
+
1128
+ // Text response variants (returns text instead of JSON)
1129
+ new Den.Network.GetText('/data', processAction);
1130
+ new Den.Network.PostText('/data', body, processAction);
1131
+ new Den.Network.PutText('/data', body, processAction);
1132
+ new Den.Network.PatchText('/data', body, processAction);
1133
+ new Den.Network.DeleteText('/data', processAction);
1134
+ // External text variants: GetTextExternal, PostTextExternal, PutTextExternal, PatchTextExternal, DeleteTextExternal
1135
+
1136
+ // Local storage
1137
+ new Den.Network.GetLocal('/local-path', processAction);
1138
+ ```
1139
+
1140
+ ### GraphQL
905
1141
 
906
- // GraphQL
1142
+ ```tsx
1143
+ // Default endpoint
907
1144
  new Den.Network.GQL({ query: 'query { users { id name } }' }, processAction);
908
- new Den.Network.GQLExternal('externalService', { query: 'mutation { createUser(name: "test") { id } }' }, processAction);
909
1145
 
910
- // Server-Sent Events
1146
+ // External endpoint
1147
+ new Den.Network.GQLExternal('externalService', { query: 'mutation { ... }' }, processAction);
1148
+
1149
+ // File upload
1150
+ new Den.Network.GQLUpload({ query: '...', variables: { file } }, processAction);
1151
+ new Den.Network.GQLExternalUpload('externalService', { query: '...' }, processAction);
1152
+
1153
+ // IGraphQL type available for query/mutation objects
1154
+ ```
1155
+
1156
+ ### Server-Sent Events (SSE)
1157
+
1158
+ ```tsx
911
1159
  new Den.Network.GetSSE('/events', processAction);
1160
+ new Den.Network.PostSSE('/events', processAction);
1161
+ new Den.Network.GetSSEExternal('externalService', '/events', processAction);
1162
+ new Den.Network.PostSSEExternal('externalService', '/events', processAction);
1163
+ ```
1164
+
1165
+ ### WebSocket
912
1166
 
913
- // WebSocket
1167
+ ```tsx
914
1168
  new Den.Network.WS({ url: 'wss://example.com/ws' });
1169
+ // Den.Network.ws() function also available
1170
+ // IWebsocketOptions type exported
1171
+ ```
1172
+
1173
+ ### Promise-based HTTP (non-Observable)
1174
+
1175
+ For use outside Redux Observable epics:
1176
+
1177
+ ```tsx
1178
+ // Default endpoint
1179
+ Den.Network.verbsGetPromise('/users');
1180
+ Den.Network.verbsPostPromise('/users', body);
1181
+ Den.Network.verbsPutPromise('/users/1', body);
1182
+ Den.Network.verbsPatchPromise('/users/1', body);
1183
+ Den.Network.verbsDeletePromise('/users/1');
1184
+
1185
+ // External endpoint
1186
+ Den.Network.verbsGetPromiseExternal('externalService', '/data');
1187
+ Den.Network.verbsPostPromiseExternal('externalService', '/data', body);
1188
+ Den.Network.verbsPutPromiseExternal('externalService', '/data/1', body);
1189
+ Den.Network.verbsPatchPromiseExternal('externalService', '/data/1', body);
1190
+ Den.Network.verbsDeletePromiseExternal('externalService', '/data/1');
1191
+ ```
1192
+
1193
+ ### Raw HTTP Verb Functions
1194
+
1195
+ Low-level verb functions that return Observables:
1196
+
1197
+ ```tsx
1198
+ // Default: verbsGet, verbsPost, verbsPut, verbsPatch, verbsDelete
1199
+ // External: verbsGetExternal, verbsPostExternal, verbsPutExternal, verbsPatchExternal, verbsDeleteExternal
1200
+ // Internal: _verbsGet, _verbsPost, _verbsPut, _verbsPatch, _verbsDelete (with custom headers)
1201
+ // Internal Promise: _verbsGetPromise, _verbsPostPromise, etc.
1202
+ ```
1203
+
1204
+ ### Network Utilities
1205
+
1206
+ ```tsx
1207
+ Den.Network.buildHeaders(customHeaders); // Merge custom headers with JWT token
1208
+ Den.Network.buildUrl(path); // Build URL from app settings endpoint
1209
+ Den.Network.buildExternalUrl(externalName, path); // Build URL from named external endpoint
1210
+ Den.Network.JsonHeaders; // Default JSON content-type headers
1211
+ Den.Network.parseAjaxData(response); // Parse AJAX response
1212
+ Den.Network.parseFetchData(response); // Parse Fetch response
1213
+ Den.Network.parseGQLAjaxData(response); // Parse GraphQL response
1214
+ Den.Network.convertJsonToGraphQLSchema(json); // Convert JSON to GraphQL schema string
915
1215
  ```
916
1216
 
917
1217
  ### Redux Observable Epic Pattern
@@ -940,6 +1240,50 @@ const fetchUsersEpic = (action$) =>
940
1240
 
941
1241
  ---
942
1242
 
1243
+ ## Store Module (App/Append variants only)
1244
+
1245
+ Type definitions for Redux store integration:
1246
+
1247
+ ```tsx
1248
+ import { Den } from '@fewbox/den-app';
1249
+
1250
+ // Pagination
1251
+ type IList = Den.Store.IList; // List response wrapper
1252
+ type IPaging = Den.Store.IPaging; // Paged list with page/size
1253
+ type IContinuePaging = Den.Store.IContinuePaging; // Cursor-based pagination
1254
+
1255
+ // Data types
1256
+ type Json = Den.Store.Json; // Generic JSON type
1257
+ type EnumDictionary<K, V> = Den.Store.EnumDictionary<K, V>; // Enum-keyed dictionary
1258
+
1259
+ // Response wrappers
1260
+ type IMetaResponse = Den.Store.IMetaResponse; // Response with metadata
1261
+ type IPayloadResponse = Den.Store.IPayloadResponse; // Response with payload
1262
+ ```
1263
+
1264
+ ---
1265
+
1266
+ ## Language Module (App/Append variants only)
1267
+
1268
+ Internationalization utilities:
1269
+
1270
+ ```tsx
1271
+ import { Den } from '@fewbox/den-app';
1272
+
1273
+ // Get browser language
1274
+ Den.Language.getBrowserLang(); // "en" (short code)
1275
+ Den.Language.getBrowserLangFull(); // "en-US" (full code)
1276
+
1277
+ // Get formatted intl message (uses BootClass language config)
1278
+ Den.Language.getIntlMessage('Hello.World', 'en', { name: 'World' });
1279
+
1280
+ // Select messages for a locale from a locales object
1281
+ const messages = Den.Language.language(locales, 'en');
1282
+ const messagesFull = Den.Language.languageFull(locales, 'en-US');
1283
+ ```
1284
+
1285
+ ---
1286
+
943
1287
  ## Styling Guide
944
1288
 
945
1289
  ### CSS Variables
@@ -969,14 +1313,6 @@ ExceptTop, ExceptRight, ExceptBottom, ExceptLeft,
969
1313
  RightTop, RightBottom, LeftTop, LeftBottom, TopBottom, LeftRight
970
1314
  ```
971
1315
 
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
1316
  ---
981
1317
 
982
1318
  ## Common Patterns
@@ -1035,7 +1371,7 @@ Den.Components.BorderRadiusType.Max // maximum rounding (pill shape)
1035
1371
  ```tsx
1036
1372
  <Den.Components.VForm
1037
1373
  handleSubmit={(data) => api.login(data.form)}
1038
- handleValidateError={(input) => { input.focus(); input.scrollIntoView({ behavior: 'smooth' }); }}>
1374
+ handleValidateError={(invalidInputs) => { invalidInputs[0]?.focus(); }}>
1039
1375
  <Den.Components.Y gap="1em" padding="2em">
1040
1376
  <Den.Components.VEmail name="form.email" required placeholder="Email" label="Email" />
1041
1377
  <Den.Components.VPassword name="form.password" required minLength={8} placeholder="Password" label="Password" />
@@ -1084,7 +1420,7 @@ Den.Components.BorderRadiusType.Max // maximum rounding (pill shape)
1084
1420
 
1085
1421
  ```tsx
1086
1422
  <Den.Components.Responsive
1087
- breakpointType={Den.Components.BreakpointType.Medium}
1423
+ breakpointType={Den.Components.ScreenSizeType.Medium}
1088
1424
  desktop={<Den.Components.X gap="1em">
1089
1425
  <Sidebar />
1090
1426
  <MainContent />
@@ -1107,5 +1443,7 @@ Den.Components.BorderRadiusType.Max // maximum rounding (pill shape)
1107
1443
  6. `selfGrow={1}` fills remaining space (flex-grow: 1).
1108
1444
  7. VBoundary is the safe default container.
1109
1445
  8. All components forward standard HTML attributes (onClick, id, aria-*, data-*).
1110
- 9. Display/PositionArea use `cloneElement` — children must accept `className` prop.
1446
+ 9. BreakpointDisplay/PositionArea use `cloneElement` — children must accept `className` prop.
1111
1447
  10. Use `height`/`width` as direct props (not in `style`) for highest CSS priority.
1448
+ 11. Use preset enums (PaddingType, MarginType, etc.) for consistent spacing, or pass custom strings.
1449
+ 12. Pseudo element styling is available via `pseudoType`, `pseudoFrontColor`, `pseudoBackgroundColor`, `pseudoBorderColor` props.