@godxjp/ui 31.3.0 → 31.5.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 (49) hide show
  1. package/agent/START-HERE.md +6 -6
  2. package/agent/components/CodeBlock.json +7 -1
  3. package/agent/components/OrgChart.json +59 -0
  4. package/agent/components/Tabs.json +5 -0
  5. package/agent/components-index.json +5 -0
  6. package/agent/components.json +71 -1
  7. package/agent/index.json +7 -7
  8. package/agent/llms.txt +6 -6
  9. package/agent/tokens.json +141 -3
  10. package/dist/components/data-display/code-block.js +90 -4
  11. package/dist/components/data-display/index.d.ts +2 -0
  12. package/dist/components/data-display/index.js +2 -0
  13. package/dist/components/data-display/org-chart.d.ts +5 -0
  14. package/dist/components/data-display/org-chart.js +169 -0
  15. package/dist/components/data-entry/upload.js +12 -1
  16. package/dist/components/general/typography.d.ts +32 -0
  17. package/dist/components/general/typography.js +11 -2
  18. package/dist/components/navigation/tabs.d.ts +2 -2
  19. package/dist/components/navigation/tabs.js +57 -10
  20. package/dist/contracts/measurement.json +1 -1
  21. package/dist/i18n/messages/en.json +10 -0
  22. package/dist/i18n/messages/ja.json +10 -0
  23. package/dist/i18n/messages/vi.json +10 -0
  24. package/dist/props/components/data-display.prop.d.ts +51 -1
  25. package/dist/props/components/navigation.prop.d.ts +19 -1
  26. package/dist/props/registry.d.ts +40 -1
  27. package/dist/props/registry.js +50 -0
  28. package/dist/styles/alert-layout.css +12 -12
  29. package/dist/styles/control.css +18 -2
  30. package/dist/styles/data-display-layout.css +173 -0
  31. package/dist/styles/data-entry-layout.css +4 -0
  32. package/dist/styles/form-layout.css +47 -5
  33. package/dist/styles/layers.json +14 -1
  34. package/dist/styles/layout.css +2 -1
  35. package/dist/tokens/base.css +1 -0
  36. package/dist/tokens/components/org-chart.css +27 -0
  37. package/dist/tokens/components/segmented.css +4 -0
  38. package/dist/tokens/semantic/layout.css +2 -0
  39. package/docs/FRAME-COVERAGE-REPORT.md +3 -2
  40. package/docs/data-display/code-block.tsx +27 -0
  41. package/docs/data-display/org-chart.tsx +165 -0
  42. package/docs/data-entry/segmented.tsx +2 -0
  43. package/docs/navigation/tabs.tsx +45 -0
  44. package/docs/query/data-state.tsx +30 -8
  45. package/docs/showcase/table-view-tabs.tsx +15 -13
  46. package/docs/themes/flat.css +4 -0
  47. package/docs/themes/glassmorphism.css +2 -0
  48. package/docs/themes/neubrutalism.css +6 -0
  49. package/package.json +2 -2
@@ -22,6 +22,13 @@ export type CodeBlockProp = {
22
22
  size?: Extract<SizeProp, "xs" | "sm">;
23
23
  /** Lands on `data-language`; no highlighter is bundled — see `children` for colouring its output. */
24
24
  language?: string;
25
+ /**
26
+ * A copy button in the block's inline-end corner — antd `Typography`'s `copyable`, same name and
27
+ * semantics. `true` copies the block's text content; the object form sets `text`, `onCopy`,
28
+ * `tooltips` (`[copy, copied]`, or `false`), `icon` (`[copy, copied]`), `format` and `tabIndex`.
29
+ * The copy is announced politely to assistive technology.
30
+ */
31
+ copyable?: boolean | TypographyCopyConfigProp;
25
32
  className?: ClassNameProp;
26
33
  };
27
34
  /**
@@ -36,7 +43,7 @@ export type ProseProp = {
36
43
  className?: ClassNameProp;
37
44
  children?: ChildrenProp;
38
45
  };
39
- import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, GetRowLabelProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, PendingProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp, DescriptionsLayoutProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, GapProp, SortDirectionProp, OnColumnFilterChangeProp, OnRowProp, TableExpandableProp, TableRowSelectionProp, TableScrollProp, TableStickyProp, TableSummaryProp, DisabledProp, OnClickProp, ValueProp, DefaultValueProp, OnValueChangeProp } from "../vocabulary/index.js";
46
+ import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ExtraProp, ColumnDefProp, GetRowIdProp, GetRowLabelProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, PendingProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp, DescriptionsLayoutProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, GapProp, SortDirectionProp, OnColumnFilterChangeProp, OnRowProp, TableExpandableProp, TableRowSelectionProp, TableScrollProp, TableStickyProp, TableSummaryProp, DisabledProp, OnClickProp, ValueProp, DefaultValueProp, OnValueChangeProp, TypographyCopyConfigProp } from "../vocabulary/index.js";
40
47
  import type { TreeFieldNamesProp, TreeOptionProp } from "./data-entry.prop.js";
41
48
  /**
42
49
  * One key in a `Legend`: a tone, and the words that tone stands for.
@@ -1126,3 +1133,46 @@ export type MarqueeProp = Omit<React.HTMLAttributes<HTMLDivElement>, "onPlay" |
1126
1133
  label?: LabelProp;
1127
1134
  className?: ClassNameProp;
1128
1135
  };
1136
+ /**
1137
+ * @see OrgChart — who a box stands for. `agent` draws the box with a DASHED border so an AI agent
1138
+ * is told apart from a person at a glance, and adds a localized visually hidden "AI agent" to the
1139
+ * node's accessible name, so the difference is never carried by the stroke alone (WCAG 1.4.1).
1140
+ */
1141
+ export type OrgChartNodeVariantProp = "person" | "agent";
1142
+ /** @see OrgChart — one box of the chart. */
1143
+ export type OrgChartNodeProp = {
1144
+ /** Identity of the node. Unique across the whole chart. */
1145
+ key: string;
1146
+ /** The person's or agent's name — the box's first line and the start of its accessible name. */
1147
+ name: React.ReactNode;
1148
+ /** Role / job title, the line under the name. */
1149
+ title?: TitleProp;
1150
+ /** The mark at the box's inline start — usually an `<Avatar>`. Decorative; the name carries identity. */
1151
+ avatar?: React.ReactNode;
1152
+ /** Free slot under the text — a Badge, a status, a count. */
1153
+ extra?: ExtraProp;
1154
+ /** `person` (default) or `agent` (dashed box). */
1155
+ variant?: OrgChartNodeVariantProp;
1156
+ children?: readonly OrgChartNodeProp[];
1157
+ };
1158
+ /**
1159
+ * @see OrgChart — an organization chart: boxes joined by lines, top-down, with a horizontal scroll
1160
+ * region of its own when the chart is wider than its container, and an indented `Tree` of the same
1161
+ * data when the CONTAINER is narrow. It is the WAI-ARIA APG tree view in both forms.
1162
+ */
1163
+ export type OrgChartProp = {
1164
+ /** The hierarchy. Usually one root; several roots render side by side. */
1165
+ data: readonly OrgChartNodeProp[];
1166
+ /**
1167
+ * Replace the box's content (avatar · name · title · extra) with your own. The box, its border,
1168
+ * the connectors and the keyboard stay the library's. Used by the narrow `Tree` form too.
1169
+ */
1170
+ renderNode?: (node: OrgChartNodeProp) => React.ReactNode;
1171
+ /**
1172
+ * Accessible name of the chart (the `role="tree"`) — a plain string. A localized default
1173
+ * ("Organization chart") applies when omitted.
1174
+ */
1175
+ label?: Extract<LabelProp, string>;
1176
+ className?: ClassNameProp;
1177
+ id?: IdProp;
1178
+ };
@@ -255,7 +255,11 @@ export type StepsSeparatorProp = "chevron" | "arrow";
255
255
  export type TabItemProp = {
256
256
  value: string;
257
257
  label: React.ReactNode;
258
- content: React.ReactNode;
258
+ /**
259
+ * The panel body. Optional because a strip-only `Tabs` (`controls`, gh#1021) renders no panel
260
+ * at all — its content lives in the consumer's own region.
261
+ */
262
+ content?: React.ReactNode;
259
263
  disabled?: boolean;
260
264
  /** Leading glyph inside the trigger (Ant Design `Tab.icon`). */
261
265
  icon?: React.ReactNode;
@@ -514,6 +518,20 @@ export type TabsProp = {
514
518
  moreIcon?: React.ReactNode;
515
519
  /** Ant Design `onTabScroll`, on the logical axis. @see TabsOnScrollProp */
516
520
  onTabScroll?: TabsOnScrollProp;
521
+ /**
522
+ * STRIP-ONLY MODE (gh#1021) — the `id` of the element OUTSIDE this `Tabs` that the strip
523
+ * drives: a status strip (未対応 / 対応中 / 完了) over a MasterDetail, a saved-view ribbon over a
524
+ * grid. With it set the `items` API renders the tablist ONLY — no `tabpanel`, empty or
525
+ * otherwise — and the selected tab's `aria-controls` points at this id, so the WAI-ARIA APG
526
+ * tab → controlled-region relationship stays real. The consumer's region is never mounted by
527
+ * the strip, so switching tabs cannot remount it (an unsent reply draft survives).
528
+ *
529
+ * Give the region an accessible name (`aria-label`/`aria-labelledby`, e.g. a `<section>`). In
530
+ * the compound form it applies to every trigger with no `TabsContent` declared for its value; a
531
+ * declared panel always wins. A pure FILTER with no region to point at is a `Segmented`
532
+ * (`radiogroup`), not a strip-only `Tabs`.
533
+ */
534
+ controls?: IdProp;
517
535
  className?: ClassNameProp;
518
536
  listClassName?: ClassNameProp;
519
537
  contentClassName?: ClassNameProp;
@@ -2626,7 +2626,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
2626
2626
  readonly TabsProp: {
2627
2627
  readonly group: "navigation";
2628
2628
  readonly file: "components/navigation.prop.ts";
2629
- readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "ClassNameProp", "SizeProp", "ExtraProp", {
2629
+ readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "ClassNameProp", "SizeProp", "ExtraProp", "IdProp", {
2630
2630
  readonly field: "bodied";
2631
2631
  readonly local: true;
2632
2632
  readonly reason: "A positive boolean for the card strip's PANEL BODY (gh#762) — an axis on Tabs rather than a `CardTabs` export, because the thing missing was a surface the existing card face already repaints its edge into, not a second component. No vocabulary type: no other component draws a body for its own panel.";
@@ -3929,6 +3929,45 @@ export declare const COMPONENT_PROP_REGISTRY: {
3929
3929
  readonly file: "components/data-display.prop.ts";
3930
3930
  readonly vocabulary: readonly ["TitleProp", "DescriptionProp", "IconProp", "StatusProp", "ControlVariantProp", "DisabledProp", "OnClickProp", "IdProp", "ClassNameProp"];
3931
3931
  };
3932
+ readonly OrgChartNodeVariantProp: {
3933
+ readonly group: "data-display";
3934
+ readonly file: "components/data-display.prop.ts";
3935
+ readonly vocabulary: readonly ["ControlVariantProp"];
3936
+ };
3937
+ readonly OrgChartNodeProp: {
3938
+ readonly group: "data-display";
3939
+ readonly file: "components/data-display.prop.ts";
3940
+ readonly vocabulary: readonly ["TitleProp", "ExtraProp", "ControlVariantProp", {
3941
+ readonly field: "key";
3942
+ readonly local: true;
3943
+ readonly reason: "The node's identity, unique across the chart.";
3944
+ }, {
3945
+ readonly field: "name";
3946
+ readonly local: true;
3947
+ readonly reason: "The person's or agent's display name (a ReactNode), not a form field `name` — NameProp is the submitted-field key.";
3948
+ }, {
3949
+ readonly field: "avatar";
3950
+ readonly local: true;
3951
+ readonly reason: "The mark at the box's inline start, usually an <Avatar>. Decorative.";
3952
+ }, {
3953
+ readonly field: "children";
3954
+ readonly local: true;
3955
+ readonly reason: "The node's own reports — the hierarchy itself, not a slot.";
3956
+ }];
3957
+ };
3958
+ readonly OrgChartProp: {
3959
+ readonly group: "data-display";
3960
+ readonly file: "components/data-display.prop.ts";
3961
+ readonly vocabulary: readonly ["LabelProp", "ClassNameProp", "IdProp", {
3962
+ readonly field: "data";
3963
+ readonly local: true;
3964
+ readonly reason: "The hierarchy of OrgChartNodeProp — the same shape feeds the boxes and the narrow Tree.";
3965
+ }, {
3966
+ readonly field: "renderNode";
3967
+ readonly local: true;
3968
+ readonly reason: "Escape hatch replacing a box's content; the box, connectors and keyboard stay the library's.";
3969
+ }];
3970
+ };
3932
3971
  };
3933
3972
  export type ComponentPropName = keyof typeof COMPONENT_PROP_REGISTRY;
3934
3973
  /** Forbidden duplicate concepts — use the canonical name on the left. */
@@ -3063,6 +3063,7 @@ const COMPONENT_PROP_REGISTRY = {
3063
3063
  "ClassNameProp",
3064
3064
  "SizeProp",
3065
3065
  "ExtraProp",
3066
+ "IdProp",
3066
3067
  {
3067
3068
  field: "bodied",
3068
3069
  local: true,
@@ -4763,6 +4764,55 @@ const COMPONENT_PROP_REGISTRY = {
4763
4764
  "IdProp",
4764
4765
  "ClassNameProp"
4765
4766
  ]
4767
+ },
4768
+ OrgChartNodeVariantProp: {
4769
+ group: "data-display",
4770
+ file: "components/data-display.prop.ts",
4771
+ vocabulary: ["ControlVariantProp"]
4772
+ },
4773
+ OrgChartNodeProp: {
4774
+ group: "data-display",
4775
+ file: "components/data-display.prop.ts",
4776
+ vocabulary: [
4777
+ "TitleProp",
4778
+ "ExtraProp",
4779
+ "ControlVariantProp",
4780
+ { field: "key", local: true, reason: "The node's identity, unique across the chart." },
4781
+ {
4782
+ field: "name",
4783
+ local: true,
4784
+ reason: "The person's or agent's display name (a ReactNode), not a form field `name` \u2014 NameProp is the submitted-field key."
4785
+ },
4786
+ {
4787
+ field: "avatar",
4788
+ local: true,
4789
+ reason: "The mark at the box's inline start, usually an <Avatar>. Decorative."
4790
+ },
4791
+ {
4792
+ field: "children",
4793
+ local: true,
4794
+ reason: "The node's own reports \u2014 the hierarchy itself, not a slot."
4795
+ }
4796
+ ]
4797
+ },
4798
+ OrgChartProp: {
4799
+ group: "data-display",
4800
+ file: "components/data-display.prop.ts",
4801
+ vocabulary: [
4802
+ "LabelProp",
4803
+ "ClassNameProp",
4804
+ "IdProp",
4805
+ {
4806
+ field: "data",
4807
+ local: true,
4808
+ reason: "The hierarchy of OrgChartNodeProp \u2014 the same shape feeds the boxes and the narrow Tree."
4809
+ },
4810
+ {
4811
+ field: "renderNode",
4812
+ local: true,
4813
+ reason: "Escape hatch replacing a box's content; the box, connectors and keyboard stay the library's."
4814
+ }
4815
+ ]
4766
4816
  }
4767
4817
  };
4768
4818
  const PROP_ALIASES_FORBIDDEN = {
@@ -289,6 +289,18 @@
289
289
  background: var(--skeleton-background, hsl(var(--muted)));
290
290
  }
291
291
 
292
+ .ui-skeleton-line {
293
+ block-size: var(--skeleton-block-height);
294
+ }
295
+
296
+ .ui-skeleton-caption {
297
+ block-size: var(--skeleton-caption-height);
298
+ }
299
+
300
+ .ui-skeleton-title {
301
+ block-size: var(--skeleton-title-height);
302
+ }
303
+
292
304
  .ui-skeleton-table {
293
305
  overflow: hidden;
294
306
  border: var(--stroke-hairline) solid hsl(var(--border));
@@ -327,18 +339,6 @@
327
339
  border-radius: var(--skeleton-radius, var(--radius));
328
340
  padding: var(--skeleton-card-inset);
329
341
 
330
- .ui-skeleton-line {
331
- block-size: var(--skeleton-block-height);
332
- }
333
-
334
- .ui-skeleton-caption {
335
- block-size: var(--skeleton-caption-height);
336
- }
337
-
338
- .ui-skeleton-title {
339
- block-size: var(--skeleton-title-height);
340
- }
341
-
342
342
  .ui-skeleton-detail-label {
343
343
  block-size: var(--skeleton-caption-height);
344
344
  inline-size: var(--skeleton-label-width);
@@ -1282,13 +1282,29 @@
1282
1282
  margin-inline-start: var(--segmented-count-gap);
1283
1283
  border-radius: var(--segmented-count-radius);
1284
1284
  padding-inline: var(--segmented-count-space-inline);
1285
- background: var(--segmented-count-background, hsl(var(--primary)));
1286
- color: var(--segmented-count-color, hsl(var(--primary-foreground)));
1285
+
1286
+ background: var(--segmented-count-background, hsl(var(--background)));
1287
+ color: var(--segmented-count-color, hsl(var(--muted-foreground)));
1287
1288
  font-size: var(--segmented-count-font-size);
1288
1289
  line-height: 1;
1289
1290
  font-variant-numeric: tabular-nums;
1290
1291
  }
1291
1292
 
1293
+ .ui-segmented-item[data-state="checked"] .ui-segmented-count {
1294
+ background: var(
1295
+ --segmented-count-selected-background,
1296
+ hsl(var(--primary) / var(--segmented-count-selected-background-alpha, 100%))
1297
+ );
1298
+ color: var(--segmented-count-selected-color, hsl(var(--primary-foreground)));
1299
+ }
1300
+
1301
+ @media (forced-colors: active) {
1302
+ .ui-segmented-item[data-state="checked"] .ui-segmented-count {
1303
+ outline: var(--segmented-count-forced-outline-width, var(--stroke-hairline)) solid
1304
+ currentColor;
1305
+ }
1306
+ }
1307
+
1292
1308
  .ui-tag-input {
1293
1309
  display: flex;
1294
1310
  flex-wrap: wrap;
@@ -1120,6 +1120,27 @@
1120
1120
  max-block-size: var(--code-block-max-height-lg);
1121
1121
  }
1122
1122
 
1123
+ .ui-code-block-frame {
1124
+ position: relative;
1125
+ min-inline-size: 0;
1126
+ }
1127
+
1128
+ .ui-code-block[data-copyable] {
1129
+ padding-inline-end: calc(var(--code-block-space-inset) + var(--control-height-xs));
1130
+ }
1131
+
1132
+ .ui-code-block-copy {
1133
+ position: absolute;
1134
+ inset-block-start: var(--space-1);
1135
+ inset-inline-end: var(--space-1);
1136
+ }
1137
+
1138
+ @media (pointer: coarse) {
1139
+ .ui-code-block[data-copyable] {
1140
+ padding-inline-end: calc(var(--code-block-space-inset) + var(--control-height-default));
1141
+ }
1142
+ }
1143
+
1123
1144
  .ui-code-block [data-code-token="comment"],
1124
1145
  .ui-prose pre [data-code-token="comment"] {
1125
1146
  color: var(--code-block-token-comment-color, hsl(var(--muted-foreground)));
@@ -2430,3 +2451,155 @@
2430
2451
  flex-direction: column;
2431
2452
  }
2432
2453
  }
2454
+
2455
+ @layer components {
2456
+
2457
+ .ui-org-chart {
2458
+ min-inline-size: 0;
2459
+ container: org-chart / inline-size;
2460
+ }
2461
+
2462
+ .ui-org-chart-scroll {
2463
+ overflow-x: auto;
2464
+ padding: var(--org-chart-padding);
2465
+ }
2466
+
2467
+ .ui-org-chart-tree,
2468
+ .ui-org-chart-children {
2469
+ display: flex;
2470
+ justify-content: center;
2471
+ margin: 0;
2472
+ padding: 0;
2473
+ list-style: none;
2474
+ }
2475
+
2476
+ .ui-org-chart-tree {
2477
+ inline-size: max-content;
2478
+ min-inline-size: 100%;
2479
+ }
2480
+
2481
+ .ui-org-chart-branch {
2482
+ position: relative;
2483
+ display: flex;
2484
+ flex-direction: column;
2485
+ align-items: center;
2486
+ padding-inline: calc(var(--org-chart-sibling-gap) / 2);
2487
+ }
2488
+
2489
+ .ui-org-chart-children {
2490
+ position: relative;
2491
+ padding-block-start: calc(var(--org-chart-level-gap) / 2);
2492
+ }
2493
+
2494
+ .ui-org-chart-children::before,
2495
+ .ui-org-chart-children > .ui-org-chart-branch::before,
2496
+ .ui-org-chart-children > .ui-org-chart-branch::after {
2497
+ position: absolute;
2498
+ box-sizing: border-box;
2499
+ inset-block-start: 0;
2500
+ block-size: calc(var(--org-chart-level-gap) / 2);
2501
+ border: 0 solid var(--org-chart-line-color, hsl(var(--border)));
2502
+ content: "";
2503
+ }
2504
+
2505
+ .ui-org-chart-children::before {
2506
+ inset-inline-start: calc(50% - var(--org-chart-line-width, var(--stroke-hairline)) / 2);
2507
+ border-inline-start-width: var(--org-chart-line-width, var(--stroke-hairline));
2508
+ }
2509
+
2510
+ .ui-org-chart-children > .ui-org-chart-branch {
2511
+ padding-block-start: calc(var(--org-chart-level-gap) / 2);
2512
+ }
2513
+
2514
+ .ui-org-chart-children > .ui-org-chart-branch::before {
2515
+ inset-inline: 0 50%;
2516
+ border-block-start-width: var(--org-chart-line-width, var(--stroke-hairline));
2517
+ }
2518
+
2519
+ .ui-org-chart-children > .ui-org-chart-branch::after {
2520
+ inset-inline: calc(50% - var(--org-chart-line-width, var(--stroke-hairline)) / 2) 0;
2521
+ border-block-start-width: var(--org-chart-line-width, var(--stroke-hairline));
2522
+ border-inline-start-width: var(--org-chart-line-width, var(--stroke-hairline));
2523
+ }
2524
+
2525
+ .ui-org-chart-children > .ui-org-chart-branch:first-child::before,
2526
+ .ui-org-chart-children > .ui-org-chart-branch:last-child::after {
2527
+ border-block-start-width: 0;
2528
+ }
2529
+
2530
+ .ui-org-chart-node {
2531
+ position: relative;
2532
+ display: flex;
2533
+ box-sizing: border-box;
2534
+ inline-size: var(--org-chart-node-inline-size);
2535
+ align-items: flex-start;
2536
+ gap: var(--org-chart-node-gap);
2537
+ padding-block: var(--org-chart-node-padding-block);
2538
+ padding-inline: var(--org-chart-node-padding-inline);
2539
+ border: var(--org-chart-node-border-width, var(--stroke-hairline)) solid
2540
+ var(--org-chart-node-border-color, hsl(var(--border)));
2541
+ border-radius: var(--org-chart-node-radius, var(--radius));
2542
+ background: var(--org-chart-node-background, hsl(var(--card)));
2543
+ color: var(--org-chart-node-foreground, hsl(var(--card-foreground)));
2544
+ font-size: var(--org-chart-node-font-size);
2545
+ text-align: start;
2546
+ }
2547
+
2548
+ .ui-org-chart-node[data-variant="agent"] {
2549
+ border-style: var(--org-chart-agent-border-style);
2550
+ }
2551
+
2552
+ .ui-org-chart-avatar {
2553
+ display: inline-flex;
2554
+ flex: 0 0 auto;
2555
+ }
2556
+
2557
+ .ui-org-chart-text {
2558
+ display: flex;
2559
+ min-inline-size: 0;
2560
+ flex: 1 1 auto;
2561
+ flex-direction: column;
2562
+ gap: var(--org-chart-node-text-gap);
2563
+ }
2564
+
2565
+ .ui-org-chart-name {
2566
+ font-weight: var(--font-weight-medium);
2567
+ overflow-wrap: anywhere;
2568
+ }
2569
+
2570
+ .ui-org-chart-title {
2571
+ color: var(--org-chart-node-title-color, hsl(var(--muted-foreground)));
2572
+ overflow-wrap: anywhere;
2573
+ }
2574
+
2575
+ .ui-org-chart-extra {
2576
+ display: flex;
2577
+ flex-wrap: wrap;
2578
+ gap: var(--org-chart-node-text-gap);
2579
+ }
2580
+
2581
+ .ui-org-chart-list {
2582
+ display: none;
2583
+ }
2584
+
2585
+ .ui-org-chart-list-row {
2586
+ display: inline-flex;
2587
+ min-inline-size: 0;
2588
+ align-items: center;
2589
+ gap: var(--org-chart-node-gap);
2590
+ }
2591
+
2592
+ .ui-org-chart-list-row .ui-org-chart-extra {
2593
+ display: inline-flex;
2594
+ }
2595
+
2596
+ @container org-chart (width < 40rem) {
2597
+ .ui-org-chart-scroll {
2598
+ display: none;
2599
+ }
2600
+
2601
+ .ui-org-chart-list {
2602
+ display: block;
2603
+ }
2604
+ }
2605
+ }
@@ -361,6 +361,10 @@
361
361
  color: hsl(var(--muted-foreground));
362
362
  }
363
363
 
364
+ .ui-upload-trigger {
365
+ align-self: start;
366
+ }
367
+
364
368
  .ui-upload-grid {
365
369
  display: flex;
366
370
  flex-wrap: wrap;
@@ -60,6 +60,9 @@
60
60
  inline-size: 100%;
61
61
 
62
62
  align-self: start;
63
+
64
+ --form-field-control-band: initial;
65
+ --form-field-first-line: initial;
63
66
  }
64
67
 
65
68
  .ui-form-field[data-layout="inline"] {
@@ -84,6 +87,40 @@
84
87
 
85
88
  min-height: var(--control-height);
86
89
  align-content: center;
90
+
91
+ grid-template-rows: minmax(var(--form-field-control-band, auto), auto);
92
+ align-items: center;
93
+ }
94
+
95
+ .ui-form-field-control:has(> .ui-form-field-note:first-child) {
96
+ grid-template-rows: none;
97
+ }
98
+
99
+ .ui-form-field-control
100
+ > fieldset
101
+ > :is(.ui-choice-group[data-orientation="vertical"], .ui-choice-field) {
102
+ align-self: start;
103
+ margin-block-start: max(
104
+ 0px,
105
+ calc(
106
+ (
107
+ var(--form-field-control-band, 0px) - var(--font-size-base) *
108
+ var(--control-label-line-height)
109
+ ) /
110
+ 2
111
+ )
112
+ );
113
+ }
114
+
115
+ .ui-form-field:has(
116
+ > .ui-form-field-control
117
+ > fieldset
118
+ > :is(.ui-control-multiline, [data-slot="textarea-affix-wrapper"])
119
+ ) {
120
+ --form-field-first-line: calc(
121
+ var(--control-border-width, var(--stroke-hairline)) + var(--control-multiline-padding-block) +
122
+ 0.5lh
123
+ );
87
124
  }
88
125
 
89
126
  .ui-form-field-control > * {
@@ -96,13 +133,14 @@
96
133
  ) {
97
134
  grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
98
135
  align-items: start;
136
+ --form-field-control-band: var(--control-height);
99
137
  column-gap: var(--form-label-gap);
100
138
  row-gap: var(--space-stack-xs);
101
139
  }
102
140
 
103
141
  .ui-form-field[data-collapse-below="false"]:is([data-layout="horizontal"], [data-layout="inline"])
104
142
  > .ui-form-field-label {
105
- min-block-size: var(--control-height);
143
+ min-block-size: calc(2 * var(--form-field-first-line, var(--control-height) / 2));
106
144
  flex-wrap: wrap;
107
145
  }
108
146
  .ui-form-field[data-collapse-below="false"]:is([data-layout="horizontal"], [data-layout="inline"])
@@ -131,12 +169,13 @@
131
169
  ) {
132
170
  grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
133
171
  align-items: start;
172
+ --form-field-control-band: var(--control-height);
134
173
  column-gap: var(--form-label-gap);
135
174
  row-gap: var(--space-stack-xs);
136
175
  }
137
176
  .ui-form-field[data-collapse-below="sm"]:is([data-layout="horizontal"], [data-layout="inline"])
138
177
  > .ui-form-field-label {
139
- min-block-size: var(--control-height);
178
+ min-block-size: calc(2 * var(--form-field-first-line, var(--control-height) / 2));
140
179
  flex-wrap: wrap;
141
180
  }
142
181
  .ui-form-field[data-collapse-below="sm"]:is([data-layout="horizontal"], [data-layout="inline"])
@@ -165,12 +204,13 @@
165
204
  ) {
166
205
  grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
167
206
  align-items: start;
207
+ --form-field-control-band: var(--control-height);
168
208
  column-gap: var(--form-label-gap);
169
209
  row-gap: var(--space-stack-xs);
170
210
  }
171
211
  .ui-form-field[data-collapse-below="md"]:is([data-layout="horizontal"], [data-layout="inline"])
172
212
  > .ui-form-field-label {
173
- min-block-size: var(--control-height);
213
+ min-block-size: calc(2 * var(--form-field-first-line, var(--control-height) / 2));
174
214
  flex-wrap: wrap;
175
215
  }
176
216
  .ui-form-field[data-collapse-below="md"]:is([data-layout="horizontal"], [data-layout="inline"])
@@ -199,12 +239,13 @@
199
239
  ) {
200
240
  grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
201
241
  align-items: start;
242
+ --form-field-control-band: var(--control-height);
202
243
  column-gap: var(--form-label-gap);
203
244
  row-gap: var(--space-stack-xs);
204
245
  }
205
246
  .ui-form-field[data-collapse-below="lg"]:is([data-layout="horizontal"], [data-layout="inline"])
206
247
  > .ui-form-field-label {
207
- min-block-size: var(--control-height);
248
+ min-block-size: calc(2 * var(--form-field-first-line, var(--control-height) / 2));
208
249
  flex-wrap: wrap;
209
250
  }
210
251
  .ui-form-field[data-collapse-below="lg"]:is([data-layout="horizontal"], [data-layout="inline"])
@@ -233,12 +274,13 @@
233
274
  ) {
234
275
  grid-template-columns: var(--form-label-width, max-content) minmax(0, 1fr);
235
276
  align-items: start;
277
+ --form-field-control-band: var(--control-height);
236
278
  column-gap: var(--form-label-gap);
237
279
  row-gap: var(--space-stack-xs);
238
280
  }
239
281
  .ui-form-field[data-collapse-below="xl"]:is([data-layout="horizontal"], [data-layout="inline"])
240
282
  > .ui-form-field-label {
241
- min-block-size: var(--control-height);
283
+ min-block-size: calc(2 * var(--form-field-first-line, var(--control-height) / 2));
242
284
  flex-wrap: wrap;
243
285
  }
244
286
  .ui-form-field[data-collapse-below="xl"]:is([data-layout="horizontal"], [data-layout="inline"])
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "31.3.0",
2
+ "version": "31.5.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",
@@ -349,6 +349,9 @@
349
349
  },
350
350
  "CodeBlock": {
351
351
  "layers": [
352
+ "control.css",
353
+ "text-layout.css",
354
+ "dialog-layout.css",
352
355
  "data-display-layout.css"
353
356
  ]
354
357
  },
@@ -673,6 +676,16 @@
673
676
  "control.css"
674
677
  ]
675
678
  },
679
+ "OrgChart": {
680
+ "layers": [
681
+ "layout.css",
682
+ "control.css",
683
+ "table-layout.css",
684
+ "alert-layout.css",
685
+ "data-display-layout.css",
686
+ "form-layout.css"
687
+ ]
688
+ },
676
689
  "OrgSwitcher": {
677
690
  "layers": [
678
691
  "shell-layout.css",
@@ -918,7 +918,8 @@
918
918
 
919
919
  .ui-page-header-extra {
920
920
  width: auto;
921
- flex-shrink: 1;
921
+ flex-shrink: 0;
922
+ max-inline-size: var(--page-header-extra-max-measure, 60%);
922
923
  min-inline-size: auto;
923
924
  justify-content: flex-end;
924
925
  }
@@ -38,6 +38,7 @@
38
38
  @import "./components/text.css";
39
39
  @import "./components/tree.css";
40
40
  @import "./components/thought-chain.css";
41
+ @import "./components/org-chart.css";
41
42
  @import "./components/welcome.css";
42
43
  @import "./components/actions.css";
43
44
  @import "./components/attachments.css";