@hjmds/design-contracts 1.26.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agreement.d.ts +1 -0
- package/dist/agreement.d.ts.map +1 -1
- package/dist/agreement.js +2 -1
- package/dist/agreement.js.map +1 -1
- package/dist/auth-screen.d.ts +1 -1
- package/dist/behaviors.d.ts +1 -1
- package/dist/calendar.d.ts +1 -0
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +4 -1
- package/dist/calendar.js.map +1 -1
- package/dist/catalog.d.ts +78 -30
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +10 -5
- package/dist/catalog.js.map +1 -1
- package/dist/chart.d.ts +2 -0
- package/dist/chart.d.ts.map +1 -1
- package/dist/chart.js +1 -1
- package/dist/chart.js.map +1 -1
- package/dist/component-definitions.d.ts +1 -0
- package/dist/component-definitions.d.ts.map +1 -1
- package/dist/component-definitions.js +1 -0
- package/dist/component-definitions.js.map +1 -1
- package/dist/component-recipes.d.ts +53 -6
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +64 -10
- package/dist/component-recipes.js.map +1 -1
- package/dist/data-table.d.ts +11 -0
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +5 -0
- package/dist/data-table.js.map +1 -1
- package/dist/description-list.d.ts +3 -0
- package/dist/description-list.d.ts.map +1 -1
- package/dist/description-list.js +5 -1
- package/dist/description-list.js.map +1 -1
- package/dist/design-profile-layout.d.ts +28 -0
- package/dist/design-profile-layout.d.ts.map +1 -1
- package/dist/design-profile-layout.js +27 -3
- package/dist/design-profile-layout.js.map +1 -1
- package/dist/design-profile.d.ts.map +1 -1
- package/dist/design-profile.js +40 -8
- package/dist/design-profile.js.map +1 -1
- package/dist/field-group.d.ts +13 -0
- package/dist/field-group.d.ts.map +1 -1
- package/dist/field-group.js +17 -2
- package/dist/field-group.js.map +1 -1
- package/dist/foundations.d.ts +24 -11
- package/dist/foundations.d.ts.map +1 -1
- package/dist/foundations.js +40 -7
- package/dist/foundations.js.map +1 -1
- package/dist/heading.d.ts +5 -5
- package/dist/image-choice.d.ts +23 -0
- package/dist/image-choice.d.ts.map +1 -0
- package/dist/image-choice.js +26 -0
- package/dist/image-choice.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/masonry.d.ts +8 -0
- package/dist/masonry.d.ts.map +1 -1
- package/dist/masonry.js +12 -1
- package/dist/masonry.js.map +1 -1
- package/dist/number-field.d.ts +2 -2
- package/dist/number-field.d.ts.map +1 -1
- package/dist/number-field.js +4 -2
- package/dist/number-field.js.map +1 -1
- package/dist/qr-code-recipe.d.ts +1 -0
- package/dist/qr-code-recipe.d.ts.map +1 -1
- package/dist/qr-code-recipe.js +3 -1
- package/dist/qr-code-recipe.js.map +1 -1
- package/dist/recipes.d.ts +1 -1
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +1 -1
- package/dist/recipes.js.map +1 -1
- package/dist/result.d.ts +9 -0
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +5 -0
- package/dist/result.js.map +1 -1
- package/dist/screen-patterns.d.ts +139 -2
- package/dist/screen-patterns.d.ts.map +1 -1
- package/dist/screen-patterns.js +140 -1
- package/dist/screen-patterns.js.map +1 -1
- package/dist/sheet.d.ts +15 -1
- package/dist/sheet.d.ts.map +1 -1
- package/dist/sheet.js +20 -1
- package/dist/sheet.js.map +1 -1
- package/dist/showcase.d.ts +27 -27
- package/dist/showcase.js +27 -27
- package/dist/showcase.js.map +1 -1
- package/dist/tag.d.ts +10 -2
- package/dist/tag.d.ts.map +1 -1
- package/dist/tag.js +3 -2
- package/dist/tag.js.map +1 -1
- package/dist/tags-input.d.ts +6 -0
- package/dist/tags-input.d.ts.map +1 -1
- package/dist/tags-input.js +3 -1
- package/dist/tags-input.js.map +1 -1
- package/dist/text-formats.d.ts +2 -2
- package/dist/top.d.ts +2 -2
- package/dist/transfer-list.d.ts +1 -1
- package/dist/transfer-list.d.ts.map +1 -1
- package/dist/transfer-list.js +2 -1
- package/dist/transfer-list.js.map +1 -1
- package/dist/upload-item.d.ts +1 -10
- package/dist/upload-item.d.ts.map +1 -1
- package/dist/upload-item.js +1 -2
- package/dist/upload-item.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/activity-chip.md +4 -3
- package/docs/catalog-freeze.json +5 -2
- package/docs/chart.md +1 -1
- package/docs/consumer-policy.md +13 -6
- package/docs/description-list.md +4 -0
- package/docs/design-profile.md +28 -2
- package/docs/font-roles.md +1 -1
- package/docs/generated/component-maturity.md +5 -4
- package/docs/generated/renderer-evidence.json +92 -6
- package/docs/generated/renderer-evidence.md +5 -3
- package/docs/generated/showcase-manifest.json +49 -1
- package/docs/gravity-letters.md +7 -2
- package/docs/masonry.md +4 -2
- package/docs/screen-patterns.md +5 -2
- package/docs/showcase.md +7 -9
- package/docs/stable-promotion.md +13 -1
- package/docs/usage/README.md +40 -10
- package/docs/usage/SELECTION.md +30 -4
- package/docs/usage/STANDARD.md +11 -2
- package/docs/usage/components/account-switcher.md +98 -0
- package/docs/usage/components/activity-chip.md +4 -4
- package/docs/usage/components/badge.md +1 -1
- package/docs/usage/components/bezier-editor.md +99 -0
- package/docs/usage/components/bottom-cta.md +2 -1
- package/docs/usage/components/button.md +26 -12
- package/docs/usage/components/carousel.md +4 -4
- package/docs/usage/components/chart.md +1 -0
- package/docs/usage/components/chat-message.md +18 -12
- package/docs/usage/components/chat-screen.md +6 -3
- package/docs/usage/components/cohort-retention-table.md +83 -0
- package/docs/usage/components/collapsible.md +7 -2
- package/docs/usage/components/comment-thread-row.md +102 -0
- package/docs/usage/components/comment-thread-screen.md +27 -13
- package/docs/usage/components/composition-layout.md +1 -0
- package/docs/usage/components/context-menu.md +32 -15
- package/docs/usage/components/conversation-row.md +11 -4
- package/docs/usage/components/conversion-funnel.md +85 -0
- package/docs/usage/components/correlation-matrix.md +80 -0
- package/docs/usage/components/data-table.md +4 -0
- package/docs/usage/components/description-list.md +2 -1
- package/docs/usage/components/editor-screen.md +9 -5
- package/docs/usage/components/effect-surface.md +4 -2
- package/docs/usage/components/empty-state.md +2 -2
- package/docs/usage/components/event-attendance-card.md +104 -0
- package/docs/usage/components/expandable-search.md +105 -0
- package/docs/usage/components/file-picker.md +5 -0
- package/docs/usage/components/filter-recovery.md +97 -0
- package/docs/usage/components/follow-profile-card.md +100 -0
- package/docs/usage/components/heading.md +6 -2
- package/docs/usage/components/histogram-explorer.md +89 -0
- package/docs/usage/components/icon-button.md +18 -2
- package/docs/usage/components/icon-tile.md +12 -4
- package/docs/usage/components/image-choice-group.md +81 -0
- package/docs/usage/components/import-field-mapping.md +94 -0
- package/docs/usage/components/inline-edit.md +105 -0
- package/docs/usage/components/keyboard-avoidance-context.md +60 -0
- package/docs/usage/components/keyboard-avoiding.md +5 -1
- package/docs/usage/components/list-detail-screen.md +4 -4
- package/docs/usage/components/list.md +1 -1
- package/docs/usage/components/masonry.md +6 -7
- package/docs/usage/components/media-selection-screen.md +7 -5
- package/docs/usage/components/media-transport.md +104 -0
- package/docs/usage/components/message-composer.md +13 -3
- package/docs/usage/components/moderation-screen.md +5 -2
- package/docs/usage/components/notification-inbox-screen.md +3 -3
- package/docs/usage/components/notification-row.md +64 -8
- package/docs/usage/components/onboarding-screen.md +1 -1
- package/docs/usage/components/overview-screen.md +9 -3
- package/docs/usage/components/pagination.md +18 -3
- package/docs/usage/components/password-rules-field.md +90 -0
- package/docs/usage/components/permission-screen.md +1 -1
- package/docs/usage/components/photo-source-sheet.md +1 -1
- package/docs/usage/components/popover.md +6 -3
- package/docs/usage/components/pricing-choice.md +85 -0
- package/docs/usage/components/profile-summary.md +56 -8
- package/docs/usage/components/progress.md +3 -3
- package/docs/usage/components/qr-code.md +5 -9
- package/docs/usage/components/repeatable-field-group.md +92 -0
- package/docs/usage/components/reply-composer.md +83 -0
- package/docs/usage/components/reply-message.md +85 -0
- package/docs/usage/components/result.md +3 -3
- package/docs/usage/components/saved-items-screen.md +7 -5
- package/docs/usage/components/screen-layout.md +21 -10
- package/docs/usage/components/search-field.md +1 -1
- package/docs/usage/components/section.md +2 -2
- package/docs/usage/components/selection-action-bar.md +89 -0
- package/docs/usage/components/settings-screen.md +13 -11
- package/docs/usage/components/sheet.md +19 -7
- package/docs/usage/components/shortcut-recorder.md +77 -0
- package/docs/usage/components/split-action.md +94 -0
- package/docs/usage/components/streaming-answer.md +94 -0
- package/docs/usage/components/switch.md +6 -2
- package/docs/usage/components/table-column-settings.md +88 -0
- package/docs/usage/components/target-summary.md +79 -0
- package/docs/usage/components/text.md +11 -5
- package/docs/usage/components/toggle-feedback-button.md +94 -0
- package/docs/usage/components/top-bar.md +8 -12
- package/docs/usage/components/transfer-task.md +87 -0
- package/docs/usage/compositions/action-recovery-optimistic.md +18 -14
- package/docs/usage/compositions/action-recovery-save.md +18 -14
- package/docs/usage/compositions/action-recovery-undo.md +18 -14
- package/docs/usage/compositions/activity-status.md +1 -1
- package/docs/usage/compositions/adaptive-content.md +2 -1
- package/docs/usage/compositions/collection-detail.md +6 -5
- package/docs/usage/compositions/collection-editing.md +13 -6
- package/docs/usage/compositions/command-records.md +5 -4
- package/docs/usage/compositions/communication.md +7 -5
- package/docs/usage/compositions/compound-controls.md +7 -3
- package/docs/usage/compositions/content-transition-comparison.md +10 -5
- package/docs/usage/compositions/data-layouts.md +12 -16
- package/docs/usage/compositions/data-workflows.md +7 -4
- package/docs/usage/compositions/date-time-selection.md +5 -5
- package/docs/usage/compositions/design-profile-comparison.md +22 -6
- package/docs/usage/compositions/disclosure.md +14 -9
- package/docs/usage/compositions/document-resource.md +1 -1
- package/docs/usage/compositions/environment-matrix.md +16 -12
- package/docs/usage/compositions/expo-interactions.md +9 -8
- package/docs/usage/compositions/family-drawer.md +9 -5
- package/docs/usage/compositions/field-group.md +7 -3
- package/docs/usage/compositions/interaction-adapters.md +11 -9
- package/docs/usage/compositions/interaction-flow-apply.md +17 -15
- package/docs/usage/compositions/interaction-flow-search.md +11 -7
- package/docs/usage/compositions/live-list.md +12 -8
- package/docs/usage/compositions/navigation-bar-collection.md +8 -3
- package/docs/usage/compositions/optional-motion.md +2 -2
- package/docs/usage/compositions/paper-surface.md +11 -6
- package/docs/usage/compositions/purpose-input-comment.md +10 -4
- package/docs/usage/compositions/purpose-input-message.md +10 -4
- package/docs/usage/compositions/reference-first.md +4 -4
- package/docs/usage/compositions/reference-review.md +4 -4
- package/docs/usage/compositions/reference-settings.md +4 -4
- package/docs/usage/compositions/selection-motion.md +2 -1
- package/docs/usage/compositions/social-compositions.md +7 -6
- package/docs/usage/compositions/stea-event-ticket.md +2 -4
- package/docs/usage/compositions/stea-order-progress.md +19 -21
- package/docs/usage/compositions/stea-pixel-empty.md +26 -26
- package/docs/usage/compositions/task-controls.md +7 -2
- package/docs/usage/compositions/texture-comparison.md +5 -5
- package/docs/usage/compositions/toast-layout.md +7 -3
- package/docs/usage/compositions/toggle-feedback.md +1 -1
- package/docs/usage/compositions/visual-foundations.md +10 -5
- package/docs/usage/compositions/web-additions.md +5 -1
- package/docs/usage/screens/common-chat.md +5 -3
- package/docs/usage/screens/common-comments.md +14 -9
- package/docs/usage/screens/common-conversation-list.md +109 -0
- package/docs/usage/screens/common-inbox.md +5 -3
- package/docs/usage/screens/common-login.md +7 -4
- package/docs/usage/screens/common-profile.md +16 -12
- package/docs/usage/screens/common-saved.md +12 -8
- package/docs/usage/screens/common-search.md +16 -8
- package/docs/usage/screens/common-settings.md +12 -11
- package/docs/usage/screens/common-shell.md +12 -10
- package/docs/usage/screens/dashboard.md +59 -56
- package/docs/usage/screens/discovery-gallery.md +18 -9
- package/docs/usage/screens/flow-collection.md +10 -6
- package/docs/usage/screens/flow-editor.md +9 -6
- package/docs/usage/screens/flow-media.md +12 -7
- package/docs/usage/screens/flow-moderation.md +9 -3
- package/docs/usage/screens/flow-onboarding.md +13 -8
- package/docs/usage/screens/flow-permission.md +5 -3
- package/docs/usage/screens/landing.md +20 -14
- package/docs/usage/screens/mockup-studio.md +100 -88
- package/docs/usage/screens/notification-settings.md +9 -7
- package/docs/usage/screens/product-bento.md +22 -10
- package/docs/usage/screens/reference-comparison.md +2 -2
- package/docs/usage/tokens/font-roles.md +18 -2
- package/docs/usage/tokens/typography.md +22 -11
- package/package.json +7 -1
|
@@ -24,7 +24,23 @@ export const textRecipe = {
|
|
|
24
24
|
medium: fontWeight.semibold,
|
|
25
25
|
strong: fontWeight.bold,
|
|
26
26
|
},
|
|
27
|
+
/**
|
|
28
|
+
* Variants whose omitted `emphasis` renders the variant's typography weight even without a design profile.
|
|
29
|
+
* Label's 500 has no emphasis step (`medium` is 600), and the shared `regular` default drew form labels at
|
|
30
|
+
* body weight (2026-10-17 user decision: label 500 on Web and Native). Other variants keep `regular`.
|
|
31
|
+
*/
|
|
32
|
+
variantWeight: ["label"],
|
|
27
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* Weight Text renders when the caller omits `emphasis`; `undefined` means `textRecipe.defaults.emphasis` applies.
|
|
36
|
+
* Inside a design profile every variant follows the profile's typography weight; outside one only
|
|
37
|
+
* `textRecipe.variantWeight` variants do. An explicit `emphasis` always wins and never reaches this resolver.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveTextDefaultWeight(variant, typographyTokens, designProfileActive) {
|
|
40
|
+
return designProfileActive || textRecipe.variantWeight.includes(variant)
|
|
41
|
+
? typographyTokens[variant].fontWeight
|
|
42
|
+
: undefined;
|
|
43
|
+
}
|
|
28
44
|
export const iconRecipe = {
|
|
29
45
|
slots: ["root"],
|
|
30
46
|
defaults: {
|
|
@@ -129,11 +145,13 @@ export const badgeRecipe = {
|
|
|
129
145
|
},
|
|
130
146
|
},
|
|
131
147
|
tones: {
|
|
148
|
+
// A canvas-colored plate is invisible on the canvas, so neutral and brand badges read as plain text beside a
|
|
149
|
+
// tinted success badge (2026-10-17 review E3). The plate stays white (canvas) and the neutral border draws it.
|
|
132
150
|
neutral: {
|
|
133
151
|
content: semanticColors.content.secondary,
|
|
134
152
|
outlineContent: semanticColors.content.secondary,
|
|
135
153
|
background: semanticColors.canvas,
|
|
136
|
-
border:
|
|
154
|
+
border: semanticColors.border.default,
|
|
137
155
|
},
|
|
138
156
|
strong: {
|
|
139
157
|
content: semanticColors.content.inverse,
|
|
@@ -151,7 +169,7 @@ export const badgeRecipe = {
|
|
|
151
169
|
// with one option switched on. The plate goes neutral and the brand
|
|
152
170
|
// stays in the copy.
|
|
153
171
|
background: semanticColors.canvas,
|
|
154
|
-
border:
|
|
172
|
+
border: semanticColors.border.default,
|
|
155
173
|
},
|
|
156
174
|
info: {
|
|
157
175
|
content: semanticColors.feedback.info.foreground,
|
|
@@ -326,7 +344,9 @@ export const listRecipe = {
|
|
|
326
344
|
separators: {
|
|
327
345
|
none: null,
|
|
328
346
|
full: { insetStart: 0, insetEnd: 0 },
|
|
329
|
-
|
|
347
|
+
// Starts where the row text starts: row padding (xs, every ListRow density) + leading 40 + gap sm. Without the row
|
|
348
|
+
// padding the line began 8px before the text (2026-10-17 review E5).
|
|
349
|
+
indented: { insetStart: spacing.xs + 40 + spacing.sm, insetEnd: 0 },
|
|
330
350
|
},
|
|
331
351
|
background: null,
|
|
332
352
|
};
|
|
@@ -687,9 +707,10 @@ export const switchRecipe = {
|
|
|
687
707
|
rowLabelTextVariant: "body",
|
|
688
708
|
slots: ["root", "track", "thumb", "label", "description"],
|
|
689
709
|
defaults: { size: "medium" },
|
|
690
|
-
//
|
|
691
|
-
//
|
|
692
|
-
|
|
710
|
+
// One default on both renderers: label/description first, track at the trailing edge
|
|
711
|
+
// (2026-10-17 web/native comparison: Web defaulted to an inline track-first switch, so the
|
|
712
|
+
// same settings toggle rendered mirrored). Compact toolbars can still pass `inline`.
|
|
713
|
+
presentationDefaults: { web: "row", native: "row" },
|
|
693
714
|
// Descriptions beside a fixed track become a narrow column at larger text sizes.
|
|
694
715
|
// Reuse the provider's large-text boundary so Web CSS and Native reflow together.
|
|
695
716
|
stackedTextScale: largeTextThreshold,
|
|
@@ -777,6 +798,8 @@ export const selectionControlRecipe = {
|
|
|
777
798
|
},
|
|
778
799
|
},
|
|
779
800
|
shapes: { checkbox: "sm", radio: "full" },
|
|
801
|
+
// Web drew 2px and Native 1px; Agreement and TransferList now reuse this indicator, so the width is one value.
|
|
802
|
+
indicatorBorderWidth: stroke.strong,
|
|
780
803
|
presentations: {
|
|
781
804
|
plain: {
|
|
782
805
|
background: null,
|
|
@@ -890,6 +913,7 @@ export const bottomNavigationRecipe = {
|
|
|
890
913
|
radius: "full",
|
|
891
914
|
shadow: floatingSurfaceContract.shadow,
|
|
892
915
|
maxWidth: 480,
|
|
916
|
+
contentMaxWidth: null,
|
|
893
917
|
outerPaddingHorizontal: spacing.md,
|
|
894
918
|
outerPaddingTop: spacing.xs,
|
|
895
919
|
},
|
|
@@ -901,6 +925,11 @@ export const bottomNavigationRecipe = {
|
|
|
901
925
|
radius: null,
|
|
902
926
|
shadow: null,
|
|
903
927
|
maxWidth: null,
|
|
928
|
+
/**
|
|
929
|
+
* The bar surface and its top edge span the viewport, but the destinations stay in a centered 480 column
|
|
930
|
+
* (the capsule width): on a 1280 desktop two items otherwise sat at opposite screen edges (2026-10-17 review D8).
|
|
931
|
+
*/
|
|
932
|
+
contentMaxWidth: 480,
|
|
904
933
|
outerPaddingHorizontal: 0,
|
|
905
934
|
outerPaddingTop: 0,
|
|
906
935
|
},
|
|
@@ -912,6 +941,7 @@ export const bottomNavigationRecipe = {
|
|
|
912
941
|
radius: "xl",
|
|
913
942
|
shadow: floatingSurfaceContract.shadow,
|
|
914
943
|
maxWidth: 384,
|
|
944
|
+
contentMaxWidth: null,
|
|
915
945
|
outerPaddingHorizontal: spacing.md,
|
|
916
946
|
outerPaddingTop: spacing.xs,
|
|
917
947
|
},
|
|
@@ -1189,7 +1219,20 @@ export const avatarRecipe = {
|
|
|
1189
1219
|
background: semanticColors.canvas,
|
|
1190
1220
|
content: semanticColors.content.secondary,
|
|
1191
1221
|
border: semanticColors.border.default,
|
|
1222
|
+
/** Initials are bold; their size follows the avatar (Web `.hjm-avatar[data-size]` steps). */
|
|
1223
|
+
initialsWeight: "strong",
|
|
1192
1224
|
};
|
|
1225
|
+
/**
|
|
1226
|
+
* Initials text step for an avatar diameter, shared by Web size tokens and Native numeric sizes
|
|
1227
|
+
* (2026-10-17 comparison: Native drew 12pt brand-colored initials at every size).
|
|
1228
|
+
*/
|
|
1229
|
+
export function resolveAvatarInitialsTextVariant(size) {
|
|
1230
|
+
if (size < avatarRecipe.sizes.medium)
|
|
1231
|
+
return "label";
|
|
1232
|
+
if (size < avatarRecipe.sizes.xlarge)
|
|
1233
|
+
return "body";
|
|
1234
|
+
return "title";
|
|
1235
|
+
}
|
|
1193
1236
|
export const statisticRecipe = {
|
|
1194
1237
|
slots: [
|
|
1195
1238
|
"group",
|
|
@@ -1268,6 +1311,12 @@ export const statisticRecipe = {
|
|
|
1268
1311
|
},
|
|
1269
1312
|
},
|
|
1270
1313
|
};
|
|
1314
|
+
/**
|
|
1315
|
+
* Gap between adjacent buttons in one action group (2026-10-17 user rule: stacked bottom buttons looked
|
|
1316
|
+
* loose at 12). Stacked (column) groups use 8, inline (row) groups keep 12 so tap targets stay apart.
|
|
1317
|
+
* AlertDialog already used these values; Sheet/Dialog footers and composed screens now share them.
|
|
1318
|
+
*/
|
|
1319
|
+
export const actionGroupRecipe = { inlineGap: spacing.sm, stackedGap: spacing.xs };
|
|
1271
1320
|
export const sheetRecipe = {
|
|
1272
1321
|
slots: ["backdrop", "positioner", "content", "handle", "header", "title", "body", "footer", "close"],
|
|
1273
1322
|
defaults: { placement: "bottom", size: "auto" },
|
|
@@ -1307,7 +1356,8 @@ export const sheetRecipe = {
|
|
|
1307
1356
|
height: 4,
|
|
1308
1357
|
radius: "full",
|
|
1309
1358
|
color: semanticColors.content.secondary,
|
|
1310
|
-
|
|
1359
|
+
// Bottom sheets now always offer drag-to-dismiss, so the handle is visible whenever it is allowed.
|
|
1360
|
+
visibleByDefault: true,
|
|
1311
1361
|
showWhen: "swipe-dismiss-enabled",
|
|
1312
1362
|
},
|
|
1313
1363
|
header: { minHeight: control.minTouchTarget, gap: spacing.sm },
|
|
@@ -1325,7 +1375,8 @@ export const sheetRecipe = {
|
|
|
1325
1375
|
footer: {
|
|
1326
1376
|
color: semanticColors.content.body,
|
|
1327
1377
|
textVariant: "body",
|
|
1328
|
-
|
|
1378
|
+
// Native stacks footer actions in a column.
|
|
1379
|
+
gap: actionGroupRecipe.stackedGap,
|
|
1329
1380
|
paddingTop: spacing.sm,
|
|
1330
1381
|
},
|
|
1331
1382
|
transition: { enter: motionPreset.enter, exit: motionPreset.exit },
|
|
@@ -1408,8 +1459,8 @@ export const alertDialogRecipe = {
|
|
|
1408
1459
|
error: formSupportContract.error,
|
|
1409
1460
|
// Stacked: confirm on top, cancel below, tighter gap (reported 2026-09-27). Row stays [cancel][confirm].
|
|
1410
1461
|
actions: {
|
|
1411
|
-
gap:
|
|
1412
|
-
stackedGap:
|
|
1462
|
+
gap: actionGroupRecipe.inlineGap,
|
|
1463
|
+
stackedGap: actionGroupRecipe.stackedGap,
|
|
1413
1464
|
stackedOrder: "confirm-first",
|
|
1414
1465
|
stackBelow: breakpoint.medium,
|
|
1415
1466
|
minButtonWidth: 96,
|
|
@@ -1627,6 +1678,9 @@ export const bottomCtaRecipe = {
|
|
|
1627
1678
|
paddingTop: spacing.sm,
|
|
1628
1679
|
paddingBottom: spacing.sm,
|
|
1629
1680
|
gap: spacing.sm,
|
|
1681
|
+
// The footer surface spans the viewport, but its copy and actions stop at the reading width (ScreenLayout's body
|
|
1682
|
+
// width): on a 1200px desktop or tablet stage each half-width button had stretched to ~440px (2026-10-17 review).
|
|
1683
|
+
contentMaxWidth: layout.readingMaxWidth,
|
|
1630
1684
|
// A footer painted in the canvas tone left only a 1pt hairline between it
|
|
1631
1685
|
// and the content scrolling underneath — a product author found that the
|
|
1632
1686
|
// line cut a glyph in half at whatever scroll position the reader stopped
|