@novi-ui/raster 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 (188) hide show
  1. package/README.md +129 -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 +78 -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 +35 -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 +14 -0
  39. package/dist/button/button.d.mts.map +1 -0
  40. package/dist/button/button.mjs +75 -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 +118 -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 +62 -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 +89 -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 +83 -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 +40 -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 +47 -0
  87. package/dist/modal/modal.d.mts.map +1 -0
  88. package/dist/modal/modal.mjs +110 -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 +69 -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 +88 -0
  120. package/dist/radio/radio.styles.mjs.map +1 -0
  121. package/dist/raster.css +92 -0
  122. package/dist/raster.scoped.css +92 -0
  123. package/dist/select/index.d.mts +3 -0
  124. package/dist/select/select.d.mts +33 -0
  125. package/dist/select/select.d.mts.map +1 -0
  126. package/dist/select/select.mjs +114 -0
  127. package/dist/select/select.mjs.map +1 -0
  128. package/dist/select/select.styles.d.mts +82 -0
  129. package/dist/select/select.styles.d.mts.map +1 -0
  130. package/dist/select/select.styles.mjs +93 -0
  131. package/dist/select/select.styles.mjs.map +1 -0
  132. package/dist/skeleton/index.d.mts +3 -0
  133. package/dist/skeleton/skeleton.d.mts +15 -0
  134. package/dist/skeleton/skeleton.d.mts.map +1 -0
  135. package/dist/skeleton/skeleton.mjs +26 -0
  136. package/dist/skeleton/skeleton.mjs.map +1 -0
  137. package/dist/skeleton/skeleton.styles.d.mts +31 -0
  138. package/dist/skeleton/skeleton.styles.d.mts.map +1 -0
  139. package/dist/skeleton/skeleton.styles.mjs +22 -0
  140. package/dist/skeleton/skeleton.styles.mjs.map +1 -0
  141. package/dist/spinner/index.d.mts +3 -0
  142. package/dist/spinner/spinner.d.mts +15 -0
  143. package/dist/spinner/spinner.d.mts.map +1 -0
  144. package/dist/spinner/spinner.mjs +55 -0
  145. package/dist/spinner/spinner.mjs.map +1 -0
  146. package/dist/spinner/spinner.styles.d.mts +46 -0
  147. package/dist/spinner/spinner.styles.d.mts.map +1 -0
  148. package/dist/spinner/spinner.styles.mjs +37 -0
  149. package/dist/spinner/spinner.styles.mjs.map +1 -0
  150. package/dist/styles/focus-ring.mjs +23 -0
  151. package/dist/styles/focus-ring.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 +80 -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 +55 -0
  163. package/dist/tabs/tabs.d.mts.map +1 -0
  164. package/dist/tabs/tabs.mjs +84 -0
  165. package/dist/tabs/tabs.mjs.map +1 -0
  166. package/dist/tabs/tabs.styles.d.mts +55 -0
  167. package/dist/tabs/tabs.styles.d.mts.map +1 -0
  168. package/dist/tabs/tabs.styles.mjs +73 -0
  169. package/dist/tabs/tabs.styles.mjs.map +1 -0
  170. package/dist/textarea/index.d.mts +3 -0
  171. package/dist/textarea/textarea.d.mts +15 -0
  172. package/dist/textarea/textarea.d.mts.map +1 -0
  173. package/dist/textarea/textarea.mjs +70 -0
  174. package/dist/textarea/textarea.mjs.map +1 -0
  175. package/dist/textarea/textarea.styles.d.mts +73 -0
  176. package/dist/textarea/textarea.styles.d.mts.map +1 -0
  177. package/dist/textarea/textarea.styles.mjs +81 -0
  178. package/dist/textarea/textarea.styles.mjs.map +1 -0
  179. package/dist/toast/index.d.mts +3 -0
  180. package/dist/toast/toast.d.mts +38 -0
  181. package/dist/toast/toast.d.mts.map +1 -0
  182. package/dist/toast/toast.mjs +86 -0
  183. package/dist/toast/toast.mjs.map +1 -0
  184. package/dist/toast/toast.styles.d.mts +61 -0
  185. package/dist/toast/toast.styles.d.mts.map +1 -0
  186. package/dist/toast/toast.styles.mjs +59 -0
  187. package/dist/toast/toast.styles.mjs.map +1 -0
  188. package/package.json +59 -0
@@ -0,0 +1,80 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/switch/switch.styles.ts
4
+ /**
5
+ * Raster の Switch は**ピル型ではなく矩形**(ADR-R3)。
6
+ *
7
+ * 一般的なピル型トグルは「角を立てる」という Raster の原則と正面から衝突する。
8
+ * ここが「テーマ差は色と角丸ではなく構造」であることの最も分かりやすい実例になる。
9
+ *
10
+ * 形が見慣れないぶん ON/OFF が読み取りにくいので、**ラベルの併記を強く推奨**する。
11
+ */
12
+ const slots = {
13
+ root: [
14
+ "inline-flex items-center gap-2",
15
+ "cursor-pointer",
16
+ disabledState
17
+ ].join(" "),
18
+ track: [
19
+ "shrink-0 inline-flex items-center",
20
+ "rounded-[var(--novi-radius-none)]",
21
+ "border border-[var(--novi-color-border-strong)]",
22
+ "bg-[var(--novi-color-subtle)]",
23
+ "transition-[background-color,border-color]",
24
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
25
+ "group-data-[selected]:bg-[var(--c)] group-data-[selected]:border-[var(--c)]",
26
+ focusRing
27
+ ].join(" "),
28
+ thumb: [
29
+ "rounded-[var(--novi-radius-none)]",
30
+ "bg-[var(--novi-color-bg)]",
31
+ "transition-transform",
32
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]"
33
+ ].join(" "),
34
+ label: "text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]",
35
+ description: "text-[length:var(--novi-text-xs)] text-[var(--novi-color-muted)]"
36
+ };
37
+ /**
38
+ * Switch のスタイル定義。
39
+ *
40
+ * @example
41
+ * const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })
42
+ */
43
+ const switchStyles = tv({
44
+ slots,
45
+ variants: {
46
+ color: {
47
+ default: { root: "[--c:var(--novi-color-fg)]" },
48
+ primary: { root: "[--c:var(--novi-color-primary)]" },
49
+ secondary: { root: "[--c:var(--novi-color-secondary)]" },
50
+ success: { root: "[--c:var(--novi-color-success)]" },
51
+ warning: { root: "[--c:var(--novi-color-warning)]" },
52
+ danger: { root: "[--c:var(--novi-color-danger)]" }
53
+ },
54
+ size: {
55
+ sm: {
56
+ track: "h-4 w-7 p-0.5",
57
+ thumb: "size-3 group-data-[selected]:translate-x-3",
58
+ label: "text-[length:var(--novi-text-sm)]"
59
+ },
60
+ md: {
61
+ track: "h-5 w-9 p-0.5",
62
+ thumb: "size-4 group-data-[selected]:translate-x-4",
63
+ label: "text-[length:var(--novi-text-base)]"
64
+ },
65
+ lg: {
66
+ track: "h-6 w-11 p-0.5",
67
+ thumb: "size-5 group-data-[selected]:translate-x-5",
68
+ label: "text-[length:var(--novi-text-base)]"
69
+ }
70
+ }
71
+ },
72
+ defaultVariants: {
73
+ color: "default",
74
+ size: "md"
75
+ }
76
+ });
77
+ //#endregion
78
+ export { switchStyles };
79
+
80
+ //# 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 * Raster の Switch は**ピル型ではなく矩形**(ADR-R3)。\n *\n * 一般的なピル型トグルは「角を立てる」という Raster の原則と正面から衝突する。\n * ここが「テーマ差は色と角丸ではなく構造」であることの最も分かりやすい実例になる。\n *\n * 形が見慣れないぶん ON/OFF が読み取りにくいので、**ラベルの併記を強く推奨**する。\n */\nconst slots = {\n root: ['inline-flex items-center gap-2', 'cursor-pointer', disabledState].join(' '),\n track: [\n 'shrink-0 inline-flex items-center',\n 'rounded-[var(--novi-radius-none)]',\n 'border border-[var(--novi-color-border-strong)]',\n 'bg-[var(--novi-color-subtle)]',\n 'transition-[background-color,border-color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'group-data-[selected]:bg-[var(--c)] group-data-[selected]:border-[var(--c)]',\n focusRing,\n ].join(' '),\n // サムも矩形。translate で滑らせる(scale や rotate は使わない)\n thumb: [\n 'rounded-[var(--novi-radius-none)]',\n 'bg-[var(--novi-color-bg)]',\n 'transition-transform',\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-xs)] 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\nconst size: VariantMap<NoviSize, { track: string; thumb: string; label: string }> = {\n sm: {\n track: 'h-4 w-7 p-0.5',\n thumb: 'size-3 group-data-[selected]:translate-x-3',\n label: 'text-[length:var(--novi-text-sm)]',\n },\n md: {\n track: 'h-5 w-9 p-0.5',\n thumb: 'size-4 group-data-[selected]:translate-x-4',\n label: 'text-[length:var(--novi-text-base)]',\n },\n lg: {\n track: 'h-6 w-11 p-0.5',\n thumb: 'size-5 group-data-[selected]:translate-x-5',\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":";;;;;;;;;;;AAmBA,MAAM,QAAQ;CACZ,MAAM;EAAC;EAAkC;EAAkB;CAAa,CAAC,CAAC,KAAK,GAAG;CAClF,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,OAAO;EACL;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CACP,aAAa;AACf;;;;;;;AAmCA,MAAa,eAAe,GAAG;CAC7B;CACA,UAAU;EAAE;GAlCZ,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;EA6BrC;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,55 @@
1
+ import { ReactNode } from "react";
2
+ import { TabsProps } from "@novi-ui/core";
3
+ //#region src/tabs/tabs.d.ts
4
+ /**
5
+ * Tabs の見出し列。`Tab` を並べる。
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
+ * Raster では選択中を**下線1本と文字色**だけで示す。背景は変えない(ADR-R4)。
43
+ *
44
+ * @example
45
+ * <Tabs selectedKey={tab} onSelectionChange={setTab}>
46
+ * <TabItems>
47
+ * <TabItem id="profile">プロフィール</TabItem>
48
+ * </TabItems>
49
+ * <TabContent id="profile">…</TabContent>
50
+ * </Tabs>
51
+ */
52
+ declare function Tabs({ variant, size, orientation, selectedKey, defaultSelectedKey, onSelectionChange, isDisabled, disabledKeys, children, className, classNames, id }: TabsProps): import("react").JSX.Element;
53
+ //#endregion
54
+ export { TabContent, TabItem, TabItems, Tabs };
55
+ //# 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;;;;;;;iBAmBe,aACd,IACA,UACA;EAEA;EACA,WAAW;EACX;oBACD,IAAA;;;;;;;;;;;;;;iBAqBe,OACd,SACA,MACA,aACA,aACA,oBACA,mBACA,YACA,cACA,UACA,WACA,YACA,MACC,4BAAS,IAAA"}
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ import { tabsStyles } from "./tabs.styles.mjs";
3
+ import { Tab, TabList, TabPanel, Tabs } from "react-aria-components";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/tabs/tabs.tsx
6
+ /**
7
+ * Tabs の見出し列。`Tab` を並べる。
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
+ return /* @__PURE__ */ jsx(Tab, {
29
+ id,
30
+ isDisabled,
31
+ "data-slot": "tab",
32
+ className: tabsStyles().tab({ class: className }),
33
+ children
34
+ });
35
+ }
36
+ /**
37
+ * Tabs の中身1つ。`id` を見出しと合わせる。
38
+ *
39
+ * @example
40
+ * <TabContent id="profile">…</TabContent>
41
+ */
42
+ function TabContent({ id, children, className }) {
43
+ return /* @__PURE__ */ jsx(TabPanel, {
44
+ id,
45
+ "data-slot": "panel",
46
+ className: tabsStyles().panel({ class: className }),
47
+ children
48
+ });
49
+ }
50
+ /**
51
+ * 同じ階層の内容を切り替える。矢印キーでタブ間を移動できる。
52
+ *
53
+ * Raster では選択中を**下線1本と文字色**だけで示す。背景は変えない(ADR-R4)。
54
+ *
55
+ * @example
56
+ * <Tabs selectedKey={tab} onSelectionChange={setTab}>
57
+ * <TabItems>
58
+ * <TabItem id="profile">プロフィール</TabItem>
59
+ * </TabItems>
60
+ * <TabContent id="profile">…</TabContent>
61
+ * </Tabs>
62
+ */
63
+ function Tabs$1({ variant, size, orientation, selectedKey, defaultSelectedKey, onSelectionChange, isDisabled, disabledKeys, children, className, classNames, id }) {
64
+ const s = tabsStyles({
65
+ variant,
66
+ size
67
+ });
68
+ return /* @__PURE__ */ jsx(Tabs, {
69
+ id,
70
+ orientation,
71
+ selectedKey,
72
+ defaultSelectedKey,
73
+ onSelectionChange: (key) => onSelectionChange?.(String(key)),
74
+ isDisabled,
75
+ disabledKeys,
76
+ "data-slot": "root",
77
+ className: s.root({ class: [className, classNames?.root] }),
78
+ children
79
+ });
80
+ }
81
+ //#endregion
82
+ export { TabContent, TabItem, TabItems, Tabs$1 as Tabs };
83
+
84
+ //# 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 の見出し列。`Tab` を並べる。\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 return (\n <Tab\n id={id}\n isDisabled={isDisabled}\n data-slot=\"tab\"\n className={tabsStyles().tab({ class: className })}\n >\n {children}\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 * 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,OACE,oBAAC,KAAD;EACM;EACQ;EACZ,aAAU;EACV,WAAW,WAAW,CAAC,CAAC,IAAI,EAAE,OAAO,UAAU,CAAC;EAE/C;CACE,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;;;;;;;;;;;;;;AAeA,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,55 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/tabs/tabs.styles.d.ts
3
+ /**
4
+ * Tabs のスタイル定義。
5
+ *
6
+ * @example
7
+ * const myTabs = tv({ extend: tabsStyles, slots: { list: 'gap-6' } })
8
+ */
9
+ declare const tabsStyles: import("tailwind-variants").TVReturnType<{
10
+ size: VariantMap<"sm" | "md" | "lg", {
11
+ tab: string;
12
+ }>;
13
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
14
+ list: string;
15
+ tab: string;
16
+ }>;
17
+ }, {
18
+ root: string;
19
+ list: string;
20
+ tab: string;
21
+ indicator: string;
22
+ panel: string;
23
+ }, undefined, {
24
+ size: VariantMap<"sm" | "md" | "lg", {
25
+ tab: string;
26
+ }>;
27
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
28
+ list: string;
29
+ tab: string;
30
+ }>;
31
+ }, {
32
+ root: string;
33
+ list: string;
34
+ tab: string;
35
+ indicator: string;
36
+ panel: string;
37
+ }, import("tailwind-variants").TVReturnTypeLike<{
38
+ size: VariantMap<"sm" | "md" | "lg", {
39
+ tab: string;
40
+ }>;
41
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
42
+ list: string;
43
+ tab: string;
44
+ }>;
45
+ }, {
46
+ root: string;
47
+ list: string;
48
+ tab: string;
49
+ indicator: string;
50
+ panel: string;
51
+ }>>;
52
+ type TabsStyleProps = Parameters<typeof tabsStyles>[0];
53
+ //#endregion
54
+ export { TabsStyleProps, tabsStyles };
55
+ //# 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":";;;;;;;;cAyDa,wCAAU;;IAZiB;;;IARO;IAAa;;;;;;;;;;IAQpB;;;IARO;IAAa;;;;;;;;;;IAQpB;;;IARO;IAAa;;;;;;;;;KA0BhD,iBAAiB,kBAAkB"}
@@ -0,0 +1,73 @@
1
+ import { focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/tabs/tabs.styles.ts
4
+ /**
5
+ * Raster の Tabs は**アクティブを下線1本と文字色だけで示す**(ADR-R4)。
6
+ *
7
+ * 背景の塗り分けはミニマルの原則(面を増やさない)に反するので使わない。
8
+ * 下線は非テキストコントラスト 3:1 を満たす色を使う。
9
+ */
10
+ const slots = {
11
+ root: "flex flex-col gap-4",
12
+ list: "flex gap-1 border-b border-[var(--novi-color-border)]",
13
+ tab: [
14
+ "relative cursor-pointer outline-none whitespace-nowrap",
15
+ "text-[var(--novi-color-muted)]",
16
+ "border-b border-transparent -mb-px",
17
+ "transition-[color,border-color]",
18
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
19
+ "hover:text-[var(--novi-color-fg)]",
20
+ "data-[selected]:text-[var(--novi-color-fg)]",
21
+ "data-[selected]:border-[var(--novi-color-fg)]",
22
+ "data-[disabled]:opacity-40 data-[disabled]:cursor-default",
23
+ focusRing
24
+ ].join(" "),
25
+ indicator: "hidden",
26
+ panel: "outline-none text-[var(--novi-color-fg)]"
27
+ };
28
+ /**
29
+ * Tabs のスタイル定義。
30
+ *
31
+ * @example
32
+ * const myTabs = tv({ extend: tabsStyles, slots: { list: 'gap-6' } })
33
+ */
34
+ const tabsStyles = tv({
35
+ slots,
36
+ variants: {
37
+ size: {
38
+ sm: { tab: "px-2.5 py-1.5 text-[length:var(--novi-text-sm)]" },
39
+ md: { tab: "px-3 py-2 text-[length:var(--novi-text-base)]" },
40
+ lg: { tab: "px-4 py-2.5 text-[length:var(--novi-text-base)]" }
41
+ },
42
+ variant: {
43
+ solid: {
44
+ list: "bg-[var(--novi-color-subtle)] p-1 border-transparent",
45
+ tab: "border-b-0"
46
+ },
47
+ outline: {
48
+ list: "border-b border-[var(--novi-color-border)]",
49
+ tab: ""
50
+ },
51
+ soft: {
52
+ list: "bg-[var(--novi-color-subtle)] border-transparent",
53
+ tab: ""
54
+ },
55
+ ghost: {
56
+ list: "border-transparent",
57
+ tab: ""
58
+ },
59
+ plain: {
60
+ list: "border-transparent gap-4",
61
+ tab: "border-b-0"
62
+ }
63
+ }
64
+ },
65
+ defaultVariants: {
66
+ variant: "outline",
67
+ size: "md"
68
+ }
69
+ });
70
+ //#endregion
71
+ export { tabsStyles };
72
+
73
+ //# sourceMappingURL=tabs.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.styles.mjs","names":[],"sources":["../../src/tabs/tabs.styles.ts"],"sourcesContent":["import type {\n NoviSize,\n NoviVariant,\n SlotMap,\n tabsRequiredSlots,\n tabsSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { focusRing } from '../styles/focus-ring'\n\n/**\n * Raster の Tabs は**アクティブを下線1本と文字色だけで示す**(ADR-R4)。\n *\n * 背景の塗り分けはミニマルの原則(面を増やさない)に反するので使わない。\n * 下線は非テキストコントラスト 3:1 を満たす色を使う。\n */\nconst slots = {\n root: 'flex flex-col gap-4',\n list: 'flex gap-1 border-b border-[var(--novi-color-border)]',\n tab: [\n 'relative cursor-pointer outline-none whitespace-nowrap',\n 'text-[var(--novi-color-muted)]',\n 'border-b border-transparent -mb-px',\n 'transition-[color,border-color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'hover:text-[var(--novi-color-fg)]',\n // 背景は変えない。文字色と下線だけで示す\n 'data-[selected]:text-[var(--novi-color-fg)]',\n 'data-[selected]:border-[var(--novi-color-fg)]',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-default',\n focusRing,\n ].join(' '),\n indicator: 'hidden',\n panel: 'outline-none text-[var(--novi-color-fg)]',\n} satisfies SlotMap<typeof tabsSlots, (typeof tabsRequiredSlots)[number]>\n\nconst variant: VariantMap<NoviVariant, { list: string; tab: string }> = {\n solid: { list: 'bg-[var(--novi-color-subtle)] p-1 border-transparent', tab: 'border-b-0' },\n outline: { list: 'border-b border-[var(--novi-color-border)]', tab: '' },\n soft: { list: 'bg-[var(--novi-color-subtle)] border-transparent', tab: '' },\n ghost: { list: 'border-transparent', tab: '' },\n plain: { list: 'border-transparent gap-4', tab: 'border-b-0' },\n}\n\nconst size: VariantMap<NoviSize, { tab: string }> = {\n sm: { tab: 'px-2.5 py-1.5 text-[length:var(--novi-text-sm)]' },\n md: { tab: 'px-3 py-2 text-[length:var(--novi-text-base)]' },\n lg: { tab: 'px-4 py-2.5 text-[length:var(--novi-text-base)]' },\n}\n\n/**\n * Tabs のスタイル定義。\n *\n * @example\n * const myTabs = tv({ extend: tabsStyles, slots: { list: 'gap-6' } })\n */\nexport const tabsStyles = tv({\n slots,\n variants: { size, variant },\n defaultVariants: { variant: 'outline', size: 'md' },\n})\n\nexport type TabsStyleProps = Parameters<typeof tabsStyles>[0]\n"],"mappings":";;;;;;;;;AAiBA,MAAM,QAAQ;CACZ,MAAM;CACN,MAAM;CACN,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,WAAW;CACX,OAAO;AACT;;;;;;;AAsBA,MAAa,aAAa,GAAG;CAC3B;CACA,UAAU;EAAE;GAbZ,IAAI,EAAE,KAAK,kDAAkD;GAC7D,IAAI,EAAE,KAAK,gDAAgD;GAC3D,IAAI,EAAE,KAAK,kDAAkD;EAWjD;EAAM;GArBlB,OAAO;IAAE,MAAM;IAAwD,KAAK;GAAa;GACzF,SAAS;IAAE,MAAM;IAA8C,KAAK;GAAG;GACvE,MAAM;IAAE,MAAM;IAAoD,KAAK;GAAG;GAC1E,OAAO;IAAE,MAAM;IAAsB,KAAK;GAAG;GAC7C,OAAO;IAAE,MAAM;IAA4B,KAAK;GAAa;EAiB3C;CAAQ;CAC1B,iBAAiB;EAAE,SAAS;EAAW,MAAM;CAAK;AACpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TextArea } from "./textarea.mjs";
2
+ import { TextareaStyleProps, textareaStyles } from "./textarea.styles.mjs";
3
+ export { TextArea, type TextareaStyleProps, textareaStyles };
@@ -0,0 +1,15 @@
1
+ import { TextareaProps } from "@novi-ui/core";
2
+ //#region src/textarea/textarea.d.ts
3
+ /**
4
+ * 複数行テキスト入力。
5
+ *
6
+ * `onKeyDown` は IME 変換中のキーを受け取らない。
7
+ * 横方向のリサイズは許可しない(レイアウトが崩れるため)。
8
+ *
9
+ * @example
10
+ * <TextArea label="備考" rows={4} maxLength={500} />
11
+ */
12
+ declare function TextArea({ variant, size, radius, label, placeholder, description, errorMessage, name, value, defaultValue, onChange, onKeyDown, rows, maxLength, isDisabled, isReadOnly, isRequired, isInvalid, className, classNames, id }: TextareaProps): import("react").JSX.Element;
13
+ //#endregion
14
+ export { TextArea };
15
+ //# sourceMappingURL=textarea.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.mts","names":[],"sources":["../../src/textarea/textarea.tsx"],"mappings":";;;;;;;;;;;iBAuBgB,WACd,SACA,MACA,QACA,OACA,aACA,aACA,cACA,MACA,OACA,cACA,UACA,WACA,MACA,WACA,YACA,YACA,YACA,WACA,WACA,YACA,MACC,gCAAa,IAAA"}
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import { textareaStyles } from "./textarea.styles.mjs";
3
+ import { FieldError, Group, Label, Text, TextArea, TextField } from "react-aria-components";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { useImeSafeKeys } from "@novi-ui/core/client";
6
+ //#region src/textarea/textarea.tsx
7
+ /**
8
+ * 複数行テキスト入力。
9
+ *
10
+ * `onKeyDown` は IME 変換中のキーを受け取らない。
11
+ * 横方向のリサイズは許可しない(レイアウトが崩れるため)。
12
+ *
13
+ * @example
14
+ * <TextArea label="備考" rows={4} maxLength={500} />
15
+ */
16
+ function TextArea$1({ variant, size, radius, label, placeholder, description, errorMessage, name, value, defaultValue, onChange, onKeyDown, rows = 3, maxLength, isDisabled, isReadOnly, isRequired, isInvalid, className, classNames, id }) {
17
+ const s = textareaStyles({
18
+ variant,
19
+ size,
20
+ radius
21
+ });
22
+ const keyProps = useImeSafeKeys(onKeyDown);
23
+ return /* @__PURE__ */ jsxs(TextField, {
24
+ id,
25
+ name,
26
+ value,
27
+ defaultValue,
28
+ onChange,
29
+ isDisabled,
30
+ isReadOnly,
31
+ isRequired,
32
+ isInvalid,
33
+ "data-slot": "root",
34
+ className: s.root({ class: [className, classNames?.root] }),
35
+ children: [
36
+ label !== void 0 && /* @__PURE__ */ jsx(Label, {
37
+ "data-slot": "label",
38
+ className: s.label({ class: classNames?.label }),
39
+ children: label
40
+ }),
41
+ /* @__PURE__ */ jsx(Group, {
42
+ "data-slot": "inputWrapper",
43
+ className: s.inputWrapper({ class: classNames?.inputWrapper }),
44
+ children: /* @__PURE__ */ jsx(TextArea, {
45
+ "data-slot": "textarea",
46
+ placeholder,
47
+ rows,
48
+ maxLength,
49
+ className: s.textarea({ class: classNames?.textarea }),
50
+ ...keyProps
51
+ })
52
+ }),
53
+ description !== void 0 && /* @__PURE__ */ jsx(Text, {
54
+ slot: "description",
55
+ "data-slot": "description",
56
+ className: s.description({ class: classNames?.description }),
57
+ children: description
58
+ }),
59
+ /* @__PURE__ */ jsx(FieldError, {
60
+ "data-slot": "errorMessage",
61
+ className: s.errorMessage({ class: classNames?.errorMessage }),
62
+ children: errorMessage
63
+ })
64
+ ]
65
+ });
66
+ }
67
+ //#endregion
68
+ export { TextArea$1 as TextArea };
69
+
70
+ //# sourceMappingURL=textarea.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.mjs","names":["TextArea","RACTextArea"],"sources":["../../src/textarea/textarea.tsx"],"sourcesContent":["'use client'\n\nimport type { TextareaProps } from '@novi-ui/core'\nimport { useImeSafeKeys } from '@novi-ui/core/client'\nimport {\n FieldError,\n Group,\n Label,\n TextArea as RACTextArea,\n Text,\n TextField,\n} from 'react-aria-components'\nimport { textareaStyles } from './textarea.styles'\n\n/**\n * 複数行テキスト入力。\n *\n * `onKeyDown` は IME 変換中のキーを受け取らない。\n * 横方向のリサイズは許可しない(レイアウトが崩れるため)。\n *\n * @example\n * <TextArea label=\"備考\" rows={4} maxLength={500} />\n */\nexport function TextArea({\n variant,\n size,\n radius,\n label,\n placeholder,\n description,\n errorMessage,\n name,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n rows = 3,\n maxLength,\n isDisabled,\n isReadOnly,\n isRequired,\n isInvalid,\n className,\n classNames,\n id,\n}: TextareaProps) {\n const s = textareaStyles({ variant, size, radius })\n const keyProps = useImeSafeKeys<HTMLTextAreaElement>(onKeyDown)\n\n return (\n <TextField\n id={id}\n name={name}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n >\n {label !== undefined && (\n <Label data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {label}\n </Label>\n )}\n\n <Group\n data-slot=\"inputWrapper\"\n className={s.inputWrapper({ class: classNames?.inputWrapper })}\n >\n <RACTextArea\n data-slot=\"textarea\"\n placeholder={placeholder}\n rows={rows}\n maxLength={maxLength}\n className={s.textarea({ class: classNames?.textarea })}\n {...keyProps}\n />\n </Group>\n\n {description !== undefined && (\n <Text\n slot=\"description\"\n data-slot=\"description\"\n className={s.description({ class: classNames?.description })}\n >\n {description}\n </Text>\n )}\n\n <FieldError\n data-slot=\"errorMessage\"\n className={s.errorMessage({ class: classNames?.errorMessage })}\n >\n {errorMessage}\n </FieldError>\n </TextField>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,SAAgBA,WAAS,EACvB,SACA,MACA,QACA,OACA,aACA,aACA,cACA,MACA,OACA,cACA,UACA,WACA,OAAO,GACP,WACA,YACA,YACA,YACA,WACA,WACA,YACA,MACgB;CAChB,MAAM,IAAI,eAAe;EAAE;EAAS;EAAM;CAAO,CAAC;CAClD,MAAM,WAAW,eAAoC,SAAS;CAE9D,OACE,qBAAC,WAAD;EACM;EACE;EACC;EACO;EACJ;EACE;EACA;EACA;EACD;EACX,aAAU;EACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAX5D,UAAA;GAaG,UAAU,KAAA,KACT,oBAAC,OAAD;IAAO,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IACrE,UAAA;GACI,CAAA;GAGT,oBAAC,OAAD;IACE,aAAU;IACV,WAAW,EAAE,aAAa,EAAE,OAAO,YAAY,aAAa,CAAC;IAE7D,UAAA,oBAACC,UAAD;KACE,aAAU;KACG;KACP;KACK;KACX,WAAW,EAAE,SAAS,EAAE,OAAO,YAAY,SAAS,CAAC;KACrD,GAAI;IACL,CAAA;GACI,CAAA;GAEN,gBAAgB,KAAA,KACf,oBAAC,MAAD;IACE,MAAK;IACL,aAAU;IACV,WAAW,EAAE,YAAY,EAAE,OAAO,YAAY,YAAY,CAAC;IAE1D,UAAA;GACG,CAAA;GAGR,oBAAC,YAAD;IACE,aAAU;IACV,WAAW,EAAE,aAAa,EAAE,OAAO,YAAY,aAAa,CAAC;IAE5D,UAAA;GACS,CAAA;EACH;;AAEf"}
@@ -0,0 +1,73 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/textarea/textarea.styles.d.ts
3
+ /**
4
+ * TextArea のスタイル定義。
5
+ *
6
+ * @example
7
+ * import { textareaStyles } from '@novi-ui/raster'
8
+ * import { tv } from 'tailwind-variants'
9
+ *
10
+ * const myTextarea = tv({
11
+ * extend: textareaStyles,
12
+ * slots: { textarea: 'font-mono' },
13
+ * })
14
+ */
15
+ declare const textareaStyles: import("tailwind-variants").TVReturnType<{
16
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
17
+ inputWrapper: string;
18
+ }>;
19
+ size: VariantMap<"sm" | "md" | "lg", {
20
+ inputWrapper: string;
21
+ textarea: string;
22
+ }>;
23
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
24
+ inputWrapper: string;
25
+ }>;
26
+ }, {
27
+ root: string;
28
+ label: string;
29
+ inputWrapper: string;
30
+ textarea: string;
31
+ description: string;
32
+ errorMessage: string;
33
+ }, undefined, {
34
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
35
+ inputWrapper: string;
36
+ }>;
37
+ size: VariantMap<"sm" | "md" | "lg", {
38
+ inputWrapper: string;
39
+ textarea: string;
40
+ }>;
41
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
42
+ inputWrapper: string;
43
+ }>;
44
+ }, {
45
+ root: string;
46
+ label: string;
47
+ inputWrapper: string;
48
+ textarea: string;
49
+ description: string;
50
+ errorMessage: string;
51
+ }, import("tailwind-variants").TVReturnTypeLike<{
52
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
53
+ inputWrapper: string;
54
+ }>;
55
+ size: VariantMap<"sm" | "md" | "lg", {
56
+ inputWrapper: string;
57
+ textarea: string;
58
+ }>;
59
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
60
+ inputWrapper: string;
61
+ }>;
62
+ }, {
63
+ root: string;
64
+ label: string;
65
+ inputWrapper: string;
66
+ textarea: string;
67
+ description: string;
68
+ errorMessage: string;
69
+ }>>;
70
+ type TextareaStyleProps = Parameters<typeof textareaStyles>[0];
71
+ //#endregion
72
+ export { TextareaStyleProps, textareaStyles };
73
+ //# sourceMappingURL=textarea.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.styles.d.mts","names":[],"sources":["../../src/textarea/textarea.styles.ts"],"mappings":";;;;;;;;;;;;;;cA8Ea,4CAAc;;IAvC4B;;;IAaN;IAAkB;;;IAMd;;;;;;;;;;;IAnBE;;;IAaN;IAAkB;;;IAMd;;;;;;;;;;;IAnBE;;;IAaN;IAAkB;;;IAMd;;;;;;;;;;KA0BzC,qBAAqB,kBAAkB"}
@@ -0,0 +1,81 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/textarea/textarea.styles.ts
4
+ const slots = {
5
+ root: "flex flex-col gap-1.5",
6
+ label: "text-[length:var(--novi-text-sm)] font-medium text-[var(--novi-color-fg)]",
7
+ inputWrapper: [
8
+ "text-[var(--novi-color-fg)]",
9
+ "flex w-full",
10
+ "bg-[var(--novi-color-bg)]",
11
+ "border border-[var(--novi-color-border-strong)]",
12
+ "transition-[border-color,opacity]",
13
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
14
+ "data-[invalid]:border-[var(--novi-color-danger)]",
15
+ focusRing,
16
+ disabledState
17
+ ].join(" "),
18
+ textarea: [
19
+ "w-full min-w-0 bg-transparent outline-none",
20
+ "text-[var(--novi-color-fg)]",
21
+ "placeholder:text-[var(--novi-color-muted)]",
22
+ "resize-y",
23
+ "leading-[var(--novi-leading-body)]"
24
+ ].join(" "),
25
+ description: "text-[length:var(--novi-text-xs)] text-[var(--novi-color-muted)]",
26
+ errorMessage: "text-[length:var(--novi-text-xs)] text-[var(--novi-color-danger)]"
27
+ };
28
+ /**
29
+ * TextArea のスタイル定義。
30
+ *
31
+ * @example
32
+ * import { textareaStyles } from '@novi-ui/raster'
33
+ * import { tv } from 'tailwind-variants'
34
+ *
35
+ * const myTextarea = tv({
36
+ * extend: textareaStyles,
37
+ * slots: { textarea: 'font-mono' },
38
+ * })
39
+ */
40
+ const textareaStyles = tv({
41
+ slots,
42
+ variants: {
43
+ variant: {
44
+ solid: { inputWrapper: "bg-[var(--novi-color-subtle)] border-[var(--novi-color-border-strong)]" },
45
+ outline: { inputWrapper: "bg-[var(--novi-color-bg)] border-[var(--novi-color-border-strong)]" },
46
+ soft: { inputWrapper: "bg-[var(--novi-color-subtle)] border-transparent" },
47
+ ghost: { inputWrapper: "bg-transparent border-transparent border-b-[var(--novi-color-border-strong)]" },
48
+ plain: { inputWrapper: "bg-transparent border-transparent" }
49
+ },
50
+ size: {
51
+ sm: {
52
+ inputWrapper: "px-2.5 py-1.5",
53
+ textarea: "text-[length:var(--novi-text-sm)]"
54
+ },
55
+ md: {
56
+ inputWrapper: "px-3 py-2",
57
+ textarea: "text-[length:var(--novi-text-base)]"
58
+ },
59
+ lg: {
60
+ inputWrapper: "px-3.5 py-2.5",
61
+ textarea: "text-[length:var(--novi-text-base)]"
62
+ }
63
+ },
64
+ radius: {
65
+ none: { inputWrapper: "rounded-[var(--novi-radius-none)]" },
66
+ sm: { inputWrapper: "rounded-[var(--novi-radius-sm)]" },
67
+ md: { inputWrapper: "rounded-[var(--novi-radius-md)]" },
68
+ lg: { inputWrapper: "rounded-[var(--novi-radius-lg)]" },
69
+ full: { inputWrapper: "rounded-[var(--novi-radius-full)]" }
70
+ }
71
+ },
72
+ defaultVariants: {
73
+ variant: "outline",
74
+ size: "md",
75
+ radius: "none"
76
+ }
77
+ });
78
+ //#endregion
79
+ export { textareaStyles };
80
+
81
+ //# sourceMappingURL=textarea.styles.mjs.map