@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 @@
1
+ {"version":3,"file":"button.mjs","names":["Button","RACButton"],"sources":["../../src/button/button.tsx"],"sourcesContent":["'use client'\n\nimport type { ButtonProps } from '@novi-ui/core'\nimport { Button as RACButton } from 'react-aria-components'\nimport { buttonStyles } from './button.styles'\n\n/**\n * ボタン。\n *\n * 押すと少し沈み、`solid` では影が消える。指で触れている手応えを返すため。\n * 実効タップ領域は視覚寸法と独立に 44px 以上を保つ。\n *\n * @example\n * <Button variant=\"solid\" color=\"primary\" onPress={() => save()}>\n * 保存\n * </Button>\n */\nexport function Button({\n variant,\n size,\n color,\n radius,\n isDisabled,\n isLoading,\n type = 'button',\n onPress,\n startContent,\n endContent,\n children,\n className,\n classNames,\n id,\n}: ButtonProps) {\n const s = buttonStyles({ variant, size, color, radius })\n\n return (\n <RACButton\n id={id}\n type={type}\n // 読み込み中は押せないようにする。見た目だけ変えて押せる状態にしない\n isDisabled={isDisabled === true || isLoading === true}\n onPress={onPress}\n data-slot=\"root\"\n data-loading={isLoading === true ? true : undefined}\n className={s.root({ class: [className, classNames?.root] })}\n >\n {isLoading === true && (\n <span\n data-slot=\"spinner\"\n className={s.spinner({ class: classNames?.spinner })}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"1em\" height=\"1em\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.25\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </span>\n )}\n\n {startContent !== undefined && (\n <span\n data-slot=\"startContent\"\n className={s.startContent({ class: classNames?.startContent })}\n >\n {startContent}\n </span>\n )}\n\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {children}\n </span>\n\n {endContent !== undefined && (\n <span data-slot=\"endContent\" className={s.endContent({ class: classNames?.endContent })}>\n {endContent}\n </span>\n )}\n </RACButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgBA,SAAO,EACrB,SACA,MACA,OACA,QACA,YACA,WACA,OAAO,UACP,SACA,cACA,YACA,UACA,WACA,YACA,MACc;CACd,MAAM,IAAI,aAAa;EAAE;EAAS;EAAM;EAAO;CAAO,CAAC;CAEvD,OACE,qBAACC,QAAD;EACM;EACE;EAEN,YAAY,eAAe,QAAQ,cAAc;EACxC;EACT,aAAU;EACV,gBAAc,cAAc,OAAO,OAAO,KAAA;EAC1C,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAR5D,UAAA;GAUG,cAAc,QACb,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;IACnD,eAAY;IAEZ,UAAA,qBAAC,OAAD;KAAK,SAAQ;KAAY,OAAM;KAAM,QAAO;KAAM,MAAK;KAAO,eAAY;KAA1E,UAAA,CACE,oBAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAI,GAAE;MAAI,QAAO;MAAe,aAAY;MAAI,SAAQ;KAAQ,CAAA,GAClF,oBAAC,QAAD;MAAM,GAAE;MAAsB,QAAO;MAAe,aAAY;KAAK,CAAA,CAClE;;GACD,CAAA;GAGP,iBAAiB,KAAA,KAChB,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,EAAE,aAAa,EAAE,OAAO,YAAY,aAAa,CAAC;IAE5D,UAAA;GACG,CAAA;GAGR,oBAAC,QAAD;IAAM,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IACpE;GACG,CAAA;GAEL,eAAe,KAAA,KACd,oBAAC,QAAD;IAAM,aAAU;IAAa,WAAW,EAAE,WAAW,EAAE,OAAO,YAAY,WAAW,CAAC;IACnF,UAAA;GACG,CAAA;EAEC;;AAEf"}
@@ -0,0 +1,82 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/button/button.styles.d.ts
3
+ /**
4
+ * Button のスタイル定義。
5
+ *
6
+ * `tv({ extend: buttonStyles })` で拡張できるよう named export する。
7
+ * npm 配布の「コードを所有できない」という不満への回答(FR-04)。
8
+ *
9
+ * slot ベースの定義なので、拡張は `base` ではなく `slots` で行う。
10
+ * `base` は黙って無視される。
11
+ *
12
+ * @example
13
+ * import { buttonStyles } from '@novi-ui/tactile'
14
+ * import { tv } from 'tailwind-variants'
15
+ *
16
+ * const myButton = tv({
17
+ * extend: buttonStyles,
18
+ * slots: { root: 'uppercase tracking-widest' },
19
+ * })
20
+ */
21
+ declare const buttonStyles: import("tailwind-variants").TVReturnType<{
22
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
23
+ root: string;
24
+ }>;
25
+ size: VariantMap<"sm" | "md" | "lg", {
26
+ root: string;
27
+ }>;
28
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
29
+ root: string;
30
+ }>;
31
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
32
+ root: string;
33
+ }>;
34
+ }, {
35
+ root: string;
36
+ label: string;
37
+ startContent: string;
38
+ endContent: string;
39
+ spinner: string;
40
+ }, undefined, {
41
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
42
+ root: string;
43
+ }>;
44
+ size: VariantMap<"sm" | "md" | "lg", {
45
+ root: string;
46
+ }>;
47
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
48
+ root: string;
49
+ }>;
50
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
51
+ root: string;
52
+ }>;
53
+ }, {
54
+ root: string;
55
+ label: string;
56
+ startContent: string;
57
+ endContent: string;
58
+ spinner: string;
59
+ }, import("tailwind-variants").TVReturnTypeLike<{
60
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
61
+ root: string;
62
+ }>;
63
+ size: VariantMap<"sm" | "md" | "lg", {
64
+ root: string;
65
+ }>;
66
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
67
+ root: string;
68
+ }>;
69
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
70
+ root: string;
71
+ }>;
72
+ }, {
73
+ root: string;
74
+ label: string;
75
+ startContent: string;
76
+ endContent: string;
77
+ spinner: string;
78
+ }>>;
79
+ type ButtonStyleProps = Parameters<typeof buttonStyles>[0];
80
+ //#endregion
81
+ export { ButtonStyleProps, buttonStyles };
82
+ //# sourceMappingURL=button.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.styles.d.mts","names":[],"sources":["../../src/button/button.styles.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;cA8Ja,0CAAY;;IA7GkB;;;IAwDF;;;IAMI;;;IAcE;;;;;;;;;;IA5EJ;;;IAwDF;;;IAMI;;;IAcE;;;;;;;;;;IA5EJ;;;IAwDF;;;IAMI;;;IAcE;;;;;;;;;KAwCnC,mBAAmB,kBAAkB"}
@@ -0,0 +1,136 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { tapTarget } from "../styles/tap-target.mjs";
3
+ import { tv } from "tailwind-variants";
4
+ //#region src/button/button.styles.ts
5
+ const slots = {
6
+ root: [
7
+ "inline-flex items-center justify-center gap-2",
8
+ "font-medium whitespace-nowrap select-none",
9
+ "border border-transparent",
10
+ "transition-[background-color,border-color,color,opacity,scale,box-shadow]",
11
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
12
+ "data-[pressed]:scale-[0.97]",
13
+ "motion-reduce:data-[pressed]:scale-100",
14
+ focusRing,
15
+ disabledState,
16
+ tapTarget
17
+ ].join(" "),
18
+ label: "truncate",
19
+ startContent: "shrink-0 inline-flex",
20
+ endContent: "shrink-0 inline-flex",
21
+ spinner: "shrink-0 inline-flex"
22
+ };
23
+ /**
24
+ * 色は「役割ごとのローカル変数」に落としてから variant が参照する。
25
+ * こうしないと variant 5 × color 6 = 30 通りの組み合わせを書くことになる。
26
+ *
27
+ * - `--c` 面の色(solid の背景)
28
+ * - `--c-fg` その面に乗る文字色
29
+ * - `--c-text` 面を持たない variant での文字色
30
+ * - `--c-line` 境界線の色
31
+ */
32
+ const color = {
33
+ default: { root: [
34
+ "[--c:var(--novi-color-default)]",
35
+ "[--c-fg:var(--novi-color-default-fg)]",
36
+ "[--c-text:var(--novi-color-fg)]",
37
+ "[--c-line:var(--novi-color-border-strong)]"
38
+ ].join(" ") },
39
+ primary: { root: [
40
+ "[--c:var(--novi-color-primary)]",
41
+ "[--c-fg:var(--novi-color-primary-fg)]",
42
+ "[--c-text:var(--novi-color-primary)]",
43
+ "[--c-line:var(--novi-color-primary)]"
44
+ ].join(" ") },
45
+ secondary: { root: [
46
+ "[--c:var(--novi-color-secondary)]",
47
+ "[--c-fg:var(--novi-color-secondary-fg)]",
48
+ "[--c-text:var(--novi-color-secondary)]",
49
+ "[--c-line:var(--novi-color-secondary)]"
50
+ ].join(" ") },
51
+ success: { root: [
52
+ "[--c:var(--novi-color-success)]",
53
+ "[--c-fg:var(--novi-color-success-fg)]",
54
+ "[--c-text:var(--novi-color-success)]",
55
+ "[--c-line:var(--novi-color-success)]"
56
+ ].join(" ") },
57
+ warning: { root: [
58
+ "[--c:var(--novi-color-warning)]",
59
+ "[--c-fg:var(--novi-color-warning-fg)]",
60
+ "[--c-text:var(--novi-color-warning)]",
61
+ "[--c-line:var(--novi-color-warning)]"
62
+ ].join(" ") },
63
+ danger: { root: [
64
+ "[--c:var(--novi-color-danger)]",
65
+ "[--c-fg:var(--novi-color-danger-fg)]",
66
+ "[--c-text:var(--novi-color-danger)]",
67
+ "[--c-line:var(--novi-color-danger)]"
68
+ ].join(" ") }
69
+ };
70
+ /**
71
+ * 高さは 40 / 48 / 56px(Raster は 32 / 40 / 48)。
72
+ * 最小段でも 40px あり、擬似要素と合わせて実効タップ領域が 44px を割らない。
73
+ * 水平余白も広い — 指の接触面は文字の幅より大きい。
74
+ */
75
+ const size = {
76
+ sm: { root: "h-10 px-4 text-[length:var(--novi-text-sm)]" },
77
+ md: { root: "h-12 px-5 text-[length:var(--novi-text-base)]" },
78
+ lg: { root: "h-14 px-6 text-[length:var(--novi-text-base)]" }
79
+ };
80
+ const radius = {
81
+ none: { root: "rounded-[var(--novi-radius-none)]" },
82
+ sm: { root: "rounded-[var(--novi-radius-sm)]" },
83
+ md: { root: "rounded-[var(--novi-radius-md)]" },
84
+ lg: { root: "rounded-[var(--novi-radius-lg)]" },
85
+ full: { root: "rounded-[var(--novi-radius-full)]" }
86
+ };
87
+ /**
88
+ * 語彙の実装漏れ・語彙外の追加はここでコンパイルエラーになる(AC-04-2)。
89
+ *
90
+ * `solid` だけが影を持ち、押下すると影が消える。**持ち上がっていた面が沈む**という
91
+ * 一連の動きで、Tactile は押した手応えを作る(Raster は色の変化だけで示す)。
92
+ */
93
+ const variant = {
94
+ solid: { root: ["bg-[var(--c)] text-[var(--c-fg)] hover:opacity-90", "shadow-[var(--novi-shadow-sm)] data-[pressed]:shadow-[var(--novi-shadow-none)]"].join(" ") },
95
+ outline: { root: "border-[var(--c-line)] text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]" },
96
+ soft: { root: "bg-[var(--novi-color-subtle)] text-[var(--c-text)] hover:brightness-95" },
97
+ ghost: { root: "text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]" },
98
+ plain: { root: "text-[var(--c-text)] underline-offset-4 hover:underline" }
99
+ };
100
+ /**
101
+ * Button のスタイル定義。
102
+ *
103
+ * `tv({ extend: buttonStyles })` で拡張できるよう named export する。
104
+ * npm 配布の「コードを所有できない」という不満への回答(FR-04)。
105
+ *
106
+ * slot ベースの定義なので、拡張は `base` ではなく `slots` で行う。
107
+ * `base` は黙って無視される。
108
+ *
109
+ * @example
110
+ * import { buttonStyles } from '@novi-ui/tactile'
111
+ * import { tv } from 'tailwind-variants'
112
+ *
113
+ * const myButton = tv({
114
+ * extend: buttonStyles,
115
+ * slots: { root: 'uppercase tracking-widest' },
116
+ * })
117
+ */
118
+ const buttonStyles = tv({
119
+ slots,
120
+ variants: {
121
+ color,
122
+ size,
123
+ radius,
124
+ variant
125
+ },
126
+ defaultVariants: {
127
+ color: "default",
128
+ variant: "solid",
129
+ size: "md",
130
+ radius: "md"
131
+ }
132
+ });
133
+ //#endregion
134
+ export { buttonStyles };
135
+
136
+ //# sourceMappingURL=button.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.styles.mjs","names":[],"sources":["../../src/button/button.styles.ts"],"sourcesContent":["import type {\n buttonRequiredSlots,\n buttonSlots,\n NoviColor,\n NoviRadius,\n NoviSize,\n NoviVariant,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\nimport { tapTarget } from '../styles/tap-target'\n\n// 型注釈ではなく `satisfies` を使う。\n// 型注釈だと「任意 slot は無いかもしれない」まで型が広がり、\n// tv() の戻り値で `s.startContent` が undefined 扱いになって呼べなくなる(ADR-R5)。\nconst slots = {\n root: [\n 'inline-flex items-center justify-center gap-2',\n 'font-medium whitespace-nowrap select-none',\n 'border border-transparent',\n // 押下フィードバック。指の下で沈む感触を作る。\n // scale はここでしか使わない(装飾目的の scale は禁止・ADR-T5)\n 'transition-[background-color,border-color,color,opacity,scale,box-shadow]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'data-[pressed]:scale-[0.97]',\n // 沈む動きが不快になりうる利用者には出さない(AC-09-2)\n 'motion-reduce:data-[pressed]:scale-100',\n focusRing,\n disabledState,\n // 視覚寸法が 44px を満たしていても付けてよい。max() なので当たり判定は広がらない\n tapTarget,\n ].join(' '),\n label: 'truncate',\n startContent: 'shrink-0 inline-flex',\n endContent: 'shrink-0 inline-flex',\n spinner: 'shrink-0 inline-flex',\n} satisfies SlotMap<typeof buttonSlots, (typeof buttonRequiredSlots)[number]>\n\n/**\n * 色は「役割ごとのローカル変数」に落としてから variant が参照する。\n * こうしないと variant 5 × color 6 = 30 通りの組み合わせを書くことになる。\n *\n * - `--c` 面の色(solid の背景)\n * - `--c-fg` その面に乗る文字色\n * - `--c-text` 面を持たない variant での文字色\n * - `--c-line` 境界線の色\n */\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: {\n root: [\n '[--c:var(--novi-color-default)]',\n '[--c-fg:var(--novi-color-default-fg)]',\n '[--c-text:var(--novi-color-fg)]',\n '[--c-line:var(--novi-color-border-strong)]',\n ].join(' '),\n },\n primary: {\n root: [\n '[--c:var(--novi-color-primary)]',\n '[--c-fg:var(--novi-color-primary-fg)]',\n '[--c-text:var(--novi-color-primary)]',\n '[--c-line:var(--novi-color-primary)]',\n ].join(' '),\n },\n secondary: {\n root: [\n '[--c:var(--novi-color-secondary)]',\n '[--c-fg:var(--novi-color-secondary-fg)]',\n '[--c-text:var(--novi-color-secondary)]',\n '[--c-line:var(--novi-color-secondary)]',\n ].join(' '),\n },\n success: {\n root: [\n '[--c:var(--novi-color-success)]',\n '[--c-fg:var(--novi-color-success-fg)]',\n '[--c-text:var(--novi-color-success)]',\n '[--c-line:var(--novi-color-success)]',\n ].join(' '),\n },\n warning: {\n root: [\n '[--c:var(--novi-color-warning)]',\n '[--c-fg:var(--novi-color-warning-fg)]',\n '[--c-text:var(--novi-color-warning)]',\n '[--c-line:var(--novi-color-warning)]',\n ].join(' '),\n },\n danger: {\n root: [\n '[--c:var(--novi-color-danger)]',\n '[--c-fg:var(--novi-color-danger-fg)]',\n '[--c-text:var(--novi-color-danger)]',\n '[--c-line:var(--novi-color-danger)]',\n ].join(' '),\n },\n}\n\n/**\n * 高さは 40 / 48 / 56px(Raster は 32 / 40 / 48)。\n * 最小段でも 40px あり、擬似要素と合わせて実効タップ領域が 44px を割らない。\n * 水平余白も広い — 指の接触面は文字の幅より大きい。\n */\nconst size: VariantMap<NoviSize, { root: string }> = {\n sm: { root: 'h-10 px-4 text-[length:var(--novi-text-sm)]' },\n md: { root: 'h-12 px-5 text-[length:var(--novi-text-base)]' },\n lg: { root: 'h-14 px-6 text-[length:var(--novi-text-base)]' },\n}\n\nconst radius: VariantMap<NoviRadius, { root: string }> = {\n none: { root: 'rounded-[var(--novi-radius-none)]' },\n sm: { root: 'rounded-[var(--novi-radius-sm)]' },\n md: { root: 'rounded-[var(--novi-radius-md)]' },\n lg: { root: 'rounded-[var(--novi-radius-lg)]' },\n full: { root: 'rounded-[var(--novi-radius-full)]' },\n}\n\n/**\n * 語彙の実装漏れ・語彙外の追加はここでコンパイルエラーになる(AC-04-2)。\n *\n * `solid` だけが影を持ち、押下すると影が消える。**持ち上がっていた面が沈む**という\n * 一連の動きで、Tactile は押した手応えを作る(Raster は色の変化だけで示す)。\n */\nconst variant: VariantMap<NoviVariant, { root: string }> = {\n solid: {\n root: [\n 'bg-[var(--c)] text-[var(--c-fg)] hover:opacity-90',\n 'shadow-[var(--novi-shadow-sm)] data-[pressed]:shadow-[var(--novi-shadow-none)]',\n ].join(' '),\n },\n outline: {\n root: 'border-[var(--c-line)] text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]',\n },\n soft: { root: 'bg-[var(--novi-color-subtle)] text-[var(--c-text)] hover:brightness-95' },\n ghost: { root: 'text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]' },\n plain: { root: 'text-[var(--c-text)] underline-offset-4 hover:underline' },\n}\n\n/**\n * Button のスタイル定義。\n *\n * `tv({ extend: buttonStyles })` で拡張できるよう named export する。\n * npm 配布の「コードを所有できない」という不満への回答(FR-04)。\n *\n * slot ベースの定義なので、拡張は `base` ではなく `slots` で行う。\n * `base` は黙って無視される。\n *\n * @example\n * import { buttonStyles } from '@novi-ui/tactile'\n * import { tv } from 'tailwind-variants'\n *\n * const myButton = tv({\n * extend: buttonStyles,\n * slots: { root: 'uppercase tracking-widest' },\n * })\n */\nexport const buttonStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと size のクラスに負ける(申し送り6)\n variants: { color, size, radius, variant },\n defaultVariants: { color: 'default', variant: 'solid', size: 'md', radius: 'md' },\n})\n\nexport type ButtonStyleProps = Parameters<typeof buttonStyles>[0]\n"],"mappings":";;;;AAiBA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EACA;EAGA;EACA;EACA;EAEA;EACA;EACA;EAEA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CACP,cAAc;CACd,YAAY;CACZ,SAAS;AACX;;;;;;;;;;AAWA,MAAM,QAAiD;CACrD,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,WAAW,EACT,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,QAAQ,EACN,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;AACF;;;;;;AAOA,MAAM,OAA+C;CACnD,IAAI,EAAE,MAAM,8CAA8C;CAC1D,IAAI,EAAE,MAAM,gDAAgD;CAC5D,IAAI,EAAE,MAAM,gDAAgD;AAC9D;AAEA,MAAM,SAAmD;CACvD,MAAM,EAAE,MAAM,oCAAoC;CAClD,IAAI,EAAE,MAAM,kCAAkC;CAC9C,IAAI,EAAE,MAAM,kCAAkC;CAC9C,IAAI,EAAE,MAAM,kCAAkC;CAC9C,MAAM,EAAE,MAAM,oCAAoC;AACpD;;;;;;;AAQA,MAAM,UAAqD;CACzD,OAAO,EACL,MAAM,CACJ,qDACA,gFACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM,kFACR;CACA,MAAM,EAAE,MAAM,yEAAyE;CACvF,OAAO,EAAE,MAAM,2DAA2D;CAC1E,OAAO,EAAE,MAAM,0DAA0D;AAC3E;;;;;;;;;;;;;;;;;;;AAoBA,MAAa,eAAe,GAAG;CAC7B;CAEA,UAAU;EAAE;EAAO;EAAM;EAAQ;CAAQ;CACzC,iBAAiB;EAAE,OAAO;EAAW,SAAS;EAAS,MAAM;EAAM,QAAQ;CAAK;AAClF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Button } from "./button.mjs";
2
+ import { ButtonStyleProps, buttonStyles } from "./button.styles.mjs";
3
+ export { Button, type ButtonStyleProps, buttonStyles };
@@ -0,0 +1,51 @@
1
+ import { ImgHTMLAttributes, ReactNode } from "react";
2
+ import { CardProps } from "@novi-ui/core";
3
+ //#region src/card/card.d.ts
4
+ interface PartProps {
5
+ children?: ReactNode;
6
+ className?: string;
7
+ }
8
+ /**
9
+ * Card の見出し部分。下端が境界線で仕切られる。
10
+ *
11
+ * @example
12
+ * <CardHeader>売上</CardHeader>
13
+ */
14
+ declare function CardHeader({ children, className }: PartProps): import("react").JSX.Element;
15
+ /**
16
+ * Card の本体。
17
+ *
18
+ * @example
19
+ * <CardBody>¥1,240,000</CardBody>
20
+ */
21
+ declare function CardBody({ children, className }: PartProps): import("react").JSX.Element;
22
+ /**
23
+ * Card の脚部。上端が境界線で仕切られる。
24
+ *
25
+ * @example
26
+ * <CardFooter>前月比 +12%</CardFooter>
27
+ */
28
+ declare function CardFooter({ children, className }: PartProps): import("react").JSX.Element;
29
+ /**
30
+ * Card の上部に置く画像。
31
+ *
32
+ * @example
33
+ * <CardImage src="/thumb.jpg" alt="" />
34
+ */
35
+ declare function CardImage({ className, alt, ...props }: ImgHTMLAttributes<HTMLImageElement>): import("react").JSX.Element;
36
+ /**
37
+ * 情報のまとまりを囲む器。
38
+ *
39
+ * 影は使わず、1px の境界線と余白だけで面を作る。
40
+ * `onPress` を渡すと押せるカードになり、キーボード操作とフォーカスリングが付く。
41
+ *
42
+ * @example
43
+ * <Card>
44
+ * <CardHeader>売上</CardHeader>
45
+ * <CardBody>¥1,240,000</CardBody>
46
+ * </Card>
47
+ */
48
+ declare function Card({ variant, radius, onPress, isDisabled, children, className, classNames, id }: CardProps): import("react").JSX.Element;
49
+ //#endregion
50
+ export { Card, CardBody, CardFooter, CardHeader, CardImage };
51
+ //# sourceMappingURL=card.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.mts","names":[],"sources":["../../src/card/card.tsx"],"mappings":";;;UAOU;EACR,WAAW;EACX;;;;;;;;iBASc,aAAa,UAAU,aAAa,4BAAS,IAAA;;;;;;;iBAc7C,WAAW,UAAU,aAAa,4BAAS,IAAA;;;;;;;iBAc3C,aAAa,UAAU,aAAa,4BAAS,IAAA;;;;;;;iBAc7C,YAAY,WAAW,QAAa,SAAS,kBAAkB,oCAAiB,IAAA;;;;;;;;;;;;;iBAuBhF,OACd,SACA,QACA,SACA,YACA,UACA,WACA,YACA,MACC,4BAAS,IAAA"}
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ import { cardStyles } from "./card.styles.mjs";
3
+ import { Button } from "react-aria-components";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/card/card.tsx
6
+ /**
7
+ * Card の見出し部分。下端が境界線で仕切られる。
8
+ *
9
+ * @example
10
+ * <CardHeader>売上</CardHeader>
11
+ */
12
+ function CardHeader({ children, className }) {
13
+ return /* @__PURE__ */ jsx("div", {
14
+ "data-slot": "header",
15
+ className: cardStyles().header({ class: className }),
16
+ children
17
+ });
18
+ }
19
+ /**
20
+ * Card の本体。
21
+ *
22
+ * @example
23
+ * <CardBody>¥1,240,000</CardBody>
24
+ */
25
+ function CardBody({ children, className }) {
26
+ return /* @__PURE__ */ jsx("div", {
27
+ "data-slot": "body",
28
+ className: cardStyles().body({ class: className }),
29
+ children
30
+ });
31
+ }
32
+ /**
33
+ * Card の脚部。上端が境界線で仕切られる。
34
+ *
35
+ * @example
36
+ * <CardFooter>前月比 +12%</CardFooter>
37
+ */
38
+ function CardFooter({ children, className }) {
39
+ return /* @__PURE__ */ jsx("div", {
40
+ "data-slot": "footer",
41
+ className: cardStyles().footer({ class: className }),
42
+ children
43
+ });
44
+ }
45
+ /**
46
+ * Card の上部に置く画像。
47
+ *
48
+ * @example
49
+ * <CardImage src="/thumb.jpg" alt="" />
50
+ */
51
+ function CardImage({ className, alt = "", ...props }) {
52
+ return /* @__PURE__ */ jsx("img", {
53
+ ...props,
54
+ alt,
55
+ "data-slot": "image",
56
+ className: cardStyles().image({ class: className })
57
+ });
58
+ }
59
+ /**
60
+ * 情報のまとまりを囲む器。
61
+ *
62
+ * 影は使わず、1px の境界線と余白だけで面を作る。
63
+ * `onPress` を渡すと押せるカードになり、キーボード操作とフォーカスリングが付く。
64
+ *
65
+ * @example
66
+ * <Card>
67
+ * <CardHeader>売上</CardHeader>
68
+ * <CardBody>¥1,240,000</CardBody>
69
+ * </Card>
70
+ */
71
+ function Card({ variant, radius, onPress, isDisabled, children, className, classNames, id }) {
72
+ const isPressable = onPress !== void 0;
73
+ const rootClass = cardStyles({
74
+ variant,
75
+ radius,
76
+ isPressable
77
+ }).root({ class: [className, classNames?.root] });
78
+ if (isPressable) return /* @__PURE__ */ jsx(Button, {
79
+ id,
80
+ onPress,
81
+ isDisabled,
82
+ "data-slot": "root",
83
+ className: rootClass,
84
+ children
85
+ });
86
+ return /* @__PURE__ */ jsx("div", {
87
+ id,
88
+ "data-slot": "root",
89
+ className: rootClass,
90
+ children
91
+ });
92
+ }
93
+ //#endregion
94
+ export { Card, CardBody, CardFooter, CardHeader, CardImage };
95
+
96
+ //# sourceMappingURL=card.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.mjs","names":[],"sources":["../../src/card/card.tsx"],"sourcesContent":["'use client'\n\nimport type { CardProps } from '@novi-ui/core'\nimport type { ImgHTMLAttributes, ReactNode } from 'react'\nimport { Button } from 'react-aria-components'\nimport { cardStyles } from './card.styles'\n\ninterface PartProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Card の見出し部分。下端が境界線で仕切られる。\n *\n * @example\n * <CardHeader>売上</CardHeader>\n */\nexport function CardHeader({ children, className }: PartProps) {\n return (\n <div data-slot=\"header\" className={cardStyles().header({ class: className })}>\n {children}\n </div>\n )\n}\n\n/**\n * Card の本体。\n *\n * @example\n * <CardBody>¥1,240,000</CardBody>\n */\nexport function CardBody({ children, className }: PartProps) {\n return (\n <div data-slot=\"body\" className={cardStyles().body({ class: className })}>\n {children}\n </div>\n )\n}\n\n/**\n * Card の脚部。上端が境界線で仕切られる。\n *\n * @example\n * <CardFooter>前月比 +12%</CardFooter>\n */\nexport function CardFooter({ children, className }: PartProps) {\n return (\n <div data-slot=\"footer\" className={cardStyles().footer({ class: className })}>\n {children}\n </div>\n )\n}\n\n/**\n * Card の上部に置く画像。\n *\n * @example\n * <CardImage src=\"/thumb.jpg\" alt=\"\" />\n */\nexport function CardImage({ className, alt = '', ...props }: ImgHTMLAttributes<HTMLImageElement>) {\n return (\n <img\n {...props}\n alt={alt}\n data-slot=\"image\"\n className={cardStyles().image({ class: className })}\n />\n )\n}\n\n/**\n * 情報のまとまりを囲む器。\n *\n * 影は使わず、1px の境界線と余白だけで面を作る。\n * `onPress` を渡すと押せるカードになり、キーボード操作とフォーカスリングが付く。\n *\n * @example\n * <Card>\n * <CardHeader>売上</CardHeader>\n * <CardBody>¥1,240,000</CardBody>\n * </Card>\n */\nexport function Card({\n variant,\n radius,\n onPress,\n isDisabled,\n children,\n className,\n classNames,\n id,\n}: CardProps) {\n const isPressable = onPress !== undefined\n const s = cardStyles({ variant, radius, isPressable })\n const rootClass = s.root({ class: [className, classNames?.root] })\n\n if (isPressable) {\n return (\n <Button\n id={id}\n onPress={onPress}\n isDisabled={isDisabled}\n data-slot=\"root\"\n className={rootClass}\n >\n {children}\n </Button>\n )\n }\n\n return (\n <div id={id} data-slot=\"root\" className={rootClass}>\n {children}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;AAkBA,SAAgB,WAAW,EAAE,UAAU,aAAwB;CAC7D,OACE,oBAAC,OAAD;EAAK,aAAU;EAAS,WAAW,WAAW,CAAC,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC;EACxE;CACE,CAAA;AAET;;;;;;;AAQA,SAAgB,SAAS,EAAE,UAAU,aAAwB;CAC3D,OACE,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAW,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,UAAU,CAAC;EACpE;CACE,CAAA;AAET;;;;;;;AAQA,SAAgB,WAAW,EAAE,UAAU,aAAwB;CAC7D,OACE,oBAAC,OAAD;EAAK,aAAU;EAAS,WAAW,WAAW,CAAC,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC;EACxE;CACE,CAAA;AAET;;;;;;;AAQA,SAAgB,UAAU,EAAE,WAAW,MAAM,IAAI,GAAG,SAA8C;CAChG,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,aAAU;EACV,WAAW,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;CACnD,CAAA;AAEL;;;;;;;;;;;;;AAcA,SAAgB,KAAK,EACnB,SACA,QACA,SACA,YACA,UACA,WACA,YACA,MACY;CACZ,MAAM,cAAc,YAAY,KAAA;CAEhC,MAAM,YADI,WAAW;EAAE;EAAS;EAAQ;CAAY,CAClC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;CAEjE,IAAI,aACF,OACE,oBAAC,QAAD;EACM;EACK;EACG;EACZ,aAAU;EACV,WAAW;EAEV;CACK,CAAA;CAIZ,OACE,oBAAC,OAAD;EAAS;EAAI,aAAU;EAAO,WAAW;EACtC;CACE,CAAA;AAET"}
@@ -0,0 +1,70 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/card/card.styles.d.ts
3
+ /**
4
+ * Card のスタイル定義。
5
+ *
6
+ * @example
7
+ * const myCard = tv({ extend: cardStyles, slots: { body: 'p-6' } })
8
+ */
9
+ declare const cardStyles: import("tailwind-variants").TVReturnType<{
10
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
11
+ root: string;
12
+ }>;
13
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
14
+ root: string;
15
+ }>;
16
+ isPressable: {
17
+ true: {
18
+ root: string;
19
+ };
20
+ false: {};
21
+ };
22
+ }, {
23
+ root: string;
24
+ header: string;
25
+ body: string;
26
+ footer: string;
27
+ image: string;
28
+ }, undefined, {
29
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
30
+ root: string;
31
+ }>;
32
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
33
+ root: string;
34
+ }>;
35
+ isPressable: {
36
+ true: {
37
+ root: string;
38
+ };
39
+ false: {};
40
+ };
41
+ }, {
42
+ root: string;
43
+ header: string;
44
+ body: string;
45
+ footer: string;
46
+ image: string;
47
+ }, import("tailwind-variants").TVReturnTypeLike<{
48
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
49
+ root: string;
50
+ }>;
51
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
52
+ root: string;
53
+ }>;
54
+ isPressable: {
55
+ true: {
56
+ root: string;
57
+ };
58
+ false: {};
59
+ };
60
+ }, {
61
+ root: string;
62
+ header: string;
63
+ body: string;
64
+ footer: string;
65
+ image: string;
66
+ }>>;
67
+ type CardStyleProps = Parameters<typeof cardStyles>[0];
68
+ //#endregion
69
+ export { CardStyleProps, cardStyles };
70
+ //# sourceMappingURL=card.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.styles.d.mts","names":[],"sources":["../../src/card/card.styles.ts"],"mappings":";;;;;;;;cAiDa,wCAAU;;IAtBwB;;;IAQF;;;;;;;;;;;;;;;;IARE;;;IAQF;;;;;;;;;;;;;;;;IARE;;;IAQF;;;;;;;;;;;;;;;KAoCjC,iBAAiB,kBAAkB"}
@@ -0,0 +1,61 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/card/card.styles.ts
4
+ const slots = {
5
+ root: [
6
+ "text-[var(--novi-color-fg)]",
7
+ "flex flex-col",
8
+ "bg-[var(--novi-color-bg)]",
9
+ "shadow-[var(--novi-shadow-sm)]",
10
+ "overflow-hidden"
11
+ ].join(" "),
12
+ header: "px-4 py-3 border-b border-[var(--novi-color-border)]",
13
+ body: "px-4 py-4 flex-1",
14
+ footer: "px-4 py-3 border-t border-[var(--novi-color-border)]",
15
+ image: "w-full object-cover"
16
+ };
17
+ /**
18
+ * Card のスタイル定義。
19
+ *
20
+ * @example
21
+ * const myCard = tv({ extend: cardStyles, slots: { body: 'p-6' } })
22
+ */
23
+ const cardStyles = tv({
24
+ slots,
25
+ variants: {
26
+ variant: {
27
+ solid: { root: "bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)]" },
28
+ outline: { root: "bg-[var(--novi-color-bg)] border-[var(--novi-color-border-strong)]" },
29
+ soft: { root: "bg-[var(--novi-color-subtle)] border-transparent" },
30
+ ghost: { root: "bg-transparent border-transparent" },
31
+ plain: { root: "bg-transparent border-transparent" }
32
+ },
33
+ radius: {
34
+ none: { root: "rounded-[var(--novi-radius-none)]" },
35
+ sm: { root: "rounded-[var(--novi-radius-sm)]" },
36
+ md: { root: "rounded-[var(--novi-radius-md)]" },
37
+ lg: { root: "rounded-[var(--novi-radius-lg)]" },
38
+ full: { root: "rounded-[var(--novi-radius-full)]" }
39
+ },
40
+ isPressable: {
41
+ true: { root: [
42
+ "text-left cursor-pointer",
43
+ "transition-[border-color]",
44
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
45
+ "hover:border-[var(--novi-color-border-strong)]",
46
+ focusRing,
47
+ disabledState
48
+ ].join(" ") },
49
+ false: {}
50
+ }
51
+ },
52
+ defaultVariants: {
53
+ variant: "outline",
54
+ radius: "lg",
55
+ isPressable: false
56
+ }
57
+ });
58
+ //#endregion
59
+ export { cardStyles };
60
+
61
+ //# sourceMappingURL=card.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.styles.mjs","names":[],"sources":["../../src/card/card.styles.ts"],"sourcesContent":["import type {\n cardRequiredSlots,\n cardSlots,\n NoviRadius,\n NoviVariant,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\n\nconst slots = {\n // 影は使わない。面の区切りは 1px の境界線だけで表す\n root: [\n 'text-[var(--novi-color-fg)]',\n 'flex flex-col',\n 'bg-[var(--novi-color-bg)]',\n 'shadow-[var(--novi-shadow-sm)]',\n 'overflow-hidden',\n ].join(' '),\n // header と footer は境界線で仕切る。背景色を変えて面を増やさない\n header: 'px-4 py-3 border-b border-[var(--novi-color-border)]',\n body: 'px-4 py-4 flex-1',\n footer: 'px-4 py-3 border-t border-[var(--novi-color-border)]',\n image: 'w-full object-cover',\n} satisfies SlotMap<typeof cardSlots, (typeof cardRequiredSlots)[number]>\n\nconst variant: VariantMap<NoviVariant, { root: string }> = {\n solid: { root: 'bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)]' },\n outline: { root: 'bg-[var(--novi-color-bg)] border-[var(--novi-color-border-strong)]' },\n soft: { root: 'bg-[var(--novi-color-subtle)] border-transparent' },\n ghost: { root: 'bg-transparent border-transparent' },\n plain: { root: 'bg-transparent border-transparent' },\n}\n\nconst radius: VariantMap<NoviRadius, { root: string }> = {\n none: { root: 'rounded-[var(--novi-radius-none)]' },\n sm: { root: 'rounded-[var(--novi-radius-sm)]' },\n md: { root: 'rounded-[var(--novi-radius-md)]' },\n lg: { root: 'rounded-[var(--novi-radius-lg)]' },\n full: { root: 'rounded-[var(--novi-radius-full)]' },\n}\n\n/**\n * Card のスタイル定義。\n *\n * @example\n * const myCard = tv({ extend: cardStyles, slots: { body: 'p-6' } })\n */\nexport const cardStyles = tv({\n slots,\n variants: {\n variant,\n radius,\n isPressable: {\n true: {\n root: [\n 'text-left cursor-pointer',\n 'transition-[border-color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'hover:border-[var(--novi-color-border-strong)]',\n focusRing,\n disabledState,\n ].join(' '),\n },\n false: {},\n },\n },\n defaultVariants: { variant: 'outline', radius: 'lg', isPressable: false },\n})\n\nexport type CardStyleProps = Parameters<typeof cardStyles>[0]\n"],"mappings":";;;AAWA,MAAM,QAAQ;CAEZ,MAAM;EACJ;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,OAAO;AACT;;;;;;;AAwBA,MAAa,aAAa,GAAG;CAC3B;CACA,UAAU;EACR;GAxBF,OAAO,EAAE,MAAM,kEAAkE;GACjF,SAAS,EAAE,MAAM,qEAAqE;GACtF,MAAM,EAAE,MAAM,mDAAmD;GACjE,OAAO,EAAE,MAAM,oCAAoC;GACnD,OAAO,EAAE,MAAM,oCAAoC;EAoBjD;EACA;GAjBF,MAAM,EAAE,MAAM,oCAAoC;GAClD,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,MAAM,EAAE,MAAM,oCAAoC;EAahD;EACA,aAAa;GACX,MAAM,EACJ,MAAM;IACJ;IACA;IACA;IACA;IACA;IACA;GACF,CAAC,CAAC,KAAK,GAAG,EACZ;GACA,OAAO,CAAC;EACV;CACF;CACA,iBAAiB;EAAE,SAAS;EAAW,QAAQ;EAAM,aAAa;CAAM;AAC1E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Card, CardBody, CardFooter, CardHeader, CardImage } from "./card.mjs";
2
+ import { CardStyleProps, cardStyles } from "./card.styles.mjs";
3
+ export { Card, CardBody, CardFooter, CardHeader, CardImage, type CardStyleProps, cardStyles };
@@ -0,0 +1,24 @@
1
+ import { CheckboxGroupProps, CheckboxProps } from "@novi-ui/core";
2
+ //#region src/checkbox/checkbox.d.ts
3
+ /**
4
+ * チェックボックス。
5
+ *
6
+ * @example
7
+ * <Checkbox isSelected={agreed} onChange={setAgreed}>
8
+ * 利用規約に同意する
9
+ * </Checkbox>
10
+ */
11
+ declare function Checkbox({ size, color, value, isSelected, defaultSelected, onChange, isIndeterminate, isDisabled, isReadOnly, isRequired, isInvalid, description, children, className, classNames, id }: CheckboxProps): import("react").JSX.Element;
12
+ /**
13
+ * チェックボックスのグループ。ラベルとエラーをまとめて扱う。
14
+ *
15
+ * @example
16
+ * <CheckboxGroup label="通知方法" value={ways} onChange={setWays}>
17
+ * <Checkbox value="email">メール</Checkbox>
18
+ * <Checkbox value="sms">SMS</Checkbox>
19
+ * </CheckboxGroup>
20
+ */
21
+ declare function CheckboxGroup({ label, description, errorMessage, name, value, defaultValue, onChange, orientation, isDisabled, isReadOnly, isRequired, isInvalid, children, className, classNames, id }: CheckboxGroupProps): import("react").JSX.Element;
22
+ //#endregion
23
+ export { Checkbox, CheckboxGroup };
24
+ //# sourceMappingURL=checkbox.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.d.mts","names":[],"sources":["../../src/checkbox/checkbox.tsx"],"mappings":";;;;;;;;;;iBAiCgB,WACd,MACA,OACA,OACA,YACA,iBACA,UACA,iBACA,YACA,YACA,YACA,WACA,aACA,UACA,WACA,YACA,MACC,gCAAa,IAAA;;;;;;;;;;iBA2DA,gBACd,OACA,aACA,cACA,MACA,OACA,cACA,UACA,aACA,YACA,YACA,YACA,WACA,UACA,WACA,YACA,MACC,qCAAkB,IAAA"}