@satinhq/kit 0.1.0-beta.1 → 0.1.0-beta.3
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/NOTICE +2 -2
- package/README.md +1 -1
- package/dist/acknowledgements/inventory.json +5 -5
- package/dist/actions/RowActions.d.ts +2 -2
- package/dist/actions/RowActions.js +2 -2
- package/dist/app/deployment.js +8 -2
- package/dist/app/installCheck.js +4 -3
- package/dist/app/launchWatchdog.js +6 -1
- package/dist/controls/civilDate.d.ts +1 -1
- package/dist/controls/civilDate.js +1 -1
- package/dist/docs/components/file-importer.md +1 -1
- package/dist/docs/components/paste-button.md +1 -1
- package/dist/docs/components/photos-picker.md +1 -1
- package/dist/docs/components/share-link.md +1 -1
- package/dist/docs/limitations.md +1 -1
- package/dist/docs/push.md +3 -3
- package/dist/docs/reference.md +1870 -0
- package/dist/glass/GlassMaterialRoot.d.ts +3 -1
- package/dist/glass/GlassMaterialRoot.js +2 -2
- package/dist/glass/MaterialEffectRoot.js +5 -1
- package/dist/glass/errors.d.ts +3 -1
- package/dist/glass/errors.js +49 -3
- package/dist/glass/fallback/canvasOwnership.d.ts +7 -0
- package/dist/glass/fallback/canvasOwnership.js +23 -0
- package/dist/glass/fallback/material.js +3 -2
- package/dist/glass/fallback/regions.d.ts +1 -0
- package/dist/glass/fallback/regions.js +9 -12
- package/dist/glass/fallback/runtime.d.ts +2 -0
- package/dist/glass/fallback/runtime.js +15 -4
- package/dist/glass/lens/controlLift.d.ts +1 -1
- package/dist/glass/lens/controlLift.js +1 -1
- package/dist/glass/lens/interactivePress.d.ts +2 -2
- package/dist/glass/lens/interactivePress.js +2 -2
- package/dist/glass/lens/menu-opening-native-fits.json +1 -1
- package/dist/glass/lens/menuContextFit.json +1 -1
- package/dist/glass/lens/menuDropFit.json +1 -1
- package/dist/glass/lens/menuField.d.ts +2 -2
- package/dist/glass/lens/menuField.js +3 -3
- package/dist/glass/lens/menuGlyphDropFit.json +1 -1
- package/dist/glass/lens/menuMorphFit.json +1 -1
- package/dist/glass/lens/menuMorphPhoneFit.json +1 -1
- package/dist/glass/lens/tabAccessoryMotion.d.ts +1 -1
- package/dist/glass/lens/tabSearchMember.d.ts +1 -1
- package/dist/glass/lens/tabSearchMember.js +1 -1
- package/dist/glass/menuPresenter.js +1 -1
- package/dist/glass/regions.d.ts +1 -1
- package/dist/glass/regions.js +1 -1
- package/dist/glass/shapeTrack.d.ts +1 -1
- package/dist/glass/submenuMotion.d.ts +1 -1
- package/dist/glass/submenuMotion.js +1 -1
- package/dist/glass/webgpu/client.d.ts +3 -0
- package/dist/glass/webgpu/client.js +57 -9
- package/dist/glass/webgpu/entry.worker.js +3 -6
- package/dist/glass/webgpu/errorCode.js +3 -2
- package/dist/glass/webgpu/frameClock.d.ts +6 -2
- package/dist/glass/webgpu/frameClock.js +9 -2
- package/dist/glass/webgpu/frameProbe.d.ts +1 -1
- package/dist/glass/webgpu/frameProbe.js +3 -3
- package/dist/glass/webgpu/layers.d.ts +5 -1
- package/dist/glass/webgpu/layers.js +61 -6
- package/dist/glass/webgpu/minimize.js +20 -2
- package/dist/glass/webgpu/production.js +13 -1
- package/dist/glass/webgpu/raster.d.ts +18 -0
- package/dist/glass/webgpu/raster.js +105 -15
- package/dist/glass/webgpu/rasterMaterial.d.ts +4 -0
- package/dist/glass/webgpu/rasterMaterial.js +17 -1
- package/dist/glass/webgpu/regionScene.d.ts +4 -1
- package/dist/glass/webgpu/regionScene.js +30 -1
- package/dist/glass/webgpu/renderer.js +23 -7
- package/dist/glass/webgpu/sourcePixels.d.ts +4 -4
- package/dist/glass/webgpu/sourcePixels.js +48 -8
- package/dist/keyboard/adapter.js +2 -2
- package/dist/keyboard/avoidance.d.ts +1 -1
- package/dist/keyboard/avoidance.js +1 -1
- package/dist/keyboard/motion.d.ts +1 -1
- package/dist/keyboard/motion.js +1 -1
- package/dist/list-form/ListForm.d.ts +2 -2
- package/dist/list-form/ListForm.js +1 -1
- package/dist/list-form/ListItem.js +1 -1
- package/dist/list-form/RowLabel.d.ts +1 -1
- package/dist/list-form/RowLabel.js +1 -1
- package/dist/list-form/Slider.js +1 -1
- package/dist/list-form/editMotion.js +1 -1
- package/dist/list-form/editing.d.ts +5 -5
- package/dist/list-form/editing.js +1 -1
- package/dist/motion/animationValue.d.ts +2 -2
- package/dist/motion/animationValue.js +9 -10
- package/dist/motion/matchedGeometry.d.ts +4 -4
- package/dist/motion/matchedGeometry.js +7 -8
- package/dist/motion/springTrack.d.ts +1 -2
- package/dist/motion/springTrack.js +10 -5
- package/dist/navigation/ScreenContainer.js +1 -1
- package/dist/navigation/chromeCurves.js +1 -1
- package/dist/navigation/types.d.ts +1 -1
- package/dist/navigation/zoomGeometry.js +1 -1
- package/dist/navigation/zoomMotion.d.ts +1 -1
- package/dist/navigation/zoomMotion.js +2 -2
- package/dist/navigation/zoomTransition.js +3 -4
- package/dist/presentation/Presentation.d.ts +2 -2
- package/dist/presentation/Presentation.js +1 -1
- package/dist/presentation/presentationSource.js +1 -1
- package/dist/public/controls.d.ts +4 -4
- package/dist/public/controls.js +7 -7
- package/dist/public/glass.d.ts +3 -4
- package/dist/public/glass.js +1 -2
- package/dist/public/navigationTransition.d.ts +1 -1
- package/dist/public/navigationTransition.js +1 -1
- package/dist/public/scroll.d.ts +1 -1
- package/dist/public/scroll.js +1 -1
- package/dist/public/toolbar.js +1 -1
- package/dist/root/SatinRoot.js +9 -5
- package/dist/safe-area/SafeAreaInset.js +3 -3
- package/dist/safe-area/modifiers.js +2 -2
- package/dist/safe-area/useSafeAreaMetrics.js +2 -2
- package/dist/scroll/ScrollSurface.d.ts +5 -5
- package/dist/scroll/ScrollSurface.js +1 -1
- package/dist/scroll/position.js +1 -1
- package/dist/scroll/screenGeometry.d.ts +1 -1
- package/dist/scroll/screenGeometry.js +1 -1
- package/dist/search/SearchDrawer.js +1 -1
- package/dist/search/searchMotion.d.ts +1 -1
- package/dist/search/searchMotion.js +1 -1
- package/dist/search/useSearchPresentation.js +1 -1
- package/dist/shapes/corners.js +1 -1
- package/dist/styles.css +55 -34
- package/dist/sw/renderServiceWorker.js +12 -3
- package/dist/text-input/TextEditor.js +7 -3
- package/package.json +4 -4
- package/dist/docs/swiftui-reference.md +0 -1895
package/NOTICE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Satin distribution notices
|
|
2
2
|
|
|
3
|
-
Generated from packages/
|
|
3
|
+
Generated from packages/kit/src/acknowledgements/inventory.json.
|
|
4
4
|
|
|
5
5
|
Satin-authored framework packages use MIT; third-party terms are preserved.
|
|
6
6
|
Retain the copyright and permission notices required by MIT in copies or
|
|
@@ -12,7 +12,7 @@ is a separately installed build dependency. Consumer Vite builds emit NOTICE.txt
|
|
|
12
12
|
and licenses.json from their actual emitted module graph, including runtime peers.
|
|
13
13
|
Development dependencies are not assumed to be bundled.
|
|
14
14
|
|
|
15
|
-
## Satin 0.1.0-beta.
|
|
15
|
+
## Satin 0.1.0-beta.3
|
|
16
16
|
|
|
17
17
|
License: MIT
|
|
18
18
|
Source: https://opensource.org/license/mit
|
package/README.md
CHANGED
|
@@ -219,7 +219,7 @@ falls back to the base glyph when no fill exists. See the shipped [available sym
|
|
|
219
219
|
|
|
220
220
|
## Public API inventory
|
|
221
221
|
|
|
222
|
-
See the packaged [Satin API reference](dist/docs/
|
|
222
|
+
See the packaged [Satin API reference](dist/docs/reference.md) for behavior, limits, unsupported capabilities and the exact export inventory. The index lists supported APIs and known gaps.
|
|
223
223
|
|
|
224
224
|
For a Safari-tab development build, set `advanced: { updateProfile: 'preview' }` in `defineApp`. No environment switch is needed. It retains the iOS WebKit platform gate and uses the existing live-update service-worker policy, which may reload on update. Use the default `release` profile for installed production apps and cold-launch update activation. A query parameter cannot opt a release build into preview. The profile does not change status style, viewport geometry, glass or lifecycle ownership.
|
|
225
225
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"name": "Satin",
|
|
4
|
-
"version": "0.1.0-beta.
|
|
4
|
+
"version": "0.1.0-beta.3",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"source": "https://opensource.org/license/mit",
|
|
7
7
|
"text": "MIT License\n\nCopyright (c) 2026 Satin contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
|
|
8
8
|
"sha256": "a9ca5be2844d1d12fbd9b77cd7446d1895c44b4c5253aed536c2c60ad8d10caa",
|
|
9
9
|
"bundledPaths": [
|
|
10
|
-
"packages/
|
|
10
|
+
"packages/kit/src"
|
|
11
11
|
],
|
|
12
12
|
"role": "framework"
|
|
13
13
|
},
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"text": "The MIT License (MIT)\n\nCopyright (c) 2016 Vladimir Kharlampidi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
|
|
20
20
|
"sha256": "61afeee2f1d59f21412901a0015ccbec0315ae4806e3f4fbd167201ebb17b2f8",
|
|
21
21
|
"bundledPaths": [
|
|
22
|
-
"packages/
|
|
23
|
-
"packages/
|
|
22
|
+
"packages/kit/src/symbols/glyphs",
|
|
23
|
+
"packages/kit/src/glass/lens/icons.ts"
|
|
24
24
|
],
|
|
25
25
|
"role": "adapted or generated source"
|
|
26
26
|
},
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"text": "MIT License\n\nCopyright (c) 2026 Pallav Agarwal\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
|
|
33
33
|
"sha256": "949e33ed2f105f112b392ce9832799a1c6d2c1fe89784a87c919dfc6b115eacc",
|
|
34
34
|
"bundledPaths": [
|
|
35
|
-
"packages/
|
|
35
|
+
"packages/kit/src/glass/lens"
|
|
36
36
|
],
|
|
37
37
|
"role": "adapted or generated source"
|
|
38
38
|
}
|
|
@@ -16,13 +16,13 @@ export type RowActionsController = {
|
|
|
16
16
|
* A row's swipe actions and context menu. Inside an editable `List` item, the item owns the row's
|
|
17
17
|
* one gesture host (it adds swipe-to-delete), so the row hands its actions to the item instead of
|
|
18
18
|
* hosting a second recognizer. Swipe actions are unavailable while the list is editing, as in
|
|
19
|
-
*
|
|
19
|
+
* selection; the context menu stays.
|
|
20
20
|
*/
|
|
21
21
|
export declare function RowActions(props: RowActionsEngineProps): import("react").JSX.Element;
|
|
22
22
|
/**
|
|
23
23
|
* The one gesture host of an editable `List` item. It hosts the row's own swipe actions and context
|
|
24
24
|
* menu (handed over by the row, or declared on its `ListRow`) and adds the `onDelete` action as the
|
|
25
|
-
* trailing swipe, unless the row declares
|
|
25
|
+
* trailing swipe, unless the row declares its own trailing `swipeActions`
|
|
26
26
|
* replace swipe-to-delete.
|
|
27
27
|
*/
|
|
28
28
|
export declare function ListItemActions({ children, swipeActions, contextMenu, deleteAction, controller, }: RowActionsProps & {
|
|
@@ -762,7 +762,7 @@ function RowActionsEngine({ children, swipeActions, contextMenu, disabled = fals
|
|
|
762
762
|
* A row's swipe actions and context menu. Inside an editable `List` item, the item owns the row's
|
|
763
763
|
* one gesture host (it adds swipe-to-delete), so the row hands its actions to the item instead of
|
|
764
764
|
* hosting a second recognizer. Swipe actions are unavailable while the list is editing, as in
|
|
765
|
-
*
|
|
765
|
+
* selection; the context menu stays.
|
|
766
766
|
*/
|
|
767
767
|
export function RowActions(props) {
|
|
768
768
|
const item = useContext(ListItemContext);
|
|
@@ -781,7 +781,7 @@ function DelegatedRowActions({ children, swipeActions, contextMenu, disabled, de
|
|
|
781
781
|
/**
|
|
782
782
|
* The one gesture host of an editable `List` item. It hosts the row's own swipe actions and context
|
|
783
783
|
* menu (handed over by the row, or declared on its `ListRow`) and adds the `onDelete` action as the
|
|
784
|
-
* trailing swipe, unless the row declares
|
|
784
|
+
* trailing swipe, unless the row declares its own trailing `swipeActions`
|
|
785
785
|
* replace swipe-to-delete.
|
|
786
786
|
*/
|
|
787
787
|
export function ListItemActions({ children, swipeActions, contextMenu, deleteAction, controller, }) {
|
package/dist/app/deployment.js
CHANGED
|
@@ -57,7 +57,7 @@ export async function checkDeployment(expected, pageUrl, fetcher = fetch, includ
|
|
|
57
57
|
fail('HTTPS is required for installation and service workers.', page.href, false, 'Serve the app over trusted HTTPS.');
|
|
58
58
|
return failures;
|
|
59
59
|
}
|
|
60
|
-
const request = async (path, kind, allowDirectoryCanonicalization = false) => {
|
|
60
|
+
const request = async (path, kind, allowDirectoryCanonicalization = false, attempt = 0) => {
|
|
61
61
|
const url = new URL(path, page).href;
|
|
62
62
|
const controller = new AbortController();
|
|
63
63
|
const timer = setTimeout(() => controller.abort(), requestTimeoutMs);
|
|
@@ -68,7 +68,7 @@ export async function checkDeployment(expected, pageUrl, fetcher = fetch, includ
|
|
|
68
68
|
cache: 'no-store',
|
|
69
69
|
redirect: path === expected.scope + 'sw.js' ? 'manual' : 'follow',
|
|
70
70
|
});
|
|
71
|
-
definite =
|
|
71
|
+
definite = response.status < 500 && response.status !== 408 && response.status !== 429;
|
|
72
72
|
if (response.status !== 200)
|
|
73
73
|
throw new Error(`HTTP ${response.status}`);
|
|
74
74
|
const finalUrl = new URL(response.url || url);
|
|
@@ -119,6 +119,12 @@ export async function checkDeployment(expected, pageUrl, fetcher = fetch, includ
|
|
|
119
119
|
}
|
|
120
120
|
catch (error) {
|
|
121
121
|
const reason = error instanceof Error ? error.message : String(error);
|
|
122
|
+
// Retry transport failures only. A mismatched deployment cannot heal with backoff.
|
|
123
|
+
if ((!definite || controller.signal.aborted) && attempt < 2) {
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
await new Promise(resolve => setTimeout(resolve, 250 * 2 ** attempt));
|
|
126
|
+
return request(path, kind, allowDirectoryCanonicalization, attempt + 1);
|
|
127
|
+
}
|
|
122
128
|
if (controller.signal.aborted) {
|
|
123
129
|
fail(`${label(url)} did not finish within ${requestTimeoutMs / 1000} s`, url, true, 'Check the server or connection, then try again.');
|
|
124
130
|
}
|
package/dist/app/installCheck.js
CHANGED
|
@@ -100,7 +100,7 @@ onPass) {
|
|
|
100
100
|
title.textContent = standalone
|
|
101
101
|
? 'Wrong Home Screen icon'
|
|
102
102
|
: unverified
|
|
103
|
-
? '
|
|
103
|
+
? "Can't reach the app right now"
|
|
104
104
|
: 'This app is misconfigured';
|
|
105
105
|
const explanation = document.createElement('p');
|
|
106
106
|
const action = document.createElement('p');
|
|
@@ -119,11 +119,12 @@ onPass) {
|
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
121
|
if (unverified) {
|
|
122
|
-
explanation.textContent = '
|
|
123
|
-
action.
|
|
122
|
+
explanation.textContent = 'Check your connection and try again.';
|
|
123
|
+
action.remove();
|
|
124
124
|
const retry = document.createElement('button');
|
|
125
125
|
retry.textContent = 'Retry';
|
|
126
126
|
retry.addEventListener('click', () => {
|
|
127
|
+
retry.disabled = true;
|
|
127
128
|
void installPageCheck(expected, check, 30_000, onPass);
|
|
128
129
|
});
|
|
129
130
|
content.append(retry);
|
|
@@ -173,8 +173,13 @@ export function installLaunchWatchdog(budgetMs) {
|
|
|
173
173
|
if (progress?.type === 'SATIN_DOWNLOAD_PROGRESS' &&
|
|
174
174
|
progress.downloading &&
|
|
175
175
|
Number.isFinite(progress.loaded) &&
|
|
176
|
-
progress.loaded >= 0)
|
|
176
|
+
progress.loaded >= 0) {
|
|
177
177
|
receiveProgress(progress);
|
|
178
|
+
// A first install can download before the application module is available.
|
|
179
|
+
// Controlled documents are cached launches/updates and keep their existing policy.
|
|
180
|
+
if (!navigator.serviceWorker?.controller && !revealed)
|
|
181
|
+
window.__SATIN_LAUNCH_SCREEN__?.progress(progress);
|
|
182
|
+
}
|
|
178
183
|
});
|
|
179
184
|
// A client's worker messages are queued until DOMContentLoaded, and a bootstrap module that
|
|
180
185
|
// never finishes holds DOMContentLoaded back: the worker's "this resource stalled" message
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Calendar fields for DatePicker, kept apart from instants.
|
|
3
3
|
*
|
|
4
4
|
* A DatePicker edits calendar fields: a day, a time of day, or both. A `Date` selection reads and
|
|
5
|
-
* writes those fields in the device's time zone
|
|
5
|
+
* writes those fields in the device's time zone. A string selection is a civil
|
|
6
6
|
* value with no time zone at all ('2026-10-14', '09:41', '2026-10-14T09:41'), so a due date
|
|
7
7
|
* chosen in New York is still October 14 when the app is opened in Tokyo.
|
|
8
8
|
*
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Calendar fields for DatePicker, kept apart from instants.
|
|
3
3
|
*
|
|
4
4
|
* A DatePicker edits calendar fields: a day, a time of day, or both. A `Date` selection reads and
|
|
5
|
-
* writes those fields in the device's time zone
|
|
5
|
+
* writes those fields in the device's time zone. A string selection is a civil
|
|
6
6
|
* value with no time zone at all ('2026-10-14', '09:41', '2026-10-14T09:41'), so a due date
|
|
7
7
|
* chosen in New York is still October 14 when the app is opened in Tokyo.
|
|
8
8
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# FileImporter
|
|
2
2
|
|
|
3
|
-
Imports file bytes through the system file chooser. `FileImporter`
|
|
3
|
+
Imports file bytes through the system file chooser. `FileImporter` opens the system chooser from a press. It does not expose a presentation flag that would open a chooser outside a user gesture.
|
|
4
4
|
|
|
5
5
|
Pass `selection` as the accepted File array and update it in `onSelectionChange`. `allowedContentTypes` accepts MIME strings or file extensions, for example `['application/pdf', '.txt']`. These are chooser hints, not content validation or Swift uniform type identifiers. `allowsMultipleSelection` defaults to false.
|
|
6
6
|
|
|
@@ -4,7 +4,7 @@ Reads plain text with the async Clipboard API inside the user's press. `onPaste`
|
|
|
4
4
|
|
|
5
5
|
WebKit may show its own Paste confirmation before returning text. Dismissal and denial cannot be reliably distinguished. The component never reads clipboard contents during render or probes whether a paste is available. It cannot pre-disable itself based on clipboard contents.
|
|
6
6
|
|
|
7
|
-
This version supports plain text only
|
|
7
|
+
This version supports plain text only. Structured clipboard objects and images are unsupported. No hidden editable field, synthetic paste, permission polling or clipboard cache bypasses WebKit's prompt.
|
|
8
8
|
|
|
9
9
|
## Example
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ Selects one photo or video using a real file input. The browser chooses the sour
|
|
|
4
4
|
|
|
5
5
|
`selection` is the accepted `File | null`; `onSelectionChange` receives a new File. `matching` accepts `images`, `videos`, or `imagesAndVideos`. `capture="user"` or `"environment"` supplies a browser camera preference, not a camera guarantee. No photo-library permission probe runs.
|
|
6
6
|
|
|
7
|
-
The browser may offer Photo Library, camera or Files. The control does not expose PhotosPickerItem identifiers, ordered multi-selection, persistent library access, or
|
|
7
|
+
The browser may offer Photo Library, camera or Files. The control does not expose PhotosPickerItem identifiers, ordered multi-selection, persistent library access, or library-specific content filters. File decoding, object URLs, storage and validation belong to the app.
|
|
8
8
|
|
|
9
9
|
## Example
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ Opens the platform share sheet using Web Share. Pass prepared `item` data contai
|
|
|
4
4
|
|
|
5
5
|
`onCompletion` reports the browser's completed handoff, not delivery to a recipient. `onError` is required. An AbortError can mean dismissal or no suitable target; it is not proof of a user cancellation. Unsupported sharing or files report NotSupportedError. Other browser errors retain their names.
|
|
6
6
|
|
|
7
|
-
The operating system chooses share targets and previews.
|
|
7
|
+
The operating system chooses share targets and previews. Structured transfer objects, custom previews and custom activity lists are unsupported. Keep `item` stable while sharing; changing its identity invalidates delivery to the old owner.
|
|
8
8
|
|
|
9
9
|
## Example
|
|
10
10
|
|
package/dist/docs/limitations.md
CHANGED
|
@@ -37,4 +37,4 @@ What each part of Satin does today, and where it stops. Limits that come from iO
|
|
|
37
37
|
- **Video player.** There's no general video player control.
|
|
38
38
|
- **Full search tab.** `searchable` gives a search field and results, but not the full search tab.
|
|
39
39
|
|
|
40
|
-
`@satinhq/kit/unstable` exports are experimental and may change. The [API reference](https://github.com/satinhq/satin/blob/main/packages/
|
|
40
|
+
`@satinhq/kit/unstable` exports are experimental and may change. The [API reference](https://github.com/satinhq/satin/blob/main/packages/kit/api/reference.md) lists every export.
|
package/dist/docs/push.md
CHANGED
|
@@ -7,13 +7,13 @@ Node 22.12+ sender and private relay for an installed iPhone Home Screen app. Th
|
|
|
7
7
|
Run from this workspace after `pnpm install && pnpm --filter @satinhq/kit build`. Replace the URLs with your installed app scope and trusted HTTPS relay URL.
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
|
-
node packages/
|
|
10
|
+
node packages/push/src/cli.mjs init --out "$HOME/.config/satin-push/push.json" --app-url https://your-app.example/app/ --relay-url https://your-app.example/push/ --subject https://example.com/contact
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
`init` generates a detail/title route at version 1, matching the starter, and writes the private configuration and owner token with mode 0600. Custom apps must align both the rule and notification route versions with their screen schema. It never prints secrets. Copy the generated public `client.env` into the starter's `.env.local`, then build and deploy the app. Supply the owner token at runtime through the app's authenticated session or token field; never bundle it.
|
|
14
14
|
|
|
15
15
|
```sh
|
|
16
|
-
node packages/
|
|
16
|
+
node packages/push/src/cli.mjs relay --config "$HOME/.config/satin-push/push.json" --port 5466
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
The default bind address is loopback. Forward the trusted HTTPS `/push/` path to this listener, stripping `/push` before forwarding. Keep the private Node listener on loopback or a permitted Tailscale address. A phone cannot call an HTTP relay from an HTTPS app. Keep CORS restricted to the configured app origin, as the relay does by default. Never create a public tunnel.
|
|
@@ -23,7 +23,7 @@ Open the installed app's Notifications screen, supply its owner token, read the
|
|
|
23
23
|
## Send in one line
|
|
24
24
|
|
|
25
25
|
```sh
|
|
26
|
-
node packages/
|
|
26
|
+
node packages/push/src/cli.mjs send --config "$HOME/.config/satin-push/push.json" --title 'Reminder' --body 'Review your list' --route '{"screen":"detail","version":1,"params":{"title":"Welcome"}}' --badge 3
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Once published, the equivalent entry is `npm exec --package @satinhq/push -- satin-push send` with those same options. Use the workspace command above when working from source.
|