@godxjp/ui 33.25.2 → 33.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +4 -4
  2. package/agent/START-HERE.md +6 -6
  3. package/agent/components/CenteredShell.json +1 -1
  4. package/agent/components/Flex.json +28 -3
  5. package/agent/components/RadarChart.json +119 -0
  6. package/agent/components-index.json +5 -0
  7. package/agent/components.json +148 -4
  8. package/agent/index.json +7 -7
  9. package/agent/llms.txt +6 -6
  10. package/agent/tokens.json +204 -0
  11. package/dist/components/charts/index.d.ts +2 -0
  12. package/dist/components/charts/index.js +3 -1
  13. package/dist/components/charts/radar-chart.d.ts +5 -0
  14. package/dist/components/charts/radar-chart.js +273 -0
  15. package/dist/components/layout/flex.js +47 -1
  16. package/dist/contracts/measurement.json +1 -1
  17. package/dist/i18n/messages/en.json +1 -0
  18. package/dist/i18n/messages/ja.json +1 -0
  19. package/dist/i18n/messages/vi.json +1 -0
  20. package/dist/props/components/charts.prop.d.ts +19 -0
  21. package/dist/props/components/layout.prop.d.ts +24 -2
  22. package/dist/props/registry.d.ts +57 -0
  23. package/dist/props/registry.js +50 -0
  24. package/dist/styles/layers.json +9 -2
  25. package/dist/styles/layout.css +156 -0
  26. package/dist/styles/precompiled/base.css +1 -1
  27. package/dist/styles/precompiled/layout.css +1 -1
  28. package/dist/styles/precompiled/text-layout.css +1 -1
  29. package/dist/styles/text-layout.css +132 -0
  30. package/dist/styles.css +1 -1
  31. package/dist/tokens/base.css +4 -0
  32. package/dist/tokens/components/flex.css +25 -0
  33. package/dist/tokens/components/radar-chart.css +21 -0
  34. package/dist/tokens/derived.css +2 -0
  35. package/package.json +6 -2
@@ -171,9 +171,21 @@ export type FlexJustifyProp = "start" | "center" | "end" | "between" | "around"
171
171
  * Bringhurst's 45–75 character reading band, `wide` (72rem) is the MARKETING measure. Do not give
172
172
  * a reading column `wide` — that rule is `--page-measure-wide`'s own, and it travels with the word.
173
173
  */
174
- export type FlexMeasureProp = "narrow" | "medium" | "wide";
174
+ export type FlexMeasureProp = "narrow" | "medium" | "wide" | "card" | "card-compact";
175
175
  /** @see Flex */
176
176
  export type FlexProp = React.HTMLAttributes<HTMLElement> & {
177
+ /** React19 ref to the rendered element. */
178
+ ref?: React.Ref<HTMLElement>;
179
+ /** Fit the visual viewport below this element's measured top; observes resize and scroll. */
180
+ viewport?: boolean;
181
+ /** Equal flexible region: flex 1 1 0 with zero minimum block size. */
182
+ basis?: "equal";
183
+ /** Internal scrolling; scroll-x and scroll-y constrain the other axis. */
184
+ overflow?: "hidden" | "auto" | "scroll-x" | "scroll-y";
185
+ /** Declarative orientation; no implied domain action. */
186
+ rotate?: 0 | 90 | 180 | 270;
187
+ /** Animate orientation changes only. Reduced motion always settles immediately. */
188
+ animated?: boolean;
177
189
  /**
178
190
  * Render element — `div` (default) or `span` when the Flex sits in a PHRASING context and a
179
191
  * `<div>` would be invalid HTML: inside a `TabsTrigger`/`PopoverTrigger`/`Button` (all of which
@@ -203,7 +215,7 @@ export type FlexProp = React.HTMLAttributes<HTMLElement> & {
203
215
  */
204
216
  marker?: FlexMarkerProp;
205
217
  /** Lightweight surfaces for rows and notices; no Card elevation by default. */
206
- surface?: "muted" | "popover" | "warning";
218
+ surface?: "muted" | "popover" | "warning" | "felt" | "etched";
207
219
  /** Negative inline inset, using the same spacing scale as pad. */
208
220
  bleed?: GapProp;
209
221
  /** Floating row actions: show on parent hover, focus-within, and touch. */
@@ -261,8 +273,18 @@ export type FlexProp = React.HTMLAttributes<HTMLElement> & {
261
273
  * Ghi đè `pad` ở TỪNG CẠNH, không phải cả cụm.
262
274
  */
263
275
  padRaw?: PadRawProp;
276
+ /** Cross-axis alignment of the children (`align-items`). Unset keeps the browser default, `stretch`. */
264
277
  align?: FlexAlignProp;
278
+ /** Main-axis distribution of the children (`justify-content`). Unset keeps the browser default, `start`. */
265
279
  justify?: FlexJustifyProp;
280
+ /**
281
+ * Let the children wrap onto further lines (`flex-wrap: wrap`) instead of overflowing one line.
282
+ *
283
+ * It also changes the Flex's behaviour INSIDE a table cell: it emits `data-wrap`, which opts the
284
+ * row out of the table-cell rule that pulls buttons, badges and avatars up with a negative
285
+ * `margin-block` (table-layout.css). A wrapping chip list needs that opt-out: with the negative
286
+ * margin, its second line overlaps the first (gh#1495).
287
+ */
266
288
  wrap?: boolean;
267
289
  /**
268
290
  * Drop this region below a breakpoint step (`sm` 40rem · `md` 48rem · `lg` 64rem · `xl` 80rem).
@@ -909,6 +909,26 @@ export declare const COMPONENT_PROP_REGISTRY: {
909
909
  readonly group: "layout";
910
910
  readonly file: "components/layout.prop.ts";
911
911
  readonly vocabulary: readonly [{
912
+ readonly field: "viewport";
913
+ readonly local: true;
914
+ readonly reason: "Generic bounded composition and declarative orientation capability; inert when omitted.";
915
+ }, {
916
+ readonly field: "basis";
917
+ readonly local: true;
918
+ readonly reason: "Generic bounded composition and declarative orientation capability; inert when omitted.";
919
+ }, {
920
+ readonly field: "overflow";
921
+ readonly local: true;
922
+ readonly reason: "Generic bounded composition and declarative orientation capability; inert when omitted.";
923
+ }, {
924
+ readonly field: "rotate";
925
+ readonly local: true;
926
+ readonly reason: "Generic bounded composition and declarative orientation capability; inert when omitted.";
927
+ }, {
928
+ readonly field: "animated";
929
+ readonly local: true;
930
+ readonly reason: "Generic bounded composition and declarative orientation capability; inert when omitted.";
931
+ }, {
912
932
  readonly field: "as";
913
933
  readonly local: true;
914
934
  readonly reason: "Closed tag seam (div | span) so a Flex stays valid HTML inside a phrasing-only parent such as the <button> a TabsTrigger renders — same shape as ListRow's `as` (gh#354).";
@@ -3616,6 +3636,43 @@ export declare const COMPONENT_PROP_REGISTRY: {
3616
3636
  readonly reason: "Chart-specific point-marker toggle.";
3617
3637
  }];
3618
3638
  };
3639
+ readonly RadarChartProp: {
3640
+ readonly group: "data-display";
3641
+ readonly file: "components/charts.prop.ts";
3642
+ readonly vocabulary: readonly ["LabelProp", "DescriptionProp", "SizeProp", "EmptyMessageProp", "FooterProp", "ClassNameProp", "IdProp", {
3643
+ readonly field: "data";
3644
+ readonly local: true;
3645
+ readonly reason: "Complete same-unit polar profile rows.";
3646
+ }, {
3647
+ readonly field: "categoryKey";
3648
+ readonly local: true;
3649
+ readonly reason: "Accessor for translated axis labels.";
3650
+ }, {
3651
+ readonly field: "valueKey";
3652
+ readonly local: true;
3653
+ readonly reason: "Accessor for the quantitative axis value.";
3654
+ }, {
3655
+ readonly field: "valueMax";
3656
+ readonly local: true;
3657
+ readonly reason: "Required positive shared scale ceiling.";
3658
+ }, {
3659
+ readonly field: "valueTicks";
3660
+ readonly local: true;
3661
+ readonly reason: "Optional positive shared scale ticks.";
3662
+ }, {
3663
+ readonly field: "showCaption";
3664
+ readonly local: true;
3665
+ readonly reason: "Hide visible caption while preserving figure name.";
3666
+ }, {
3667
+ readonly field: "numberFormat";
3668
+ readonly local: true;
3669
+ readonly reason: "Intl options for exact profile values.";
3670
+ }, {
3671
+ readonly field: "ref";
3672
+ readonly local: true;
3673
+ readonly reason: "Forwarded figure reference.";
3674
+ }];
3675
+ };
3619
3676
  readonly BarChartProp: {
3620
3677
  readonly group: "data-display";
3621
3678
  readonly file: "components/charts.prop.ts";
@@ -912,6 +912,31 @@ const COMPONENT_PROP_REGISTRY = {
912
912
  group: "layout",
913
913
  file: "components/layout.prop.ts",
914
914
  vocabulary: [
915
+ {
916
+ field: "viewport",
917
+ local: true,
918
+ reason: "Generic bounded composition and declarative orientation capability; inert when omitted."
919
+ },
920
+ {
921
+ field: "basis",
922
+ local: true,
923
+ reason: "Generic bounded composition and declarative orientation capability; inert when omitted."
924
+ },
925
+ {
926
+ field: "overflow",
927
+ local: true,
928
+ reason: "Generic bounded composition and declarative orientation capability; inert when omitted."
929
+ },
930
+ {
931
+ field: "rotate",
932
+ local: true,
933
+ reason: "Generic bounded composition and declarative orientation capability; inert when omitted."
934
+ },
935
+ {
936
+ field: "animated",
937
+ local: true,
938
+ reason: "Generic bounded composition and declarative orientation capability; inert when omitted."
939
+ },
915
940
  {
916
941
  field: "as",
917
942
  local: true,
@@ -3809,6 +3834,31 @@ const COMPONENT_PROP_REGISTRY = {
3809
3834
  { field: "showDots", local: true, reason: "Chart-specific point-marker toggle." }
3810
3835
  ]
3811
3836
  },
3837
+ RadarChartProp: {
3838
+ group: "data-display",
3839
+ file: "components/charts.prop.ts",
3840
+ vocabulary: [
3841
+ "LabelProp",
3842
+ "DescriptionProp",
3843
+ "SizeProp",
3844
+ "EmptyMessageProp",
3845
+ "FooterProp",
3846
+ "ClassNameProp",
3847
+ "IdProp",
3848
+ { field: "data", local: true, reason: "Complete same-unit polar profile rows." },
3849
+ { field: "categoryKey", local: true, reason: "Accessor for translated axis labels." },
3850
+ { field: "valueKey", local: true, reason: "Accessor for the quantitative axis value." },
3851
+ { field: "valueMax", local: true, reason: "Required positive shared scale ceiling." },
3852
+ { field: "valueTicks", local: true, reason: "Optional positive shared scale ticks." },
3853
+ {
3854
+ field: "showCaption",
3855
+ local: true,
3856
+ reason: "Hide visible caption while preserving figure name."
3857
+ },
3858
+ { field: "numberFormat", local: true, reason: "Intl options for exact profile values." },
3859
+ { field: "ref", local: true, reason: "Forwarded figure reference." }
3860
+ ]
3861
+ },
3812
3862
  BarChartProp: {
3813
3863
  group: "data-display",
3814
3864
  file: "components/charts.prop.ts",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "33.25.2",
2
+ "version": "33.27.0",
3
3
  "generatedBy": "scripts/gen-style-layers.mjs — do not edit by hand; run `pnpm gen:style-layers`",
4
4
  "base": "base.css",
5
5
  "fonts": "fonts.css",
@@ -334,7 +334,8 @@
334
334
  },
335
335
  "CenteredShell": {
336
336
  "layers": [
337
- "shell-layout.css"
337
+ "shell-layout.css",
338
+ "text-layout.css"
338
339
  ]
339
340
  },
340
341
  "ChatBubble": {
@@ -1094,6 +1095,12 @@
1094
1095
  "data-display-layout.css"
1095
1096
  ]
1096
1097
  },
1098
+ "RadarChart": {
1099
+ "layers": [
1100
+ "layout.css",
1101
+ "chart-layout.css"
1102
+ ]
1103
+ },
1097
1104
  "Radio": {
1098
1105
  "layers": [
1099
1106
  "control.css",
@@ -2578,5 +2578,161 @@
2578
2578
  grid-template-columns: var(--responsive-grid-panels-track-size);
2579
2579
  gap: var(--responsive-grid-panels-gap);
2580
2580
  }
2581
+ }
2581
2582
 
2583
+ @layer components {
2584
+ .ui-flex[data-viewport] {
2585
+ block-size: var(--flex-viewport-available, 100dvh);
2586
+ min-block-size: 0;
2587
+
2588
+ overflow: clip;
2589
+ overflow-clip-margin: var(--focus-ring-clip-margin);
2590
+ }
2591
+ .ui-flex[data-basis="equal"] {
2592
+ flex: 1 1 0;
2593
+ min-block-size: 0;
2594
+ min-inline-size: 0;
2595
+ }
2596
+ .ui-flex[data-overflow] {
2597
+ min-block-size: 0;
2598
+ min-inline-size: 0;
2599
+ }
2600
+ .ui-flex[data-overflow="hidden"] {
2601
+ overflow: clip;
2602
+ overflow-clip-margin: var(--focus-ring-clip-margin);
2603
+ }
2604
+ .ui-flex[data-overflow="auto"] {
2605
+ overflow: auto;
2606
+ }
2607
+ .ui-flex[data-overflow="scroll-x"] {
2608
+ overflow-x: auto;
2609
+ overflow-y: hidden;
2610
+ }
2611
+ .ui-flex[data-overflow="scroll-y"] {
2612
+ overflow-y: auto;
2613
+ overflow-x: hidden;
2614
+ }
2615
+ .ui-flex[data-measure="card"],
2616
+ .ui-flex[data-measure="card-compact"] {
2617
+ margin-inline: 0;
2618
+ flex: 0 0 auto;
2619
+ max-inline-size: none;
2620
+ }
2621
+ .ui-flex[data-measure="card"] {
2622
+ inline-size: calc(var(--flex-card-width) * var(--flex-card-size-ratio));
2623
+ block-size: calc(var(--flex-card-width) * var(--flex-card-size-ratio));
2624
+ align-items: center;
2625
+ justify-content: center;
2626
+ }
2627
+ .ui-flex[data-measure="card-compact"] {
2628
+ inline-size: calc(var(--flex-compact-card-width) * var(--flex-card-size-ratio));
2629
+ block-size: calc(var(--flex-compact-card-width) * var(--flex-card-size-ratio));
2630
+ align-items: center;
2631
+ justify-content: center;
2632
+ }
2633
+ .ui-flex[data-rotate="0"] {
2634
+ transform: rotate(0deg);
2635
+ }
2636
+ .ui-flex[data-rotate="90"] {
2637
+ transform: rotate(90deg);
2638
+ }
2639
+ .ui-flex[data-rotate="180"] {
2640
+ transform: rotate(180deg);
2641
+ }
2642
+ .ui-flex[data-rotate="270"] {
2643
+ transform: rotate(270deg);
2644
+ }
2645
+ .ui-flex[data-animated][data-rotate] {
2646
+ transition: transform var(--flex-orientation-duration) var(--ease-decelerate);
2647
+ }
2648
+ @media (prefers-reduced-motion: reduce) {
2649
+ .ui-flex[data-animated][data-rotate] {
2650
+ transition: none;
2651
+ }
2652
+ }
2653
+ }
2654
+
2655
+ @layer components {
2656
+ .ui-flex[data-measure="card"] > * {
2657
+ inline-size: var(--flex-card-width);
2658
+ max-inline-size: var(--flex-card-width);
2659
+ }
2660
+ .ui-flex[data-measure="card-compact"] > * {
2661
+ inline-size: var(--flex-compact-card-width);
2662
+ max-inline-size: var(--flex-compact-card-width);
2663
+ }
2664
+ .ui-flex[data-viewport] {
2665
+ padding-block-end: env(safe-area-inset-bottom, 0px);
2666
+ box-sizing: border-box;
2667
+ }
2668
+ }
2669
+
2670
+ @layer components {
2671
+ .ui-flex[data-surface="felt"] {
2672
+ --background: var(--flex-felt-background, var(--primary));
2673
+ --button-outline-foreground: hsl(var(--foreground));
2674
+ --button-outline-background: transparent;
2675
+ --button-outline-border-color: hsl(
2676
+ var(--flex-etched-border-color, var(--foreground)) / var(--flex-felt-control-border-alpha)
2677
+ );
2678
+ --button-link-foreground: hsl(var(--foreground));
2679
+ --control-surface-background: hsl(var(--background));
2680
+ --control-surface-border-color: hsl(
2681
+ var(--flex-etched-border-color, var(--foreground)) / var(--flex-felt-control-border-alpha)
2682
+ );
2683
+ --secondary: var(--background);
2684
+ --secondary-foreground: var(--foreground);
2685
+ --accent: var(--foreground);
2686
+ --accent-foreground: var(--background);
2687
+ --slider-track-background: hsl(
2688
+ var(--flex-etched-border-color, var(--foreground)) / var(--flex-felt-track-alpha)
2689
+ );
2690
+ --slider-range-background: hsl(var(--foreground));
2691
+
2692
+ --foreground: var(--flex-felt-foreground, var(--primary-foreground));
2693
+ --muted-foreground: var(--flex-felt-muted-foreground, var(--primary-foreground));
2694
+ --ring: var(--flex-felt-focus-color, var(--primary-foreground));
2695
+ color: hsl(var(--foreground));
2696
+ background-color: hsl(var(--flex-felt-background, var(--primary)));
2697
+ background-image:
2698
+ radial-gradient(
2699
+ ellipse at center,
2700
+ hsl(var(--foreground) / var(--flex-felt-highlight-alpha)),
2701
+ transparent var(--flex-felt-highlight-size)
2702
+ ),
2703
+ repeating-linear-gradient(
2704
+ 0deg,
2705
+ hsl(var(--foreground) / var(--flex-felt-grain-alpha)) 0,
2706
+ transparent var(--flex-felt-grain-width),
2707
+ transparent var(--flex-felt-grain-size)
2708
+ ),
2709
+ repeating-linear-gradient(
2710
+ 90deg,
2711
+ hsl(var(--foreground) / var(--flex-felt-grain-alpha)) 0,
2712
+ transparent var(--flex-felt-grain-width),
2713
+ transparent var(--flex-felt-grain-size)
2714
+ );
2715
+ }
2716
+ .ui-flex[data-surface="etched"] {
2717
+ border: var(--flex-etched-border-size) solid
2718
+ hsl(var(--flex-etched-border-color, var(--foreground)) / var(--flex-etched-border-alpha));
2719
+ border-radius: var(
2720
+ --flex-etched-radius,
2721
+ var(--radius-md, calc(var(--radius) / var(--radius-ratio)))
2722
+ );
2723
+ background: transparent;
2724
+ box-sizing: border-box;
2725
+ }
2726
+ }
2727
+
2728
+ @layer components {
2729
+ .ui-flex[data-surface="felt"] .ui-button--default {
2730
+ --primary-foreground: var(--background);
2731
+ --primary-hover: var(--foreground);
2732
+ --button-default-background: hsl(var(--foreground));
2733
+ }
2734
+ .ui-flex[data-surface="felt"] .ui-slider-thumb {
2735
+ background: hsl(var(--foreground));
2736
+ border-color: hsl(var(--flex-etched-border-color, var(--foreground)));
2737
+ }
2582
2738
  }