@godxjp/ui 18.9.0 → 18.11.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.
- package/LICENSE +202 -0
- package/dist/components/data-display/badge.d.ts +7 -0
- package/dist/components/data-display/badge.js +1 -1
- package/dist/components/data-display/data-table.js +2 -2
- package/dist/components/data-display/index.d.ts +2 -0
- package/dist/components/data-display/index.js +2 -0
- package/dist/components/data-display/permission-matrix.d.ts +26 -0
- package/dist/components/data-display/permission-matrix.js +219 -0
- package/dist/components/data-display/table.d.ts +12 -0
- package/dist/components/data-entry/branch-scope-picker.d.ts +43 -0
- package/dist/components/data-entry/branch-scope-picker.js +200 -0
- package/dist/components/data-entry/index.d.ts +2 -0
- package/dist/components/data-entry/index.js +2 -0
- package/dist/components/data-entry/select.d.ts +7 -1
- package/dist/components/data-entry/select.js +46 -26
- package/dist/components/feedback/alert.d.ts +2 -20
- package/dist/components/feedback/alert.js +1 -11
- package/dist/components/feedback/banner.d.ts +21 -0
- package/dist/components/feedback/banner.js +19 -0
- package/dist/components/feedback/index.d.ts +4 -2
- package/dist/components/feedback/index.js +2 -2
- package/dist/components/general/typography.d.ts +1 -0
- package/dist/components/general/typography.js +32 -13
- package/dist/components/layout/auth-shell.d.ts +2 -2
- package/dist/components/layout/index.d.ts +2 -2
- package/dist/components/layout/index.js +2 -2
- package/dist/components/layout/page-container.d.ts +1 -1
- package/dist/components/layout/page-container.js +61 -15
- package/dist/components/layout/resizable.d.ts +1 -1
- package/dist/components/layout/resizable.js +26 -8
- package/dist/components/layout/service-role-panel.d.ts +25 -0
- package/dist/components/layout/service-role-panel.js +206 -0
- package/dist/components/navigation/filter-bar.d.ts +2 -2
- package/dist/components/navigation/filter-bar.js +113 -34
- package/dist/components/navigation/index.d.ts +1 -1
- package/dist/components/navigation/pagination.js +20 -1
- package/dist/components/navigation/tabs.js +6 -1
- package/dist/i18n/messages/en.json +59 -4
- package/dist/i18n/messages/ja.json +54 -5
- package/dist/i18n/messages/vi.json +53 -4
- package/dist/lib/field-a11y.d.ts +7 -0
- package/dist/lib/field-a11y.js +6 -0
- package/dist/lib/hooks.d.ts +15 -0
- package/dist/lib/hooks.js +37 -0
- package/dist/props/components/data-display.prop.d.ts +66 -0
- package/dist/props/components/data-entry.prop.d.ts +54 -0
- package/dist/props/components/feedback.prop.d.ts +3 -3
- package/dist/props/components/general.prop.d.ts +8 -1
- package/dist/props/components/layout.prop.d.ts +80 -51
- package/dist/props/components/navigation.prop.d.ts +77 -50
- package/dist/props/registry.d.ts +274 -54
- package/dist/props/registry.js +362 -73
- package/dist/props/vocabulary/content.prop.d.ts +5 -0
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/interaction.prop.d.ts +4 -7
- package/dist/props/vocabulary/layout.prop.d.ts +2 -2
- package/dist/styles/alert-layout.css +15 -32
- package/dist/styles/badge-layout.css +5 -0
- package/dist/styles/control.css +5 -0
- package/dist/styles/layout.css +118 -108
- package/dist/styles/shell-layout.css +16 -7
- package/dist/styles/table-layout.css +92 -2
- package/dist/styles/text-layout.css +13 -0
- package/dist/tokens/base.css +1 -0
- package/dist/tokens/components/badge.css +5 -0
- package/dist/tokens/components/banner.css +16 -0
- package/dist/tokens/components/navigation.css +10 -25
- package/dist/tokens/components/shell.css +20 -9
- package/dist/tokens/components/table.css +41 -1
- package/dist/tokens/semantic/layout.css +8 -7
- package/package.json +15 -2
- package/dist/components/layout/page-header.d.ts +0 -22
- package/dist/components/layout/page-header.js +0 -89
package/dist/props/registry.js
CHANGED
|
@@ -121,6 +121,11 @@ const VOCABULARY_REGISTRY = {
|
|
|
121
121
|
category: "content",
|
|
122
122
|
description: "Secondary line under title"
|
|
123
123
|
},
|
|
124
|
+
StatusProp: {
|
|
125
|
+
file: "vocabulary/content.prop.ts",
|
|
126
|
+
category: "content",
|
|
127
|
+
description: "Status/meta band beside a title (StatusBadge, meta text)"
|
|
128
|
+
},
|
|
124
129
|
DescriptionProp: {
|
|
125
130
|
file: "vocabulary/content.prop.ts",
|
|
126
131
|
category: "content",
|
|
@@ -220,7 +225,7 @@ const VOCABULARY_REGISTRY = {
|
|
|
220
225
|
AuthShellPresetProp: {
|
|
221
226
|
file: "vocabulary/layout.prop.ts",
|
|
222
227
|
category: "layout",
|
|
223
|
-
description: "AuthShell named flow geometry \u2014 default | login (stable SCR-001 identity/card/footer anchor) | device-authorization (380px card, 5px mobile gutter) | context-selection (25rem card, edge-to-edge mobile) | account-recovery (432px SCR-008 recovery/MFA panel, 15px mobile gutter)"
|
|
228
|
+
description: "AuthShell named flow geometry \u2014 default | login (stable SCR-001 identity/card/footer anchor) | registration (360px SCR-002 sign-up measure, start-aligned long-form scroll, own footer clearance, 15px mobile gutter) | device-authorization (380px card, 5px mobile gutter) | context-selection (25rem card, edge-to-edge mobile) | account-recovery (432px SCR-008 recovery/MFA panel, 15px mobile gutter)"
|
|
224
229
|
},
|
|
225
230
|
GapProp: {
|
|
226
231
|
file: "vocabulary/layout.prop.ts",
|
|
@@ -321,7 +326,7 @@ const VOCABULARY_REGISTRY = {
|
|
|
321
326
|
AlertVariantProp: {
|
|
322
327
|
file: "vocabulary/interaction.prop.ts",
|
|
323
328
|
category: "interaction",
|
|
324
|
-
description: "
|
|
329
|
+
description: "Alert structural axis: default inline card | banner full-bleed strip"
|
|
325
330
|
},
|
|
326
331
|
SortDirectionProp: {
|
|
327
332
|
file: "vocabulary/interaction.prop.ts",
|
|
@@ -465,51 +470,22 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
465
470
|
file: "components/layout.prop.ts",
|
|
466
471
|
vocabulary: []
|
|
467
472
|
},
|
|
468
|
-
PageHeaderProp: {
|
|
469
|
-
group: "layout",
|
|
470
|
-
file: "components/layout.prop.ts",
|
|
471
|
-
vocabulary: [
|
|
472
|
-
"TitleProp",
|
|
473
|
-
"SubtitleProp",
|
|
474
|
-
"ExtraProp",
|
|
475
|
-
"BreadcrumbProp",
|
|
476
|
-
{
|
|
477
|
-
field: "meta",
|
|
478
|
-
local: true,
|
|
479
|
-
reason: "Status/meta band rendered inline with the `<h1>` (a Badge tone, a record id, a timestamp). A free ReactNode slot, not a controlled value \u2014 the header never interprets what it holds."
|
|
480
|
-
},
|
|
481
|
-
{
|
|
482
|
-
field: "layout",
|
|
483
|
-
local: true,
|
|
484
|
-
reason: "Header ARRANGEMENT of the title band vs the extra slot below the 640px step (stack | responsive-inline) \u2014 the standalone spelling of PageContainer's `headerLayout`."
|
|
485
|
-
},
|
|
486
|
-
{
|
|
487
|
-
field: "loading",
|
|
488
|
-
local: true,
|
|
489
|
-
reason: "Pending state of the TITLE BAND only (skeleton title/subtitle + aria-busy), distinct from a page-wide DataState: breadcrumbs and actions come from the route and stay live while the record resolves."
|
|
490
|
-
}
|
|
491
|
-
]
|
|
492
|
-
},
|
|
493
473
|
PageContainerProp: {
|
|
494
474
|
group: "layout",
|
|
495
475
|
file: "components/layout.prop.ts",
|
|
496
476
|
vocabulary: [
|
|
497
477
|
"TitleProp",
|
|
498
478
|
"SubtitleProp",
|
|
479
|
+
"StatusProp",
|
|
499
480
|
"ExtraProp",
|
|
500
481
|
"FooterProp",
|
|
501
482
|
"BreadcrumbProp",
|
|
502
483
|
"DensityProp",
|
|
503
484
|
"PageContainerVariantProp",
|
|
504
|
-
{
|
|
505
|
-
field: "meta",
|
|
506
|
-
local: true,
|
|
507
|
-
reason: "Forwarded verbatim to PageHeader's `meta` slot \u2014 see PageHeaderProp."
|
|
508
|
-
},
|
|
509
485
|
{
|
|
510
486
|
field: "headerLoading",
|
|
511
487
|
local: true,
|
|
512
|
-
reason: "
|
|
488
|
+
reason: "Pending state of the TITLE BAND only (skeleton title/subtitle + aria-busy on the header). Named for the BAND it skeletonises, so it can never be read as a page-wide loading flag (that is DataState's job); breadcrumbs and `extra` come from the route and stay live while the record resolves."
|
|
513
489
|
},
|
|
514
490
|
{
|
|
515
491
|
field: "headerLayout",
|
|
@@ -1526,8 +1502,6 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
1526
1502
|
BannerProp: {
|
|
1527
1503
|
group: "feedback",
|
|
1528
1504
|
file: "components/feedback.prop.ts",
|
|
1529
|
-
// `Omit<AlertProp, "variant">` — the alias fixes the one prop it drops, so it inherits Alert's
|
|
1530
|
-
// vocabulary exactly. Listing it again here is what keeps the guard honest if Alert's API moves.
|
|
1531
1505
|
vocabulary: ["ToneProp", "IconProp", "OnValueChangeProp", "ClassNameProp", "ChildrenProp"]
|
|
1532
1506
|
},
|
|
1533
1507
|
AlertTitleProp: {
|
|
@@ -1559,52 +1533,33 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
1559
1533
|
"OnClearFiltersProp",
|
|
1560
1534
|
"HasActiveFiltersProp",
|
|
1561
1535
|
"StickyProp",
|
|
1536
|
+
"ActionsProp",
|
|
1537
|
+
"PendingProp",
|
|
1538
|
+
"DisabledProp",
|
|
1539
|
+
"ErrorProp",
|
|
1562
1540
|
"ClassNameProp",
|
|
1563
|
-
"ChildrenProp"
|
|
1564
|
-
{
|
|
1565
|
-
field: "search",
|
|
1566
|
-
local: true,
|
|
1567
|
-
reason: "SLOT for the caller's own search control, positioned at the start of the row and measured by --filter-bar-search-width. Not a value/onValueChange pair: the bar owns the search's PLACE and WIDTH, never its state (gh#258)."
|
|
1568
|
-
},
|
|
1569
|
-
{
|
|
1570
|
-
field: "chips",
|
|
1571
|
-
local: true,
|
|
1572
|
-
reason: "APPLIED filters as removable chips \u2014 the visible record of filters already in effect, distinct from the controls that set them. A bar-specific shape (id/label/onRemove), not a shared vocabulary type (gh#258)."
|
|
1573
|
-
},
|
|
1574
|
-
{
|
|
1575
|
-
field: "onChipRemove",
|
|
1576
|
-
local: true,
|
|
1577
|
-
reason: "Chip-removal callback keyed by chip id. Not `onValueChange`: it reports ONE lifted filter rather than the bar's whole value, which the bar deliberately does not hold (gh#258)."
|
|
1578
|
-
},
|
|
1579
|
-
{
|
|
1580
|
-
field: "resultCount",
|
|
1581
|
-
local: true,
|
|
1582
|
-
reason: "Number of records the current filters resolve to, announced in a polite live region and formatted via Intl.NumberFormat + CLDR plurals. Presentational output, not a controlled value (gh#258)."
|
|
1583
|
-
},
|
|
1584
|
-
{
|
|
1585
|
-
field: "actions",
|
|
1586
|
-
local: true,
|
|
1587
|
-
reason: "Trailing action SLOT (export, column settings, saved views), ordered AFTER the reset control by the bar so `clear filters` never sits beside an unrelated primary action (gh#258)."
|
|
1588
|
-
}
|
|
1541
|
+
"ChildrenProp"
|
|
1589
1542
|
]
|
|
1590
1543
|
},
|
|
1591
|
-
|
|
1544
|
+
FilterBarOverflowProp: {
|
|
1592
1545
|
group: "navigation",
|
|
1593
1546
|
file: "components/navigation.prop.ts",
|
|
1594
|
-
vocabulary: [
|
|
1595
|
-
"IdProp",
|
|
1596
|
-
"LabelProp",
|
|
1597
|
-
{
|
|
1598
|
-
field: "onRemove",
|
|
1599
|
-
local: true,
|
|
1600
|
-
reason: "Per-chip removal. Omitting it is meaningful \u2014 the chip renders with NO remove control (a filter the user may not lift), rather than a disabled button that is a dead tab stop (gh#258)."
|
|
1601
|
-
}
|
|
1602
|
-
]
|
|
1547
|
+
vocabulary: []
|
|
1603
1548
|
},
|
|
1604
|
-
|
|
1549
|
+
FilterBarSearchProp: {
|
|
1605
1550
|
group: "navigation",
|
|
1606
1551
|
file: "components/navigation.prop.ts",
|
|
1607
|
-
vocabulary: []
|
|
1552
|
+
vocabulary: ["PlaceholderProp", "IdProp", "DisabledProp"]
|
|
1553
|
+
},
|
|
1554
|
+
FilterBarFilterProp: {
|
|
1555
|
+
group: "navigation",
|
|
1556
|
+
file: "components/navigation.prop.ts",
|
|
1557
|
+
vocabulary: ["LabelProp", "PlaceholderProp", "DisabledProp"]
|
|
1558
|
+
},
|
|
1559
|
+
FilterBarChipProp: {
|
|
1560
|
+
group: "navigation",
|
|
1561
|
+
file: "components/navigation.prop.ts",
|
|
1562
|
+
vocabulary: ["DisabledProp"]
|
|
1608
1563
|
},
|
|
1609
1564
|
ToolbarGroupProp: {
|
|
1610
1565
|
group: "navigation",
|
|
@@ -1813,6 +1768,340 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
1813
1768
|
group: "layout",
|
|
1814
1769
|
file: "components/layout/split-pane.tsx",
|
|
1815
1770
|
vocabulary: ["ClassNameProp", "ChildrenProp"]
|
|
1771
|
+
},
|
|
1772
|
+
PermissionMatrixRoleProp: {
|
|
1773
|
+
group: "data-display",
|
|
1774
|
+
file: "components/data-display.prop.ts",
|
|
1775
|
+
vocabulary: [
|
|
1776
|
+
"IdProp",
|
|
1777
|
+
{
|
|
1778
|
+
field: "name",
|
|
1779
|
+
local: true,
|
|
1780
|
+
reason: "Consumer-supplied role display name; a plain string so it can label cells for AT."
|
|
1781
|
+
},
|
|
1782
|
+
{
|
|
1783
|
+
field: "description",
|
|
1784
|
+
local: true,
|
|
1785
|
+
reason: "Secondary caption under the role column header."
|
|
1786
|
+
},
|
|
1787
|
+
{
|
|
1788
|
+
field: "locked",
|
|
1789
|
+
local: true,
|
|
1790
|
+
reason: "Per-role read-only flag \u2014 a locked role keeps \u2713/\u2014 cells in an editable matrix."
|
|
1791
|
+
}
|
|
1792
|
+
]
|
|
1793
|
+
},
|
|
1794
|
+
PermissionMatrixPermissionProp: {
|
|
1795
|
+
group: "data-display",
|
|
1796
|
+
file: "components/data-display.prop.ts",
|
|
1797
|
+
vocabulary: [
|
|
1798
|
+
"IdProp",
|
|
1799
|
+
{
|
|
1800
|
+
field: "name",
|
|
1801
|
+
local: true,
|
|
1802
|
+
reason: "Consumer-supplied permission display name; plain string for accessible labels."
|
|
1803
|
+
},
|
|
1804
|
+
{
|
|
1805
|
+
field: "description",
|
|
1806
|
+
local: true,
|
|
1807
|
+
reason: "Secondary line under the permission name."
|
|
1808
|
+
},
|
|
1809
|
+
{
|
|
1810
|
+
field: "group",
|
|
1811
|
+
local: true,
|
|
1812
|
+
reason: "Optional category caption for the permission row."
|
|
1813
|
+
}
|
|
1814
|
+
]
|
|
1815
|
+
},
|
|
1816
|
+
PermissionMatrixGrantsProp: {
|
|
1817
|
+
group: "data-display",
|
|
1818
|
+
file: "components/data-display.prop.ts",
|
|
1819
|
+
vocabulary: [
|
|
1820
|
+
{
|
|
1821
|
+
field: "grants",
|
|
1822
|
+
local: true,
|
|
1823
|
+
reason: "The role\xD7permission grant relation \u2014 the grantKey Set from lib/permission-grid or a pair array normalized through the same encoding."
|
|
1824
|
+
}
|
|
1825
|
+
]
|
|
1826
|
+
},
|
|
1827
|
+
PermissionMatrixProp: {
|
|
1828
|
+
group: "data-display",
|
|
1829
|
+
file: "components/data-display.prop.ts",
|
|
1830
|
+
vocabulary: [
|
|
1831
|
+
"LabelProp",
|
|
1832
|
+
"HandlerProp",
|
|
1833
|
+
"ClassNameProp",
|
|
1834
|
+
"IdProp",
|
|
1835
|
+
{
|
|
1836
|
+
field: "roles",
|
|
1837
|
+
local: true,
|
|
1838
|
+
reason: "Consumer-supplied role columns (see PermissionMatrixRoleProp)."
|
|
1839
|
+
},
|
|
1840
|
+
{
|
|
1841
|
+
field: "permissions",
|
|
1842
|
+
local: true,
|
|
1843
|
+
reason: "Consumer-supplied permission rows (see PermissionMatrixPermissionProp)."
|
|
1844
|
+
},
|
|
1845
|
+
{
|
|
1846
|
+
field: "grants",
|
|
1847
|
+
local: true,
|
|
1848
|
+
reason: "The grant relation (see PermissionMatrixGrantsProp)."
|
|
1849
|
+
},
|
|
1850
|
+
{
|
|
1851
|
+
field: "onGrantChange",
|
|
1852
|
+
local: true,
|
|
1853
|
+
reason: "Cell toggle handler carrying the (roleId, permissionId, granted) triple; its presence switches the grid from read-only \u2713/\u2014 to editable checkboxes."
|
|
1854
|
+
},
|
|
1855
|
+
{
|
|
1856
|
+
field: "readOnly",
|
|
1857
|
+
local: true,
|
|
1858
|
+
reason: "Forces the read-only grid even when onGrantChange is present (viewer permission)."
|
|
1859
|
+
},
|
|
1860
|
+
{
|
|
1861
|
+
field: "compare",
|
|
1862
|
+
local: true,
|
|
1863
|
+
reason: "Two role ids compared side by side \u2014 the lib/permission-grid ComparePair."
|
|
1864
|
+
},
|
|
1865
|
+
{
|
|
1866
|
+
field: "diffOnly",
|
|
1867
|
+
local: true,
|
|
1868
|
+
reason: "\u5DEE\u5206\u306E\u307F filter: with compare set, keep only the rows where the two roles differ."
|
|
1869
|
+
},
|
|
1870
|
+
{
|
|
1871
|
+
field: "loading",
|
|
1872
|
+
local: true,
|
|
1873
|
+
reason: "Read-lifecycle skeleton state mirroring DataTable #216 (precedence loading \u2192 denied \u2192 error \u2192 empty)."
|
|
1874
|
+
},
|
|
1875
|
+
{
|
|
1876
|
+
field: "empty",
|
|
1877
|
+
local: true,
|
|
1878
|
+
reason: "Custom empty content override, mirroring DataTable's empty slot."
|
|
1879
|
+
},
|
|
1880
|
+
{
|
|
1881
|
+
field: "error",
|
|
1882
|
+
local: true,
|
|
1883
|
+
reason: "Read-failure state mirroring DataTable #216 (true = built-in localized message)."
|
|
1884
|
+
},
|
|
1885
|
+
{
|
|
1886
|
+
field: "denied",
|
|
1887
|
+
local: true,
|
|
1888
|
+
reason: "Permission-denied read state mirroring DataTable #216 \u2014 refused, not failed."
|
|
1889
|
+
},
|
|
1890
|
+
{
|
|
1891
|
+
field: "onRetry",
|
|
1892
|
+
local: true,
|
|
1893
|
+
reason: "Retry affordance for the built-in error state, mirroring DataTable #216."
|
|
1894
|
+
}
|
|
1895
|
+
]
|
|
1896
|
+
},
|
|
1897
|
+
BranchScopeModeProp: {
|
|
1898
|
+
group: "data-entry",
|
|
1899
|
+
file: "components/data-entry.prop.ts",
|
|
1900
|
+
vocabulary: [
|
|
1901
|
+
{
|
|
1902
|
+
field: "mode",
|
|
1903
|
+
local: true,
|
|
1904
|
+
reason: "Closed scope vocabulary: all branches vs an explicit subset."
|
|
1905
|
+
}
|
|
1906
|
+
]
|
|
1907
|
+
},
|
|
1908
|
+
BranchScopeValueProp: {
|
|
1909
|
+
group: "data-entry",
|
|
1910
|
+
file: "components/data-entry.prop.ts",
|
|
1911
|
+
vocabulary: [
|
|
1912
|
+
{
|
|
1913
|
+
field: "mode",
|
|
1914
|
+
local: true,
|
|
1915
|
+
reason: "The selected scope mode (see BranchScopeModeProp)."
|
|
1916
|
+
},
|
|
1917
|
+
{
|
|
1918
|
+
field: "branchIds",
|
|
1919
|
+
local: true,
|
|
1920
|
+
reason: "Checked branch ids, meaningful only when mode = selected."
|
|
1921
|
+
}
|
|
1922
|
+
]
|
|
1923
|
+
},
|
|
1924
|
+
BranchScopeOptionProp: {
|
|
1925
|
+
group: "data-entry",
|
|
1926
|
+
file: "components/data-entry.prop.ts",
|
|
1927
|
+
vocabulary: [
|
|
1928
|
+
"IdProp",
|
|
1929
|
+
"DisabledProp",
|
|
1930
|
+
{
|
|
1931
|
+
field: "name",
|
|
1932
|
+
local: true,
|
|
1933
|
+
reason: "Consumer-supplied branch display name; plain string so it is searchable."
|
|
1934
|
+
},
|
|
1935
|
+
{
|
|
1936
|
+
field: "description",
|
|
1937
|
+
local: true,
|
|
1938
|
+
reason: "Secondary line under the branch name."
|
|
1939
|
+
}
|
|
1940
|
+
]
|
|
1941
|
+
},
|
|
1942
|
+
BranchScopePickerProp: {
|
|
1943
|
+
group: "data-entry",
|
|
1944
|
+
file: "components/data-entry.prop.ts",
|
|
1945
|
+
vocabulary: [
|
|
1946
|
+
"ValueProp",
|
|
1947
|
+
"DefaultValueProp",
|
|
1948
|
+
"OnValueChangeProp",
|
|
1949
|
+
"DisabledProp",
|
|
1950
|
+
"ErrorProp",
|
|
1951
|
+
"NameProp",
|
|
1952
|
+
"IdProp",
|
|
1953
|
+
"ClassNameProp",
|
|
1954
|
+
{
|
|
1955
|
+
field: "branches",
|
|
1956
|
+
local: true,
|
|
1957
|
+
reason: "Consumer-supplied selectable branches (see BranchScopeOptionProp)."
|
|
1958
|
+
},
|
|
1959
|
+
{
|
|
1960
|
+
field: "readOnly",
|
|
1961
|
+
local: true,
|
|
1962
|
+
reason: "Locked view: render the current scope without editable affordances."
|
|
1963
|
+
},
|
|
1964
|
+
{
|
|
1965
|
+
field: "searchable",
|
|
1966
|
+
local: true,
|
|
1967
|
+
reason: "Toggle for the built-in branch SearchInput above the checkbox list."
|
|
1968
|
+
},
|
|
1969
|
+
{
|
|
1970
|
+
field: "loading",
|
|
1971
|
+
local: true,
|
|
1972
|
+
reason: "Read-lifecycle skeleton state (precedence loading \u2192 denied \u2192 listError \u2192 empty)."
|
|
1973
|
+
},
|
|
1974
|
+
{
|
|
1975
|
+
field: "empty",
|
|
1976
|
+
local: true,
|
|
1977
|
+
reason: "Custom empty content when there are no branches."
|
|
1978
|
+
},
|
|
1979
|
+
{
|
|
1980
|
+
field: "listError",
|
|
1981
|
+
local: true,
|
|
1982
|
+
reason: "Branch-collection READ failure \u2014 deliberately distinct from ErrorProp `error`, which stays field validation."
|
|
1983
|
+
},
|
|
1984
|
+
{
|
|
1985
|
+
field: "denied",
|
|
1986
|
+
local: true,
|
|
1987
|
+
reason: "Permission-denied read state \u2014 the branch collection was refused, not failed."
|
|
1988
|
+
},
|
|
1989
|
+
{
|
|
1990
|
+
field: "allLabel",
|
|
1991
|
+
local: true,
|
|
1992
|
+
reason: "Override for the localized all-branches radio label."
|
|
1993
|
+
},
|
|
1994
|
+
{
|
|
1995
|
+
field: "selectedLabel",
|
|
1996
|
+
local: true,
|
|
1997
|
+
reason: "Override for the localized selected-branches radio label."
|
|
1998
|
+
}
|
|
1999
|
+
]
|
|
2000
|
+
},
|
|
2001
|
+
ServiceRoleItemProp: {
|
|
2002
|
+
group: "layout",
|
|
2003
|
+
file: "components/layout.prop.ts",
|
|
2004
|
+
vocabulary: [
|
|
2005
|
+
"IdProp",
|
|
2006
|
+
{
|
|
2007
|
+
field: "name",
|
|
2008
|
+
local: true,
|
|
2009
|
+
reason: "Consumer-supplied role display name; plain string for accessible labels."
|
|
2010
|
+
},
|
|
2011
|
+
{
|
|
2012
|
+
field: "description",
|
|
2013
|
+
local: true,
|
|
2014
|
+
reason: "Secondary line under the role name in the master rail."
|
|
2015
|
+
},
|
|
2016
|
+
{
|
|
2017
|
+
field: "memberCount",
|
|
2018
|
+
local: true,
|
|
2019
|
+
reason: "Member count caption, pluralized via CLDR categories."
|
|
2020
|
+
},
|
|
2021
|
+
{
|
|
2022
|
+
field: "locked",
|
|
2023
|
+
local: true,
|
|
2024
|
+
reason: "System-role flag: lock badge, no delete affordance ever."
|
|
2025
|
+
}
|
|
2026
|
+
]
|
|
2027
|
+
},
|
|
2028
|
+
ServiceRolePanelProp: {
|
|
2029
|
+
group: "layout",
|
|
2030
|
+
file: "components/layout.prop.ts",
|
|
2031
|
+
vocabulary: [
|
|
2032
|
+
"ValueProp",
|
|
2033
|
+
"DefaultValueProp",
|
|
2034
|
+
"OnValueChangeProp",
|
|
2035
|
+
"ChildrenProp",
|
|
2036
|
+
"BreakpointProp",
|
|
2037
|
+
"IdProp",
|
|
2038
|
+
"ClassNameProp",
|
|
2039
|
+
{
|
|
2040
|
+
field: "roles",
|
|
2041
|
+
local: true,
|
|
2042
|
+
reason: "Consumer-supplied role collection (see ServiceRoleItemProp)."
|
|
2043
|
+
},
|
|
2044
|
+
{
|
|
2045
|
+
field: "onDeleteRole",
|
|
2046
|
+
local: true,
|
|
2047
|
+
reason: "Confirmed-deletion handler; its presence arms the built-in destructive AlertDialog per non-locked role."
|
|
2048
|
+
},
|
|
2049
|
+
{
|
|
2050
|
+
field: "readOnly",
|
|
2051
|
+
local: true,
|
|
2052
|
+
reason: "Locked view: hides every mutating affordance."
|
|
2053
|
+
},
|
|
2054
|
+
{
|
|
2055
|
+
field: "loading",
|
|
2056
|
+
local: true,
|
|
2057
|
+
reason: "Read-lifecycle skeleton state (precedence loading \u2192 denied \u2192 error \u2192 empty)."
|
|
2058
|
+
},
|
|
2059
|
+
{
|
|
2060
|
+
field: "empty",
|
|
2061
|
+
local: true,
|
|
2062
|
+
reason: "Custom empty content when there are no roles."
|
|
2063
|
+
},
|
|
2064
|
+
{
|
|
2065
|
+
field: "error",
|
|
2066
|
+
local: true,
|
|
2067
|
+
reason: "Read-failure state (true = built-in localized message, node replaces it)."
|
|
2068
|
+
},
|
|
2069
|
+
{
|
|
2070
|
+
field: "denied",
|
|
2071
|
+
local: true,
|
|
2072
|
+
reason: "Permission-denied read state \u2014 refused, not failed."
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
field: "onRetry",
|
|
2076
|
+
local: true,
|
|
2077
|
+
reason: "Retry affordance for the built-in error state."
|
|
2078
|
+
},
|
|
2079
|
+
{
|
|
2080
|
+
field: "masterLabel",
|
|
2081
|
+
local: true,
|
|
2082
|
+
reason: "Accessible name override for the roles region (localized default otherwise)."
|
|
2083
|
+
},
|
|
2084
|
+
{
|
|
2085
|
+
field: "detailLabel",
|
|
2086
|
+
local: true,
|
|
2087
|
+
reason: "Accessible name override for the detail region (localized default otherwise)."
|
|
2088
|
+
},
|
|
2089
|
+
{
|
|
2090
|
+
field: "railWidth",
|
|
2091
|
+
local: true,
|
|
2092
|
+
reason: "Forwarded MasterDetail rail geometry preset."
|
|
2093
|
+
},
|
|
2094
|
+
{
|
|
2095
|
+
field: "masterViewport",
|
|
2096
|
+
local: true,
|
|
2097
|
+
reason: "Forwarded MasterDetail bounded-collection preset."
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
field: "collapseBelow",
|
|
2101
|
+
local: true,
|
|
2102
|
+
reason: "Forwarded MasterDetail stacking threshold override."
|
|
2103
|
+
}
|
|
2104
|
+
]
|
|
1816
2105
|
}
|
|
1817
2106
|
};
|
|
1818
2107
|
const PROP_ALIASES_FORBIDDEN = {
|
|
@@ -9,6 +9,11 @@ export type TitleProp = React.ReactNode;
|
|
|
9
9
|
export type SubtitleProp = React.ReactNode;
|
|
10
10
|
/** Longer explanatory copy — dialog body, empty state body. */
|
|
11
11
|
export type DescriptionProp = React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Status/meta band beside a title — StatusBadge, environment tag, "updated …" meta text.
|
|
14
|
+
* Owned by the canonical page-header contract so consumers never hand-lay a badge row.
|
|
15
|
+
*/
|
|
16
|
+
export type StatusProp = React.ReactNode;
|
|
12
17
|
/** Top-right action slot on pages (Ant Design `extra`). */
|
|
13
18
|
export type ExtraProp = React.ReactNode;
|
|
14
19
|
/** Bottom action bar on pages — save/cancel, pagination controls. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Barrel — all vocabulary prop types. */
|
|
2
2
|
export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, OnOpenChangeProp, HandlerProp, PendingProp, RequiredProp, DisabledProp, LabelProp, HelperProp, ErrorProp, PlaceholderProp, NameProp, ValueProp, DefaultValueProp, OnValueChangeProp, OnChangeProp, OnClickProp, AsChildProp, WidthProp, } from "./shared.prop.js";
|
|
3
|
-
export type { TitleProp, SubtitleProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
|
|
3
|
+
export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
|
|
4
4
|
export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, TableDensityProp, DensityProp, GapProp, } from "./layout.prop.js";
|
|
5
5
|
export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, SizeProp, FormLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, } from "./interaction.prop.js";
|
|
6
6
|
export type { BreadcrumbItemProp, BreadcrumbProp } from "./navigation.prop.js";
|
|
@@ -55,13 +55,10 @@ export type ConfirmVariantProp = "default" | "destructive";
|
|
|
55
55
|
/** Semantic color/status intent. */
|
|
56
56
|
export type ToneProp = "default" | "success" | "warning" | "destructive" | "info" | "muted" | "neutral";
|
|
57
57
|
/**
|
|
58
|
-
* Alert
|
|
59
|
-
*
|
|
60
|
-
* `
|
|
61
|
-
*
|
|
62
|
-
* on the block-end edge only, so it reads as page chrome above the content rather than as a card
|
|
63
|
-
* inside it. Both share one implementation, one tone scale and one dismiss/actions contract —
|
|
64
|
-
* `banner` re-measures the box through `--banner-*` tokens and changes nothing else.
|
|
58
|
+
* Alert STRUCTURAL axis (orthogonal to `tone`, which owns colour/semantics):
|
|
59
|
+
* `default` — the inline card (rounded, framed on all sides);
|
|
60
|
+
* `banner` — the full-bleed page/shell attention strip the `Banner` export renders
|
|
61
|
+
* (square corners, hairline block-end rule only, `--banner-*` token geometry).
|
|
65
62
|
*/
|
|
66
63
|
export type AlertVariantProp = "default" | "banner";
|
|
67
64
|
/** Sort direction for table columns. */
|
|
@@ -46,9 +46,9 @@ export type ErrorSurfaceStatusProp = 403 | 404 | 500 | 503;
|
|
|
46
46
|
* a 5px mobile inline gutter; `"context-selection"` is the 25rem organisation/context picker
|
|
47
47
|
* measure that goes edge-to-edge on mobile; `"account-recovery"` is the 432px SCR-008 measure
|
|
48
48
|
* shared by the password-recovery and sign-in MFA challenge panels (15px mobile inline gutter);
|
|
49
|
-
* `"registration"` is the 360px sign-up measure —
|
|
49
|
+
* `"registration"` is the 360px sign-up measure — start-aligned like `"login"`, because a
|
|
50
50
|
* registration card is the tallest surface in the set and a centred tall card overflows above the
|
|
51
|
-
* scroll origin, and the only
|
|
51
|
+
* scroll origin, and the only preset with a footer-clearance knob of its own.
|
|
52
52
|
* Orthogonal to AuthShell's `variant` (which owns control density and heading size) — combine them.
|
|
53
53
|
*/
|
|
54
54
|
export type AuthShellPresetProp = "default" | "login" | "registration" | "device-authorization" | "context-selection" | "account-recovery";
|
|
@@ -47,44 +47,27 @@
|
|
|
47
47
|
color: hsl(var(--foreground));
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
* BANNER variant (gh#255) — the same Alert, re-measured as page chrome: edge-to-edge, square,
|
|
56
|
-
* ruled only on the block-end edge so it separates itself from the content BELOW it. Declared
|
|
57
|
-
* after the base box (equal specificity → source order wins) and it touches geometry only, so
|
|
58
|
-
* every tone, the icon treatment, the actions grid and the dismiss control are inherited
|
|
59
|
-
* unchanged from the inline alert above.
|
|
60
|
-
*/
|
|
50
|
+
/* variant="banner" (the <Banner> export) — the full-bleed page/shell attention strip.
|
|
51
|
+
* ONLY geometry changes here: every tone colour rule above applies unchanged, and the
|
|
52
|
+
* strip keeps its tone-coloured hairline on the block-end edge alone. All values are
|
|
53
|
+
* --banner-* component tokens (src/tokens/components/banner.css), so a consumer never
|
|
54
|
+
* writes CSS to place a banner and a service retunes the strip once via theme. */
|
|
61
55
|
[data-slot="alert"][data-variant="banner"] {
|
|
62
56
|
border-radius: var(--banner-radius);
|
|
63
|
-
border-width:
|
|
64
|
-
border-
|
|
65
|
-
|
|
57
|
+
border-block-start-width: 0;
|
|
58
|
+
border-inline-width: 0;
|
|
59
|
+
border-block-end-width: var(--banner-border-width);
|
|
60
|
+
padding-block: var(--banner-space-inset-block);
|
|
61
|
+
padding-inline: var(--banner-space-inset-inline);
|
|
66
62
|
}
|
|
67
63
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
[data-slot="alert"][data-variant="banner"][data-dismissible] {
|
|
71
|
-
padding-inline-end: calc(var(--banner-space-inline) + var(--space-8));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
[data-slot="alert"][data-variant="banner"] > [data-slot="alert-dismiss"] {
|
|
75
|
-
top: var(--banner-dismiss-space-offset);
|
|
76
|
-
inset-inline-end: var(--banner-dismiss-space-offset);
|
|
64
|
+
[data-slot="alert"][data-dismissible] {
|
|
65
|
+
padding-inline-end: calc(var(--alert-space-inset) + var(--space-8));
|
|
77
66
|
}
|
|
78
67
|
|
|
79
|
-
/* The
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
* Bound to its own `--banner-space-inline-compact` knob rather than a literal, so a service
|
|
83
|
-
* retunes the mobile inset the same way it retunes the desktop one. */
|
|
84
|
-
@media (max-width: 720px) {
|
|
85
|
-
[data-slot="alert"][data-variant="banner"] {
|
|
86
|
-
--banner-space-inline: var(--banner-space-inline-compact);
|
|
87
|
-
}
|
|
68
|
+
/* The banner strip reserves dismiss clearance from ITS inline inset, not the card's. */
|
|
69
|
+
[data-slot="alert"][data-variant="banner"][data-dismissible] {
|
|
70
|
+
padding-inline-end: calc(var(--banner-space-inset-inline) + var(--space-8));
|
|
88
71
|
}
|
|
89
72
|
|
|
90
73
|
[data-slot="alert-icon"] {
|
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
border-radius: var(--radius-md);
|
|
16
16
|
border-width: 1px;
|
|
17
17
|
font-size: var(--badge-font-size);
|
|
18
|
+
/* The cva used to carry `text-xs`, which set BOTH font-size and the Tailwind companion
|
|
19
|
+
* line-height. It was dropped (gh#260) so this components-layer rule can own font-size —
|
|
20
|
+
* so line-height must be restored here too, or the badge would inherit the ambient body
|
|
21
|
+
* leading and grow taller. Default reproduces `text-xs` exactly. */
|
|
22
|
+
line-height: var(--badge-line-height);
|
|
18
23
|
font-weight: var(--font-weight-medium);
|
|
19
24
|
/* A status chip must read as one unit — never wrap its label across lines,
|
|
20
25
|
* especially inside narrow table cells. */
|
package/dist/styles/control.css
CHANGED
|
@@ -827,6 +827,11 @@
|
|
|
827
827
|
display: inline-flex;
|
|
828
828
|
align-items: center;
|
|
829
829
|
gap: var(--space-1);
|
|
830
|
+
/* A 10-star scale needs ~276px of hit area; a 320px viewport offers ~212 inside a card. Without
|
|
831
|
+
* wrapping, the last stars are painted outside the surface with nothing to scroll them into
|
|
832
|
+
* view, so they can be neither seen nor clicked (WCAG 2.1.1 / 2.4.7). Wrapping keeps every star
|
|
833
|
+
* reachable and is a no-op wherever the row already fits. */
|
|
834
|
+
flex-wrap: wrap;
|
|
830
835
|
}
|
|
831
836
|
.ui-rating-star {
|
|
832
837
|
/* ≥24px hit area (WCAG 2.5.8) around the 20px glyph */
|