@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.
Files changed (190) hide show
  1. package/README.md +195 -0
  2. package/dist/accordion/accordion.d.mts +31 -0
  3. package/dist/accordion/accordion.d.mts.map +1 -0
  4. package/dist/accordion/accordion.mjs +88 -0
  5. package/dist/accordion/accordion.mjs.map +1 -0
  6. package/dist/accordion/accordion.styles.d.mts +61 -0
  7. package/dist/accordion/accordion.styles.d.mts.map +1 -0
  8. package/dist/accordion/accordion.styles.mjs +83 -0
  9. package/dist/accordion/accordion.styles.mjs.map +1 -0
  10. package/dist/accordion/index.d.mts +3 -0
  11. package/dist/avatar/avatar.d.mts +19 -0
  12. package/dist/avatar/avatar.d.mts.map +1 -0
  13. package/dist/avatar/avatar.mjs +57 -0
  14. package/dist/avatar/avatar.mjs.map +1 -0
  15. package/dist/avatar/avatar.styles.d.mts +49 -0
  16. package/dist/avatar/avatar.styles.d.mts.map +1 -0
  17. package/dist/avatar/avatar.styles.mjs +45 -0
  18. package/dist/avatar/avatar.styles.mjs.map +1 -0
  19. package/dist/avatar/index.d.mts +3 -0
  20. package/dist/badge/badge.d.mts +15 -0
  21. package/dist/badge/badge.d.mts.map +1 -0
  22. package/dist/badge/badge.mjs +39 -0
  23. package/dist/badge/badge.mjs.map +1 -0
  24. package/dist/badge/badge.styles.d.mts +67 -0
  25. package/dist/badge/badge.styles.d.mts.map +1 -0
  26. package/dist/badge/badge.styles.mjs +99 -0
  27. package/dist/badge/badge.styles.mjs.map +1 -0
  28. package/dist/badge/index.d.mts +3 -0
  29. package/dist/breadcrumbs/breadcrumbs.d.mts +33 -0
  30. package/dist/breadcrumbs/breadcrumbs.d.mts.map +1 -0
  31. package/dist/breadcrumbs/breadcrumbs.mjs +79 -0
  32. package/dist/breadcrumbs/breadcrumbs.mjs.map +1 -0
  33. package/dist/breadcrumbs/breadcrumbs.styles.d.mts +46 -0
  34. package/dist/breadcrumbs/breadcrumbs.styles.d.mts.map +1 -0
  35. package/dist/breadcrumbs/breadcrumbs.styles.mjs +38 -0
  36. package/dist/breadcrumbs/breadcrumbs.styles.mjs.map +1 -0
  37. package/dist/breadcrumbs/index.d.mts +3 -0
  38. package/dist/button/button.d.mts +17 -0
  39. package/dist/button/button.d.mts.map +1 -0
  40. package/dist/button/button.mjs +78 -0
  41. package/dist/button/button.mjs.map +1 -0
  42. package/dist/button/button.styles.d.mts +82 -0
  43. package/dist/button/button.styles.d.mts.map +1 -0
  44. package/dist/button/button.styles.mjs +136 -0
  45. package/dist/button/button.styles.mjs.map +1 -0
  46. package/dist/button/index.d.mts +3 -0
  47. package/dist/card/card.d.mts +51 -0
  48. package/dist/card/card.d.mts.map +1 -0
  49. package/dist/card/card.mjs +96 -0
  50. package/dist/card/card.mjs.map +1 -0
  51. package/dist/card/card.styles.d.mts +70 -0
  52. package/dist/card/card.styles.d.mts.map +1 -0
  53. package/dist/card/card.styles.mjs +61 -0
  54. package/dist/card/card.styles.mjs.map +1 -0
  55. package/dist/card/index.d.mts +3 -0
  56. package/dist/checkbox/checkbox.d.mts +24 -0
  57. package/dist/checkbox/checkbox.d.mts.map +1 -0
  58. package/dist/checkbox/checkbox.mjs +124 -0
  59. package/dist/checkbox/checkbox.mjs.map +1 -0
  60. package/dist/checkbox/checkbox.styles.d.mts +111 -0
  61. package/dist/checkbox/checkbox.styles.d.mts.map +1 -0
  62. package/dist/checkbox/checkbox.styles.mjs +99 -0
  63. package/dist/checkbox/checkbox.styles.mjs.map +1 -0
  64. package/dist/checkbox/index.d.mts +3 -0
  65. package/dist/index.d.mts +61 -0
  66. package/dist/index.mjs +42 -0
  67. package/dist/input/index.d.mts +3 -0
  68. package/dist/input/input.d.mts +20 -0
  69. package/dist/input/input.d.mts.map +1 -0
  70. package/dist/input/input.mjs +86 -0
  71. package/dist/input/input.mjs.map +1 -0
  72. package/dist/input/input.styles.d.mts +81 -0
  73. package/dist/input/input.styles.d.mts.map +1 -0
  74. package/dist/input/input.styles.mjs +88 -0
  75. package/dist/input/input.styles.mjs.map +1 -0
  76. package/dist/menu/index.d.mts +3 -0
  77. package/dist/menu/menu.d.mts +62 -0
  78. package/dist/menu/menu.d.mts.map +1 -0
  79. package/dist/menu/menu.mjs +115 -0
  80. package/dist/menu/menu.mjs.map +1 -0
  81. package/dist/menu/menu.styles.d.mts +90 -0
  82. package/dist/menu/menu.styles.d.mts.map +1 -0
  83. package/dist/menu/menu.styles.mjs +42 -0
  84. package/dist/menu/menu.styles.mjs.map +1 -0
  85. package/dist/modal/index.d.mts +3 -0
  86. package/dist/modal/modal.d.mts +55 -0
  87. package/dist/modal/modal.d.mts.map +1 -0
  88. package/dist/modal/modal.mjs +122 -0
  89. package/dist/modal/modal.mjs.map +1 -0
  90. package/dist/modal/modal.styles.d.mts +58 -0
  91. package/dist/modal/modal.styles.d.mts.map +1 -0
  92. package/dist/modal/modal.styles.mjs +91 -0
  93. package/dist/modal/modal.styles.mjs.map +1 -0
  94. package/dist/popover/index.d.mts +3 -0
  95. package/dist/popover/popover.d.mts +40 -0
  96. package/dist/popover/popover.d.mts.map +1 -0
  97. package/dist/popover/popover.mjs +86 -0
  98. package/dist/popover/popover.mjs.map +1 -0
  99. package/dist/popover/popover.styles.d.mts +81 -0
  100. package/dist/popover/popover.styles.d.mts.map +1 -0
  101. package/dist/popover/popover.styles.mjs +53 -0
  102. package/dist/popover/popover.styles.mjs.map +1 -0
  103. package/dist/progress/index.d.mts +3 -0
  104. package/dist/progress/progress.d.mts +14 -0
  105. package/dist/progress/progress.d.mts.map +1 -0
  106. package/dist/progress/progress.mjs +54 -0
  107. package/dist/progress/progress.mjs.map +1 -0
  108. package/dist/progress/progress.styles.d.mts +70 -0
  109. package/dist/progress/progress.styles.d.mts.map +1 -0
  110. package/dist/progress/progress.styles.mjs +54 -0
  111. package/dist/progress/progress.styles.mjs.map +1 -0
  112. package/dist/radio/index.d.mts +3 -0
  113. package/dist/radio/radio.d.mts +22 -0
  114. package/dist/radio/radio.d.mts.map +1 -0
  115. package/dist/radio/radio.mjs +95 -0
  116. package/dist/radio/radio.mjs.map +1 -0
  117. package/dist/radio/radio.styles.d.mts +111 -0
  118. package/dist/radio/radio.styles.d.mts.map +1 -0
  119. package/dist/radio/radio.styles.mjs +95 -0
  120. package/dist/radio/radio.styles.mjs.map +1 -0
  121. package/dist/select/index.d.mts +3 -0
  122. package/dist/select/select.d.mts +34 -0
  123. package/dist/select/select.d.mts.map +1 -0
  124. package/dist/select/select.mjs +136 -0
  125. package/dist/select/select.mjs.map +1 -0
  126. package/dist/select/select.styles.d.mts +85 -0
  127. package/dist/select/select.styles.d.mts.map +1 -0
  128. package/dist/select/select.styles.mjs +109 -0
  129. package/dist/select/select.styles.mjs.map +1 -0
  130. package/dist/skeleton/index.d.mts +3 -0
  131. package/dist/skeleton/skeleton.d.mts +15 -0
  132. package/dist/skeleton/skeleton.d.mts.map +1 -0
  133. package/dist/skeleton/skeleton.mjs +26 -0
  134. package/dist/skeleton/skeleton.mjs.map +1 -0
  135. package/dist/skeleton/skeleton.styles.d.mts +31 -0
  136. package/dist/skeleton/skeleton.styles.d.mts.map +1 -0
  137. package/dist/skeleton/skeleton.styles.mjs +22 -0
  138. package/dist/skeleton/skeleton.styles.mjs.map +1 -0
  139. package/dist/spinner/index.d.mts +3 -0
  140. package/dist/spinner/spinner.d.mts +15 -0
  141. package/dist/spinner/spinner.d.mts.map +1 -0
  142. package/dist/spinner/spinner.mjs +55 -0
  143. package/dist/spinner/spinner.mjs.map +1 -0
  144. package/dist/spinner/spinner.styles.d.mts +46 -0
  145. package/dist/spinner/spinner.styles.d.mts.map +1 -0
  146. package/dist/spinner/spinner.styles.mjs +37 -0
  147. package/dist/spinner/spinner.styles.mjs.map +1 -0
  148. package/dist/styles/focus-ring.mjs +23 -0
  149. package/dist/styles/focus-ring.mjs.map +1 -0
  150. package/dist/styles/tap-target.mjs +25 -0
  151. package/dist/styles/tap-target.mjs.map +1 -0
  152. package/dist/switch/index.d.mts +3 -0
  153. package/dist/switch/switch.d.mts +17 -0
  154. package/dist/switch/switch.d.mts.map +1 -0
  155. package/dist/switch/switch.mjs +57 -0
  156. package/dist/switch/switch.mjs.map +1 -0
  157. package/dist/switch/switch.styles.d.mts +58 -0
  158. package/dist/switch/switch.styles.d.mts.map +1 -0
  159. package/dist/switch/switch.styles.mjs +79 -0
  160. package/dist/switch/switch.styles.mjs.map +1 -0
  161. package/dist/tabs/index.d.mts +3 -0
  162. package/dist/tabs/tabs.d.mts +57 -0
  163. package/dist/tabs/tabs.d.mts.map +1 -0
  164. package/dist/tabs/tabs.mjs +91 -0
  165. package/dist/tabs/tabs.mjs.map +1 -0
  166. package/dist/tabs/tabs.styles.d.mts +58 -0
  167. package/dist/tabs/tabs.styles.d.mts.map +1 -0
  168. package/dist/tabs/tabs.styles.mjs +92 -0
  169. package/dist/tabs/tabs.styles.mjs.map +1 -0
  170. package/dist/tactile.css +528 -0
  171. package/dist/tactile.scoped.css +528 -0
  172. package/dist/textarea/index.d.mts +3 -0
  173. package/dist/textarea/textarea.d.mts +15 -0
  174. package/dist/textarea/textarea.d.mts.map +1 -0
  175. package/dist/textarea/textarea.mjs +70 -0
  176. package/dist/textarea/textarea.mjs.map +1 -0
  177. package/dist/textarea/textarea.styles.d.mts +73 -0
  178. package/dist/textarea/textarea.styles.d.mts.map +1 -0
  179. package/dist/textarea/textarea.styles.mjs +83 -0
  180. package/dist/textarea/textarea.styles.mjs.map +1 -0
  181. package/dist/toast/index.d.mts +3 -0
  182. package/dist/toast/toast.d.mts +38 -0
  183. package/dist/toast/toast.d.mts.map +1 -0
  184. package/dist/toast/toast.mjs +86 -0
  185. package/dist/toast/toast.mjs.map +1 -0
  186. package/dist/toast/toast.styles.d.mts +61 -0
  187. package/dist/toast/toast.styles.d.mts.map +1 -0
  188. package/dist/toast/toast.styles.mjs +59 -0
  189. package/dist/toast/toast.styles.mjs.map +1 -0
  190. 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,3 @@
1
+ import { Switch } from "./switch.mjs";
2
+ import { SwitchStyleProps, switchStyles } from "./switch.styles.mjs";
3
+ export { Switch, type SwitchStyleProps, switchStyles };
@@ -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,3 @@
1
+ import { TabContent, TabItem, TabItems, Tabs } from "./tabs.mjs";
2
+ import { TabsStyleProps, tabsStyles } from "./tabs.styles.mjs";
3
+ export { TabContent, TabItem, TabItems, Tabs, type TabsStyleProps, tabsStyles };
@@ -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"}