@colixsystems/widget-sdk 0.210.0 → 0.212.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/README.md +54 -2
- package/dist/checkbox-view.js +150 -0
- package/dist/checkbox.js +11 -0
- package/dist/checkbox.native.js +7 -0
- package/dist/contract.cjs +42 -3
- package/dist/contract.js +42 -3
- package/dist/form-control-logic.js +55 -0
- package/dist/form-control-tokens.js +121 -0
- package/dist/form-control-view.js +98 -0
- package/dist/index.d.ts +136 -6
- package/dist/index.js +9 -1
- package/dist/index.native.js +9 -1
- package/dist/search-field-view.js +155 -0
- package/dist/search-field.js +13 -0
- package/dist/search-field.native.js +9 -0
- package/dist/select-view.js +312 -0
- package/dist/select.js +15 -0
- package/dist/select.native.js +9 -0
- package/dist/switch-view.js +149 -0
- package/dist/switch.js +80 -0
- package/dist/switch.native.js +7 -0
- package/dist/text-field-view.js +54 -8
- package/dist/text-field.js +6 -1
- package/dist/text-field.native.js +3 -3
- package/package.json +1 -1
- package/src/contract.js +42 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// `<TextField>` (native). Binds ./text-field-view.js to React Native's own
|
|
2
|
-
//
|
|
2
|
+
// primitives; only the import differs from ./text-field.js.
|
|
3
3
|
|
|
4
|
-
import { TextInput } from "react-native";
|
|
4
|
+
import { TextInput, View, Text, Pressable } from "react-native";
|
|
5
5
|
import { makeTextField } from "./text-field-view.js";
|
|
6
6
|
|
|
7
|
-
export const TextField = makeTextField({ TextInput });
|
|
7
|
+
export const TextField = makeTextField({ TextInput, View, Text, Pressable });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@colixsystems/widget-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.212.0",
|
|
4
4
|
"description": "Common widget interface for AppStudio. Implements WidgetManifest, WidgetContext, property schema, and helper hooks.",
|
|
5
5
|
"homepage": "https://github.com/Colix-AB/AppStudio",
|
|
6
6
|
"type": "module",
|
package/src/contract.js
CHANGED
|
@@ -618,6 +618,8 @@ const THEME_COMPONENTS = Object.freeze({
|
|
|
618
618
|
// `text` scope already owns.
|
|
619
619
|
muted: Object.freeze({
|
|
620
620
|
label: "Muted",
|
|
621
|
+
// The SDK's form controls read this scope directly, in every widget.
|
|
622
|
+
sdkComponents: Object.freeze(["TextField", "Checkbox", "Switch", "Select", "SearchField"]),
|
|
621
623
|
tokens: Object.freeze({
|
|
622
624
|
background: Object.freeze({ type: "color", uiDefault: "colors.surfaceMuted" }),
|
|
623
625
|
textColor: Object.freeze({ type: "color", uiDefault: "colors.onSurfaceMuted" }),
|
|
@@ -635,6 +637,7 @@ const THEME_COMPONENTS = Object.freeze({
|
|
|
635
637
|
// list is the closest thing the built-in catalog has to a popover panel.
|
|
636
638
|
popover: Object.freeze({
|
|
637
639
|
label: "Popover",
|
|
640
|
+
sdkComponents: Object.freeze(["Select"]),
|
|
638
641
|
tokens: Object.freeze({
|
|
639
642
|
background: Object.freeze({ type: "color", uiDefault: "colors.surface" }),
|
|
640
643
|
textColor: Object.freeze({ type: "color", uiDefault: "colors.onSurface" }),
|
|
@@ -2811,7 +2814,7 @@ const PRIMITIVES = [
|
|
|
2811
2814
|
{
|
|
2812
2815
|
name: "Switch",
|
|
2813
2816
|
description:
|
|
2814
|
-
"
|
|
2817
|
+
'Themed on/off toggle. `<Switch label="Email me updates" value={on} onValueChange={setOn} />` — THE way to draw a setting that takes effect at once. It is the platform\'s own switch, so each host gives it its switch role, state and keys; its "on" track is the app\'s primary colour and its "off" track the input border (Design > Components > Muted). `label` draws the text beside it and makes the text tappable too, `helper` a hint below, `error` a message in its place (or `true` to mark it without one), `disabled` stops it (a device greys it; on the web it is drawn at half strength unless you passed your own colours). Always pass `label`, or `accessibilityLabel` when a visible label already sits next to it. Controlled — `value` + `onValueChange(next)`. Every React Native `Switch` prop still works: a `trackColor` you pass overrides the theme for the states it names, and `thumbColor` colours the thumb. Never hand-roll a toggle from `Pressable` + a sliding `View`.',
|
|
2815
2818
|
rnComponent: "Switch",
|
|
2816
2819
|
docsUrl: "https://reactnative.dev/docs/switch",
|
|
2817
2820
|
},
|
|
@@ -3053,7 +3056,35 @@ const PRIMITIVES = [
|
|
|
3053
3056
|
{
|
|
3054
3057
|
name: "TextField",
|
|
3055
3058
|
description:
|
|
3056
|
-
'Themed text-entry field. `<TextField value={name} onChangeText={setName} placeholder="Your name" accessibilityLabel="Name" />` — every `TextInput` prop works, and its background, text colour, border, corner radius and height come from the app\'s input look (Theme Settings > Muted), so a widget\'s fields match the built-in forms. `multiline` grows the field to a ceiling and then scrolls inside it. Override one field with `background`, `textColor`, `borderColor`, `radius` or `height`; `style` is merged last. Use it instead of styling a bare `TextInput`.',
|
|
3059
|
+
'Themed text-entry field. `<TextField value={name} onChangeText={setName} placeholder="Your name" accessibilityLabel="Name" />` — every `TextInput` prop works, and its background, text colour, border, corner radius and height come from the app\'s input look (Theme Settings > Muted), so a widget\'s fields match the built-in forms. `multiline` grows the field to a ceiling and then scrolls inside it. Override one field with `background`, `textColor`, `borderColor`, `radius` or `height`; `style` is merged last. `label` draws a label above the field and names it for a screen reader, `helper` a hint below, `error` a message in the helper\'s place with a danger border (`true` marks it without a message), `disabled` makes it read-only and dimmed; `containerStyle` styles the box around a labelled field. Use it instead of styling a bare `TextInput`.',
|
|
3060
|
+
rnComponent: null,
|
|
3061
|
+
docsUrl: null,
|
|
3062
|
+
},
|
|
3063
|
+
{
|
|
3064
|
+
name: "Checkbox",
|
|
3065
|
+
description:
|
|
3066
|
+
'Themed tick box. `<Checkbox label="Remember me" value={checked} onValueChange={setChecked} />` — THE way to draw a yes/no choice that is submitted with a form, or one row of a multi-select list. The box is the app\'s input surface (Design > Components > Muted) and fills with the primary colour when checked; focus draws a ring in the primary colour around it. The whole row is one 44px target with the checkbox role and checked state on both hosts, and Space toggles it on the web. Props: `value` (boolean), `onValueChange(next)`, `label` (text, or an element), `helper`, `error` (a message, or `true`), `disabled`, `accessibilityLabel` (required when there is no text `label`), `style` (the row), `containerStyle` (the box around a row that shows a helper or error), `testID`; any other prop lands on the row. Never hand-roll a tick box from `Pressable` + a bordered `View` + a "✓".',
|
|
3067
|
+
rnComponent: null,
|
|
3068
|
+
docsUrl: null,
|
|
3069
|
+
},
|
|
3070
|
+
{
|
|
3071
|
+
name: "Select",
|
|
3072
|
+
description:
|
|
3073
|
+
'Themed single-choice picker. `<Select label="Status" value={status} onValueChange={setStatus} options={[{ value: "open", label: "Open" }, { value: "done", label: "Done" }]} placeholder="Choose a status" />` — THE way to let the user pick ONE of a known list. The trigger is the app\'s input field (Design > Components > Muted) showing the chosen label; pressing it opens the options at SCREEN level, in a sheet painted from Design > Components > Popover, so no card or scroll container can clip them, and a long list scrolls inside the sheet. The trigger is a button that opens a dialog (expanded state included) and each option carries the option role and its selected state on both hosts; the list around them is a listbox on the web only. On the web Enter, Space or an arrow key opens it, the arrow keys, Home and End move between options, Enter or Space chooses, Escape closes, and focus returns to the trigger; on Android the back button closes it. Props: `options` (`[{ value, label, disabled?, testID? }]`, `value` a string or number, unique), `value`, `onValueChange(value, option)`, `placeholder` (default "Select"), `title` (the sheet\'s heading; defaults to a text `label`), `emptyText` (default "No options"), `label`, `helper`, `error`, `disabled`, `accessibilityLabel`, `closeAccessibilityLabel`, `background` / `textColor` / `borderColor` / `radius` / `height` to override one field, `style` (the trigger), `containerStyle`, `testID`; any other prop lands on the trigger. Never hand-roll a dropdown from `Pressable` + an absolutely positioned list: it is clipped by the widget\'s container on both hosts.',
|
|
3074
|
+
rnComponent: null,
|
|
3075
|
+
docsUrl: null,
|
|
3076
|
+
},
|
|
3077
|
+
{
|
|
3078
|
+
name: "SearchField",
|
|
3079
|
+
description:
|
|
3080
|
+
'Themed search box. `<SearchField value={query} onChangeText={setQuery} placeholder="Search orders" />` — THE way to draw a field that filters or searches. It IS a `TextField` (same look, same props, same `label` / `helper` / `error` / `disabled`) with a search glyph, the search key on the on-screen keyboard and a clear control that appears once there is text; clearing calls `onChangeText("")`, then `onClear` if you passed one, and keeps focus in the field. `placeholder` defaults to "Search" and `clearAccessibilityLabel` to "Clear search" — pass translated ones. `style` styles the input and `containerStyle` the box around it (use it for `flex: 1` in a toolbar). Debounce the query yourself before you fetch. Never hand-roll a search box from a `TextInput` + an icon.',
|
|
3081
|
+
rnComponent: null,
|
|
3082
|
+
docsUrl: null,
|
|
3083
|
+
},
|
|
3084
|
+
{
|
|
3085
|
+
name: "spaceActivates",
|
|
3086
|
+
description:
|
|
3087
|
+
'Space-key activation for a control whose role is not a button. `<Pressable accessibilityRole="radio" aria-checked={on} onPress={pick} onKeyDown={spaceActivates(pick)} />`. On the web a `Pressable` answers Enter for every role but Space only for a button, and Space is the key a checkbox, radio, switch or option is operated with; this restores it, once per key press. Native ignores `onKeyDown`, so it is safe on both hosts. `<Checkbox>` and `<Select>` already use it — reach for it only for a control you build yourself.',
|
|
3057
3088
|
rnComponent: null,
|
|
3058
3089
|
docsUrl: null,
|
|
3059
3090
|
},
|
|
@@ -5585,7 +5616,15 @@ const CONTRACT = deepFreeze({
|
|
|
5585
5616
|
// `initialFocusRef`, `backdropAccessible` and `testID`. A scope may now
|
|
5586
5617
|
// name `sdkComponents` and bind no widget field; a colour token may be
|
|
5587
5618
|
// `translucent` (always painted see-through) and carry a `note`.
|
|
5588
|
-
|
|
5619
|
+
// 1.171.0: (sc-10929) — the form controls `Checkbox`, `Select` and
|
|
5620
|
+
// `SearchField`, and the `spaceActivates` helper. `TextField` gains
|
|
5621
|
+
// `label`, `helper`, `error`, `disabled` and `containerStyle`. The `muted`
|
|
5622
|
+
// and `popover` scopes name the `sdkComponents` that read them directly.
|
|
5623
|
+
// VISIBLE CHANGE, not additive: `Switch` is now the themed platform
|
|
5624
|
+
// switch, so an existing `<Switch>` with no colour props is repainted:
|
|
5625
|
+
// its tracks follow the theme on both hosts and its "on" thumb is white
|
|
5626
|
+
// on the web. A caller's `trackColor` / `thumbColor` still win.
|
|
5627
|
+
version: "1.171.0",
|
|
5589
5628
|
sharedTranslationKeys: SHARED_TRANSLATION_KEYS,
|
|
5590
5629
|
hooks: HOOKS,
|
|
5591
5630
|
primitives: PRIMITIVES,
|