@godxjp/ui 18.5.0 → 18.7.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 (101) hide show
  1. package/dist/components/charts/compact-bar-trend.d.ts +2 -1
  2. package/dist/components/charts/index.d.ts +4 -1
  3. package/dist/components/data-display/data-table.d.ts +25 -4
  4. package/dist/components/data-display/data-table.js +13 -2
  5. package/dist/components/data-display/empty-state.js +1 -1
  6. package/dist/components/data-display/index.d.ts +1 -1
  7. package/dist/components/data-display/list-row.d.ts +19 -0
  8. package/dist/components/data-display/list-row.js +2 -0
  9. package/dist/components/data-display/qr-code.d.ts +1 -1
  10. package/dist/components/data-display/table.d.ts +47 -2
  11. package/dist/components/data-display/table.js +29 -4
  12. package/dist/components/data-entry/command.d.ts +10 -10
  13. package/dist/components/data-entry/index.d.ts +1 -0
  14. package/dist/components/data-entry/input-otp.d.ts +1 -0
  15. package/dist/components/feedback/alert.d.ts +20 -2
  16. package/dist/components/feedback/alert.js +11 -1
  17. package/dist/components/feedback/dialog.d.ts +14 -1
  18. package/dist/components/feedback/dialog.js +4 -0
  19. package/dist/components/feedback/index.d.ts +3 -3
  20. package/dist/components/feedback/index.js +5 -1
  21. package/dist/components/general/logo.d.ts +7 -1
  22. package/dist/components/general/logo.js +1 -1
  23. package/dist/components/layout/app-shell.d.ts +1 -1
  24. package/dist/components/layout/app-shell.js +55 -46
  25. package/dist/components/layout/auth-account-summary.d.ts +5 -0
  26. package/dist/components/layout/auth-account-summary.js +31 -0
  27. package/dist/components/layout/auth-shell.d.ts +5 -2
  28. package/dist/components/layout/centered-shell.d.ts +1 -1
  29. package/dist/components/layout/centered-shell.js +28 -19
  30. package/dist/components/layout/error-surface.d.ts +35 -0
  31. package/dist/components/layout/error-surface.js +155 -0
  32. package/dist/components/layout/flex.d.ts +1 -1
  33. package/dist/components/layout/flex.js +4 -0
  34. package/dist/components/layout/index.d.ts +7 -0
  35. package/dist/components/layout/index.js +6 -0
  36. package/dist/components/layout/page-container.d.ts +1 -1
  37. package/dist/components/layout/page-container.js +23 -41
  38. package/dist/components/layout/page-header.d.ts +22 -0
  39. package/dist/components/layout/page-header.js +89 -0
  40. package/dist/components/navigation/filter-bar.d.ts +2 -2
  41. package/dist/components/navigation/filter-bar.js +44 -1
  42. package/dist/components/navigation/index.d.ts +1 -1
  43. package/dist/components/navigation/steps.js +38 -19
  44. package/dist/components/navigation/tabs.js +12 -3
  45. package/dist/components/ui/avatar.d.ts +2 -1
  46. package/dist/components/ui/avatar.js +2 -1
  47. package/dist/components/ui/input-otp.d.ts +4 -1
  48. package/dist/components/ui/input-otp.js +2 -1
  49. package/dist/components/ui/toggle-group.d.ts +7 -4
  50. package/dist/components/ui/toggle-group.js +32 -21
  51. package/dist/email/brand-mark.d.ts +21 -5
  52. package/dist/email/brand-mark.js +5 -0
  53. package/dist/email/color.d.ts +2 -1
  54. package/dist/email/geometry.d.ts +9 -1
  55. package/dist/email/geometry.js +1 -0
  56. package/dist/email/index.d.ts +6 -1
  57. package/dist/email/index.js +6 -0
  58. package/dist/email/inline-style.d.ts +7 -5
  59. package/dist/email/inline-style.js +5 -0
  60. package/dist/email/tokens.generated.d.ts +40 -20
  61. package/dist/email/tokens.generated.js +40 -20
  62. package/dist/email/urgency.d.ts +22 -0
  63. package/dist/email/urgency.js +14 -0
  64. package/dist/i18n/messages/en.json +26 -1
  65. package/dist/i18n/messages/ja.json +23 -1
  66. package/dist/i18n/messages/vi.json +23 -1
  67. package/dist/props/components/data-display.prop.d.ts +63 -1
  68. package/dist/props/components/data-entry.prop.d.ts +6 -0
  69. package/dist/props/components/feedback.prop.d.ts +6 -0
  70. package/dist/props/components/index.d.ts +1 -1
  71. package/dist/props/components/layout.prop.d.ts +244 -4
  72. package/dist/props/components/navigation.prop.d.ts +57 -1
  73. package/dist/props/registry.d.ts +205 -5
  74. package/dist/props/registry.js +270 -6
  75. package/dist/props/vocabulary/data.prop.d.ts +27 -0
  76. package/dist/props/vocabulary/index.d.ts +3 -3
  77. package/dist/props/vocabulary/interaction.prop.d.ts +19 -2
  78. package/dist/props/vocabulary/layout.prop.d.ts +41 -7
  79. package/dist/styles/alert-layout.css +36 -0
  80. package/dist/styles/control.css +28 -0
  81. package/dist/styles/data-display-layout.css +26 -0
  82. package/dist/styles/layout.css +212 -0
  83. package/dist/styles/logo-layout.css +42 -9
  84. package/dist/styles/navigation-layout.css +109 -0
  85. package/dist/styles/shell-layout.css +336 -0
  86. package/dist/styles/table-layout.css +164 -1
  87. package/dist/theme/dxs.canonical.css +5 -4
  88. package/dist/tokens/axes.css +4 -3
  89. package/dist/tokens/base.css +1 -0
  90. package/dist/tokens/components/data-display.css +13 -0
  91. package/dist/tokens/components/email.css +43 -16
  92. package/dist/tokens/components/error-surface.css +36 -0
  93. package/dist/tokens/components/feedback.css +20 -0
  94. package/dist/tokens/components/list-row.css +20 -0
  95. package/dist/tokens/components/logo.css +52 -10
  96. package/dist/tokens/components/navigation.css +41 -0
  97. package/dist/tokens/components/shell.css +109 -0
  98. package/dist/tokens/components/table.css +45 -0
  99. package/dist/tokens/foundation.css +26 -0
  100. package/dist/tokens/semantic/layout.css +38 -0
  101. package/package.json +8 -2
@@ -22,6 +22,7 @@ import {
22
22
  roundedRectPath
23
23
  } from "./brand-mark.js";
24
24
  import { emailInlineStyle } from "./inline-style.js";
25
+ import { EMAIL_URGENCY, EMAIL_URGENCY_DARK } from "./urgency.js";
25
26
  import {
26
27
  EMAIL_COLOR_SOURCE,
27
28
  EMAIL_COLOR_SOURCE_DARK,
@@ -37,9 +38,12 @@ import {
37
38
  EMAIL_MOBILE as EMAIL_MOBILE2
38
39
  } from "./geometry.js";
39
40
  import { EMAIL_BRAND_MARK as EMAIL_BRAND_MARK2 } from "./brand-mark.js";
41
+ import { EMAIL_URGENCY as EMAIL_URGENCY2, EMAIL_URGENCY_DARK as EMAIL_URGENCY_DARK2 } from "./urgency.js";
40
42
  const EMAIL_TOKENS = Object.freeze({
41
43
  colors: EMAIL_COLORS2,
42
44
  colorsDark: EMAIL_COLORS_DARK2,
45
+ urgency: EMAIL_URGENCY2,
46
+ urgencyDark: EMAIL_URGENCY_DARK2,
43
47
  shell: EMAIL_SHELL2,
44
48
  typography: EMAIL_TYPOGRAPHY2,
45
49
  cta: EMAIL_CTA2,
@@ -67,6 +71,8 @@ export {
67
71
  EMAIL_TOKENS,
68
72
  EMAIL_TOKENS_JSON,
69
73
  EMAIL_TYPOGRAPHY,
74
+ EMAIL_URGENCY,
75
+ EMAIL_URGENCY_DARK,
70
76
  emailBrandMarkDataUri,
71
77
  emailBrandMarkSvg,
72
78
  emailBrandMarkTableHtml,
@@ -3,10 +3,11 @@
3
3
  *
4
4
  * Email clients do not run the cascade: Gmail strips `<style>`, Outlook resolves no custom
5
5
  * property, and only the `style=""` attribute on the painting element is universally honoured.
6
- * `emailInlineStyle` turns a declaration map into that attribute value AND enforces the two rules
7
- * that silently break templates — no `var()` (nothing resolves it) and no `calc()` (Outlook's Word
8
- * renderer drops the whole declaration). Failing loudly at template-build time beats a broken
9
- * layout discovered in Mailpit.
6
+ * `emailInlineStyle` turns a declaration map into that attribute value AND enforces the three rules
7
+ * that silently break templates — no `var()` (nothing resolves it), no `calc()` (Outlook's Word
8
+ * renderer drops the whole declaration) and no `"` (it closes the `style="…"` attribute mid-value,
9
+ * which is how a double-quoted font family corrupts a whole tag). Failing loudly at template-build
10
+ * time beats a broken layout discovered in Mailpit.
10
11
  */
11
12
  /** A declaration map. Numbers are emitted verbatim (already-unitless values like `font-weight`). */
12
13
  export type EmailStyleDeclarations = Record<string, string | number | null | undefined>;
@@ -20,6 +21,7 @@ export type EmailStyleDeclarations = Record<string, string | number | null | und
20
21
  *
21
22
  * `null` / `undefined` values are dropped, so a conditional declaration needs no branch.
22
23
  *
23
- * @throws if a value contains `var()` or `calc()` neither survives an email client.
24
+ * @throws if a value contains `var()` or `calc()` (neither survives an email client) or a double
25
+ * quote (it terminates the `style="…"` attribute).
24
26
  */
25
27
  export declare function emailInlineStyle(declarations: EmailStyleDeclarations): string;
@@ -9,6 +9,11 @@ function emailInlineStyle(declarations) {
9
9
  `emailInlineStyle: "${property}: ${serialised}" uses var()/calc(), which no email client resolves. Pass the literal value from the @godxjp/ui/email token export instead.`
10
10
  );
11
11
  }
12
+ if (serialised.includes('"')) {
13
+ throw new TypeError(
14
+ `emailInlineStyle: "${property}: ${serialised}" contains a double quote, which terminates the style="\u2026" attribute it is written into. Use single quotes \u2014 a quoted font family from EMAIL_TYPOGRAPHY already ships that way.`
15
+ );
16
+ }
12
17
  parts.push(`${kebab(property)}:${serialised}`);
13
18
  }
14
19
  return parts.join(";");
@@ -48,11 +48,19 @@ export declare const EMAIL_COLOR_SOURCE: {
48
48
  readonly hsl: "204 100% 39%";
49
49
  };
50
50
  readonly brand: {
51
- readonly cssVar: "--success";
52
- readonly hsl: "146 40% 58%";
51
+ readonly cssVar: "--brand";
52
+ readonly hsl: "160.5 100% 29.6%";
53
53
  };
54
54
  readonly brandForeground: {
55
- readonly cssVar: "--success-foreground";
55
+ readonly cssVar: "--brand-foreground";
56
+ readonly hsl: "60 33% 99%";
57
+ };
58
+ readonly urgency: {
59
+ readonly cssVar: "--attention";
60
+ readonly hsl: "25 99% 46%";
61
+ };
62
+ readonly urgencyForeground: {
63
+ readonly cssVar: "--attention-foreground";
56
64
  readonly hsl: "60 33% 99%";
57
65
  };
58
66
  };
@@ -99,11 +107,19 @@ export declare const EMAIL_COLOR_SOURCE_DARK: {
99
107
  readonly hsl: "204 90% 60%";
100
108
  };
101
109
  readonly brand: {
102
- readonly cssVar: "--success";
103
- readonly hsl: "146 45% 55%";
110
+ readonly cssVar: "--brand";
111
+ readonly hsl: "160.5 100% 36%";
104
112
  };
105
113
  readonly brandForeground: {
106
- readonly cssVar: "--success-foreground";
114
+ readonly cssVar: "--brand-foreground";
115
+ readonly hsl: "48 9% 9%";
116
+ };
117
+ readonly urgency: {
118
+ readonly cssVar: "--attention";
119
+ readonly hsl: "25 95% 56%";
120
+ };
121
+ readonly urgencyForeground: {
122
+ readonly cssVar: "--attention-foreground";
107
123
  readonly hsl: "48 9% 9%";
108
124
  };
109
125
  };
@@ -117,23 +133,27 @@ export declare const EMAIL_GEOMETRY_SOURCE: {
117
133
  readonly "--email-card-reference-height": "407px";
118
134
  readonly "--email-stack-gap": "24px";
119
135
  readonly "--email-stack-gap-sm": "12px";
120
- readonly "--email-mark-width": "32px";
121
- readonly "--email-mark-height": "32px";
122
- readonly "--email-font-family-sans": "-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif";
136
+ readonly "--email-mark-width": "22px";
137
+ readonly "--email-mark-height": "22px";
138
+ readonly "--email-mark-gap": "8px";
139
+ readonly "--email-wordmark-font-size": "13px";
140
+ readonly "--email-wordmark-font-weight": "700";
141
+ readonly "--email-font-family-sans": "'M PLUS 2', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Yu Gothic Medium', YuGothic, 'Noto Sans JP', Meiryo, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, system-ui, Arial, sans-serif";
142
+ readonly "--email-font-family-mono": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";
123
143
  readonly "--email-body-font-size": "14px";
124
- readonly "--email-body-line-height": "1.7";
144
+ readonly "--email-body-line-height": "1.9";
125
145
  readonly "--email-body-font-weight": "400";
126
- readonly "--email-heading-font-size": "20px";
127
- readonly "--email-heading-line-height": "1.25";
128
- readonly "--email-heading-font-weight": "700";
129
- readonly "--email-cta-height": "44px";
130
- readonly "--email-cta-line-height": "44px";
131
- readonly "--email-cta-padding-x": "24px";
146
+ readonly "--email-heading-font-size": "17px";
147
+ readonly "--email-heading-line-height": "1.7";
148
+ readonly "--email-heading-font-weight": "500";
149
+ readonly "--email-cta-height": "36px";
150
+ readonly "--email-cta-line-height": "36px";
151
+ readonly "--email-cta-padding-x": "16px";
132
152
  readonly "--email-cta-radius": "6px";
133
153
  readonly "--email-cta-font-size": "14px";
134
- readonly "--email-cta-font-weight": "700";
135
- readonly "--email-footer-font-size": "12px";
136
- readonly "--email-footer-line-height": "1.5";
154
+ readonly "--email-cta-font-weight": "500";
155
+ readonly "--email-footer-font-size": "11px";
156
+ readonly "--email-footer-line-height": "1.8";
137
157
  readonly "--email-footer-link-gap": "12px";
138
158
  readonly "--email-footer-padding-top": "20px";
139
159
  readonly "--email-footer-border-width": "1px";
@@ -142,6 +162,6 @@ export declare const EMAIL_GEOMETRY_SOURCE: {
142
162
  readonly "--email-mobile-width": "100%";
143
163
  readonly "--email-mobile-padding": "20px";
144
164
  readonly "--email-mobile-page-padding": "12px";
145
- readonly "--email-mobile-heading-font-size": "18px";
165
+ readonly "--email-mobile-heading-font-size": "16px";
146
166
  readonly "--email-mobile-cta-width": "100%";
147
167
  };
@@ -40,11 +40,19 @@ const EMAIL_COLOR_SOURCE = {
40
40
  "hsl": "204 100% 39%"
41
41
  },
42
42
  "brand": {
43
- "cssVar": "--success",
44
- "hsl": "146 40% 58%"
43
+ "cssVar": "--brand",
44
+ "hsl": "160.5 100% 29.6%"
45
45
  },
46
46
  "brandForeground": {
47
- "cssVar": "--success-foreground",
47
+ "cssVar": "--brand-foreground",
48
+ "hsl": "60 33% 99%"
49
+ },
50
+ "urgency": {
51
+ "cssVar": "--attention",
52
+ "hsl": "25 99% 46%"
53
+ },
54
+ "urgencyForeground": {
55
+ "cssVar": "--attention-foreground",
48
56
  "hsl": "60 33% 99%"
49
57
  }
50
58
  };
@@ -90,11 +98,19 @@ const EMAIL_COLOR_SOURCE_DARK = {
90
98
  "hsl": "204 90% 60%"
91
99
  },
92
100
  "brand": {
93
- "cssVar": "--success",
94
- "hsl": "146 45% 55%"
101
+ "cssVar": "--brand",
102
+ "hsl": "160.5 100% 36%"
95
103
  },
96
104
  "brandForeground": {
97
- "cssVar": "--success-foreground",
105
+ "cssVar": "--brand-foreground",
106
+ "hsl": "48 9% 9%"
107
+ },
108
+ "urgency": {
109
+ "cssVar": "--attention",
110
+ "hsl": "25 95% 56%"
111
+ },
112
+ "urgencyForeground": {
113
+ "cssVar": "--attention-foreground",
98
114
  "hsl": "48 9% 9%"
99
115
  }
100
116
  };
@@ -107,23 +123,27 @@ const EMAIL_GEOMETRY_SOURCE = {
107
123
  "--email-card-reference-height": "407px",
108
124
  "--email-stack-gap": "24px",
109
125
  "--email-stack-gap-sm": "12px",
110
- "--email-mark-width": "32px",
111
- "--email-mark-height": "32px",
112
- "--email-font-family-sans": "-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif",
126
+ "--email-mark-width": "22px",
127
+ "--email-mark-height": "22px",
128
+ "--email-mark-gap": "8px",
129
+ "--email-wordmark-font-size": "13px",
130
+ "--email-wordmark-font-weight": "700",
131
+ "--email-font-family-sans": "'M PLUS 2', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Yu Gothic Medium', YuGothic, 'Noto Sans JP', Meiryo, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, system-ui, Arial, sans-serif",
132
+ "--email-font-family-mono": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
113
133
  "--email-body-font-size": "14px",
114
- "--email-body-line-height": "1.7",
134
+ "--email-body-line-height": "1.9",
115
135
  "--email-body-font-weight": "400",
116
- "--email-heading-font-size": "20px",
117
- "--email-heading-line-height": "1.25",
118
- "--email-heading-font-weight": "700",
119
- "--email-cta-height": "44px",
120
- "--email-cta-line-height": "44px",
121
- "--email-cta-padding-x": "24px",
136
+ "--email-heading-font-size": "17px",
137
+ "--email-heading-line-height": "1.7",
138
+ "--email-heading-font-weight": "500",
139
+ "--email-cta-height": "36px",
140
+ "--email-cta-line-height": "36px",
141
+ "--email-cta-padding-x": "16px",
122
142
  "--email-cta-radius": "6px",
123
143
  "--email-cta-font-size": "14px",
124
- "--email-cta-font-weight": "700",
125
- "--email-footer-font-size": "12px",
126
- "--email-footer-line-height": "1.5",
144
+ "--email-cta-font-weight": "500",
145
+ "--email-footer-font-size": "11px",
146
+ "--email-footer-line-height": "1.8",
127
147
  "--email-footer-link-gap": "12px",
128
148
  "--email-footer-padding-top": "20px",
129
149
  "--email-footer-border-width": "1px",
@@ -132,7 +152,7 @@ const EMAIL_GEOMETRY_SOURCE = {
132
152
  "--email-mobile-width": "100%",
133
153
  "--email-mobile-padding": "20px",
134
154
  "--email-mobile-page-padding": "12px",
135
- "--email-mobile-heading-font-size": "18px",
155
+ "--email-mobile-heading-font-size": "16px",
136
156
  "--email-mobile-cta-width": "100%"
137
157
  };
138
158
  export {
@@ -0,0 +1,22 @@
1
+ import { type EmailHex } from "./color.js";
2
+ /**
3
+ * Semantic action-required styling for transactional email.
4
+ *
5
+ * `accent` is the non-text rail/border color painted on the normal email surface. The solid pair
6
+ * is safe for icons and large or bold labels that satisfy the 3:1 contrast floor; it is not a
7
+ * replacement for normal body copy, which remains `EMAIL_COLORS.foreground` on
8
+ * `EMAIL_COLORS.surface`. This deliberately narrow contract prevents urgency from becoming an
9
+ * undocumented second CTA or a component-local palette.
10
+ */
11
+ export interface EmailUrgencyTokens {
12
+ /** Non-text action-required rail or border on the standard email surface. */
13
+ readonly accent: EmailHex;
14
+ /** Solid action-required fill for an icon or large/bold label. */
15
+ readonly solidBackground: EmailHex;
16
+ /** Foreground paired only with `solidBackground` under the usage restriction above. */
17
+ readonly solidForeground: EmailHex;
18
+ }
19
+ /** Light-scheme action-required email contract. */
20
+ export declare const EMAIL_URGENCY: Readonly<EmailUrgencyTokens>;
21
+ /** Dark-scheme action-required email contract for clients that honor dark-mode overrides. */
22
+ export declare const EMAIL_URGENCY_DARK: Readonly<EmailUrgencyTokens>;
@@ -0,0 +1,14 @@
1
+ import { EMAIL_COLORS, EMAIL_COLORS_DARK } from "./color.js";
2
+ function resolveUrgency(colors) {
3
+ return Object.freeze({
4
+ accent: colors.urgency,
5
+ solidBackground: colors.urgency,
6
+ solidForeground: colors.urgencyForeground
7
+ });
8
+ }
9
+ const EMAIL_URGENCY = resolveUrgency(EMAIL_COLORS);
10
+ const EMAIL_URGENCY_DARK = resolveUrgency(EMAIL_COLORS_DARK);
11
+ export {
12
+ EMAIL_URGENCY,
13
+ EMAIL_URGENCY_DARK
14
+ };
@@ -135,6 +135,9 @@
135
135
  "openNav": "Open navigation menu",
136
136
  "navLabel": "Menu"
137
137
  },
138
+ "pageHeader": {
139
+ "loading": "Loading page…"
140
+ },
138
141
  "authShell": {
139
142
  "brandLabel": "Brand",
140
143
  "mainLabel": "Main content",
@@ -150,6 +153,14 @@
150
153
  "version": "Version {version}",
151
154
  "effectiveDate": "Effective {date}"
152
155
  },
156
+ "errorSurface": {
157
+ "statusLabel": "HTTP status {status}",
158
+ "requestId": "Request ID",
159
+ "permission": "Required permission",
160
+ "organization": "Organization",
161
+ "maintenanceWindow": "Scheduled maintenance",
162
+ "maintenanceProgress": "Maintenance progress {percent}"
163
+ },
153
164
  "topbar": {
154
165
  "toggleSidebar": "Toggle sidebar",
155
166
  "search": "Search",
@@ -205,7 +216,13 @@
205
216
  },
206
217
  "navigation": {
207
218
  "steps": {
208
- "ariaLabel": "Progress"
219
+ "ariaLabel": "Progress",
220
+ "status": {
221
+ "wait": "Waiting",
222
+ "process": "Current step",
223
+ "finish": "Completed",
224
+ "error": "Error"
225
+ }
209
226
  },
210
227
  "breadcrumb": {
211
228
  "ariaLabel": "Breadcrumb"
@@ -213,6 +230,14 @@
213
230
  "toolbar": {
214
231
  "ariaLabel": "Filters"
215
232
  },
233
+ "filterBar": {
234
+ "appliedFilters": "Applied filters",
235
+ "removeFilter": "Remove filter {label}",
236
+ "resultCount": {
237
+ "one": "{count} result",
238
+ "other": "{count} results"
239
+ }
240
+ },
216
241
  "localePicker": {
217
242
  "ariaLabel": "Language"
218
243
  },
@@ -135,6 +135,9 @@
135
135
  "openNav": "ナビゲーションメニューを開く",
136
136
  "navLabel": "メニュー"
137
137
  },
138
+ "pageHeader": {
139
+ "loading": "ページを読み込んでいます…"
140
+ },
138
141
  "authShell": {
139
142
  "brandLabel": "ブランド",
140
143
  "mainLabel": "メインコンテンツ",
@@ -150,6 +153,14 @@
150
153
  "version": "バージョン {version}",
151
154
  "effectiveDate": "施行日 {date}"
152
155
  },
156
+ "errorSurface": {
157
+ "statusLabel": "HTTP ステータス {status}",
158
+ "requestId": "リクエスト ID",
159
+ "permission": "必要な権限",
160
+ "organization": "組織",
161
+ "maintenanceWindow": "計画メンテナンス",
162
+ "maintenanceProgress": "メンテナンス進捗 {percent}"
163
+ },
153
164
  "topbar": {
154
165
  "toggleSidebar": "サイドバーの切り替え",
155
166
  "search": "検索",
@@ -205,7 +216,13 @@
205
216
  },
206
217
  "navigation": {
207
218
  "steps": {
208
- "ariaLabel": "進行状況"
219
+ "ariaLabel": "進行状況",
220
+ "status": {
221
+ "wait": "未完了",
222
+ "process": "現在のステップ",
223
+ "finish": "完了",
224
+ "error": "エラー"
225
+ }
209
226
  },
210
227
  "breadcrumb": {
211
228
  "ariaLabel": "パンくずリスト"
@@ -213,6 +230,11 @@
213
230
  "toolbar": {
214
231
  "ariaLabel": "フィルター"
215
232
  },
233
+ "filterBar": {
234
+ "appliedFilters": "適用中のフィルター",
235
+ "removeFilter": "フィルター「{label}」を解除",
236
+ "resultCount": "{count} 件"
237
+ },
216
238
  "localePicker": {
217
239
  "ariaLabel": "言語"
218
240
  },
@@ -135,6 +135,9 @@
135
135
  "openNav": "Mở menu điều hướng",
136
136
  "navLabel": "Menu"
137
137
  },
138
+ "pageHeader": {
139
+ "loading": "Đang tải trang…"
140
+ },
138
141
  "authShell": {
139
142
  "brandLabel": "Thương hiệu",
140
143
  "mainLabel": "Nội dung chính",
@@ -150,6 +153,14 @@
150
153
  "version": "Phiên bản {version}",
151
154
  "effectiveDate": "Hiệu lực từ {date}"
152
155
  },
156
+ "errorSurface": {
157
+ "statusLabel": "Trạng thái HTTP {status}",
158
+ "requestId": "Mã yêu cầu",
159
+ "permission": "Quyền yêu cầu",
160
+ "organization": "Tổ chức",
161
+ "maintenanceWindow": "Bảo trì theo lịch",
162
+ "maintenanceProgress": "Tiến độ bảo trì {percent}"
163
+ },
153
164
  "topbar": {
154
165
  "toggleSidebar": "Bật/tắt thanh bên",
155
166
  "search": "Tìm kiếm",
@@ -205,7 +216,13 @@
205
216
  },
206
217
  "navigation": {
207
218
  "steps": {
208
- "ariaLabel": "Tiến trình"
219
+ "ariaLabel": "Tiến trình",
220
+ "status": {
221
+ "wait": "Đang chờ",
222
+ "process": "Bước hiện tại",
223
+ "finish": "Đã hoàn tất",
224
+ "error": "Lỗi"
225
+ }
209
226
  },
210
227
  "breadcrumb": {
211
228
  "ariaLabel": "Đường dẫn"
@@ -213,6 +230,11 @@
213
230
  "toolbar": {
214
231
  "ariaLabel": "Bộ lọc"
215
232
  },
233
+ "filterBar": {
234
+ "appliedFilters": "Bộ lọc đang áp dụng",
235
+ "removeFilter": "Bỏ bộ lọc {label}",
236
+ "resultCount": "{count} kết quả"
237
+ },
216
238
  "localePicker": {
217
239
  "ariaLabel": "Ngôn ngữ"
218
240
  },
@@ -1,6 +1,6 @@
1
1
  /** Data Display component prop types — @see docs/COMPONENTS.md#data-display */
2
2
  import type * as React from "react";
3
- import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, ChildrenProp, ToneProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp } from "../vocabulary/index.js";
3
+ import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp } from "../vocabulary/index.js";
4
4
  /** @see EmptyState */
5
5
  /**
6
6
  * Semantic intent of the EmptyState icon medallion — a subset of the shared `ToneProp` vocabulary
@@ -50,6 +50,21 @@ export type DescriptionsItemProp = {
50
50
  value: React.ReactNode;
51
51
  mono?: boolean;
52
52
  };
53
+ /**
54
+ * @see Avatar
55
+ *
56
+ * Identity mark. `shape` is the ONLY appearance knob: the default `circle` is the person avatar
57
+ * (unchanged — an existing `<Avatar>` renders identically), `square` is the entity-header
58
+ * organization / service mark (compact rounded square on the brand surface). Every value it
59
+ * paints — radius, box size, fill, glyph colour — comes from the `--avatar-square-*` component
60
+ * tokens (cardinal rule #45), so a service retunes the entity mark once in its theme instead of
61
+ * overriding `className` per call site.
62
+ */
63
+ export type AvatarProp = React.ComponentPropsWithoutRef<"span"> & {
64
+ shape?: AvatarShapeProp;
65
+ className?: ClassNameProp;
66
+ children?: ChildrenProp;
67
+ };
53
68
  /** @see Badge */
54
69
  export type BadgeProp = {
55
70
  variant?: "default" | "secondary" | "outline";
@@ -148,6 +163,53 @@ export type DataTableProp<T> = {
148
163
  denied?: React.ReactNode;
149
164
  /** Retry handler surfaced by the built-in `error` state. */
150
165
  onRetry?: HandlerProp;
166
+ /**
167
+ * Named collection contract (gh#253) — the SAME preset the `Table` primitive owns, forwarded to
168
+ * the table DataTable renders. `"default"` (the default) emits no attribute and matches no
169
+ * selector. `"action-collection"` is the canonical dense approval / action queue: below
170
+ * `collapseBelow` the desktop intrinsic column widths give way to the token-owned column-PRIORITY
171
+ * measures (`--table-action-collection-*`) under `table-layout: fixed`, cells wrap, and the
172
+ * surface drops its `--table-surface-min-inline-size` floor — so every column, row actions
173
+ * included, stays inside a 390px frame with no horizontal scroll. Mark each column with
174
+ * `priority` on its `ColumnDef`.
175
+ */
176
+ preset?: TablePresetProp;
177
+ /**
178
+ * Container step at which `preset="action-collection"` switches to the compact priority measures.
179
+ * Measured against the TABLE's own container (a container query), not the viewport, so a table in
180
+ * a master rail collapses before the page does. Default `"sm"`. Ignored while `preset` is
181
+ * `"default"`.
182
+ */
183
+ collapseBelow?: BreakpointProp;
151
184
  className?: ClassNameProp;
152
185
  children?: ChildrenProp;
153
186
  };
187
+ /**
188
+ * ListRow geometry — `default` (the roomy entity row) or `compact` (#246: the inline-actions row —
189
+ * Avatar + title/description + one or two small trailing Buttons on ONE line inside a narrow card).
190
+ * A ListRow-LOCAL subset of the shared density vocabulary: the row has no `comfortable` step, so it
191
+ * is deliberately narrower than `DensityProp` (and unrelated to `PageDensityProp`/`TableDensityProp`).
192
+ */
193
+ export type ListRowDensityProp = Exclude<DensityProp, "comfortable">;
194
+ /** @see ListRow */
195
+ export type ListRowProp = {
196
+ /** Render element — `div` (default) or `li` when the parent is a `<ul>`/`<ol>`. */
197
+ as?: "div" | "li";
198
+ /** Leading slot — a decorative icon or an Avatar. Mark a purely decorative icon `aria-hidden`. */
199
+ leading?: React.ReactNode;
200
+ /** Primary line — rendered in medium weight. */
201
+ title: TitleProp | React.ReactNode;
202
+ /** Secondary line under the title (muted, xs). */
203
+ description?: DescriptionProp | React.ReactNode;
204
+ /** Trailing slot — the row action(s): a Button / DropdownMenu trigger, a Badge, or a Switch. */
205
+ trailing?: React.ReactNode;
206
+ /** Cross-axis alignment of the columns — `center` (default) or `start` for multi-line content. */
207
+ align?: "center" | "start";
208
+ /** How over-long title/description resolve — `truncate` (default) or `wrap` (#224). */
209
+ overflow?: "truncate" | "wrap";
210
+ /** Row geometry — `default` or the compact inline-actions preset (#246). */
211
+ density?: ListRowDensityProp;
212
+ /** Read/unread state — indicator dot + localized `sr-only` text, never colour alone (#225). */
213
+ unread?: boolean;
214
+ className?: ClassNameProp;
215
+ };
@@ -10,6 +10,12 @@ import type { UploadFileItem } from "../../components/data-entry/upload-types.js
10
10
  import type { FieldA11yProps } from "../../lib/field-a11y.js";
11
11
  import type { ClassNameProp, DisabledProp, EmptyMessageProp, ErrorProp, HelperProp, IdProp, LabelProp, NameProp, OnChangeProp, OnValueChangeProp, OnSearchChangeProp, OpenProp, OnOpenChangeProp, PlaceholderProp, RequiredProp, ValueProp, DefaultValueProp, FormLayoutProp, WidthProp, BreakpointProp, DensityProp, SizeProp } from "../vocabulary/index.js";
12
12
  import type { ResponsiveGridColumnsProp } from "./layout.prop.js";
13
+ /** One-outline-per-group appearance for the compound InputOTP control. */
14
+ export type InputOTPGroupAppearanceProp = "slots" | "grouped";
15
+ /** @see InputOTPGroup */
16
+ export type InputOTPGroupProp = React.HTMLAttributes<HTMLDivElement> & {
17
+ appearance?: InputOTPGroupAppearanceProp;
18
+ };
13
19
  /** @see Input */
14
20
  export type InputProp = React.InputHTMLAttributes<HTMLInputElement> & {
15
21
  /** Show an inline ✕ that clears the field while it holds text (default false). */
@@ -42,6 +42,12 @@ export type AlertProp = React.HTMLAttributes<HTMLDivElement> & {
42
42
  className?: ClassNameProp;
43
43
  children?: ChildrenProp;
44
44
  };
45
+ /**
46
+ * @see Banner — page-level Alert. `variant` is fixed to `"banner"` by the alias, so it is the one
47
+ * prop a Banner does not take; everything else (tone, icon, onDismiss, children) is Alert's
48
+ * contract verbatim. gh#255.
49
+ */
50
+ export type BannerProp = Omit<AlertProp, "variant">;
45
51
  /** @see AlertTitle */
46
52
  export type AlertTitleProp = React.HTMLAttributes<HTMLParagraphElement> & {
47
53
  className?: ClassNameProp;
@@ -1,7 +1,7 @@
1
1
  export type { AppShellProp, AuthFooterProp, AuthIdentityProp, OrgSwitcherLabels, OrgSwitcherOrganization, OrgSwitcherProp, PageContainerProp, PageInsetProp, SidebarItemProp, SidebarProductProp, SidebarProp, SidebarSectionProp, TopbarProp, } from "./layout.prop.js";
2
2
  export type { ButtonProp } from "./general.prop.js";
3
3
  export type { InputProp, TextareaProp, FormFieldProp, SearchInputProp, CheckboxProp, CheckboxGroupProp, ChoiceOptionProp, RadioProp, RadioGroupProp, SwitchProp, SliderProp, CalendarProp, DatePickerProp, DateRangePickerProp, TimePickerProp, ColorPickerProp, UploadProp, UploadFileItemProp, UploadVariantProp, TreeOptionProp, TreeFieldNamesProp, CascaderProp, TreeSelectProp, ShowCheckedStrategyProp, TransferProp, TransferItemProp, } from "./data-entry.prop.js";
4
- export type { EmptyStateProp, DescriptionsProp, DescriptionsItemProp, BadgeProp, DataTableProp, QrCodeProp, } from "./data-display.prop.js";
4
+ export type { AvatarProp, EmptyStateProp, DescriptionsProp, DescriptionsItemProp, BadgeProp, DataTableProp, QrCodeProp, } from "./data-display.prop.js";
5
5
  export type { ChartDatum, ChartSeriesProp, LineChartProp, BarChartProp, AreaChartProp, PieChartProp, } from "./charts.prop.js";
6
6
  export type { AlertQueryErrorProp, AlertProp, AlertTitleProp, AlertContentProp, AlertDescriptionProp, AlertActionsProp, SheetResponsiveProp, SkeletonRowsProp, } from "./feedback.prop.js";
7
7
  export type { DataStateProp, InfiniteQueryStateProp, InfiniteQueryHelpers, PrefetchLinkProp, } from "./query.prop.js";