@sableui/react 0.0.0-stage → 0.1.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/AGENTS.md +157 -0
- package/CHANGELOG.md +50 -0
- package/CONTRIBUTING.md +221 -0
- package/DESIGN.md +548 -0
- package/LICENSE +21 -0
- package/README.md +194 -2
- package/THIRD_PARTY_NOTICES.md +44 -0
- package/bin/sable-lint.mjs +0 -0
- package/bin/sable.mjs +1223 -0
- package/dist/_contract-CYScOdf5.d.ts +150 -0
- package/dist/chunk-3IWZYBGH.js +398 -0
- package/dist/chunk-5Z5KLOAU.js +167 -0
- package/dist/chunk-7MG4SHYX.js +15 -0
- package/dist/chunk-ADLLDWLW.js +15 -0
- package/dist/chunk-EP55KSYA.js +14 -0
- package/dist/chunk-J23ELQQZ.js +9396 -0
- package/dist/chunk-JI7WJP2L.js +286 -0
- package/dist/chunk-K7RUHUGC.js +14 -0
- package/dist/chunk-KO3NAEBF.js +15 -0
- package/dist/chunk-L4IEIQQA.js +14 -0
- package/dist/chunk-L6Y46C62.js +270 -0
- package/dist/chunk-NEQNXI2G.js +25 -0
- package/dist/chunk-PAOZBZME.js +40 -0
- package/dist/chunk-RWP4XBSK.js +139 -0
- package/dist/chunk-SRQWQUTW.js +63 -0
- package/dist/chunk-YXBOYWBN.js +15 -0
- package/dist/foundations/index.d.ts +88 -0
- package/dist/foundations/index.js +792 -0
- package/dist/icon/index.d.ts +60 -0
- package/dist/icon/index.js +2 -0
- package/dist/icon-sets/brands.d.ts +44 -0
- package/dist/icon-sets/brands.js +147 -0
- package/dist/icon-sets/reicon.d.ts +8 -0
- package/dist/icon-sets/reicon.js +1 -0
- package/dist/index.d.ts +7013 -0
- package/dist/index.js +15462 -0
- package/dist/ios/chrome.css +83 -0
- package/dist/ios/frame.css +5 -0
- package/dist/ios/index.d.ts +70 -0
- package/dist/ios/index.js +313 -0
- package/dist/ios/preview.d.ts +64 -0
- package/dist/ios/preview.js +133 -0
- package/dist/ios/styles.css +77 -0
- package/dist/layout/index.d.ts +280 -0
- package/dist/layout/index.js +2 -0
- package/dist/meta-6dUzgC6M.d.ts +205 -0
- package/dist/patterns/index.d.ts +36 -0
- package/dist/patterns/index.js +934 -0
- package/dist/presets/index.d.ts +37 -0
- package/dist/presets/index.js +117 -0
- package/dist/registry-CyL28OzJ.d.ts +28 -0
- package/dist/styles.css +1893 -0
- package/dist/theme-provider-BWcizhAt.d.ts +105 -0
- package/dist/themes/atelier/atelier.css +213 -0
- package/dist/themes/atelier/index.d.ts +9 -0
- package/dist/themes/atelier/index.js +1 -0
- package/dist/themes/base/base.css +443 -0
- package/dist/themes/base/index.d.ts +9 -0
- package/dist/themes/base/index.js +1 -0
- package/dist/themes/ember/ember.css +270 -0
- package/dist/themes/ember/index.d.ts +9 -0
- package/dist/themes/ember/index.js +1 -0
- package/dist/themes/index.d.ts +10 -0
- package/dist/themes/index.js +8 -0
- package/dist/themes/meridian/index.d.ts +9 -0
- package/dist/themes/meridian/index.js +1 -0
- package/dist/themes/meridian/meridian.css +255 -0
- package/dist/themes/poppy/index.d.ts +6 -0
- package/dist/themes/poppy/index.js +1 -0
- package/dist/themes/poppy/poppy.css +174 -0
- package/dist/themes/prism/index.d.ts +6 -0
- package/dist/themes/prism/index.js +1 -0
- package/dist/themes/prism/prism.css +183 -0
- package/dist/themes/verdant/index.d.ts +9 -0
- package/dist/themes/verdant/index.js +1 -0
- package/dist/themes/verdant/verdant.css +210 -0
- package/dist/themes.css +30 -0
- package/llms/components/accordion.md +93 -0
- package/llms/components/app-header.md +70 -0
- package/llms/components/app-shell.md +117 -0
- package/llms/components/attachment.md +105 -0
- package/llms/components/avatar.md +141 -0
- package/llms/components/badge.md +117 -0
- package/llms/components/banner.md +119 -0
- package/llms/components/bottom-nav.md +80 -0
- package/llms/components/breadcrumbs.md +75 -0
- package/llms/components/browser.md +67 -0
- package/llms/components/bubble.md +119 -0
- package/llms/components/button.md +199 -0
- package/llms/components/calendar.md +75 -0
- package/llms/components/card.md +135 -0
- package/llms/components/carousel.md +87 -0
- package/llms/components/chat-composer.md +126 -0
- package/llms/components/checkbox-card.md +98 -0
- package/llms/components/checkbox.md +90 -0
- package/llms/components/code-block.md +81 -0
- package/llms/components/code.md +62 -0
- package/llms/components/collapsible.md +83 -0
- package/llms/components/color-field.md +100 -0
- package/llms/components/combobox.md +119 -0
- package/llms/components/command-menu.md +158 -0
- package/llms/components/context-card.md +73 -0
- package/llms/components/context-menu.md +79 -0
- package/llms/components/data-table.md +99 -0
- package/llms/components/date-picker.md +97 -0
- package/llms/components/description.md +96 -0
- package/llms/components/destructive-action-modal.md +76 -0
- package/llms/components/dialog.md +127 -0
- package/llms/components/dots-menu.md +64 -0
- package/llms/components/empty-state.md +113 -0
- package/llms/components/entity.md +67 -0
- package/llms/components/feedback.md +63 -0
- package/llms/components/fieldset.md +106 -0
- package/llms/components/file-dropzone.md +103 -0
- package/llms/components/form.md +111 -0
- package/llms/components/gliding-highlight.md +84 -0
- package/llms/components/inline-status.md +62 -0
- package/llms/components/input.md +127 -0
- package/llms/components/kbd.md +57 -0
- package/llms/components/label.md +73 -0
- package/llms/components/marker.md +99 -0
- package/llms/components/marquee.md +66 -0
- package/llms/components/menu.md +122 -0
- package/llms/components/message-scroller.md +110 -0
- package/llms/components/message.md +114 -0
- package/llms/components/meter.md +124 -0
- package/llms/components/middle-truncate.md +62 -0
- package/llms/components/note.md +81 -0
- package/llms/components/notification-badge.md +67 -0
- package/llms/components/number-field.md +70 -0
- package/llms/components/otp-field.md +101 -0
- package/llms/components/page-header.md +76 -0
- package/llms/components/page-loader.md +67 -0
- package/llms/components/pagination.md +92 -0
- package/llms/components/panel-group.md +120 -0
- package/llms/components/panel-section.md +122 -0
- package/llms/components/phone.md +70 -0
- package/llms/components/pill.md +73 -0
- package/llms/components/popover.md +79 -0
- package/llms/components/progress.md +98 -0
- package/llms/components/radio-card.md +90 -0
- package/llms/components/radio.md +86 -0
- package/llms/components/relative-time.md +60 -0
- package/llms/components/scroller.md +88 -0
- package/llms/components/scrub-field.md +97 -0
- package/llms/components/search-input.md +84 -0
- package/llms/components/select.md +106 -0
- package/llms/components/separator.md +70 -0
- package/llms/components/settings-menu.md +139 -0
- package/llms/components/sheet.md +97 -0
- package/llms/components/show-more.md +59 -0
- package/llms/components/side-nav.md +106 -0
- package/llms/components/sidebar.md +87 -0
- package/llms/components/skeleton.md +62 -0
- package/llms/components/slider.md +114 -0
- package/llms/components/spinner.md +87 -0
- package/llms/components/status-bar.md +91 -0
- package/llms/components/status-dot.md +70 -0
- package/llms/components/stepper.md +125 -0
- package/llms/components/streaming-text.md +86 -0
- package/llms/components/switch.md +87 -0
- package/llms/components/table.md +112 -0
- package/llms/components/tabs.md +84 -0
- package/llms/components/textarea.md +88 -0
- package/llms/components/theme-selector.md +95 -0
- package/llms/components/theme-switcher.md +71 -0
- package/llms/components/thinking-orb.md +91 -0
- package/llms/components/toast.md +130 -0
- package/llms/components/toggle.md +95 -0
- package/llms/components/toolbar.md +168 -0
- package/llms/components/tooltip.md +93 -0
- package/llms/components/tree.md +227 -0
- package/llms/components/video.md +66 -0
- package/llms/components/workspace.md +138 -0
- package/llms/foundations/accessibility.md +60 -0
- package/llms/foundations/motion.md +96 -0
- package/llms/foundations/scrolling.md +41 -0
- package/llms/foundations/shape.md +73 -0
- package/llms/foundations/spacing.md +82 -0
- package/llms/foundations/surfaces.md +69 -0
- package/llms/foundations/typography.md +120 -0
- package/llms/layout/aspect-box.md +37 -0
- package/llms/layout/bleed.md +31 -0
- package/llms/layout/center.md +37 -0
- package/llms/layout/columns.md +51 -0
- package/llms/layout/grid-overlay.md +40 -0
- package/llms/layout/grid.md +47 -0
- package/llms/layout/page.md +39 -0
- package/llms/layout/region.md +49 -0
- package/llms/layout/row.md +40 -0
- package/llms/layout/safe-area.md +37 -0
- package/llms/layout/spacer.md +39 -0
- package/llms/layout/split-pane.md +41 -0
- package/llms/layout/stack.md +39 -0
- package/llms/patterns/auth-page.md +68 -0
- package/llms/patterns/brand-landing-page.md +423 -0
- package/llms/patterns/chat-panel.md +210 -0
- package/llms/patterns/dashboard-page.md +170 -0
- package/llms/patterns/feed-page.md +103 -0
- package/llms/patterns/landing-page.md +122 -0
- package/llms/patterns/list-detail-page.md +100 -0
- package/llms/patterns/settings-page.md +121 -0
- package/llms/reference/token-intent.md +324 -0
- package/llms/reference/utilities.md +129 -0
- package/llms/tasks/adding-a-component.md +113 -0
- package/llms/tasks/auditing-an-app.md +216 -0
- package/llms/tasks/building-a-page.md +109 -0
- package/llms/tasks/building-a-tool.md +141 -0
- package/llms/tasks/building-an-ios-prototype.md +105 -0
- package/llms/tasks/building-with-sable.md +73 -0
- package/llms/tasks/choosing-a-component.md +109 -0
- package/llms/tasks/converting-an-app.md +139 -0
- package/llms/tasks/creating-a-preset.md +43 -0
- package/llms/tasks/creating-design-assets.md +96 -0
- package/llms/tasks/designing-a-surface.md +115 -0
- package/llms/tasks/developing-taste.md +157 -0
- package/llms/tasks/getting-started.md +63 -0
- package/llms/tasks/learning-from-builds.md +74 -0
- package/llms/tasks/reviewing-a-design.md +114 -0
- package/llms/tasks/reviewing-a-journey.md +84 -0
- package/llms/tasks/reviewing-motion.md +92 -0
- package/llms/tasks/using-presets.md +87 -0
- package/llms/taste/asset-plan.template.json +53 -0
- package/llms/taste/composition-follows-content.md +20 -0
- package/llms/taste/hierarchy-is-a-relationship.md +22 -0
- package/llms/taste/lessons.json +57 -0
- package/llms/taste/motion-needs-a-reason.md +21 -0
- package/llms/taste/surface-states-travel-together.md +20 -0
- package/llms-full.txt +14906 -0
- package/llms.txt +405 -0
- package/package.json +185 -3
- package/registry.json +18812 -0
- package/scripts/agent-setup.mjs +54 -0
- package/scripts/design-atlas.mjs +221 -0
- package/scripts/design-directions.mjs +123 -0
- package/scripts/design-memory.mjs +166 -0
- package/scripts/design-preferences.mjs +227 -0
- package/scripts/design-presets.mjs +48 -0
- package/scripts/grade.mjs +509 -0
- package/scripts/lint-rules.mjs +1065 -0
- package/scripts/review-evidence.mjs +120 -0
- package/scripts/skeleton.mjs +248 -0
- package/skills/entry/SKILL.md +34 -0
- package/skills/sable/SKILL.md +187 -0
- package/skills/sable/agents/openai.yaml +6 -0
- package/targets/ios.json +982 -0
- package/third-party/reicon-LICENSE.txt +20 -0
package/targets/ios.json
ADDED
|
@@ -0,0 +1,982 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 3,
|
|
3
|
+
"target": "ios",
|
|
4
|
+
"platformVersion": "27",
|
|
5
|
+
"verifiedOn": "2026-10-10",
|
|
6
|
+
"designPolicy": {
|
|
7
|
+
"principle": "Sable first. Every screen is built from Sable components in the chosen preset. The adapter supplies only the iOS system chrome Sable has no equivalent for: the app frame and status bar, the navigation bar, the tab bar and sheet presentation.",
|
|
8
|
+
"chrome": [
|
|
9
|
+
"status bar and safe areas",
|
|
10
|
+
"navigation bar: title, large title, back, bar actions",
|
|
11
|
+
"tab bar",
|
|
12
|
+
"sheet presentation and dismissal",
|
|
13
|
+
"glass material"
|
|
14
|
+
],
|
|
15
|
+
"sable": [
|
|
16
|
+
"every control: Switch, Input, Slider, SearchInput, Select, Checkbox, Button",
|
|
17
|
+
"lists and rows: Card, CardList, Entity",
|
|
18
|
+
"forms: Form, Field",
|
|
19
|
+
"feedback: Toast, Banner, EmptyState, InlineStatus",
|
|
20
|
+
"all content, typography and imagery"
|
|
21
|
+
],
|
|
22
|
+
"rule": "Never import from konsta. Chrome comes from @sableui/react/ios; anything else is a Sable component. If Sable lacks something a screen needs, report it as a library gap rather than reaching for a native control.",
|
|
23
|
+
"styling": "One document: Tailwind, Sable styles.css, the preset, then @sableui/react/ios/styles.css. The chrome reads the preset; Sable content follows it as on the web. Align content to px-(--ios-inset)."
|
|
24
|
+
},
|
|
25
|
+
"implementation": {
|
|
26
|
+
"package": "konsta",
|
|
27
|
+
"verifiedVersion": "5.5.0",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"install": "pnpm add konsta",
|
|
30
|
+
"ownership": "The adapter's optional peer, installed in the consuming project only for an iOS prototype. Apps never import it."
|
|
31
|
+
},
|
|
32
|
+
"integration": {
|
|
33
|
+
"importFrom": "@sableui/react/ios",
|
|
34
|
+
"stylesheet": "@sableui/react/ios/styles.css",
|
|
35
|
+
"previewImportFrom": "@sableui/react/ios/preview",
|
|
36
|
+
"previewStylesheet": "@sableui/react/ios/frame.css",
|
|
37
|
+
"chrome": [
|
|
38
|
+
"NativeApp",
|
|
39
|
+
"IosPage",
|
|
40
|
+
"IosNavbar",
|
|
41
|
+
"IosBackLink",
|
|
42
|
+
"IosIconButton",
|
|
43
|
+
"IosTabbar",
|
|
44
|
+
"IosTab",
|
|
45
|
+
"IosSheet",
|
|
46
|
+
"NavigationStack",
|
|
47
|
+
"useNavigation",
|
|
48
|
+
"iosThemeStyle"
|
|
49
|
+
],
|
|
50
|
+
"previewHelpers": [
|
|
51
|
+
"PhoneFrame",
|
|
52
|
+
"phoneSizes",
|
|
53
|
+
"useIosPreviewBridge",
|
|
54
|
+
"useIosPreviewTheme",
|
|
55
|
+
"isIosPreviewTheme",
|
|
56
|
+
"loadIosPreviewFonts"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"sources": [
|
|
60
|
+
"https://support.apple.com/en-gb/149076",
|
|
61
|
+
"https://developer.apple.com/videos/play/wwdc2026/251/",
|
|
62
|
+
"https://konstaui.com/react"
|
|
63
|
+
],
|
|
64
|
+
"components": {
|
|
65
|
+
"Accordion": {
|
|
66
|
+
"source": "Accordion",
|
|
67
|
+
"strategy": "preserve",
|
|
68
|
+
"importFrom": "@sableui/react",
|
|
69
|
+
"components": [
|
|
70
|
+
"Accordion"
|
|
71
|
+
],
|
|
72
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
73
|
+
},
|
|
74
|
+
"AppHeader": {
|
|
75
|
+
"source": "AppHeader",
|
|
76
|
+
"strategy": "replace",
|
|
77
|
+
"importFrom": "@sableui/react/ios",
|
|
78
|
+
"components": [
|
|
79
|
+
"IosNavbar",
|
|
80
|
+
"IosBackLink",
|
|
81
|
+
"IosIconButton"
|
|
82
|
+
],
|
|
83
|
+
"guidance": "The screen title, back and bar actions are the iOS navigation bar. It takes the preset font and accent; keep its geometry."
|
|
84
|
+
},
|
|
85
|
+
"AppShell": {
|
|
86
|
+
"source": "AppShell",
|
|
87
|
+
"strategy": "replace",
|
|
88
|
+
"importFrom": "@sableui/react/ios",
|
|
89
|
+
"components": [
|
|
90
|
+
"NativeApp",
|
|
91
|
+
"IosPage",
|
|
92
|
+
"NavigationStack"
|
|
93
|
+
],
|
|
94
|
+
"guidance": "NativeApp is the app frame (status bar, safe areas, home indicator); each screen is an IosPage; each tab keeps one NavigationStack. Screen content is Sable."
|
|
95
|
+
},
|
|
96
|
+
"Attachment": {
|
|
97
|
+
"source": "Attachment",
|
|
98
|
+
"strategy": "preserve",
|
|
99
|
+
"importFrom": "@sableui/react",
|
|
100
|
+
"components": [
|
|
101
|
+
"Attachment"
|
|
102
|
+
],
|
|
103
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
104
|
+
},
|
|
105
|
+
"Avatar": {
|
|
106
|
+
"source": "Avatar",
|
|
107
|
+
"strategy": "preserve",
|
|
108
|
+
"importFrom": "@sableui/react",
|
|
109
|
+
"components": [
|
|
110
|
+
"Avatar"
|
|
111
|
+
],
|
|
112
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
113
|
+
},
|
|
114
|
+
"Badge": {
|
|
115
|
+
"source": "Badge",
|
|
116
|
+
"strategy": "preserve",
|
|
117
|
+
"importFrom": "@sableui/react",
|
|
118
|
+
"components": [
|
|
119
|
+
"Badge"
|
|
120
|
+
],
|
|
121
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
122
|
+
},
|
|
123
|
+
"Banner": {
|
|
124
|
+
"source": "Banner",
|
|
125
|
+
"strategy": "preserve",
|
|
126
|
+
"importFrom": "@sableui/react",
|
|
127
|
+
"components": [
|
|
128
|
+
"Banner"
|
|
129
|
+
],
|
|
130
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
131
|
+
},
|
|
132
|
+
"BottomNav": {
|
|
133
|
+
"source": "BottomNav",
|
|
134
|
+
"strategy": "replace",
|
|
135
|
+
"importFrom": "@sableui/react/ios",
|
|
136
|
+
"components": [
|
|
137
|
+
"IosTabbar",
|
|
138
|
+
"IosTab"
|
|
139
|
+
],
|
|
140
|
+
"guidance": "Top-level destinations are the iOS tab bar with a Sable Icon in each IosTab. Keep one NavigationStack per tab; pushed details never go in the tab bar."
|
|
141
|
+
},
|
|
142
|
+
"Breadcrumbs": {
|
|
143
|
+
"source": "Breadcrumbs",
|
|
144
|
+
"strategy": "recompose",
|
|
145
|
+
"importFrom": "@sableui/react",
|
|
146
|
+
"components": [
|
|
147
|
+
"Card",
|
|
148
|
+
"CardList",
|
|
149
|
+
"Entity"
|
|
150
|
+
],
|
|
151
|
+
"guidance": "Hierarchy becomes drill-down: a list of interactive Entity rows in a Card that push the next screen with useNavigation().push. Back is the navigation bar."
|
|
152
|
+
},
|
|
153
|
+
"Browser": {
|
|
154
|
+
"source": "Browser",
|
|
155
|
+
"strategy": "preview-only",
|
|
156
|
+
"importFrom": null,
|
|
157
|
+
"components": [],
|
|
158
|
+
"guidance": "Frame a prototype with PhoneFrame from @sableui/react/ios/preview on a host page. Never draw device or browser chrome inside the app."
|
|
159
|
+
},
|
|
160
|
+
"Bubble": {
|
|
161
|
+
"source": "Bubble",
|
|
162
|
+
"strategy": "preserve",
|
|
163
|
+
"importFrom": "@sableui/react",
|
|
164
|
+
"components": [
|
|
165
|
+
"Bubble"
|
|
166
|
+
],
|
|
167
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
168
|
+
},
|
|
169
|
+
"Button": {
|
|
170
|
+
"source": "Button",
|
|
171
|
+
"strategy": "contextual",
|
|
172
|
+
"importFrom": null,
|
|
173
|
+
"components": [],
|
|
174
|
+
"guidance": "Only actions in the navigation bar are adapter controls. Every other button — product actions, form submits, sheet actions, empty-state actions — is a Sable Button.",
|
|
175
|
+
"contexts": [
|
|
176
|
+
{
|
|
177
|
+
"role": "Navigation-bar action",
|
|
178
|
+
"strategy": "replace",
|
|
179
|
+
"importFrom": "@sableui/react/ios",
|
|
180
|
+
"components": [
|
|
181
|
+
"IosIconButton",
|
|
182
|
+
"IosBackLink"
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"role": "Everything else",
|
|
187
|
+
"strategy": "preserve",
|
|
188
|
+
"importFrom": "@sableui/react",
|
|
189
|
+
"components": [
|
|
190
|
+
"Button"
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
],
|
|
194
|
+
"defaultContext": "Everything else"
|
|
195
|
+
},
|
|
196
|
+
"Calendar": {
|
|
197
|
+
"source": "Calendar",
|
|
198
|
+
"strategy": "preserve",
|
|
199
|
+
"importFrom": "@sableui/react",
|
|
200
|
+
"components": [
|
|
201
|
+
"Calendar"
|
|
202
|
+
],
|
|
203
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
204
|
+
},
|
|
205
|
+
"Card": {
|
|
206
|
+
"source": "Card",
|
|
207
|
+
"strategy": "preserve",
|
|
208
|
+
"importFrom": "@sableui/react",
|
|
209
|
+
"components": [
|
|
210
|
+
"Card"
|
|
211
|
+
],
|
|
212
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
213
|
+
},
|
|
214
|
+
"Carousel": {
|
|
215
|
+
"source": "Carousel",
|
|
216
|
+
"strategy": "preserve",
|
|
217
|
+
"importFrom": "@sableui/react",
|
|
218
|
+
"components": [
|
|
219
|
+
"Carousel"
|
|
220
|
+
],
|
|
221
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
222
|
+
},
|
|
223
|
+
"ChatComposer": {
|
|
224
|
+
"source": "ChatComposer",
|
|
225
|
+
"strategy": "preserve",
|
|
226
|
+
"importFrom": "@sableui/react",
|
|
227
|
+
"components": [
|
|
228
|
+
"ChatComposer"
|
|
229
|
+
],
|
|
230
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
231
|
+
},
|
|
232
|
+
"Checkbox": {
|
|
233
|
+
"source": "Checkbox",
|
|
234
|
+
"strategy": "preserve",
|
|
235
|
+
"importFrom": "@sableui/react",
|
|
236
|
+
"components": [
|
|
237
|
+
"Checkbox"
|
|
238
|
+
],
|
|
239
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
240
|
+
},
|
|
241
|
+
"CheckboxCard": {
|
|
242
|
+
"source": "CheckboxCard",
|
|
243
|
+
"strategy": "preserve",
|
|
244
|
+
"importFrom": "@sableui/react",
|
|
245
|
+
"components": [
|
|
246
|
+
"CheckboxCard"
|
|
247
|
+
],
|
|
248
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
249
|
+
},
|
|
250
|
+
"Code": {
|
|
251
|
+
"source": "Code",
|
|
252
|
+
"strategy": "preserve",
|
|
253
|
+
"importFrom": "@sableui/react",
|
|
254
|
+
"components": [
|
|
255
|
+
"Code"
|
|
256
|
+
],
|
|
257
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
258
|
+
},
|
|
259
|
+
"CodeBlock": {
|
|
260
|
+
"source": "CodeBlock",
|
|
261
|
+
"strategy": "preserve",
|
|
262
|
+
"importFrom": "@sableui/react",
|
|
263
|
+
"components": [
|
|
264
|
+
"CodeBlock"
|
|
265
|
+
],
|
|
266
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
267
|
+
},
|
|
268
|
+
"Collapsible": {
|
|
269
|
+
"source": "Collapsible",
|
|
270
|
+
"strategy": "preserve",
|
|
271
|
+
"importFrom": "@sableui/react",
|
|
272
|
+
"components": [
|
|
273
|
+
"Collapsible"
|
|
274
|
+
],
|
|
275
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
276
|
+
},
|
|
277
|
+
"ColorField": {
|
|
278
|
+
"source": "ColorField",
|
|
279
|
+
"strategy": "preserve",
|
|
280
|
+
"importFrom": "@sableui/react",
|
|
281
|
+
"components": [
|
|
282
|
+
"ColorField"
|
|
283
|
+
],
|
|
284
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
285
|
+
},
|
|
286
|
+
"Combobox": {
|
|
287
|
+
"source": "Combobox",
|
|
288
|
+
"strategy": "preserve",
|
|
289
|
+
"importFrom": "@sableui/react",
|
|
290
|
+
"components": [
|
|
291
|
+
"Combobox"
|
|
292
|
+
],
|
|
293
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
294
|
+
},
|
|
295
|
+
"CommandMenu": {
|
|
296
|
+
"source": "CommandMenu",
|
|
297
|
+
"strategy": "redesign",
|
|
298
|
+
"importFrom": null,
|
|
299
|
+
"components": [],
|
|
300
|
+
"guidance": "Desktop workspace tools have no honest phone form. Redesign the task as screens of Sable content first."
|
|
301
|
+
},
|
|
302
|
+
"ContextCard": {
|
|
303
|
+
"source": "ContextCard",
|
|
304
|
+
"strategy": "preserve",
|
|
305
|
+
"importFrom": "@sableui/react",
|
|
306
|
+
"components": [
|
|
307
|
+
"ContextCard"
|
|
308
|
+
],
|
|
309
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
310
|
+
},
|
|
311
|
+
"ContextMenu": {
|
|
312
|
+
"source": "ContextMenu",
|
|
313
|
+
"strategy": "preserve",
|
|
314
|
+
"importFrom": "@sableui/react",
|
|
315
|
+
"components": [
|
|
316
|
+
"ContextMenu"
|
|
317
|
+
],
|
|
318
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
319
|
+
},
|
|
320
|
+
"DataTable": {
|
|
321
|
+
"source": "DataTable",
|
|
322
|
+
"strategy": "recompose",
|
|
323
|
+
"importFrom": "@sableui/react",
|
|
324
|
+
"components": [
|
|
325
|
+
"Card",
|
|
326
|
+
"CardList",
|
|
327
|
+
"Entity",
|
|
328
|
+
"Description"
|
|
329
|
+
],
|
|
330
|
+
"guidance": "On a phone a table becomes rows: Entity per record in a CardList, with the detail on a pushed screen (Description for its fields). Keep sorting and filtering the task needs."
|
|
331
|
+
},
|
|
332
|
+
"DatePicker": {
|
|
333
|
+
"source": "DatePicker",
|
|
334
|
+
"strategy": "preserve",
|
|
335
|
+
"importFrom": "@sableui/react",
|
|
336
|
+
"components": [
|
|
337
|
+
"DatePicker"
|
|
338
|
+
],
|
|
339
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
340
|
+
},
|
|
341
|
+
"Description": {
|
|
342
|
+
"source": "Description",
|
|
343
|
+
"strategy": "preserve",
|
|
344
|
+
"importFrom": "@sableui/react",
|
|
345
|
+
"components": [
|
|
346
|
+
"Description"
|
|
347
|
+
],
|
|
348
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
349
|
+
},
|
|
350
|
+
"DestructiveActionModal": {
|
|
351
|
+
"source": "DestructiveActionModal",
|
|
352
|
+
"strategy": "preserve",
|
|
353
|
+
"importFrom": "@sableui/react",
|
|
354
|
+
"components": [
|
|
355
|
+
"DestructiveActionModal"
|
|
356
|
+
],
|
|
357
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
358
|
+
},
|
|
359
|
+
"Dialog": {
|
|
360
|
+
"source": "Dialog",
|
|
361
|
+
"strategy": "preserve",
|
|
362
|
+
"importFrom": "@sableui/react",
|
|
363
|
+
"components": [
|
|
364
|
+
"Dialog"
|
|
365
|
+
],
|
|
366
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
367
|
+
},
|
|
368
|
+
"DotsMenu": {
|
|
369
|
+
"source": "DotsMenu",
|
|
370
|
+
"strategy": "preserve",
|
|
371
|
+
"importFrom": "@sableui/react",
|
|
372
|
+
"components": [
|
|
373
|
+
"DotsMenu"
|
|
374
|
+
],
|
|
375
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
376
|
+
},
|
|
377
|
+
"EmptyState": {
|
|
378
|
+
"source": "EmptyState",
|
|
379
|
+
"strategy": "preserve",
|
|
380
|
+
"importFrom": "@sableui/react",
|
|
381
|
+
"components": [
|
|
382
|
+
"EmptyState"
|
|
383
|
+
],
|
|
384
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
385
|
+
},
|
|
386
|
+
"Entity": {
|
|
387
|
+
"source": "Entity",
|
|
388
|
+
"strategy": "preserve",
|
|
389
|
+
"importFrom": "@sableui/react",
|
|
390
|
+
"components": [
|
|
391
|
+
"Entity"
|
|
392
|
+
],
|
|
393
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
394
|
+
},
|
|
395
|
+
"Feedback": {
|
|
396
|
+
"source": "Feedback",
|
|
397
|
+
"strategy": "preserve",
|
|
398
|
+
"importFrom": "@sableui/react",
|
|
399
|
+
"components": [
|
|
400
|
+
"Feedback"
|
|
401
|
+
],
|
|
402
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
403
|
+
},
|
|
404
|
+
"Fieldset": {
|
|
405
|
+
"source": "Fieldset",
|
|
406
|
+
"strategy": "preserve",
|
|
407
|
+
"importFrom": "@sableui/react",
|
|
408
|
+
"components": [
|
|
409
|
+
"Fieldset"
|
|
410
|
+
],
|
|
411
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
412
|
+
},
|
|
413
|
+
"FileDropzone": {
|
|
414
|
+
"source": "FileDropzone",
|
|
415
|
+
"strategy": "recompose",
|
|
416
|
+
"importFrom": "@sableui/react",
|
|
417
|
+
"components": [
|
|
418
|
+
"Attachment",
|
|
419
|
+
"Button"
|
|
420
|
+
],
|
|
421
|
+
"guidance": "Drag and drop is not a phone interaction. Pick files with a Sable Button; show them as Attachments."
|
|
422
|
+
},
|
|
423
|
+
"Form": {
|
|
424
|
+
"source": "Form",
|
|
425
|
+
"strategy": "preserve",
|
|
426
|
+
"importFrom": "@sableui/react",
|
|
427
|
+
"components": [
|
|
428
|
+
"Form"
|
|
429
|
+
],
|
|
430
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
431
|
+
},
|
|
432
|
+
"GlidingHighlight": {
|
|
433
|
+
"source": "GlidingHighlight",
|
|
434
|
+
"strategy": "preserve",
|
|
435
|
+
"importFrom": "@sableui/react",
|
|
436
|
+
"components": [
|
|
437
|
+
"GlidingHighlight"
|
|
438
|
+
],
|
|
439
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
440
|
+
},
|
|
441
|
+
"InlineStatus": {
|
|
442
|
+
"source": "InlineStatus",
|
|
443
|
+
"strategy": "preserve",
|
|
444
|
+
"importFrom": "@sableui/react",
|
|
445
|
+
"components": [
|
|
446
|
+
"InlineStatus"
|
|
447
|
+
],
|
|
448
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
449
|
+
},
|
|
450
|
+
"Input": {
|
|
451
|
+
"source": "Input",
|
|
452
|
+
"strategy": "preserve",
|
|
453
|
+
"importFrom": "@sableui/react",
|
|
454
|
+
"components": [
|
|
455
|
+
"Input"
|
|
456
|
+
],
|
|
457
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
458
|
+
},
|
|
459
|
+
"Kbd": {
|
|
460
|
+
"source": "Kbd",
|
|
461
|
+
"strategy": "preserve",
|
|
462
|
+
"importFrom": "@sableui/react",
|
|
463
|
+
"components": [
|
|
464
|
+
"Kbd"
|
|
465
|
+
],
|
|
466
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
467
|
+
},
|
|
468
|
+
"Label": {
|
|
469
|
+
"source": "Label",
|
|
470
|
+
"strategy": "preserve",
|
|
471
|
+
"importFrom": "@sableui/react",
|
|
472
|
+
"components": [
|
|
473
|
+
"Label"
|
|
474
|
+
],
|
|
475
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
476
|
+
},
|
|
477
|
+
"Marker": {
|
|
478
|
+
"source": "Marker",
|
|
479
|
+
"strategy": "preserve",
|
|
480
|
+
"importFrom": "@sableui/react",
|
|
481
|
+
"components": [
|
|
482
|
+
"Marker"
|
|
483
|
+
],
|
|
484
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
485
|
+
},
|
|
486
|
+
"Marquee": {
|
|
487
|
+
"source": "Marquee",
|
|
488
|
+
"strategy": "preserve",
|
|
489
|
+
"importFrom": "@sableui/react",
|
|
490
|
+
"components": [
|
|
491
|
+
"Marquee"
|
|
492
|
+
],
|
|
493
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
494
|
+
},
|
|
495
|
+
"Menu": {
|
|
496
|
+
"source": "Menu",
|
|
497
|
+
"strategy": "preserve",
|
|
498
|
+
"importFrom": "@sableui/react",
|
|
499
|
+
"components": [
|
|
500
|
+
"Menu"
|
|
501
|
+
],
|
|
502
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
503
|
+
},
|
|
504
|
+
"Message": {
|
|
505
|
+
"source": "Message",
|
|
506
|
+
"strategy": "preserve",
|
|
507
|
+
"importFrom": "@sableui/react",
|
|
508
|
+
"components": [
|
|
509
|
+
"Message"
|
|
510
|
+
],
|
|
511
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
512
|
+
},
|
|
513
|
+
"MessageScroller": {
|
|
514
|
+
"source": "MessageScroller",
|
|
515
|
+
"strategy": "preserve",
|
|
516
|
+
"importFrom": "@sableui/react",
|
|
517
|
+
"components": [
|
|
518
|
+
"MessageScroller"
|
|
519
|
+
],
|
|
520
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
521
|
+
},
|
|
522
|
+
"Meter": {
|
|
523
|
+
"source": "Meter",
|
|
524
|
+
"strategy": "preserve",
|
|
525
|
+
"importFrom": "@sableui/react",
|
|
526
|
+
"components": [
|
|
527
|
+
"Meter"
|
|
528
|
+
],
|
|
529
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
530
|
+
},
|
|
531
|
+
"MiddleTruncate": {
|
|
532
|
+
"source": "MiddleTruncate",
|
|
533
|
+
"strategy": "preserve",
|
|
534
|
+
"importFrom": "@sableui/react",
|
|
535
|
+
"components": [
|
|
536
|
+
"MiddleTruncate"
|
|
537
|
+
],
|
|
538
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
539
|
+
},
|
|
540
|
+
"Note": {
|
|
541
|
+
"source": "Note",
|
|
542
|
+
"strategy": "preserve",
|
|
543
|
+
"importFrom": "@sableui/react",
|
|
544
|
+
"components": [
|
|
545
|
+
"Note"
|
|
546
|
+
],
|
|
547
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
548
|
+
},
|
|
549
|
+
"NotificationBadge": {
|
|
550
|
+
"source": "NotificationBadge",
|
|
551
|
+
"strategy": "preserve",
|
|
552
|
+
"importFrom": "@sableui/react",
|
|
553
|
+
"components": [
|
|
554
|
+
"NotificationBadge"
|
|
555
|
+
],
|
|
556
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
557
|
+
},
|
|
558
|
+
"NumberField": {
|
|
559
|
+
"source": "NumberField",
|
|
560
|
+
"strategy": "preserve",
|
|
561
|
+
"importFrom": "@sableui/react",
|
|
562
|
+
"components": [
|
|
563
|
+
"NumberField"
|
|
564
|
+
],
|
|
565
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
566
|
+
},
|
|
567
|
+
"OtpField": {
|
|
568
|
+
"source": "OtpField",
|
|
569
|
+
"strategy": "preserve",
|
|
570
|
+
"importFrom": "@sableui/react",
|
|
571
|
+
"components": [
|
|
572
|
+
"OtpField"
|
|
573
|
+
],
|
|
574
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
575
|
+
},
|
|
576
|
+
"PageHeader": {
|
|
577
|
+
"source": "PageHeader",
|
|
578
|
+
"strategy": "contextual",
|
|
579
|
+
"importFrom": null,
|
|
580
|
+
"components": [],
|
|
581
|
+
"guidance": "A screen title is the navigation bar (`large` for the top of a tab). An editorial heading or product introduction inside the screen stays PageHeader or Sable typography.",
|
|
582
|
+
"contexts": [
|
|
583
|
+
{
|
|
584
|
+
"role": "Screen title",
|
|
585
|
+
"strategy": "replace",
|
|
586
|
+
"importFrom": "@sableui/react/ios",
|
|
587
|
+
"components": [
|
|
588
|
+
"IosNavbar"
|
|
589
|
+
]
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"role": "Everything else",
|
|
593
|
+
"strategy": "preserve",
|
|
594
|
+
"importFrom": "@sableui/react",
|
|
595
|
+
"components": [
|
|
596
|
+
"PageHeader"
|
|
597
|
+
]
|
|
598
|
+
}
|
|
599
|
+
],
|
|
600
|
+
"defaultContext": "Everything else"
|
|
601
|
+
},
|
|
602
|
+
"PageLoader": {
|
|
603
|
+
"source": "PageLoader",
|
|
604
|
+
"strategy": "preserve",
|
|
605
|
+
"importFrom": "@sableui/react",
|
|
606
|
+
"components": [
|
|
607
|
+
"PageLoader"
|
|
608
|
+
],
|
|
609
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
610
|
+
},
|
|
611
|
+
"Pagination": {
|
|
612
|
+
"source": "Pagination",
|
|
613
|
+
"strategy": "recompose",
|
|
614
|
+
"importFrom": "@sableui/react",
|
|
615
|
+
"components": [
|
|
616
|
+
"Button",
|
|
617
|
+
"Spinner"
|
|
618
|
+
],
|
|
619
|
+
"guidance": "Phones scroll: load more at the end of the list with a Sable Button, or load on scroll with a Spinner."
|
|
620
|
+
},
|
|
621
|
+
"PanelGroup": {
|
|
622
|
+
"source": "PanelGroup",
|
|
623
|
+
"strategy": "redesign",
|
|
624
|
+
"importFrom": null,
|
|
625
|
+
"components": [],
|
|
626
|
+
"guidance": "Desktop workspace tools have no honest phone form. Redesign the task as screens of Sable content first."
|
|
627
|
+
},
|
|
628
|
+
"PanelSection": {
|
|
629
|
+
"source": "PanelSection",
|
|
630
|
+
"strategy": "redesign",
|
|
631
|
+
"importFrom": null,
|
|
632
|
+
"components": [],
|
|
633
|
+
"guidance": "Desktop workspace tools have no honest phone form. Redesign the task as screens of Sable content first."
|
|
634
|
+
},
|
|
635
|
+
"Phone": {
|
|
636
|
+
"source": "Phone",
|
|
637
|
+
"strategy": "preview-only",
|
|
638
|
+
"importFrom": null,
|
|
639
|
+
"components": [],
|
|
640
|
+
"guidance": "Frame a prototype with PhoneFrame from @sableui/react/ios/preview on a host page. Never draw device or browser chrome inside the app."
|
|
641
|
+
},
|
|
642
|
+
"Pill": {
|
|
643
|
+
"source": "Pill",
|
|
644
|
+
"strategy": "preserve",
|
|
645
|
+
"importFrom": "@sableui/react",
|
|
646
|
+
"components": [
|
|
647
|
+
"Pill"
|
|
648
|
+
],
|
|
649
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
650
|
+
},
|
|
651
|
+
"Popover": {
|
|
652
|
+
"source": "Popover",
|
|
653
|
+
"strategy": "preserve",
|
|
654
|
+
"importFrom": "@sableui/react",
|
|
655
|
+
"components": [
|
|
656
|
+
"Popover"
|
|
657
|
+
],
|
|
658
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
659
|
+
},
|
|
660
|
+
"Progress": {
|
|
661
|
+
"source": "Progress",
|
|
662
|
+
"strategy": "preserve",
|
|
663
|
+
"importFrom": "@sableui/react",
|
|
664
|
+
"components": [
|
|
665
|
+
"Progress"
|
|
666
|
+
],
|
|
667
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
668
|
+
},
|
|
669
|
+
"Radio": {
|
|
670
|
+
"source": "Radio",
|
|
671
|
+
"strategy": "preserve",
|
|
672
|
+
"importFrom": "@sableui/react",
|
|
673
|
+
"components": [
|
|
674
|
+
"Radio"
|
|
675
|
+
],
|
|
676
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
677
|
+
},
|
|
678
|
+
"RadioCard": {
|
|
679
|
+
"source": "RadioCard",
|
|
680
|
+
"strategy": "preserve",
|
|
681
|
+
"importFrom": "@sableui/react",
|
|
682
|
+
"components": [
|
|
683
|
+
"RadioCard"
|
|
684
|
+
],
|
|
685
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
686
|
+
},
|
|
687
|
+
"RelativeTime": {
|
|
688
|
+
"source": "RelativeTime",
|
|
689
|
+
"strategy": "preserve",
|
|
690
|
+
"importFrom": "@sableui/react",
|
|
691
|
+
"components": [
|
|
692
|
+
"RelativeTime"
|
|
693
|
+
],
|
|
694
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
695
|
+
},
|
|
696
|
+
"Scroller": {
|
|
697
|
+
"source": "Scroller",
|
|
698
|
+
"strategy": "preserve",
|
|
699
|
+
"importFrom": "@sableui/react",
|
|
700
|
+
"components": [
|
|
701
|
+
"Scroller"
|
|
702
|
+
],
|
|
703
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
704
|
+
},
|
|
705
|
+
"ScrubField": {
|
|
706
|
+
"source": "ScrubField",
|
|
707
|
+
"strategy": "redesign",
|
|
708
|
+
"importFrom": null,
|
|
709
|
+
"components": [],
|
|
710
|
+
"guidance": "Desktop workspace tools have no honest phone form. Redesign the task as screens of Sable content first."
|
|
711
|
+
},
|
|
712
|
+
"SearchInput": {
|
|
713
|
+
"source": "SearchInput",
|
|
714
|
+
"strategy": "preserve",
|
|
715
|
+
"importFrom": "@sableui/react",
|
|
716
|
+
"components": [
|
|
717
|
+
"SearchInput"
|
|
718
|
+
],
|
|
719
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
720
|
+
},
|
|
721
|
+
"Select": {
|
|
722
|
+
"source": "Select",
|
|
723
|
+
"strategy": "preserve",
|
|
724
|
+
"importFrom": "@sableui/react",
|
|
725
|
+
"components": [
|
|
726
|
+
"Select"
|
|
727
|
+
],
|
|
728
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
729
|
+
},
|
|
730
|
+
"Separator": {
|
|
731
|
+
"source": "Separator",
|
|
732
|
+
"strategy": "preserve",
|
|
733
|
+
"importFrom": "@sableui/react",
|
|
734
|
+
"components": [
|
|
735
|
+
"Separator"
|
|
736
|
+
],
|
|
737
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
738
|
+
},
|
|
739
|
+
"SettingsMenu": {
|
|
740
|
+
"source": "SettingsMenu",
|
|
741
|
+
"strategy": "preserve",
|
|
742
|
+
"importFrom": "@sableui/react",
|
|
743
|
+
"components": [
|
|
744
|
+
"SettingsMenu"
|
|
745
|
+
],
|
|
746
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
747
|
+
},
|
|
748
|
+
"Sheet": {
|
|
749
|
+
"source": "Sheet",
|
|
750
|
+
"strategy": "replace",
|
|
751
|
+
"importFrom": "@sableui/react/ios",
|
|
752
|
+
"components": [
|
|
753
|
+
"IosSheet"
|
|
754
|
+
],
|
|
755
|
+
"guidance": "IosSheet presents and dismisses (detents, drag, Escape, focus). Everything inside it is Sable: Form, Field, Input, Button."
|
|
756
|
+
},
|
|
757
|
+
"ShowMore": {
|
|
758
|
+
"source": "ShowMore",
|
|
759
|
+
"strategy": "preserve",
|
|
760
|
+
"importFrom": "@sableui/react",
|
|
761
|
+
"components": [
|
|
762
|
+
"ShowMore"
|
|
763
|
+
],
|
|
764
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
765
|
+
},
|
|
766
|
+
"SideNav": {
|
|
767
|
+
"source": "SideNav",
|
|
768
|
+
"strategy": "recompose",
|
|
769
|
+
"importFrom": "@sableui/react",
|
|
770
|
+
"components": [
|
|
771
|
+
"Card",
|
|
772
|
+
"CardList",
|
|
773
|
+
"Entity"
|
|
774
|
+
],
|
|
775
|
+
"guidance": "Hierarchy becomes drill-down: a list of interactive Entity rows in a Card that push the next screen with useNavigation().push. Back is the navigation bar."
|
|
776
|
+
},
|
|
777
|
+
"Sidebar": {
|
|
778
|
+
"source": "Sidebar",
|
|
779
|
+
"strategy": "recompose",
|
|
780
|
+
"importFrom": "@sableui/react",
|
|
781
|
+
"components": [
|
|
782
|
+
"Card",
|
|
783
|
+
"CardList",
|
|
784
|
+
"Entity"
|
|
785
|
+
],
|
|
786
|
+
"guidance": "Hierarchy becomes drill-down: a list of interactive Entity rows in a Card that push the next screen with useNavigation().push. Back is the navigation bar."
|
|
787
|
+
},
|
|
788
|
+
"Skeleton": {
|
|
789
|
+
"source": "Skeleton",
|
|
790
|
+
"strategy": "preserve",
|
|
791
|
+
"importFrom": "@sableui/react",
|
|
792
|
+
"components": [
|
|
793
|
+
"Skeleton"
|
|
794
|
+
],
|
|
795
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
796
|
+
},
|
|
797
|
+
"Slider": {
|
|
798
|
+
"source": "Slider",
|
|
799
|
+
"strategy": "preserve",
|
|
800
|
+
"importFrom": "@sableui/react",
|
|
801
|
+
"components": [
|
|
802
|
+
"Slider"
|
|
803
|
+
],
|
|
804
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
805
|
+
},
|
|
806
|
+
"Spinner": {
|
|
807
|
+
"source": "Spinner",
|
|
808
|
+
"strategy": "preserve",
|
|
809
|
+
"importFrom": "@sableui/react",
|
|
810
|
+
"components": [
|
|
811
|
+
"Spinner"
|
|
812
|
+
],
|
|
813
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
814
|
+
},
|
|
815
|
+
"StatusBar": {
|
|
816
|
+
"source": "StatusBar",
|
|
817
|
+
"strategy": "replace",
|
|
818
|
+
"importFrom": "@sableui/react/ios",
|
|
819
|
+
"components": [
|
|
820
|
+
"NativeApp"
|
|
821
|
+
],
|
|
822
|
+
"guidance": "NativeApp draws the iOS status bar. App status belongs in Sable content (InlineStatus, Banner), not a desktop tool strip."
|
|
823
|
+
},
|
|
824
|
+
"StatusDot": {
|
|
825
|
+
"source": "StatusDot",
|
|
826
|
+
"strategy": "preserve",
|
|
827
|
+
"importFrom": "@sableui/react",
|
|
828
|
+
"components": [
|
|
829
|
+
"StatusDot"
|
|
830
|
+
],
|
|
831
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
832
|
+
},
|
|
833
|
+
"Stepper": {
|
|
834
|
+
"source": "Stepper",
|
|
835
|
+
"strategy": "preserve",
|
|
836
|
+
"importFrom": "@sableui/react",
|
|
837
|
+
"components": [
|
|
838
|
+
"Stepper"
|
|
839
|
+
],
|
|
840
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
841
|
+
},
|
|
842
|
+
"StreamingText": {
|
|
843
|
+
"source": "StreamingText",
|
|
844
|
+
"strategy": "preserve",
|
|
845
|
+
"importFrom": "@sableui/react",
|
|
846
|
+
"components": [
|
|
847
|
+
"StreamingText"
|
|
848
|
+
],
|
|
849
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
850
|
+
},
|
|
851
|
+
"Switch": {
|
|
852
|
+
"source": "Switch",
|
|
853
|
+
"strategy": "preserve",
|
|
854
|
+
"importFrom": "@sableui/react",
|
|
855
|
+
"components": [
|
|
856
|
+
"Switch"
|
|
857
|
+
],
|
|
858
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
859
|
+
},
|
|
860
|
+
"Table": {
|
|
861
|
+
"source": "Table",
|
|
862
|
+
"strategy": "recompose",
|
|
863
|
+
"importFrom": "@sableui/react",
|
|
864
|
+
"components": [
|
|
865
|
+
"Card",
|
|
866
|
+
"CardList",
|
|
867
|
+
"Entity",
|
|
868
|
+
"Description"
|
|
869
|
+
],
|
|
870
|
+
"guidance": "On a phone a table becomes rows: Entity per record in a CardList, with the detail on a pushed screen (Description for its fields). Keep sorting and filtering the task needs."
|
|
871
|
+
},
|
|
872
|
+
"Tabs": {
|
|
873
|
+
"source": "Tabs",
|
|
874
|
+
"strategy": "preserve",
|
|
875
|
+
"importFrom": "@sableui/react",
|
|
876
|
+
"components": [
|
|
877
|
+
"Tabs"
|
|
878
|
+
],
|
|
879
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
880
|
+
},
|
|
881
|
+
"Textarea": {
|
|
882
|
+
"source": "Textarea",
|
|
883
|
+
"strategy": "preserve",
|
|
884
|
+
"importFrom": "@sableui/react",
|
|
885
|
+
"components": [
|
|
886
|
+
"Textarea"
|
|
887
|
+
],
|
|
888
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
889
|
+
},
|
|
890
|
+
"ThemeSelector": {
|
|
891
|
+
"source": "ThemeSelector",
|
|
892
|
+
"strategy": "preserve",
|
|
893
|
+
"importFrom": "@sableui/react",
|
|
894
|
+
"components": [
|
|
895
|
+
"ThemeSelector"
|
|
896
|
+
],
|
|
897
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
898
|
+
},
|
|
899
|
+
"ThemeSwitcher": {
|
|
900
|
+
"source": "ThemeSwitcher",
|
|
901
|
+
"strategy": "preserve",
|
|
902
|
+
"importFrom": "@sableui/react",
|
|
903
|
+
"components": [
|
|
904
|
+
"ThemeSwitcher"
|
|
905
|
+
],
|
|
906
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
907
|
+
},
|
|
908
|
+
"ThinkingOrb": {
|
|
909
|
+
"source": "ThinkingOrb",
|
|
910
|
+
"strategy": "preserve",
|
|
911
|
+
"importFrom": "@sableui/react",
|
|
912
|
+
"components": [
|
|
913
|
+
"ThinkingOrb"
|
|
914
|
+
],
|
|
915
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
916
|
+
},
|
|
917
|
+
"Toast": {
|
|
918
|
+
"source": "Toast",
|
|
919
|
+
"strategy": "preserve",
|
|
920
|
+
"importFrom": "@sableui/react",
|
|
921
|
+
"components": [
|
|
922
|
+
"Toast"
|
|
923
|
+
],
|
|
924
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
925
|
+
},
|
|
926
|
+
"Toggle": {
|
|
927
|
+
"source": "Toggle",
|
|
928
|
+
"strategy": "preserve",
|
|
929
|
+
"importFrom": "@sableui/react",
|
|
930
|
+
"components": [
|
|
931
|
+
"Toggle"
|
|
932
|
+
],
|
|
933
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
934
|
+
},
|
|
935
|
+
"Toolbar": {
|
|
936
|
+
"source": "Toolbar",
|
|
937
|
+
"strategy": "preserve",
|
|
938
|
+
"importFrom": "@sableui/react",
|
|
939
|
+
"components": [
|
|
940
|
+
"Toolbar"
|
|
941
|
+
],
|
|
942
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
943
|
+
},
|
|
944
|
+
"Tooltip": {
|
|
945
|
+
"source": "Tooltip",
|
|
946
|
+
"strategy": "recompose",
|
|
947
|
+
"importFrom": "@sableui/react",
|
|
948
|
+
"components": [
|
|
949
|
+
"Popover",
|
|
950
|
+
"Label"
|
|
951
|
+
],
|
|
952
|
+
"guidance": "There is no hover on a phone. Essential help is visible text, or a Popover on tap."
|
|
953
|
+
},
|
|
954
|
+
"Tree": {
|
|
955
|
+
"source": "Tree",
|
|
956
|
+
"strategy": "recompose",
|
|
957
|
+
"importFrom": "@sableui/react",
|
|
958
|
+
"components": [
|
|
959
|
+
"Card",
|
|
960
|
+
"CardList",
|
|
961
|
+
"Entity"
|
|
962
|
+
],
|
|
963
|
+
"guidance": "Hierarchy becomes drill-down: a list of interactive Entity rows in a Card that push the next screen with useNavigation().push. Back is the navigation bar."
|
|
964
|
+
},
|
|
965
|
+
"Video": {
|
|
966
|
+
"source": "Video",
|
|
967
|
+
"strategy": "preserve",
|
|
968
|
+
"importFrom": "@sableui/react",
|
|
969
|
+
"components": [
|
|
970
|
+
"Video"
|
|
971
|
+
],
|
|
972
|
+
"guidance": "Use the Sable component as it is, in the preset. Adapt layout and touch targets to the phone; do not swap in a native lookalike or restyle it."
|
|
973
|
+
},
|
|
974
|
+
"Workspace": {
|
|
975
|
+
"source": "Workspace",
|
|
976
|
+
"strategy": "redesign",
|
|
977
|
+
"importFrom": null,
|
|
978
|
+
"components": [],
|
|
979
|
+
"guidance": "Desktop workspace tools have no honest phone form. Redesign the task as screens of Sable content first."
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
}
|