@novi-ui/tactile 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/README.md +195 -0
- package/dist/accordion/accordion.d.mts +31 -0
- package/dist/accordion/accordion.d.mts.map +1 -0
- package/dist/accordion/accordion.mjs +88 -0
- package/dist/accordion/accordion.mjs.map +1 -0
- package/dist/accordion/accordion.styles.d.mts +61 -0
- package/dist/accordion/accordion.styles.d.mts.map +1 -0
- package/dist/accordion/accordion.styles.mjs +83 -0
- package/dist/accordion/accordion.styles.mjs.map +1 -0
- package/dist/accordion/index.d.mts +3 -0
- package/dist/avatar/avatar.d.mts +19 -0
- package/dist/avatar/avatar.d.mts.map +1 -0
- package/dist/avatar/avatar.mjs +57 -0
- package/dist/avatar/avatar.mjs.map +1 -0
- package/dist/avatar/avatar.styles.d.mts +49 -0
- package/dist/avatar/avatar.styles.d.mts.map +1 -0
- package/dist/avatar/avatar.styles.mjs +45 -0
- package/dist/avatar/avatar.styles.mjs.map +1 -0
- package/dist/avatar/index.d.mts +3 -0
- package/dist/badge/badge.d.mts +15 -0
- package/dist/badge/badge.d.mts.map +1 -0
- package/dist/badge/badge.mjs +39 -0
- package/dist/badge/badge.mjs.map +1 -0
- package/dist/badge/badge.styles.d.mts +67 -0
- package/dist/badge/badge.styles.d.mts.map +1 -0
- package/dist/badge/badge.styles.mjs +99 -0
- package/dist/badge/badge.styles.mjs.map +1 -0
- package/dist/badge/index.d.mts +3 -0
- package/dist/breadcrumbs/breadcrumbs.d.mts +33 -0
- package/dist/breadcrumbs/breadcrumbs.d.mts.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.mjs +79 -0
- package/dist/breadcrumbs/breadcrumbs.mjs.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.styles.d.mts +46 -0
- package/dist/breadcrumbs/breadcrumbs.styles.d.mts.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.styles.mjs +38 -0
- package/dist/breadcrumbs/breadcrumbs.styles.mjs.map +1 -0
- package/dist/breadcrumbs/index.d.mts +3 -0
- package/dist/button/button.d.mts +17 -0
- package/dist/button/button.d.mts.map +1 -0
- package/dist/button/button.mjs +78 -0
- package/dist/button/button.mjs.map +1 -0
- package/dist/button/button.styles.d.mts +82 -0
- package/dist/button/button.styles.d.mts.map +1 -0
- package/dist/button/button.styles.mjs +136 -0
- package/dist/button/button.styles.mjs.map +1 -0
- package/dist/button/index.d.mts +3 -0
- package/dist/card/card.d.mts +51 -0
- package/dist/card/card.d.mts.map +1 -0
- package/dist/card/card.mjs +96 -0
- package/dist/card/card.mjs.map +1 -0
- package/dist/card/card.styles.d.mts +70 -0
- package/dist/card/card.styles.d.mts.map +1 -0
- package/dist/card/card.styles.mjs +61 -0
- package/dist/card/card.styles.mjs.map +1 -0
- package/dist/card/index.d.mts +3 -0
- package/dist/checkbox/checkbox.d.mts +24 -0
- package/dist/checkbox/checkbox.d.mts.map +1 -0
- package/dist/checkbox/checkbox.mjs +124 -0
- package/dist/checkbox/checkbox.mjs.map +1 -0
- package/dist/checkbox/checkbox.styles.d.mts +111 -0
- package/dist/checkbox/checkbox.styles.d.mts.map +1 -0
- package/dist/checkbox/checkbox.styles.mjs +99 -0
- package/dist/checkbox/checkbox.styles.mjs.map +1 -0
- package/dist/checkbox/index.d.mts +3 -0
- package/dist/index.d.mts +61 -0
- package/dist/index.mjs +42 -0
- package/dist/input/index.d.mts +3 -0
- package/dist/input/input.d.mts +20 -0
- package/dist/input/input.d.mts.map +1 -0
- package/dist/input/input.mjs +86 -0
- package/dist/input/input.mjs.map +1 -0
- package/dist/input/input.styles.d.mts +81 -0
- package/dist/input/input.styles.d.mts.map +1 -0
- package/dist/input/input.styles.mjs +88 -0
- package/dist/input/input.styles.mjs.map +1 -0
- package/dist/menu/index.d.mts +3 -0
- package/dist/menu/menu.d.mts +62 -0
- package/dist/menu/menu.d.mts.map +1 -0
- package/dist/menu/menu.mjs +115 -0
- package/dist/menu/menu.mjs.map +1 -0
- package/dist/menu/menu.styles.d.mts +90 -0
- package/dist/menu/menu.styles.d.mts.map +1 -0
- package/dist/menu/menu.styles.mjs +42 -0
- package/dist/menu/menu.styles.mjs.map +1 -0
- package/dist/modal/index.d.mts +3 -0
- package/dist/modal/modal.d.mts +55 -0
- package/dist/modal/modal.d.mts.map +1 -0
- package/dist/modal/modal.mjs +122 -0
- package/dist/modal/modal.mjs.map +1 -0
- package/dist/modal/modal.styles.d.mts +58 -0
- package/dist/modal/modal.styles.d.mts.map +1 -0
- package/dist/modal/modal.styles.mjs +91 -0
- package/dist/modal/modal.styles.mjs.map +1 -0
- package/dist/popover/index.d.mts +3 -0
- package/dist/popover/popover.d.mts +40 -0
- package/dist/popover/popover.d.mts.map +1 -0
- package/dist/popover/popover.mjs +86 -0
- package/dist/popover/popover.mjs.map +1 -0
- package/dist/popover/popover.styles.d.mts +81 -0
- package/dist/popover/popover.styles.d.mts.map +1 -0
- package/dist/popover/popover.styles.mjs +53 -0
- package/dist/popover/popover.styles.mjs.map +1 -0
- package/dist/progress/index.d.mts +3 -0
- package/dist/progress/progress.d.mts +14 -0
- package/dist/progress/progress.d.mts.map +1 -0
- package/dist/progress/progress.mjs +54 -0
- package/dist/progress/progress.mjs.map +1 -0
- package/dist/progress/progress.styles.d.mts +70 -0
- package/dist/progress/progress.styles.d.mts.map +1 -0
- package/dist/progress/progress.styles.mjs +54 -0
- package/dist/progress/progress.styles.mjs.map +1 -0
- package/dist/radio/index.d.mts +3 -0
- package/dist/radio/radio.d.mts +22 -0
- package/dist/radio/radio.d.mts.map +1 -0
- package/dist/radio/radio.mjs +95 -0
- package/dist/radio/radio.mjs.map +1 -0
- package/dist/radio/radio.styles.d.mts +111 -0
- package/dist/radio/radio.styles.d.mts.map +1 -0
- package/dist/radio/radio.styles.mjs +95 -0
- package/dist/radio/radio.styles.mjs.map +1 -0
- package/dist/select/index.d.mts +3 -0
- package/dist/select/select.d.mts +34 -0
- package/dist/select/select.d.mts.map +1 -0
- package/dist/select/select.mjs +136 -0
- package/dist/select/select.mjs.map +1 -0
- package/dist/select/select.styles.d.mts +85 -0
- package/dist/select/select.styles.d.mts.map +1 -0
- package/dist/select/select.styles.mjs +109 -0
- package/dist/select/select.styles.mjs.map +1 -0
- package/dist/skeleton/index.d.mts +3 -0
- package/dist/skeleton/skeleton.d.mts +15 -0
- package/dist/skeleton/skeleton.d.mts.map +1 -0
- package/dist/skeleton/skeleton.mjs +26 -0
- package/dist/skeleton/skeleton.mjs.map +1 -0
- package/dist/skeleton/skeleton.styles.d.mts +31 -0
- package/dist/skeleton/skeleton.styles.d.mts.map +1 -0
- package/dist/skeleton/skeleton.styles.mjs +22 -0
- package/dist/skeleton/skeleton.styles.mjs.map +1 -0
- package/dist/spinner/index.d.mts +3 -0
- package/dist/spinner/spinner.d.mts +15 -0
- package/dist/spinner/spinner.d.mts.map +1 -0
- package/dist/spinner/spinner.mjs +55 -0
- package/dist/spinner/spinner.mjs.map +1 -0
- package/dist/spinner/spinner.styles.d.mts +46 -0
- package/dist/spinner/spinner.styles.d.mts.map +1 -0
- package/dist/spinner/spinner.styles.mjs +37 -0
- package/dist/spinner/spinner.styles.mjs.map +1 -0
- package/dist/styles/focus-ring.mjs +23 -0
- package/dist/styles/focus-ring.mjs.map +1 -0
- package/dist/styles/tap-target.mjs +25 -0
- package/dist/styles/tap-target.mjs.map +1 -0
- package/dist/switch/index.d.mts +3 -0
- package/dist/switch/switch.d.mts +17 -0
- package/dist/switch/switch.d.mts.map +1 -0
- package/dist/switch/switch.mjs +57 -0
- package/dist/switch/switch.mjs.map +1 -0
- package/dist/switch/switch.styles.d.mts +58 -0
- package/dist/switch/switch.styles.d.mts.map +1 -0
- package/dist/switch/switch.styles.mjs +79 -0
- package/dist/switch/switch.styles.mjs.map +1 -0
- package/dist/tabs/index.d.mts +3 -0
- package/dist/tabs/tabs.d.mts +57 -0
- package/dist/tabs/tabs.d.mts.map +1 -0
- package/dist/tabs/tabs.mjs +91 -0
- package/dist/tabs/tabs.mjs.map +1 -0
- package/dist/tabs/tabs.styles.d.mts +58 -0
- package/dist/tabs/tabs.styles.d.mts.map +1 -0
- package/dist/tabs/tabs.styles.mjs +92 -0
- package/dist/tabs/tabs.styles.mjs.map +1 -0
- package/dist/tactile.css +528 -0
- package/dist/tactile.scoped.css +528 -0
- package/dist/textarea/index.d.mts +3 -0
- package/dist/textarea/textarea.d.mts +15 -0
- package/dist/textarea/textarea.d.mts.map +1 -0
- package/dist/textarea/textarea.mjs +70 -0
- package/dist/textarea/textarea.mjs.map +1 -0
- package/dist/textarea/textarea.styles.d.mts +73 -0
- package/dist/textarea/textarea.styles.d.mts.map +1 -0
- package/dist/textarea/textarea.styles.mjs +83 -0
- package/dist/textarea/textarea.styles.mjs.map +1 -0
- package/dist/toast/index.d.mts +3 -0
- package/dist/toast/toast.d.mts +38 -0
- package/dist/toast/toast.d.mts.map +1 -0
- package/dist/toast/toast.mjs +86 -0
- package/dist/toast/toast.mjs.map +1 -0
- package/dist/toast/toast.styles.d.mts +61 -0
- package/dist/toast/toast.styles.d.mts.map +1 -0
- package/dist/toast/toast.styles.mjs +59 -0
- package/dist/toast/toast.styles.mjs.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { tv } from "tailwind-variants";
|
|
2
|
+
/**
|
|
3
|
+
* Spinner のスタイル定義。
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* const mySpinner = tv({ extend: spinnerStyles, slots: { label: 'font-medium' } })
|
|
7
|
+
*/
|
|
8
|
+
const spinnerStyles = tv({
|
|
9
|
+
slots: {
|
|
10
|
+
root: "inline-flex items-center gap-2",
|
|
11
|
+
circle: "shrink-0 motion-safe:animate-spin text-[var(--c)]",
|
|
12
|
+
label: "text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]"
|
|
13
|
+
},
|
|
14
|
+
variants: {
|
|
15
|
+
color: {
|
|
16
|
+
default: { root: "[--c:var(--novi-color-fg)]" },
|
|
17
|
+
primary: { root: "[--c:var(--novi-color-primary)]" },
|
|
18
|
+
secondary: { root: "[--c:var(--novi-color-secondary)]" },
|
|
19
|
+
success: { root: "[--c:var(--novi-color-success)]" },
|
|
20
|
+
warning: { root: "[--c:var(--novi-color-warning)]" },
|
|
21
|
+
danger: { root: "[--c:var(--novi-color-danger)]" }
|
|
22
|
+
},
|
|
23
|
+
size: {
|
|
24
|
+
sm: { circle: "size-5" },
|
|
25
|
+
md: { circle: "size-6" },
|
|
26
|
+
lg: { circle: "size-7" }
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: {
|
|
30
|
+
color: "default",
|
|
31
|
+
size: "md"
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
//#endregion
|
|
35
|
+
export { spinnerStyles };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=spinner.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.styles.mjs","names":[],"sources":["../../src/spinner/spinner.styles.ts"],"sourcesContent":["import type {\n NoviColor,\n NoviSize,\n SlotMap,\n spinnerRequiredSlots,\n spinnerSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\n\n/**\n * Spinner は `rotate` を使う**唯一の例外**(ADR-R2)。\n *\n * 代替のローディング表現(点滅・バーの往復)は視認性か情報量で劣るため、\n * ここだけ回転を許可している。デザイン規律の検査でも例外登録済み。\n * `prefers-reduced-motion` のときは回転を止める。\n */\nconst slots = {\n root: 'inline-flex items-center gap-2',\n circle: 'shrink-0 motion-safe:animate-spin text-[var(--c)]',\n label: 'text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]',\n} satisfies SlotMap<typeof spinnerSlots, (typeof spinnerRequiredSlots)[number]>\n\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: { root: '[--c:var(--novi-color-fg)]' },\n primary: { root: '[--c:var(--novi-color-primary)]' },\n secondary: { root: '[--c:var(--novi-color-secondary)]' },\n success: { root: '[--c:var(--novi-color-success)]' },\n warning: { root: '[--c:var(--novi-color-warning)]' },\n danger: { root: '[--c:var(--novi-color-danger)]' },\n}\n\nconst size: VariantMap<NoviSize, { circle: string }> = {\n sm: { circle: 'size-5' },\n md: { circle: 'size-6' },\n lg: { circle: 'size-7' },\n}\n\n/**\n * Spinner のスタイル定義。\n *\n * @example\n * const mySpinner = tv({ extend: spinnerStyles, slots: { label: 'font-medium' } })\n */\nexport const spinnerStyles = tv({\n slots,\n variants: { color, size },\n defaultVariants: { color: 'default', size: 'md' },\n})\n\nexport type SpinnerStyleProps = Parameters<typeof spinnerStyles>[0]\n"],"mappings":";;;;;;;AA4CA,MAAa,gBAAgB,GAAG;CAC9B;EA3BA,MAAM;EACN,QAAQ;EACR,OAAO;CAyBP;CACA,UAAU;EAAE;GAtBZ,SAAS,EAAE,MAAM,6BAA6B;GAC9C,SAAS,EAAE,MAAM,kCAAkC;GACnD,WAAW,EAAE,MAAM,oCAAoC;GACvD,SAAS,EAAE,MAAM,kCAAkC;GACnD,SAAS,EAAE,MAAM,kCAAkC;GACnD,QAAQ,EAAE,MAAM,iCAAiC;EAiBrC;EAAO;GAbnB,IAAI,EAAE,QAAQ,SAAS;GACvB,IAAI,EAAE,QAAQ,SAAS;GACvB,IAAI,EAAE,QAAQ,SAAS;EAWJ;CAAK;CACxB,iBAAiB;EAAE,OAAO;EAAW,MAAM;CAAK;AAClD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/styles/focus-ring.ts
|
|
2
|
+
/**
|
|
3
|
+
* 全コンポーネント共通のフォーカスリング。
|
|
4
|
+
*
|
|
5
|
+
* 個別に書くと必ずどこかで揺れる。1箇所に定義して全コンポーネントが import する。
|
|
6
|
+
*
|
|
7
|
+
* React Aria Components はキーボード操作時にのみ `data-focus-visible` を立てるため、
|
|
8
|
+
* `:focus-visible` 擬似クラスではなくその属性を使う。
|
|
9
|
+
* ポインタで押しただけでリングが出る誤動作を避けられる。
|
|
10
|
+
*/
|
|
11
|
+
const focusRing = [
|
|
12
|
+
"outline-none",
|
|
13
|
+
"data-[focus-visible]:outline",
|
|
14
|
+
"data-[focus-visible]:outline-[length:var(--novi-focus-ring-width)]",
|
|
15
|
+
"data-[focus-visible]:outline-[var(--novi-focus-ring-color)]",
|
|
16
|
+
"data-[focus-visible]:outline-offset-[var(--novi-focus-ring-offset)]"
|
|
17
|
+
].join(" ");
|
|
18
|
+
/** 無効状態の共通表現。色は変えず、透明度と操作不能だけで示す(色数を増やさない)。 */
|
|
19
|
+
const disabledState = "data-[disabled]:opacity-40 data-[disabled]:pointer-events-none";
|
|
20
|
+
//#endregion
|
|
21
|
+
export { disabledState, focusRing };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=focus-ring.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-ring.mjs","names":[],"sources":["../../src/styles/focus-ring.ts"],"sourcesContent":["/**\n * 全コンポーネント共通のフォーカスリング。\n *\n * 個別に書くと必ずどこかで揺れる。1箇所に定義して全コンポーネントが import する。\n *\n * React Aria Components はキーボード操作時にのみ `data-focus-visible` を立てるため、\n * `:focus-visible` 擬似クラスではなくその属性を使う。\n * ポインタで押しただけでリングが出る誤動作を避けられる。\n */\nexport const focusRing = [\n 'outline-none',\n 'data-[focus-visible]:outline',\n 'data-[focus-visible]:outline-[length:var(--novi-focus-ring-width)]',\n 'data-[focus-visible]:outline-[var(--novi-focus-ring-color)]',\n 'data-[focus-visible]:outline-offset-[var(--novi-focus-ring-offset)]',\n].join(' ')\n\n/** 無効状態の共通表現。色は変えず、透明度と操作不能だけで示す(色数を増やさない)。 */\nexport const disabledState = 'data-[disabled]:opacity-40 data-[disabled]:pointer-events-none'\n"],"mappings":";;;;;;;;;;AASA,MAAa,YAAY;CACvB;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;AAGV,MAAa,gBAAgB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/styles/tap-target.ts
|
|
2
|
+
/**
|
|
3
|
+
* 実効タップ領域を 44×44px 以上にする共通断片(G5 / AC-01-5)。
|
|
4
|
+
*
|
|
5
|
+
* **視覚寸法とタップ寸法を分離する。** Checkbox の箱(24px)や Breadcrumbs のリンクは
|
|
6
|
+
* 小さく見えてよいが、指が当たる範囲まで小さいと押し直しが起きる。
|
|
7
|
+
* 擬似要素で当たり判定だけを広げると、見た目を変えずに下限を満たせる。
|
|
8
|
+
*
|
|
9
|
+
* `before:` を使うのは、内容(label・アイコン)と重ならない層を1つ増やせるため。
|
|
10
|
+
* `-z-10` は置かない — 重なると擬似要素がクリックを受けなくなる環境がある。
|
|
11
|
+
*/
|
|
12
|
+
const tapTarget = [
|
|
13
|
+
"relative",
|
|
14
|
+
"before:absolute before:left-1/2 before:top-1/2",
|
|
15
|
+
"before:-translate-x-1/2 before:-translate-y-1/2",
|
|
16
|
+
"before:size-[max(100%,44px)] before:content-[\"\"]"
|
|
17
|
+
].join(" ");
|
|
18
|
+
/**
|
|
19
|
+
* 高さが既に 44px 以上ある要素(md / lg のボタン等)にも付けてよい。
|
|
20
|
+
* `max(100%,44px)` なので、大きい方が採られて当たり判定は広がらない。
|
|
21
|
+
*/
|
|
22
|
+
//#endregion
|
|
23
|
+
export { tapTarget };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=tap-target.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tap-target.mjs","names":[],"sources":["../../src/styles/tap-target.ts"],"sourcesContent":["/**\n * 実効タップ領域を 44×44px 以上にする共通断片(G5 / AC-01-5)。\n *\n * **視覚寸法とタップ寸法を分離する。** Checkbox の箱(24px)や Breadcrumbs のリンクは\n * 小さく見えてよいが、指が当たる範囲まで小さいと押し直しが起きる。\n * 擬似要素で当たり判定だけを広げると、見た目を変えずに下限を満たせる。\n *\n * `before:` を使うのは、内容(label・アイコン)と重ならない層を1つ増やせるため。\n * `-z-10` は置かない — 重なると擬似要素がクリックを受けなくなる環境がある。\n */\nexport const tapTarget = [\n 'relative',\n // 当たり判定のみ。背景を持たないので視覚には現れない\n 'before:absolute before:left-1/2 before:top-1/2',\n 'before:-translate-x-1/2 before:-translate-y-1/2',\n 'before:size-[max(100%,44px)] before:content-[\"\"]',\n].join(' ')\n\n/**\n * 高さが既に 44px 以上ある要素(md / lg のボタン等)にも付けてよい。\n * `max(100%,44px)` なので、大きい方が採られて当たり判定は広がらない。\n */\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,YAAY;CACvB;CAEA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SwitchProps } from "@novi-ui/core";
|
|
2
|
+
//#region src/switch/switch.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* オン / オフの切り替え。
|
|
5
|
+
*
|
|
6
|
+
* Raster では**矩形**で表示する(ADR-R3)。形が見慣れないぶん状態が読み取りにくいため、
|
|
7
|
+
* ラベルの併記を強く推奨する。
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* <Switch isSelected={enabled} onChange={setEnabled}>
|
|
11
|
+
* メール通知を受け取る
|
|
12
|
+
* </Switch>
|
|
13
|
+
*/
|
|
14
|
+
declare function Switch({ size, color, name, value, isSelected, defaultSelected, onChange, isDisabled, isReadOnly, description, children, className, classNames, id }: SwitchProps): import("react").JSX.Element;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { Switch };
|
|
17
|
+
//# sourceMappingURL=switch.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.d.mts","names":[],"sources":["../../src/switch/switch.tsx"],"mappings":";;;;;;;;;;;;;iBAiBgB,SACd,MACA,OACA,MACA,OACA,YACA,iBACA,UACA,YACA,YACA,aACA,UACA,WACA,YACA,MACC,8BAAW,IAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { switchStyles } from "./switch.styles.mjs";
|
|
3
|
+
import { Switch } from "react-aria-components";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/switch/switch.tsx
|
|
6
|
+
/**
|
|
7
|
+
* オン / オフの切り替え。
|
|
8
|
+
*
|
|
9
|
+
* Raster では**矩形**で表示する(ADR-R3)。形が見慣れないぶん状態が読み取りにくいため、
|
|
10
|
+
* ラベルの併記を強く推奨する。
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* <Switch isSelected={enabled} onChange={setEnabled}>
|
|
14
|
+
* メール通知を受け取る
|
|
15
|
+
* </Switch>
|
|
16
|
+
*/
|
|
17
|
+
function Switch$1({ size, color, name, value, isSelected, defaultSelected, onChange, isDisabled, isReadOnly, description, children, className, classNames, id }) {
|
|
18
|
+
const s = switchStyles({
|
|
19
|
+
size,
|
|
20
|
+
color
|
|
21
|
+
});
|
|
22
|
+
return /* @__PURE__ */ jsxs(Switch, {
|
|
23
|
+
id,
|
|
24
|
+
name,
|
|
25
|
+
value,
|
|
26
|
+
isSelected,
|
|
27
|
+
defaultSelected,
|
|
28
|
+
onChange,
|
|
29
|
+
isDisabled,
|
|
30
|
+
isReadOnly,
|
|
31
|
+
"data-slot": "root",
|
|
32
|
+
className: `group ${s.root({ class: [className, classNames?.root] })}`,
|
|
33
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
34
|
+
"data-slot": "track",
|
|
35
|
+
className: s.track({ class: classNames?.track }),
|
|
36
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
37
|
+
"data-slot": "thumb",
|
|
38
|
+
className: s.thumb({ class: classNames?.thumb })
|
|
39
|
+
})
|
|
40
|
+
}), children !== void 0 && /* @__PURE__ */ jsxs("span", {
|
|
41
|
+
className: "flex flex-col gap-0.5",
|
|
42
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
43
|
+
"data-slot": "label",
|
|
44
|
+
className: s.label({ class: classNames?.label }),
|
|
45
|
+
children
|
|
46
|
+
}), description !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
47
|
+
"data-slot": "description",
|
|
48
|
+
className: s.description({ class: classNames?.description }),
|
|
49
|
+
children: description
|
|
50
|
+
})]
|
|
51
|
+
})]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { Switch$1 as Switch };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=switch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.mjs","names":["Switch","RACSwitch"],"sources":["../../src/switch/switch.tsx"],"sourcesContent":["'use client'\n\nimport type { SwitchProps } from '@novi-ui/core'\nimport { Switch as RACSwitch } from 'react-aria-components'\nimport { switchStyles } from './switch.styles'\n\n/**\n * オン / オフの切り替え。\n *\n * Raster では**矩形**で表示する(ADR-R3)。形が見慣れないぶん状態が読み取りにくいため、\n * ラベルの併記を強く推奨する。\n *\n * @example\n * <Switch isSelected={enabled} onChange={setEnabled}>\n * メール通知を受け取る\n * </Switch>\n */\nexport function Switch({\n size,\n color,\n name,\n value,\n isSelected,\n defaultSelected,\n onChange,\n isDisabled,\n isReadOnly,\n description,\n children,\n className,\n classNames,\n id,\n}: SwitchProps) {\n const s = switchStyles({ size, color })\n\n return (\n <RACSwitch\n id={id}\n name={name}\n value={value}\n isSelected={isSelected}\n defaultSelected={defaultSelected}\n onChange={onChange}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n data-slot=\"root\"\n className={`group ${s.root({ class: [className, classNames?.root] })}`}\n >\n <span data-slot=\"track\" className={s.track({ class: classNames?.track })}>\n <span data-slot=\"thumb\" className={s.thumb({ class: classNames?.thumb })} />\n </span>\n\n {children !== undefined && (\n <span className=\"flex flex-col gap-0.5\">\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {children}\n </span>\n {description !== undefined && (\n <span\n data-slot=\"description\"\n className={s.description({ class: classNames?.description })}\n >\n {description}\n </span>\n )}\n </span>\n )}\n </RACSwitch>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgBA,SAAO,EACrB,MACA,OACA,MACA,OACA,YACA,iBACA,UACA,YACA,YACA,aACA,UACA,WACA,YACA,MACc;CACd,MAAM,IAAI,aAAa;EAAE;EAAM;CAAM,CAAC;CAEtC,OACE,qBAACC,QAAD;EACM;EACE;EACC;EACK;EACK;EACP;EACE;EACA;EACZ,aAAU;EACV,WAAW,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAVrE,UAAA,CAYE,oBAAC,QAAD;GAAM,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GACrE,UAAA,oBAAC,QAAD;IAAM,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GAAI,CAAA;EACvE,CAAA,GAEL,aAAa,KAAA,KACZ,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,oBAAC,QAAD;IAAM,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IACpE;GACG,CAAA,GACL,gBAAgB,KAAA,KACf,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,EAAE,YAAY,EAAE,OAAO,YAAY,YAAY,CAAC;IAE1D,UAAA;GACG,CAAA,CAEJ;EAEC,CAAA,CAAA;;AAEf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/switch/switch.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Switch のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })
|
|
8
|
+
*/
|
|
9
|
+
declare const switchStyles: import("tailwind-variants").TVReturnType<{
|
|
10
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
11
|
+
root: string;
|
|
12
|
+
}>;
|
|
13
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
14
|
+
track: string;
|
|
15
|
+
thumb: string;
|
|
16
|
+
label: string;
|
|
17
|
+
}>;
|
|
18
|
+
}, {
|
|
19
|
+
root: string;
|
|
20
|
+
track: string;
|
|
21
|
+
thumb: string;
|
|
22
|
+
label: string;
|
|
23
|
+
description: string;
|
|
24
|
+
}, undefined, {
|
|
25
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
26
|
+
root: string;
|
|
27
|
+
}>;
|
|
28
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
29
|
+
track: string;
|
|
30
|
+
thumb: string;
|
|
31
|
+
label: string;
|
|
32
|
+
}>;
|
|
33
|
+
}, {
|
|
34
|
+
root: string;
|
|
35
|
+
track: string;
|
|
36
|
+
thumb: string;
|
|
37
|
+
label: string;
|
|
38
|
+
description: string;
|
|
39
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
40
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
41
|
+
root: string;
|
|
42
|
+
}>;
|
|
43
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
44
|
+
track: string;
|
|
45
|
+
thumb: string;
|
|
46
|
+
label: string;
|
|
47
|
+
}>;
|
|
48
|
+
}, {
|
|
49
|
+
root: string;
|
|
50
|
+
track: string;
|
|
51
|
+
thumb: string;
|
|
52
|
+
label: string;
|
|
53
|
+
description: string;
|
|
54
|
+
}>>;
|
|
55
|
+
type SwitchStyleProps = Parameters<typeof switchStyles>[0];
|
|
56
|
+
//#endregion
|
|
57
|
+
export { SwitchStyleProps, switchStyles };
|
|
58
|
+
//# sourceMappingURL=switch.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.styles.d.mts","names":[],"sources":["../../src/switch/switch.styles.ts"],"mappings":";;;;;;;;cA8Ea,0CAAY;;IAlCkB;;;IAUD;IAAe;IAAe;;;;;;;;;;IAV7B;;;IAUD;IAAe;IAAe;;;;;;;;;;IAV7B;;;IAUD;IAAe;IAAe;;;;;;;;;KA8B5D,mBAAmB,kBAAkB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { disabledState, focusRing } from "../styles/focus-ring.mjs";
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
//#region src/switch/switch.styles.ts
|
|
4
|
+
/**
|
|
5
|
+
* Tactile の Switch は **iOS 相当の 51×31px**。パーツ自体がタップ下限を満たす。
|
|
6
|
+
*
|
|
7
|
+
* 押下フィードバックは `scale` ではなく**サムの横伸長**で出す。
|
|
8
|
+
* トグルは「掴んで動かす」ものなので、沈むより伸びる方が動作の予告になる。
|
|
9
|
+
*/
|
|
10
|
+
const slots = {
|
|
11
|
+
root: [
|
|
12
|
+
"inline-flex items-center gap-3 min-h-11",
|
|
13
|
+
"cursor-pointer",
|
|
14
|
+
disabledState
|
|
15
|
+
].join(" "),
|
|
16
|
+
track: [
|
|
17
|
+
"shrink-0 inline-flex items-center",
|
|
18
|
+
"rounded-[var(--novi-radius-full)]",
|
|
19
|
+
"bg-[var(--novi-color-subtle)]",
|
|
20
|
+
"ring-1 ring-[var(--novi-color-border)]",
|
|
21
|
+
"transition-[background-color,box-shadow]",
|
|
22
|
+
"duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
|
|
23
|
+
"group-data-[selected]:bg-[var(--c)] group-data-[selected]:ring-[var(--c)]",
|
|
24
|
+
focusRing
|
|
25
|
+
].join(" "),
|
|
26
|
+
thumb: [
|
|
27
|
+
"rounded-[var(--novi-radius-full)]",
|
|
28
|
+
"bg-[var(--novi-color-surface)]",
|
|
29
|
+
"shadow-[var(--novi-shadow-sm)]",
|
|
30
|
+
"transition-[transform,width]",
|
|
31
|
+
"duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]"
|
|
32
|
+
].join(" "),
|
|
33
|
+
label: "text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]",
|
|
34
|
+
description: "text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]"
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Switch のスタイル定義。
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })
|
|
41
|
+
*/
|
|
42
|
+
const switchStyles = tv({
|
|
43
|
+
slots,
|
|
44
|
+
variants: {
|
|
45
|
+
color: {
|
|
46
|
+
default: { root: "[--c:var(--novi-color-fg)]" },
|
|
47
|
+
primary: { root: "[--c:var(--novi-color-primary)]" },
|
|
48
|
+
secondary: { root: "[--c:var(--novi-color-secondary)]" },
|
|
49
|
+
success: { root: "[--c:var(--novi-color-success)]" },
|
|
50
|
+
warning: { root: "[--c:var(--novi-color-warning)]" },
|
|
51
|
+
danger: { root: "[--c:var(--novi-color-danger)]" }
|
|
52
|
+
},
|
|
53
|
+
size: {
|
|
54
|
+
sm: {
|
|
55
|
+
track: "h-7 w-12 p-0.5",
|
|
56
|
+
thumb: "size-6 group-data-[selected]:translate-x-5",
|
|
57
|
+
label: "text-[length:var(--novi-text-sm)]"
|
|
58
|
+
},
|
|
59
|
+
md: {
|
|
60
|
+
track: "h-[31px] w-[51px] p-0.5",
|
|
61
|
+
thumb: "size-[27px] group-data-[selected]:translate-x-5",
|
|
62
|
+
label: "text-[length:var(--novi-text-base)]"
|
|
63
|
+
},
|
|
64
|
+
lg: {
|
|
65
|
+
track: "h-9 w-[60px] p-0.5",
|
|
66
|
+
thumb: "size-8 group-data-[selected]:translate-x-6",
|
|
67
|
+
label: "text-[length:var(--novi-text-base)]"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
color: "default",
|
|
73
|
+
size: "md"
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
//#endregion
|
|
77
|
+
export { switchStyles };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=switch.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.styles.mjs","names":[],"sources":["../../src/switch/switch.styles.ts"],"sourcesContent":["import type {\n NoviColor,\n NoviSize,\n SlotMap,\n switchRequiredSlots,\n switchSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\n\n/**\n * Tactile の Switch は **iOS 相当の 51×31px**。パーツ自体がタップ下限を満たす。\n *\n * 押下フィードバックは `scale` ではなく**サムの横伸長**で出す。\n * トグルは「掴んで動かす」ものなので、沈むより伸びる方が動作の予告になる。\n */\nconst slots = {\n // 行全体が押せる。トラック(31px)だけでは指のタップ下限を割るため、\n // ラベルを含む行に 44px の下限を持たせる(e2e の実測で判明)\n root: ['inline-flex items-center gap-3 min-h-11', 'cursor-pointer', disabledState].join(' '),\n track: [\n 'shrink-0 inline-flex items-center',\n 'rounded-[var(--novi-radius-full)]',\n 'bg-[var(--novi-color-subtle)]',\n 'ring-1 ring-[var(--novi-color-border)]',\n 'transition-[background-color,box-shadow]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'group-data-[selected]:bg-[var(--c)] group-data-[selected]:ring-[var(--c)]',\n focusRing,\n ].join(' '),\n // 押下でサムが横に伸びる。scale を使わないのは、掴んでいる感触は\n // 「縮む」より「引き伸ばされる」方が近いため(ADR-T5 の scale はボタン用)\n thumb: [\n 'rounded-[var(--novi-radius-full)]',\n 'bg-[var(--novi-color-surface)]',\n 'shadow-[var(--novi-shadow-sm)]',\n 'transition-[transform,width]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n ].join(' '),\n label: 'text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]',\n description: 'text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]',\n} satisfies SlotMap<typeof switchSlots, (typeof switchRequiredSlots)[number]>\n\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: { root: '[--c:var(--novi-color-fg)]' },\n primary: { root: '[--c:var(--novi-color-primary)]' },\n secondary: { root: '[--c:var(--novi-color-secondary)]' },\n success: { root: '[--c:var(--novi-color-success)]' },\n warning: { root: '[--c:var(--novi-color-warning)]' },\n danger: { root: '[--c:var(--novi-color-danger)]' },\n}\n\n/** md の 51×31px は iOS のスイッチ寸法。パーツ自体が 44px 相当のタップ域を持つ。 */\nconst size: VariantMap<NoviSize, { track: string; thumb: string; label: string }> = {\n sm: {\n track: 'h-7 w-12 p-0.5',\n thumb: 'size-6 group-data-[selected]:translate-x-5',\n label: 'text-[length:var(--novi-text-sm)]',\n },\n md: {\n track: 'h-[31px] w-[51px] p-0.5',\n thumb: 'size-[27px] group-data-[selected]:translate-x-5',\n label: 'text-[length:var(--novi-text-base)]',\n },\n lg: {\n track: 'h-9 w-[60px] p-0.5',\n thumb: 'size-8 group-data-[selected]:translate-x-6',\n label: 'text-[length:var(--novi-text-base)]',\n },\n}\n\n/**\n * Switch のスタイル定義。\n *\n * @example\n * const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })\n */\nexport const switchStyles = tv({\n slots,\n variants: { color, size },\n defaultVariants: { color: 'default', size: 'md' },\n})\n\nexport type SwitchStyleProps = Parameters<typeof switchStyles>[0]\n"],"mappings":";;;;;;;;;AAiBA,MAAM,QAAQ;CAGZ,MAAM;EAAC;EAA2C;EAAkB;CAAa,CAAC,CAAC,KAAK,GAAG;CAC3F,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAGV,OAAO;EACL;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CACP,aAAa;AACf;;;;;;;AAoCA,MAAa,eAAe,GAAG;CAC7B;CACA,UAAU;EAAE;GAnCZ,SAAS,EAAE,MAAM,6BAA6B;GAC9C,SAAS,EAAE,MAAM,kCAAkC;GACnD,WAAW,EAAE,MAAM,oCAAoC;GACvD,SAAS,EAAE,MAAM,kCAAkC;GACnD,SAAS,EAAE,MAAM,kCAAkC;GACnD,QAAQ,EAAE,MAAM,iCAAiC;EA8BrC;EAAO;GAzBnB,IAAI;IACF,OAAO;IACP,OAAO;IACP,OAAO;GACT;GACA,IAAI;IACF,OAAO;IACP,OAAO;IACP,OAAO;GACT;GACA,IAAI;IACF,OAAO;IACP,OAAO;IACP,OAAO;GACT;EAWmB;CAAK;CACxB,iBAAiB;EAAE,OAAO;EAAW,MAAM;CAAK;AAClD,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { TabsProps } from "@novi-ui/core";
|
|
3
|
+
//#region src/tabs/tabs.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Tabs の見出し列。塗られたトラックになる。
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* <TabItems>
|
|
9
|
+
* <TabItem id="profile">プロフィール</TabItem>
|
|
10
|
+
* </TabItems>
|
|
11
|
+
*/
|
|
12
|
+
declare function TabItems({ children, className }: {
|
|
13
|
+
children?: ReactNode;
|
|
14
|
+
className?: string;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
/**
|
|
17
|
+
* Tabs の見出し1つ。
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* <TabItem id="profile">プロフィール</TabItem>
|
|
21
|
+
*/
|
|
22
|
+
declare function TabItem({ id, isDisabled, children, className }: {
|
|
23
|
+
id: string;
|
|
24
|
+
isDisabled?: boolean;
|
|
25
|
+
children?: ReactNode;
|
|
26
|
+
className?: string;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
/**
|
|
29
|
+
* Tabs の中身1つ。`id` を見出しと合わせる。
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* <TabContent id="profile">…</TabContent>
|
|
33
|
+
*/
|
|
34
|
+
declare function TabContent({ id, children, className }: {
|
|
35
|
+
id: string;
|
|
36
|
+
children?: ReactNode;
|
|
37
|
+
className?: string;
|
|
38
|
+
}): import("react").JSX.Element;
|
|
39
|
+
/**
|
|
40
|
+
* 同じ階層の内容を切り替える。矢印キーでタブ間を移動できる。
|
|
41
|
+
*
|
|
42
|
+
* Tactile では**セグメンテッドコントロール**にする。塗られたトラックの内側で、
|
|
43
|
+
* 選択中の区画だけが1段持ち上がる。指で切り替える前提では、どこまでが
|
|
44
|
+
* 自分の押せる範囲かを面で示す必要があるため(Raster は下線1本・ADR-R4)。
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* <Tabs selectedKey={tab} onSelectionChange={setTab}>
|
|
48
|
+
* <TabItems>
|
|
49
|
+
* <TabItem id="profile">プロフィール</TabItem>
|
|
50
|
+
* </TabItems>
|
|
51
|
+
* <TabContent id="profile">…</TabContent>
|
|
52
|
+
* </Tabs>
|
|
53
|
+
*/
|
|
54
|
+
declare function Tabs({ variant, size, orientation, selectedKey, defaultSelectedKey, onSelectionChange, isDisabled, disabledKeys, children, className, classNames, id }: TabsProps): import("react").JSX.Element;
|
|
55
|
+
//#endregion
|
|
56
|
+
export { TabContent, TabItem, TabItems, Tabs };
|
|
57
|
+
//# sourceMappingURL=tabs.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.mts","names":[],"sources":["../../src/tabs/tabs.tsx"],"mappings":";;;;;;;;;;;iBAegB,WAAW,UAAU;EAAe,WAAW;EAAW;oBAAoB,IAAA;;;;;;;iBAc9E,UACd,IACA,YACA,UACA;EAEA;EACA;EACA,WAAW;EACX;oBACD,IAAA;;;;;;;iBAwBe,aACd,IACA,UACA;EAEA;EACA,WAAW;EACX;oBACD,IAAA;;;;;;;;;;;;;;;;iBAuBe,OACd,SACA,MACA,aACA,aACA,oBACA,mBACA,YACA,cACA,UACA,WACA,YACA,MACC,4BAAS,IAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { tabsStyles } from "./tabs.styles.mjs";
|
|
3
|
+
import { Tab, TabList, TabPanel, Tabs } from "react-aria-components";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/tabs/tabs.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Tabs の見出し列。塗られたトラックになる。
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* <TabItems>
|
|
11
|
+
* <TabItem id="profile">プロフィール</TabItem>
|
|
12
|
+
* </TabItems>
|
|
13
|
+
*/
|
|
14
|
+
function TabItems({ children, className }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(TabList, {
|
|
16
|
+
"data-slot": "list",
|
|
17
|
+
className: tabsStyles().list({ class: className }),
|
|
18
|
+
children
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Tabs の見出し1つ。
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <TabItem id="profile">プロフィール</TabItem>
|
|
26
|
+
*/
|
|
27
|
+
function TabItem({ id, isDisabled, children, className }) {
|
|
28
|
+
const s = tabsStyles();
|
|
29
|
+
return /* @__PURE__ */ jsx(Tab, {
|
|
30
|
+
id,
|
|
31
|
+
isDisabled,
|
|
32
|
+
"data-slot": "tab",
|
|
33
|
+
className: s.tab({ class: className }),
|
|
34
|
+
children: ({ isSelected }) => /* @__PURE__ */ jsxs(Fragment, { children: [isSelected && /* @__PURE__ */ jsx("span", {
|
|
35
|
+
"data-slot": "indicator",
|
|
36
|
+
"aria-hidden": "true",
|
|
37
|
+
className: s.indicator()
|
|
38
|
+
}), children] })
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Tabs の中身1つ。`id` を見出しと合わせる。
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* <TabContent id="profile">…</TabContent>
|
|
46
|
+
*/
|
|
47
|
+
function TabContent({ id, children, className }) {
|
|
48
|
+
return /* @__PURE__ */ jsx(TabPanel, {
|
|
49
|
+
id,
|
|
50
|
+
"data-slot": "panel",
|
|
51
|
+
className: tabsStyles().panel({ class: className }),
|
|
52
|
+
children
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 同じ階層の内容を切り替える。矢印キーでタブ間を移動できる。
|
|
57
|
+
*
|
|
58
|
+
* Tactile では**セグメンテッドコントロール**にする。塗られたトラックの内側で、
|
|
59
|
+
* 選択中の区画だけが1段持ち上がる。指で切り替える前提では、どこまでが
|
|
60
|
+
* 自分の押せる範囲かを面で示す必要があるため(Raster は下線1本・ADR-R4)。
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* <Tabs selectedKey={tab} onSelectionChange={setTab}>
|
|
64
|
+
* <TabItems>
|
|
65
|
+
* <TabItem id="profile">プロフィール</TabItem>
|
|
66
|
+
* </TabItems>
|
|
67
|
+
* <TabContent id="profile">…</TabContent>
|
|
68
|
+
* </Tabs>
|
|
69
|
+
*/
|
|
70
|
+
function Tabs$1({ variant, size, orientation, selectedKey, defaultSelectedKey, onSelectionChange, isDisabled, disabledKeys, children, className, classNames, id }) {
|
|
71
|
+
const s = tabsStyles({
|
|
72
|
+
variant,
|
|
73
|
+
size
|
|
74
|
+
});
|
|
75
|
+
return /* @__PURE__ */ jsx(Tabs, {
|
|
76
|
+
id,
|
|
77
|
+
orientation,
|
|
78
|
+
selectedKey,
|
|
79
|
+
defaultSelectedKey,
|
|
80
|
+
onSelectionChange: (key) => onSelectionChange?.(String(key)),
|
|
81
|
+
isDisabled,
|
|
82
|
+
disabledKeys,
|
|
83
|
+
"data-slot": "root",
|
|
84
|
+
className: s.root({ class: [className, classNames?.root] }),
|
|
85
|
+
children
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { TabContent, TabItem, TabItems, Tabs$1 as Tabs };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=tabs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.mjs","names":["Tabs","RACTabs"],"sources":["../../src/tabs/tabs.tsx"],"sourcesContent":["'use client'\n\nimport type { TabsProps } from '@novi-ui/core'\nimport type { ReactNode } from 'react'\nimport { Tabs as RACTabs, Tab, TabList, TabPanel } from 'react-aria-components'\nimport { tabsStyles } from './tabs.styles'\n\n/**\n * Tabs の見出し列。塗られたトラックになる。\n *\n * @example\n * <TabItems>\n * <TabItem id=\"profile\">プロフィール</TabItem>\n * </TabItems>\n */\nexport function TabItems({ children, className }: { children?: ReactNode; className?: string }) {\n return (\n <TabList data-slot=\"list\" className={tabsStyles().list({ class: className })}>\n {children}\n </TabList>\n )\n}\n\n/**\n * Tabs の見出し1つ。\n *\n * @example\n * <TabItem id=\"profile\">プロフィール</TabItem>\n */\nexport function TabItem({\n id,\n isDisabled,\n children,\n className,\n}: {\n id: string\n isDisabled?: boolean\n children?: ReactNode\n className?: string\n}) {\n const s = tabsStyles()\n return (\n <Tab id={id} isDisabled={isDisabled} data-slot=\"tab\" className={s.tab({ class: className })}>\n {({ isSelected }) => (\n <>\n {/* 選択中の区画に敷く面。トラックから1段持ち上がって見える。\n 先に置いて後続の文字が上に乗るようにする */}\n {isSelected && (\n <span data-slot=\"indicator\" aria-hidden=\"true\" className={s.indicator()} />\n )}\n {children}\n </>\n )}\n </Tab>\n )\n}\n\n/**\n * Tabs の中身1つ。`id` を見出しと合わせる。\n *\n * @example\n * <TabContent id=\"profile\">…</TabContent>\n */\nexport function TabContent({\n id,\n children,\n className,\n}: {\n id: string\n children?: ReactNode\n className?: string\n}) {\n return (\n <TabPanel id={id} data-slot=\"panel\" className={tabsStyles().panel({ class: className })}>\n {children}\n </TabPanel>\n )\n}\n\n/**\n * 同じ階層の内容を切り替える。矢印キーでタブ間を移動できる。\n *\n * Tactile では**セグメンテッドコントロール**にする。塗られたトラックの内側で、\n * 選択中の区画だけが1段持ち上がる。指で切り替える前提では、どこまでが\n * 自分の押せる範囲かを面で示す必要があるため(Raster は下線1本・ADR-R4)。\n *\n * @example\n * <Tabs selectedKey={tab} onSelectionChange={setTab}>\n * <TabItems>\n * <TabItem id=\"profile\">プロフィール</TabItem>\n * </TabItems>\n * <TabContent id=\"profile\">…</TabContent>\n * </Tabs>\n */\nexport function Tabs({\n variant,\n size,\n orientation,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n isDisabled,\n disabledKeys,\n children,\n className,\n classNames,\n id,\n}: TabsProps) {\n const s = tabsStyles({ variant, size })\n\n return (\n <RACTabs\n id={id}\n orientation={orientation}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={(key) => onSelectionChange?.(String(key))}\n isDisabled={isDisabled}\n disabledKeys={disabledKeys}\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n >\n {children}\n </RACTabs>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,SAAgB,SAAS,EAAE,UAAU,aAA2D;CAC9F,OACE,oBAAC,SAAD;EAAS,aAAU;EAAO,WAAW,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,UAAU,CAAC;EACxE;CACM,CAAA;AAEb;;;;;;;AAQA,SAAgB,QAAQ,EACtB,IACA,YACA,UACA,aAMC;CACD,MAAM,IAAI,WAAW;CACrB,OACE,oBAAC,KAAD;EAAS;EAAgB;EAAY,aAAU;EAAM,WAAW,EAAE,IAAI,EAAE,OAAO,UAAU,CAAC;EACtF,WAAA,EAAE,iBACF,qBAAA,UAAA,EAAA,UAAA,CAGG,cACC,oBAAC,QAAD;GAAM,aAAU;GAAY,eAAY;GAAO,WAAW,EAAE,UAAU;EAAI,CAAA,GAE3E,QACD,EAAA,CAAA;CAED,CAAA;AAET;;;;;;;AAQA,SAAgB,WAAW,EACzB,IACA,UACA,aAKC;CACD,OACE,oBAAC,UAAD;EAAc;EAAI,aAAU;EAAQ,WAAW,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;EACnF;CACO,CAAA;AAEd;;;;;;;;;;;;;;;;AAiBA,SAAgBA,OAAK,EACnB,SACA,MACA,aACA,aACA,oBACA,mBACA,YACA,cACA,UACA,WACA,YACA,MACY;CACZ,MAAM,IAAI,WAAW;EAAE;EAAS;CAAK,CAAC;CAEtC,OACE,oBAACC,MAAD;EACM;EACS;EACA;EACO;EACpB,oBAAoB,QAAQ,oBAAoB,OAAO,GAAG,CAAC;EAC/C;EACE;EACd,aAAU;EACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAEzD;CACM,CAAA;AAEb"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/tabs/tabs.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Tabs のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { tabsStyles } from '@novi-ui/tactile'
|
|
8
|
+
* import { tv } from 'tailwind-variants'
|
|
9
|
+
*
|
|
10
|
+
* const myTabs = tv({ extend: tabsStyles, slots: { list: 'w-full' } })
|
|
11
|
+
*/
|
|
12
|
+
declare const tabsStyles: import("tailwind-variants").TVReturnType<{
|
|
13
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
14
|
+
tab: string;
|
|
15
|
+
}>;
|
|
16
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
17
|
+
list: string;
|
|
18
|
+
indicator: string;
|
|
19
|
+
}>;
|
|
20
|
+
}, {
|
|
21
|
+
root: string;
|
|
22
|
+
list: string;
|
|
23
|
+
tab: string;
|
|
24
|
+
indicator: string;
|
|
25
|
+
panel: string;
|
|
26
|
+
}, undefined, {
|
|
27
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
28
|
+
tab: string;
|
|
29
|
+
}>;
|
|
30
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
31
|
+
list: string;
|
|
32
|
+
indicator: string;
|
|
33
|
+
}>;
|
|
34
|
+
}, {
|
|
35
|
+
root: string;
|
|
36
|
+
list: string;
|
|
37
|
+
tab: string;
|
|
38
|
+
indicator: string;
|
|
39
|
+
panel: string;
|
|
40
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
41
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
42
|
+
tab: string;
|
|
43
|
+
}>;
|
|
44
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
45
|
+
list: string;
|
|
46
|
+
indicator: string;
|
|
47
|
+
}>;
|
|
48
|
+
}, {
|
|
49
|
+
root: string;
|
|
50
|
+
list: string;
|
|
51
|
+
tab: string;
|
|
52
|
+
indicator: string;
|
|
53
|
+
panel: string;
|
|
54
|
+
}>>;
|
|
55
|
+
type TabsStyleProps = Parameters<typeof tabsStyles>[0];
|
|
56
|
+
//#endregion
|
|
57
|
+
export { TabsStyleProps, tabsStyles };
|
|
58
|
+
//# sourceMappingURL=tabs.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.styles.d.mts","names":[],"sources":["../../src/tabs/tabs.styles.ts"],"mappings":";;;;;;;;;;;cAuFa,wCAAU;;IAfiB;;;IAlBO;IAAmB;;;;;;;;;;IAkB1B;;;IAlBO;IAAmB;;;;;;;;;;IAkB1B;;;IAlBO;IAAmB;;;;;;;;;KAuCtD,iBAAiB,kBAAkB"}
|