@krizaka/ui 3.1.0 → 3.3.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/achievement.js +1 -1
- package/dist/action-bar.js +1 -1
- package/dist/app-shell.js +1 -1
- package/dist/argument-card.js +2 -2
- package/dist/card-grid.js +1 -1
- package/dist/card.js +1 -1
- package/dist/choice-grid.js +1 -1
- package/dist/chunk-2FRWNSRO.js +23 -0
- package/dist/chunk-2FRWNSRO.js.map +1 -0
- package/dist/chunk-4LOMIQVX.js +21 -0
- package/dist/chunk-4LOMIQVX.js.map +1 -0
- package/dist/chunk-BTMFZ66D.js +135 -0
- package/dist/chunk-BTMFZ66D.js.map +1 -0
- package/dist/chunk-C2BRIFJG.js +13 -0
- package/dist/chunk-C2BRIFJG.js.map +1 -0
- package/dist/{chunk-K3SWZXYT.js → chunk-DGQMDJXK.js} +2 -2
- package/dist/chunk-G3ETON2A.js +22 -0
- package/dist/chunk-G3ETON2A.js.map +1 -0
- package/dist/chunk-IZ7MV6HM.js +26 -0
- package/dist/chunk-IZ7MV6HM.js.map +1 -0
- package/dist/chunk-KDXRYUD3.js +39 -0
- package/dist/chunk-KDXRYUD3.js.map +1 -0
- package/dist/{chunk-OGJI5X4W.js → chunk-ZKVQGXLD.js} +5 -3
- package/dist/{chunk-OGJI5X4W.js.map → chunk-ZKVQGXLD.js.map} +1 -1
- package/dist/chunk-ZNMFG62E.js +20 -0
- package/dist/chunk-ZNMFG62E.js.map +1 -0
- package/dist/cn.d.ts +9 -1
- package/dist/cn.js +5 -3
- package/dist/code-block.js +1 -1
- package/dist/command.js +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/continue-prompt.js +1 -1
- package/dist/cta-panel.js +1 -1
- package/dist/data-table.js +3 -2
- package/dist/data-table.js.map +1 -1
- package/dist/date-picker.d.ts +652 -61
- package/dist/date-picker.js +918 -122
- package/dist/date-picker.js.map +1 -1
- package/dist/decision-list.js +1 -1
- package/dist/dropdown-menu.js +1 -1
- package/dist/error-page.js +1 -1
- package/dist/field.js +1 -1
- package/dist/filter-bar.js +3 -2
- package/dist/form.d.ts +23 -12
- package/dist/form.js +11 -47
- package/dist/form.js.map +1 -1
- package/dist/gallery-page.js +1 -1
- package/dist/glow-card.js +1 -1
- package/dist/goal-gauge.js +1 -1
- package/dist/how-it-works-page.js +1 -1
- package/dist/image-cropper.js +3 -1
- package/dist/image-cropper.js.map +1 -1
- package/dist/landscape.js +1 -1
- package/dist/link-card.js +1 -1
- package/dist/longform-page.js +1 -1
- package/dist/marquee.js +1 -1
- package/dist/mascot-quote.js +1 -1
- package/dist/motion.css +18 -1
- package/dist/native/form.d.ts +60 -15
- package/dist/native/form.js +103 -42
- package/dist/native/form.js.map +1 -1
- package/dist/native.d.ts +443 -2
- package/dist/native.js +1655 -448
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.js +1 -1
- package/dist/page-hero.js +2 -2
- package/dist/page.js +2 -2
- package/dist/popover.js +1 -1
- package/dist/pricing-page.js +1 -1
- package/dist/product-page.js +1 -1
- package/dist/profile-card.js +1 -1
- package/dist/promise-card.js +1 -1
- package/dist/radio-group.d.ts +66 -32
- package/dist/radio-group.js +54 -10
- package/dist/radio-group.js.map +1 -1
- package/dist/scroll-stage.js +1 -1
- package/dist/slider.d.ts +96 -35
- package/dist/slider.js +67 -13
- package/dist/slider.js.map +1 -1
- package/dist/stage-banner.js +1 -1
- package/dist/terminal-replay.js +34 -60
- package/dist/terminal-replay.js.map +1 -1
- package/dist/toast.js +1 -1
- package/dist/toc.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/video-player.js +3 -1
- package/dist/video-player.js.map +1 -1
- package/package.json +8 -8
- package/registry/cn.json +1 -1
- package/registry/combobox.json +225 -3
- package/registry/date-picker.json +1739 -288
- package/registry/dialog.json +74 -3
- package/registry/examples/combobox/native/multiple.d.ts +4 -0
- package/registry/examples/combobox/native/multiple.dark.png +0 -0
- package/registry/examples/combobox/native/multiple.js +15 -0
- package/registry/examples/combobox/native/multiple.light.png +0 -0
- package/registry/examples/combobox/native/multiple.tsx +15 -0
- package/registry/examples/combobox/native/search.d.ts +4 -0
- package/registry/examples/combobox/native/search.dark.png +0 -0
- package/registry/examples/combobox/native/search.js +15 -0
- package/registry/examples/combobox/native/search.light.png +0 -0
- package/registry/examples/combobox/native/search.tsx +15 -0
- package/registry/examples/date-picker/birth-date-wheel.d.ts +4 -0
- package/registry/examples/date-picker/birth-date-wheel.js +13 -0
- package/registry/examples/date-picker/birth-date-wheel.tsx +11 -0
- package/registry/examples/date-picker/birth-date.d.ts +4 -0
- package/registry/examples/date-picker/birth-date.js +25 -0
- package/registry/examples/date-picker/birth-date.tsx +21 -0
- package/registry/examples/date-picker/calendar.js +1 -1
- package/registry/examples/date-picker/calendar.tsx +2 -6
- package/registry/examples/date-picker/day-strip.d.ts +4 -0
- package/registry/examples/date-picker/day-strip.js +28 -0
- package/registry/examples/date-picker/day-strip.tsx +27 -0
- package/registry/examples/date-picker/month-year.d.ts +4 -0
- package/registry/examples/date-picker/month-year.js +13 -0
- package/registry/examples/date-picker/month-year.tsx +10 -0
- package/registry/examples/date-picker/native/birth-date-wheel.d.ts +4 -0
- package/registry/examples/date-picker/native/birth-date-wheel.dark.png +0 -0
- package/registry/examples/date-picker/native/birth-date-wheel.js +13 -0
- package/registry/examples/date-picker/native/birth-date-wheel.light.png +0 -0
- package/registry/examples/date-picker/native/birth-date-wheel.tsx +9 -0
- package/registry/examples/date-picker/native/calendar.d.ts +4 -0
- package/registry/examples/date-picker/native/calendar.dark.png +0 -0
- package/registry/examples/date-picker/native/calendar.js +13 -0
- package/registry/examples/date-picker/native/calendar.light.png +0 -0
- package/registry/examples/date-picker/native/calendar.tsx +8 -0
- package/registry/examples/date-picker/native/day-strip.d.ts +4 -0
- package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
- package/registry/examples/date-picker/native/day-strip.js +29 -0
- package/registry/examples/date-picker/native/day-strip.light.png +0 -0
- package/registry/examples/date-picker/native/day-strip.tsx +26 -0
- package/registry/examples/date-picker/native/month-year.d.ts +4 -0
- package/registry/examples/date-picker/native/month-year.dark.png +0 -0
- package/registry/examples/date-picker/native/month-year.js +13 -0
- package/registry/examples/date-picker/native/month-year.light.png +0 -0
- package/registry/examples/date-picker/native/month-year.tsx +8 -0
- package/registry/examples/date-picker/native/time-slots.d.ts +4 -0
- package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
- package/registry/examples/date-picker/native/time-slots.js +15 -0
- package/registry/examples/date-picker/native/time-slots.light.png +0 -0
- package/registry/examples/date-picker/native/time-slots.tsx +15 -0
- package/registry/examples/date-picker/native/time-wheel.d.ts +4 -0
- package/registry/examples/date-picker/native/time-wheel.dark.png +0 -0
- package/registry/examples/date-picker/native/time-wheel.js +13 -0
- package/registry/examples/date-picker/native/time-wheel.light.png +0 -0
- package/registry/examples/date-picker/native/time-wheel.tsx +8 -0
- package/registry/examples/date-picker/time-slots.d.ts +4 -0
- package/registry/examples/date-picker/time-slots.js +26 -0
- package/registry/examples/date-picker/time-slots.tsx +25 -0
- package/registry/examples/date-picker/time-wheel.d.ts +4 -0
- package/registry/examples/date-picker/time-wheel.js +13 -0
- package/registry/examples/date-picker/time-wheel.tsx +10 -0
- package/registry/examples/date-picker/wheel.d.ts +4 -0
- package/registry/examples/date-picker/wheel.js +14 -0
- package/registry/examples/date-picker/wheel.tsx +16 -0
- package/registry/examples/dialog/native/sheet.d.ts +4 -0
- package/registry/examples/dialog/native/sheet.dark.png +0 -0
- package/registry/examples/dialog/native/sheet.js +21 -0
- package/registry/examples/dialog/native/sheet.light.png +0 -0
- package/registry/examples/dialog/native/sheet.tsx +18 -0
- package/registry/examples/field/native/select.d.ts +4 -0
- package/registry/examples/field/native/select.dark.png +0 -0
- package/registry/examples/field/native/select.js +29 -0
- package/registry/examples/field/native/select.light.png +0 -0
- package/registry/examples/field/native/select.tsx +25 -0
- package/registry/examples/form/native/audience.dark.png +0 -0
- package/registry/examples/form/native/audience.light.png +0 -0
- package/registry/examples/form/native/profile.dark.png +0 -0
- package/registry/examples/form/native/profile.light.png +0 -0
- package/registry/examples/form/native/settings.dark.png +0 -0
- package/registry/examples/form/native/settings.light.png +0 -0
- package/registry/examples/form/native/sign-up.dark.png +0 -0
- package/registry/examples/form/native/sign-up.light.png +0 -0
- package/registry/examples/form/native/upload.dark.png +0 -0
- package/registry/examples/form/native/upload.light.png +0 -0
- package/registry/examples/radio-group/buttons.d.ts +4 -0
- package/registry/examples/radio-group/buttons.js +17 -0
- package/registry/examples/radio-group/buttons.tsx +21 -0
- package/registry/examples/radio-group/cards.js +1 -1
- package/registry/examples/radio-group/cards.tsx +2 -2
- package/registry/examples/radio-group/native/buttons.d.ts +4 -0
- package/registry/examples/radio-group/native/buttons.dark.png +0 -0
- package/registry/examples/radio-group/native/buttons.js +25 -0
- package/registry/examples/radio-group/native/buttons.light.png +0 -0
- package/registry/examples/radio-group/native/buttons.tsx +21 -0
- package/registry/examples/radio-group/native/cards.d.ts +4 -0
- package/registry/examples/radio-group/native/cards.dark.png +0 -0
- package/registry/examples/radio-group/native/cards.js +23 -0
- package/registry/examples/radio-group/native/cards.light.png +0 -0
- package/registry/examples/radio-group/native/cards.tsx +19 -0
- package/registry/examples/radio-group/native/list.d.ts +4 -0
- package/registry/examples/radio-group/native/list.dark.png +0 -0
- package/registry/examples/radio-group/native/list.js +24 -0
- package/registry/examples/radio-group/native/list.light.png +0 -0
- package/registry/examples/radio-group/native/list.tsx +20 -0
- package/registry/examples/radio-group/native/segmented.d.ts +4 -0
- package/registry/examples/radio-group/native/segmented.dark.png +0 -0
- package/registry/examples/radio-group/native/segmented.js +24 -0
- package/registry/examples/radio-group/native/segmented.light.png +0 -0
- package/registry/examples/radio-group/native/segmented.tsx +20 -0
- package/registry/examples/radio-group/segmented.d.ts +4 -0
- package/registry/examples/radio-group/segmented.js +15 -0
- package/registry/examples/radio-group/segmented.tsx +12 -0
- package/registry/examples/slider/floating.d.ts +4 -0
- package/registry/examples/slider/floating.js +11 -0
- package/registry/examples/slider/floating.tsx +12 -0
- package/registry/examples/slider/native/default.d.ts +4 -0
- package/registry/examples/slider/native/default.dark.png +0 -0
- package/registry/examples/slider/native/default.js +14 -0
- package/registry/examples/slider/native/default.light.png +0 -0
- package/registry/examples/slider/native/default.tsx +13 -0
- package/registry/examples/slider/native/range.d.ts +4 -0
- package/registry/examples/slider/native/range.dark.png +0 -0
- package/registry/examples/slider/native/range.js +12 -0
- package/registry/examples/slider/native/range.light.png +0 -0
- package/registry/examples/slider/native/range.tsx +11 -0
- package/registry/examples/slider/native/stepped.d.ts +4 -0
- package/registry/examples/slider/native/stepped.dark.png +0 -0
- package/registry/examples/slider/native/stepped.js +28 -0
- package/registry/examples/slider/native/stepped.light.png +0 -0
- package/registry/examples/slider/native/stepped.tsx +24 -0
- package/registry/examples/slider/native/vertical.d.ts +4 -0
- package/registry/examples/slider/native/vertical.dark.png +0 -0
- package/registry/examples/slider/native/vertical.js +16 -0
- package/registry/examples/slider/native/vertical.light.png +0 -0
- package/registry/examples/slider/native/vertical.tsx +13 -0
- package/registry/examples/slider/price-range.d.ts +4 -0
- package/registry/examples/slider/price-range.js +29 -0
- package/registry/examples/slider/price-range.tsx +27 -0
- package/registry/examples/slider/stepped.d.ts +4 -0
- package/registry/examples/slider/stepped.js +28 -0
- package/registry/examples/slider/stepped.tsx +24 -0
- package/registry/examples/slider/vertical.d.ts +4 -0
- package/registry/examples/slider/vertical.js +15 -0
- package/registry/examples/slider/vertical.tsx +14 -0
- package/registry/examples/switch/native/default.d.ts +4 -0
- package/registry/examples/switch/native/default.dark.png +0 -0
- package/registry/examples/switch/native/default.js +16 -0
- package/registry/examples/switch/native/default.light.png +0 -0
- package/registry/examples/switch/native/default.tsx +13 -0
- package/registry/examples/switch/native/settings.d.ts +4 -0
- package/registry/examples/switch/native/settings.dark.png +0 -0
- package/registry/examples/switch/native/settings.js +20 -0
- package/registry/examples/switch/native/settings.light.png +0 -0
- package/registry/examples/switch/native/settings.tsx +17 -0
- package/registry/field.json +15 -3
- package/registry/form.json +250 -42
- package/registry/index.json +29 -24
- package/registry/radio-group.json +227 -15
- package/registry/slider.json +314 -13
- package/registry/switch.json +115 -3
- package/registry/tabs.json +2 -2
- package/registry/theme.json +7 -0
- package/skills/choice-controls/SKILL.md +39 -0
- package/skills/date-picker/SKILL.md +43 -0
- package/skills/form/SKILL.md +3 -0
- package/dist/chunk-2USC2YT6.js +0 -17
- package/dist/chunk-2USC2YT6.js.map +0 -1
- package/dist/chunk-5AXLA4LK.js +0 -13
- package/dist/chunk-5AXLA4LK.js.map +0 -1
- package/dist/chunk-FJDSLNXK.js +0 -11
- package/dist/chunk-FJDSLNXK.js.map +0 -1
- package/dist/chunk-KNBYZGSQ.js +0 -11
- package/dist/chunk-KNBYZGSQ.js.map +0 -1
- package/dist/chunk-RUPRYJ45.js +0 -82
- package/dist/chunk-RUPRYJ45.js.map +0 -1
- package/dist/chunk-VCAAHCHL.js +0 -17
- package/dist/chunk-VCAAHCHL.js.map +0 -1
- /package/dist/{chunk-K3SWZXYT.js.map → chunk-DGQMDJXK.js.map} +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/radio-group/segmented.tsx
|
|
4
|
+
import { RadioGroup } from "@krizaka/ui/radio-group";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
function RadioGroupSegmented() {
|
|
7
|
+
return /* @__PURE__ */ jsxs(RadioGroup.Root, { label: "Billing", defaultValue: "yearly", variant: "segmented", children: [
|
|
8
|
+
/* @__PURE__ */ jsx(RadioGroup.Segment, { value: "monthly", children: "Monthly" }),
|
|
9
|
+
/* @__PURE__ */ jsx(RadioGroup.Segment, { value: "yearly", children: "Yearly" }),
|
|
10
|
+
/* @__PURE__ */ jsx(RadioGroup.Segment, { value: "lifetime", children: "Lifetime" })
|
|
11
|
+
] });
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
RadioGroupSegmented as default
|
|
15
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RadioGroup } from "@krizaka/ui/radio-group";
|
|
2
|
+
|
|
3
|
+
// A segmented control that is a choice (a form's value), not a view switch: one light glides to the chosen segment.
|
|
4
|
+
export default function RadioGroupSegmented() {
|
|
5
|
+
return (
|
|
6
|
+
<RadioGroup.Root label="Billing" defaultValue="yearly" variant="segmented">
|
|
7
|
+
<RadioGroup.Segment value="monthly">Monthly</RadioGroup.Segment>
|
|
8
|
+
<RadioGroup.Segment value="yearly">Yearly</RadioGroup.Segment>
|
|
9
|
+
<RadioGroup.Segment value="lifetime">Lifetime</RadioGroup.Segment>
|
|
10
|
+
</RadioGroup.Root>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/floating.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
function SliderFloating() {
|
|
7
|
+
return /* @__PURE__ */ jsx("div", { className: "pt-10", children: /* @__PURE__ */ jsx(Slider, { label: "Creator's share", size: "lg", defaultValue: 70, step: 5, floatingValue: "always", formatValue: (v) => `${v} %` }) });
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
SliderFloating as default
|
|
11
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
4
|
+
|
|
5
|
+
// The value floats over the thumb while it is touched (`"always"` here, to be seen at rest); a thicker track.
|
|
6
|
+
export default function SliderFloating() {
|
|
7
|
+
return (
|
|
8
|
+
<div className="pt-10">
|
|
9
|
+
<Slider label="Creator's share" size="lg" defaultValue={70} step={5} floatingValue="always" formatValue={(v) => `${v} %`} />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/native/default.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/native";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { View } from "react-native";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
function NativeSliderDefault() {
|
|
9
|
+
const [share, setShare] = React.useState(70);
|
|
10
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 300 }, children: /* @__PURE__ */ jsx(Slider, { label: "Creator's share", showLabel: true, floatingValue: true, value: share, onValueChange: setShare, step: 5, formatValue: (v) => `${v} %` }) });
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
NativeSliderDefault as default
|
|
14
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Slider } from "@krizaka/ui/native";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { View } from "react-native";
|
|
4
|
+
|
|
5
|
+
// One value, its label and value above the track; the value floats over the thumb while it is dragged.
|
|
6
|
+
export default function NativeSliderDefault() {
|
|
7
|
+
const [share, setShare] = React.useState(70);
|
|
8
|
+
return (
|
|
9
|
+
<View style={{ width: 300 }}>
|
|
10
|
+
<Slider label="Creator's share" showLabel floatingValue value={share} onValueChange={setShare} step={5} formatValue={(v) => `${v} %`} />
|
|
11
|
+
</View>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/native/range.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function NativeSliderRange() {
|
|
8
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 300, paddingTop: 36 }, children: /* @__PURE__ */ jsx(Slider, { label: "Price", thumbLabels: ["Minimum price", "Maximum price"], defaultValue: [40, 160], max: 250, step: 10, floatingValue: "always", formatValue: (v) => `$${v}` }) });
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
NativeSliderRange as default
|
|
12
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Slider } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
// A price range in the brand's gradient: two named thumbs, their values floating.
|
|
5
|
+
export default function NativeSliderRange() {
|
|
6
|
+
return (
|
|
7
|
+
<View style={{ width: 300, paddingTop: 36 }}>
|
|
8
|
+
<Slider<[number, number]> label="Price" thumbLabels={["Minimum price", "Maximum price"]} defaultValue={[40, 160]} max={250} step={10} floatingValue="always" formatValue={(v) => `$${v}`} />
|
|
9
|
+
</View>
|
|
10
|
+
);
|
|
11
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/native/stepped.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function NativeSliderStepped() {
|
|
8
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 300 }, children: /* @__PURE__ */ jsx(
|
|
9
|
+
Slider,
|
|
10
|
+
{
|
|
11
|
+
label: "Playback speed",
|
|
12
|
+
showLabel: true,
|
|
13
|
+
defaultValue: 1,
|
|
14
|
+
min: 0.5,
|
|
15
|
+
max: 2,
|
|
16
|
+
step: 0.25,
|
|
17
|
+
ticks: true,
|
|
18
|
+
marks: [
|
|
19
|
+
{ value: 0.5, label: "0.5\xD7" },
|
|
20
|
+
{ value: 2, label: "2\xD7" }
|
|
21
|
+
],
|
|
22
|
+
formatValue: (v) => `${v}\xD7`
|
|
23
|
+
}
|
|
24
|
+
) });
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
NativeSliderStepped as default
|
|
28
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Slider } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
// Steps you feel: a graduation at each one, a selection haptic as the thumb passes it, words under the track.
|
|
5
|
+
export default function NativeSliderStepped() {
|
|
6
|
+
return (
|
|
7
|
+
<View style={{ width: 300 }}>
|
|
8
|
+
<Slider
|
|
9
|
+
label="Playback speed"
|
|
10
|
+
showLabel
|
|
11
|
+
defaultValue={1}
|
|
12
|
+
min={0.5}
|
|
13
|
+
max={2}
|
|
14
|
+
step={0.25}
|
|
15
|
+
ticks
|
|
16
|
+
marks={[
|
|
17
|
+
{ value: 0.5, label: "0.5×" },
|
|
18
|
+
{ value: 2, label: "2×" },
|
|
19
|
+
]}
|
|
20
|
+
formatValue={(v) => `${v}×`}
|
|
21
|
+
/>
|
|
22
|
+
</View>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/native/vertical.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function NativeSliderVertical() {
|
|
8
|
+
return /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", gap: 24, height: 180 }, children: [
|
|
9
|
+
/* @__PURE__ */ jsx(Slider, { label: "Voice", orientation: "vertical", tone: "solid", defaultValue: 70, step: 10, ticks: true }),
|
|
10
|
+
/* @__PURE__ */ jsx(Slider, { label: "Music", orientation: "vertical", tone: "solid", defaultValue: 40, step: 10, ticks: true }),
|
|
11
|
+
/* @__PURE__ */ jsx(Slider, { label: "Effects", orientation: "vertical", defaultValue: 55, step: 10, ticks: true })
|
|
12
|
+
] });
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
NativeSliderVertical as default
|
|
16
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Slider } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
// Vertical faders, the accent alone, steps marked.
|
|
5
|
+
export default function NativeSliderVertical() {
|
|
6
|
+
return (
|
|
7
|
+
<View style={{ flexDirection: "row", gap: 24, height: 180 }}>
|
|
8
|
+
<Slider label="Voice" orientation="vertical" tone="solid" defaultValue={70} step={10} ticks />
|
|
9
|
+
<Slider label="Music" orientation="vertical" tone="solid" defaultValue={40} step={10} ticks />
|
|
10
|
+
<Slider label="Effects" orientation="vertical" defaultValue={55} step={10} ticks />
|
|
11
|
+
</View>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/price-range.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function SliderPriceRange() {
|
|
8
|
+
const [price, setPrice] = React.useState([40, 160]);
|
|
9
|
+
return /* @__PURE__ */ jsx("div", { className: "pt-10", children: /* @__PURE__ */ jsx(
|
|
10
|
+
Slider,
|
|
11
|
+
{
|
|
12
|
+
label: "Price",
|
|
13
|
+
thumbLabels: ["Minimum price", "Maximum price"],
|
|
14
|
+
value: price,
|
|
15
|
+
onValueChange: setPrice,
|
|
16
|
+
max: 250,
|
|
17
|
+
step: 10,
|
|
18
|
+
floatingValue: "always",
|
|
19
|
+
marks: [
|
|
20
|
+
{ value: 0, label: "$0" },
|
|
21
|
+
{ value: 250, label: "$250+" }
|
|
22
|
+
],
|
|
23
|
+
formatValue: (v) => `$${v}`
|
|
24
|
+
}
|
|
25
|
+
) });
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
SliderPriceRange as default
|
|
29
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
|
|
6
|
+
// A price range in the brand's gradient: two floating values, the bounds written under the track.
|
|
7
|
+
export default function SliderPriceRange() {
|
|
8
|
+
const [price, setPrice] = React.useState<[number, number]>([40, 160]);
|
|
9
|
+
return (
|
|
10
|
+
<div className="pt-10">
|
|
11
|
+
<Slider<[number, number]>
|
|
12
|
+
label="Price"
|
|
13
|
+
thumbLabels={["Minimum price", "Maximum price"]}
|
|
14
|
+
value={price}
|
|
15
|
+
onValueChange={setPrice}
|
|
16
|
+
max={250}
|
|
17
|
+
step={10}
|
|
18
|
+
floatingValue="always"
|
|
19
|
+
marks={[
|
|
20
|
+
{ value: 0, label: "$0" },
|
|
21
|
+
{ value: 250, label: "$250+" },
|
|
22
|
+
]}
|
|
23
|
+
formatValue={(v) => `$${v}`}
|
|
24
|
+
/>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/stepped.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
function SliderStepped() {
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
Slider,
|
|
9
|
+
{
|
|
10
|
+
label: "Playback speed",
|
|
11
|
+
showLabel: true,
|
|
12
|
+
defaultValue: 1,
|
|
13
|
+
min: 0.5,
|
|
14
|
+
max: 2,
|
|
15
|
+
step: 0.25,
|
|
16
|
+
ticks: true,
|
|
17
|
+
marks: [
|
|
18
|
+
{ value: 0.5, label: "0.5\xD7" },
|
|
19
|
+
{ value: 1, label: "1\xD7" },
|
|
20
|
+
{ value: 2, label: "2\xD7" }
|
|
21
|
+
],
|
|
22
|
+
formatValue: (v) => `${v}\xD7`
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
SliderStepped as default
|
|
28
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
4
|
+
|
|
5
|
+
// Steps you can feel: a graduation at each one, their words under the track.
|
|
6
|
+
export default function SliderStepped() {
|
|
7
|
+
return (
|
|
8
|
+
<Slider
|
|
9
|
+
label="Playback speed"
|
|
10
|
+
showLabel
|
|
11
|
+
defaultValue={1}
|
|
12
|
+
min={0.5}
|
|
13
|
+
max={2}
|
|
14
|
+
step={0.25}
|
|
15
|
+
ticks
|
|
16
|
+
marks={[
|
|
17
|
+
{ value: 0.5, label: "0.5×" },
|
|
18
|
+
{ value: 1, label: "1×" },
|
|
19
|
+
{ value: 2, label: "2×" },
|
|
20
|
+
]}
|
|
21
|
+
formatValue={(v) => `${v}×`}
|
|
22
|
+
/>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/slider/vertical.tsx
|
|
4
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
function SliderVertical() {
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex h-48 gap-8", children: [
|
|
8
|
+
/* @__PURE__ */ jsx(Slider, { label: "Voice", orientation: "vertical", tone: "solid", defaultValue: 70, step: 10, ticks: true, formatValue: (v) => `${v} %` }),
|
|
9
|
+
/* @__PURE__ */ jsx(Slider, { label: "Music", orientation: "vertical", tone: "solid", defaultValue: 40, step: 10, ticks: true, formatValue: (v) => `${v} %` }),
|
|
10
|
+
/* @__PURE__ */ jsx(Slider, { label: "Effects", orientation: "vertical", defaultValue: 55, step: 10, ticks: true, formatValue: (v) => `${v} %` })
|
|
11
|
+
] });
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
SliderVertical as default
|
|
15
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Slider } from "@krizaka/ui/slider";
|
|
4
|
+
|
|
5
|
+
// Vertical faders: a mixer's channels, the accent alone, steps marked.
|
|
6
|
+
export default function SliderVertical() {
|
|
7
|
+
return (
|
|
8
|
+
<div className="flex h-48 gap-8">
|
|
9
|
+
<Slider label="Voice" orientation="vertical" tone="solid" defaultValue={70} step={10} ticks formatValue={(v) => `${v} %`} />
|
|
10
|
+
<Slider label="Music" orientation="vertical" tone="solid" defaultValue={40} step={10} ticks formatValue={(v) => `${v} %`} />
|
|
11
|
+
<Slider label="Effects" orientation="vertical" defaultValue={55} step={10} ticks formatValue={(v) => `${v} %`} />
|
|
12
|
+
</div>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/switch/native/default.tsx
|
|
4
|
+
import { Switch } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function NativeSwitchDefault() {
|
|
8
|
+
return /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", gap: 16, alignItems: "center" }, children: [
|
|
9
|
+
/* @__PURE__ */ jsx(Switch, { label: "Dark mode", defaultChecked: true }),
|
|
10
|
+
/* @__PURE__ */ jsx(Switch, { label: "Sounds" }),
|
|
11
|
+
/* @__PURE__ */ jsx(Switch, { label: "Compact", size: "sm", defaultChecked: true })
|
|
12
|
+
] });
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
NativeSwitchDefault as default
|
|
16
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Switch } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
// The switch alone, named by `label`: md and sm, on and off.
|
|
5
|
+
export default function NativeSwitchDefault() {
|
|
6
|
+
return (
|
|
7
|
+
<View style={{ flexDirection: "row", gap: 16, alignItems: "center" }}>
|
|
8
|
+
<Switch label="Dark mode" defaultChecked />
|
|
9
|
+
<Switch label="Sounds" />
|
|
10
|
+
<Switch label="Compact" size="sm" defaultChecked />
|
|
11
|
+
</View>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/switch/native/settings.tsx
|
|
4
|
+
import { Switch } from "@krizaka/ui/native";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { View } from "react-native";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
function NativeSwitchSettings() {
|
|
9
|
+
const [push, setPush] = React.useState(true);
|
|
10
|
+
const [auctions, setAuctions] = React.useState(true);
|
|
11
|
+
const [digest, setDigest] = React.useState(false);
|
|
12
|
+
return /* @__PURE__ */ jsxs(View, { style: { width: 320, gap: 4 }, children: [
|
|
13
|
+
/* @__PURE__ */ jsx(Switch, { label: "Push notifications", description: "On this phone, even when the app is closed.", showLabel: true, checked: push, onCheckedChange: setPush }),
|
|
14
|
+
/* @__PURE__ */ jsx(Switch, { label: "Auctions you follow", description: "Outbid, ending soon, won.", showLabel: true, checked: auctions, onCheckedChange: setAuctions, disabled: !push }),
|
|
15
|
+
/* @__PURE__ */ jsx(Switch, { label: "Weekly digest", description: "One e-mail on Monday morning.", showLabel: true, checked: digest, onCheckedChange: setDigest })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
NativeSwitchSettings as default
|
|
20
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Switch } from "@krizaka/ui/native";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { View } from "react-native";
|
|
4
|
+
|
|
5
|
+
// Notification preferences: settings rows, the whole row pressable, a selection haptic as each one flips.
|
|
6
|
+
export default function NativeSwitchSettings() {
|
|
7
|
+
const [push, setPush] = React.useState(true);
|
|
8
|
+
const [auctions, setAuctions] = React.useState(true);
|
|
9
|
+
const [digest, setDigest] = React.useState(false);
|
|
10
|
+
return (
|
|
11
|
+
<View style={{ width: 320, gap: 4 }}>
|
|
12
|
+
<Switch label="Push notifications" description="On this phone, even when the app is closed." showLabel checked={push} onCheckedChange={setPush} />
|
|
13
|
+
<Switch label="Auctions you follow" description="Outbid, ending soon, won." showLabel checked={auctions} onCheckedChange={setAuctions} disabled={!push} />
|
|
14
|
+
<Switch label="Weekly digest" description="One e-mail on Monday morning." showLabel checked={digest} onCheckedChange={setDigest} />
|
|
15
|
+
</View>
|
|
16
|
+
);
|
|
17
|
+
}
|
package/registry/field.json
CHANGED
|
@@ -133,11 +133,11 @@
|
|
|
133
133
|
},
|
|
134
134
|
"native": {
|
|
135
135
|
"entry": "@krizaka/ui/native",
|
|
136
|
-
"import": "import { TextField } from \"@krizaka/ui/native\";",
|
|
136
|
+
"import": "import { TextField, Select } from \"@krizaka/ui/native\";",
|
|
137
137
|
"differences": [
|
|
138
138
|
"One component, `TextField`: the label, the input, the hint or the error together (no `Field.*` parts, no `htmlFor`).",
|
|
139
139
|
"Every `TextInput` prop passes through (`secureTextEntry`, `keyboardType`, `autoComplete`, `returnKeyType`); `multiline` is the text area; `onValueChange` gives the text.",
|
|
140
|
-
"`end` holds an adornment (a spinner, a check, a show-password button); `inputRef` focuses the input.
|
|
140
|
+
"`end` holds an adornment (a spinner, a check, a show-password button); `inputRef` focuses the input. A choice among many is `Select`: a field that opens a `Sheet` of options."
|
|
141
141
|
],
|
|
142
142
|
"props": [
|
|
143
143
|
{
|
|
@@ -229,6 +229,18 @@
|
|
|
229
229
|
"dark": "examples/field/native/default.dark.png",
|
|
230
230
|
"light": "examples/field/native/default.light.png"
|
|
231
231
|
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"name": "select",
|
|
235
|
+
"title": "Select",
|
|
236
|
+
"description": "One choice among many: the field opens a sheet of options, picking one closes it.",
|
|
237
|
+
"path": "examples/field/native/select.tsx",
|
|
238
|
+
"module": "@krizaka/ui/registry/examples/field/native/select",
|
|
239
|
+
"code": "import { Select } from \"@krizaka/ui/native\";\nimport * as React from \"react\";\nimport { View } from \"react-native\";\n\n// One choice among many: the field opens a sheet of options; picking one closes it.\nexport default function NativeFieldSelect() {\n const [category, setCategory] = React.useState<string | null>(null);\n return (\n <View style={{ width: 300 }}>\n <Select\n label=\"Category\"\n placeholder=\"Choose a category\"\n value={category}\n onValueChange={setCategory}\n hint=\"Where your video is listed.\"\n options={[\n { value: \"music\", label: \"Music\" },\n { value: \"sport\", label: \"Sport\", description: \"Training, matches, challenges\" },\n { value: \"art\", label: \"Art\" },\n { value: \"talk\", label: \"Talk\" },\n ]}\n />\n </View>\n );\n}\n",
|
|
240
|
+
"screenshots": {
|
|
241
|
+
"dark": "examples/field/native/select.dark.png",
|
|
242
|
+
"light": "examples/field/native/select.light.png"
|
|
243
|
+
}
|
|
232
244
|
}
|
|
233
245
|
]
|
|
234
246
|
},
|
|
@@ -243,7 +255,7 @@
|
|
|
243
255
|
},
|
|
244
256
|
{
|
|
245
257
|
"path": "field/meta.ts",
|
|
246
|
-
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Field\",\n summary: \"A form field: a label, a hint and an error around an `Input`, a `Textarea` or a native `Select`.\",\n status: \"stable\",\n category: \"forms\",\n platforms: \"both\",\n whenToUse: [\n \"For every text entry of a form: email, title, description, amount.\",\n \"`Select` for a choice among many options (a country): the platform's own menu, right on phones.\",\n ],\n whenNotToUse: [\n { when: \"To turn a setting on or off.\", use: \"switch\" },\n { when: \"To choose among two to five options that should all be visible.\", use: \"radio-group\" },\n { when: \"To pick a number in a range by feel.\", use: \"slider\" },\n ],\n bestPractices: [\n \"Always a visible `Field.Label`: a placeholder is an example, never the label.\",\n \"Put the hint before the error is possible (“We never share it”), the error after it is: what is wrong and how to fix it.\",\n \"Use the right `type` (`email`, `url`, `number`) and `autoComplete`: phones show the right keyboard.\",\n ],\n accessibility: {\n keyboard: [],\n notes: [\n \"Plain HTML wiring: `Field.Label htmlFor` = the control's `id`; hint and error ids in `aria-describedby`.\",\n \"`invalid` sets `aria-invalid` and `data-invalid` on the control.\",\n \"A disabled control is skipped by Tab: if the value matters, prefer `readOnly`.\",\n ],\n },\n related: [\"checkbox\", \"switch\", \"radio-group\", \"slider\"],\n web: {\n imports: [\"Field\", \"Input\", \"Textarea\", \"Select\"],\n examples: [\n { name: \"default\", title: \"Default\", description: \"A label, an input and a hint.\" },\n { name: \"invalid\", title: \"Invalid\", description: \"`invalid` and its error, read through `aria-describedby`.\" },\n { name: \"disabled\", title: \"Disabled\", description: \"Not editable.\" },\n { name: \"textarea\", title: \"Textarea\", description: \"A longer text.\" },\n { name: \"select\", title: \"Select\", description: \"A native select.\" },\n ],\n },\n native: {\n imports: [\"TextField\"],\n differences: [\n \"One component, `TextField`: the label, the input, the hint or the error together (no `Field.*` parts, no `htmlFor`).\",\n \"Every `TextInput` prop passes through (`secureTextEntry`, `keyboardType`, `autoComplete`, `returnKeyType`); `multiline` is the text area; `onValueChange` gives the text.\",\n \"`end` holds an adornment (a spinner, a check, a show-password button); `inputRef` focuses the input.
|
|
258
|
+
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Field\",\n summary: \"A form field: a label, a hint and an error around an `Input`, a `Textarea` or a native `Select`.\",\n status: \"stable\",\n category: \"forms\",\n platforms: \"both\",\n whenToUse: [\n \"For every text entry of a form: email, title, description, amount.\",\n \"`Select` for a choice among many options (a country): the platform's own menu, right on phones.\",\n ],\n whenNotToUse: [\n { when: \"To turn a setting on or off.\", use: \"switch\" },\n { when: \"To choose among two to five options that should all be visible.\", use: \"radio-group\" },\n { when: \"To pick a number in a range by feel.\", use: \"slider\" },\n ],\n bestPractices: [\n \"Always a visible `Field.Label`: a placeholder is an example, never the label.\",\n \"Put the hint before the error is possible (“We never share it”), the error after it is: what is wrong and how to fix it.\",\n \"Use the right `type` (`email`, `url`, `number`) and `autoComplete`: phones show the right keyboard.\",\n ],\n accessibility: {\n keyboard: [],\n notes: [\n \"Plain HTML wiring: `Field.Label htmlFor` = the control's `id`; hint and error ids in `aria-describedby`.\",\n \"`invalid` sets `aria-invalid` and `data-invalid` on the control.\",\n \"A disabled control is skipped by Tab: if the value matters, prefer `readOnly`.\",\n ],\n },\n related: [\"checkbox\", \"switch\", \"radio-group\", \"slider\"],\n web: {\n imports: [\"Field\", \"Input\", \"Textarea\", \"Select\"],\n examples: [\n { name: \"default\", title: \"Default\", description: \"A label, an input and a hint.\" },\n { name: \"invalid\", title: \"Invalid\", description: \"`invalid` and its error, read through `aria-describedby`.\" },\n { name: \"disabled\", title: \"Disabled\", description: \"Not editable.\" },\n { name: \"textarea\", title: \"Textarea\", description: \"A longer text.\" },\n { name: \"select\", title: \"Select\", description: \"A native select.\" },\n ],\n },\n native: {\n imports: [\"TextField\", \"Select\"],\n differences: [\n \"One component, `TextField`: the label, the input, the hint or the error together (no `Field.*` parts, no `htmlFor`).\",\n \"Every `TextInput` prop passes through (`secureTextEntry`, `keyboardType`, `autoComplete`, `returnKeyType`); `multiline` is the text area; `onValueChange` gives the text.\",\n \"`end` holds an adornment (a spinner, a check, a show-password button); `inputRef` focuses the input. A choice among many is `Select`: a field that opens a `Sheet` of options.\",\n ],\n examples: [\n { name: \"default\", title: \"Sign-up fields\", description: \"E-mail and password: the right keyboards, autofill, a hint, then an error in place of the hint.\" },\n { name: \"select\", title: \"Select\", description: \"One choice among many: the field opens a sheet of options, picking one closes it.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
|
|
247
259
|
},
|
|
248
260
|
{
|
|
249
261
|
"path": "meta.ts",
|