@novi-ui/flatlay 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 (212) hide show
  1. package/README.md +418 -0
  2. package/dist/accordion/accordion.d.mts +35 -0
  3. package/dist/accordion/accordion.d.mts.map +1 -0
  4. package/dist/accordion/accordion.mjs +74 -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 +91 -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 +22 -0
  12. package/dist/avatar/avatar.d.mts.map +1 -0
  13. package/dist/avatar/avatar.mjs +60 -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 +55 -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 +110 -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 +36 -0
  30. package/dist/breadcrumbs/breadcrumbs.d.mts.map +1 -0
  31. package/dist/breadcrumbs/breadcrumbs.mjs +82 -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 +45 -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 +18 -0
  39. package/dist/button/button.d.mts.map +1 -0
  40. package/dist/button/button.mjs +79 -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 +137 -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 +73 -0
  52. package/dist/card/card.styles.d.mts.map +1 -0
  53. package/dist/card/card.styles.mjs +72 -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 +27 -0
  57. package/dist/checkbox/checkbox.d.mts.map +1 -0
  58. package/dist/checkbox/checkbox.mjs +109 -0
  59. package/dist/checkbox/checkbox.mjs.map +1 -0
  60. package/dist/checkbox/checkbox.styles.d.mts +114 -0
  61. package/dist/checkbox/checkbox.styles.d.mts.map +1 -0
  62. package/dist/checkbox/checkbox.styles.mjs +105 -0
  63. package/dist/checkbox/checkbox.styles.mjs.map +1 -0
  64. package/dist/checkbox/index.d.mts +3 -0
  65. package/dist/color-picker/color-picker.d.mts +30 -0
  66. package/dist/color-picker/color-picker.d.mts.map +1 -0
  67. package/dist/color-picker/color-picker.mjs +100 -0
  68. package/dist/color-picker/color-picker.mjs.map +1 -0
  69. package/dist/color-picker/color-picker.styles.d.mts +91 -0
  70. package/dist/color-picker/color-picker.styles.d.mts.map +1 -0
  71. package/dist/color-picker/color-picker.styles.mjs +79 -0
  72. package/dist/color-picker/color-picker.styles.mjs.map +1 -0
  73. package/dist/color-picker/index.d.mts +3 -0
  74. package/dist/flatlay.css +381 -0
  75. package/dist/flatlay.scoped.css +381 -0
  76. package/dist/index.d.mts +67 -0
  77. package/dist/index.mjs +46 -0
  78. package/dist/input/index.d.mts +3 -0
  79. package/dist/input/input.d.mts +23 -0
  80. package/dist/input/input.d.mts.map +1 -0
  81. package/dist/input/input.mjs +89 -0
  82. package/dist/input/input.mjs.map +1 -0
  83. package/dist/input/input.styles.d.mts +97 -0
  84. package/dist/input/input.styles.d.mts.map +1 -0
  85. package/dist/input/input.styles.mjs +96 -0
  86. package/dist/input/input.styles.mjs.map +1 -0
  87. package/dist/menu/index.d.mts +3 -0
  88. package/dist/menu/menu.d.mts +66 -0
  89. package/dist/menu/menu.d.mts.map +1 -0
  90. package/dist/menu/menu.mjs +118 -0
  91. package/dist/menu/menu.mjs.map +1 -0
  92. package/dist/menu/menu.styles.d.mts +114 -0
  93. package/dist/menu/menu.styles.d.mts.map +1 -0
  94. package/dist/menu/menu.styles.mjs +66 -0
  95. package/dist/menu/menu.styles.mjs.map +1 -0
  96. package/dist/modal/index.d.mts +3 -0
  97. package/dist/modal/modal.d.mts +55 -0
  98. package/dist/modal/modal.d.mts.map +1 -0
  99. package/dist/modal/modal.mjs +120 -0
  100. package/dist/modal/modal.mjs.map +1 -0
  101. package/dist/modal/modal.styles.d.mts +70 -0
  102. package/dist/modal/modal.styles.d.mts.map +1 -0
  103. package/dist/modal/modal.styles.mjs +83 -0
  104. package/dist/modal/modal.styles.mjs.map +1 -0
  105. package/dist/popover/index.d.mts +3 -0
  106. package/dist/popover/popover.d.mts +33 -0
  107. package/dist/popover/popover.d.mts.map +1 -0
  108. package/dist/popover/popover.mjs +57 -0
  109. package/dist/popover/popover.mjs.map +1 -0
  110. package/dist/popover/popover.styles.d.mts +40 -0
  111. package/dist/popover/popover.styles.d.mts.map +1 -0
  112. package/dist/popover/popover.styles.mjs +47 -0
  113. package/dist/popover/popover.styles.mjs.map +1 -0
  114. package/dist/progress/index.d.mts +3 -0
  115. package/dist/progress/progress.d.mts +15 -0
  116. package/dist/progress/progress.d.mts.map +1 -0
  117. package/dist/progress/progress.mjs +55 -0
  118. package/dist/progress/progress.mjs.map +1 -0
  119. package/dist/progress/progress.styles.d.mts +100 -0
  120. package/dist/progress/progress.styles.d.mts.map +1 -0
  121. package/dist/progress/progress.styles.mjs +65 -0
  122. package/dist/progress/progress.styles.mjs.map +1 -0
  123. package/dist/radio/index.d.mts +3 -0
  124. package/dist/radio/radio.d.mts +25 -0
  125. package/dist/radio/radio.d.mts.map +1 -0
  126. package/dist/radio/radio.mjs +99 -0
  127. package/dist/radio/radio.mjs.map +1 -0
  128. package/dist/radio/radio.styles.d.mts +114 -0
  129. package/dist/radio/radio.styles.d.mts.map +1 -0
  130. package/dist/radio/radio.styles.mjs +103 -0
  131. package/dist/radio/radio.styles.mjs.map +1 -0
  132. package/dist/select/index.d.mts +3 -0
  133. package/dist/select/select.d.mts +40 -0
  134. package/dist/select/select.d.mts.map +1 -0
  135. package/dist/select/select.mjs +121 -0
  136. package/dist/select/select.mjs.map +1 -0
  137. package/dist/select/select.styles.d.mts +85 -0
  138. package/dist/select/select.styles.d.mts.map +1 -0
  139. package/dist/select/select.styles.mjs +111 -0
  140. package/dist/select/select.styles.mjs.map +1 -0
  141. package/dist/skeleton/index.d.mts +3 -0
  142. package/dist/skeleton/skeleton.d.mts +15 -0
  143. package/dist/skeleton/skeleton.d.mts.map +1 -0
  144. package/dist/skeleton/skeleton.mjs +26 -0
  145. package/dist/skeleton/skeleton.mjs.map +1 -0
  146. package/dist/skeleton/skeleton.styles.d.mts +47 -0
  147. package/dist/skeleton/skeleton.styles.d.mts.map +1 -0
  148. package/dist/skeleton/skeleton.styles.mjs +31 -0
  149. package/dist/skeleton/skeleton.styles.mjs.map +1 -0
  150. package/dist/spinner/index.d.mts +3 -0
  151. package/dist/spinner/spinner.d.mts +15 -0
  152. package/dist/spinner/spinner.d.mts.map +1 -0
  153. package/dist/spinner/spinner.mjs +55 -0
  154. package/dist/spinner/spinner.mjs.map +1 -0
  155. package/dist/spinner/spinner.styles.d.mts +46 -0
  156. package/dist/spinner/spinner.styles.d.mts.map +1 -0
  157. package/dist/spinner/spinner.styles.mjs +50 -0
  158. package/dist/spinner/spinner.styles.mjs.map +1 -0
  159. package/dist/styles/focus-ring.mjs +30 -0
  160. package/dist/styles/focus-ring.mjs.map +1 -0
  161. package/dist/styles/inflow.mjs +156 -0
  162. package/dist/styles/inflow.mjs.map +1 -0
  163. package/dist/styles/mono.mjs +24 -0
  164. package/dist/styles/mono.mjs.map +1 -0
  165. package/dist/switch/index.d.mts +3 -0
  166. package/dist/switch/switch.d.mts +18 -0
  167. package/dist/switch/switch.d.mts.map +1 -0
  168. package/dist/switch/switch.mjs +58 -0
  169. package/dist/switch/switch.mjs.map +1 -0
  170. package/dist/switch/switch.styles.d.mts +58 -0
  171. package/dist/switch/switch.styles.d.mts.map +1 -0
  172. package/dist/switch/switch.styles.mjs +86 -0
  173. package/dist/switch/switch.styles.mjs.map +1 -0
  174. package/dist/tabs/index.d.mts +3 -0
  175. package/dist/tabs/tabs.d.mts +64 -0
  176. package/dist/tabs/tabs.d.mts.map +1 -0
  177. package/dist/tabs/tabs.mjs +93 -0
  178. package/dist/tabs/tabs.mjs.map +1 -0
  179. package/dist/tabs/tabs.styles.d.mts +64 -0
  180. package/dist/tabs/tabs.styles.d.mts.map +1 -0
  181. package/dist/tabs/tabs.styles.mjs +118 -0
  182. package/dist/tabs/tabs.styles.mjs.map +1 -0
  183. package/dist/textarea/index.d.mts +3 -0
  184. package/dist/textarea/textarea.d.mts +15 -0
  185. package/dist/textarea/textarea.d.mts.map +1 -0
  186. package/dist/textarea/textarea.mjs +70 -0
  187. package/dist/textarea/textarea.mjs.map +1 -0
  188. package/dist/textarea/textarea.styles.d.mts +70 -0
  189. package/dist/textarea/textarea.styles.d.mts.map +1 -0
  190. package/dist/textarea/textarea.styles.mjs +85 -0
  191. package/dist/textarea/textarea.styles.mjs.map +1 -0
  192. package/dist/toast/index.d.mts +3 -0
  193. package/dist/toast/toast.d.mts +47 -0
  194. package/dist/toast/toast.d.mts.map +1 -0
  195. package/dist/toast/toast.mjs +100 -0
  196. package/dist/toast/toast.mjs.map +1 -0
  197. package/dist/toast/toast.styles.d.mts +61 -0
  198. package/dist/toast/toast.styles.d.mts.map +1 -0
  199. package/dist/toast/toast.styles.mjs +79 -0
  200. package/dist/toast/toast.styles.mjs.map +1 -0
  201. package/dist/tokens/color-set.mjs +124 -0
  202. package/dist/tokens/color-set.mjs.map +1 -0
  203. package/dist/tooltip/index.d.mts +3 -0
  204. package/dist/tooltip/tooltip.d.mts +20 -0
  205. package/dist/tooltip/tooltip.d.mts.map +1 -0
  206. package/dist/tooltip/tooltip.mjs +45 -0
  207. package/dist/tooltip/tooltip.mjs.map +1 -0
  208. package/dist/tooltip/tooltip.styles.d.mts +48 -0
  209. package/dist/tooltip/tooltip.styles.d.mts.map +1 -0
  210. package/dist/tooltip/tooltip.styles.mjs +39 -0
  211. package/dist/tooltip/tooltip.styles.mjs.map +1 -0
  212. package/package.json +69 -0
@@ -0,0 +1,64 @@
1
+ import { ReactNode } from "react";
2
+ import { TabsProps } from "@novi-ui/core";
3
+ //#region src/tabs/tabs.d.ts
4
+ /**
5
+ * Tabs の見出し列。下辺に罫線が1本走る。
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
+ * 選ばれると見出し列の罫線に切れ目が入り、そのままパネルへ繋がる。
20
+ * 切れ目を作るのは要素ではなく**自分の下辺罫線を地色で塗ること**なので、
21
+ * ここには印を描く子要素が無い(Tactile は塗り面を1枚敷く)。
22
+ *
23
+ * @example
24
+ * <TabItem id="profile">プロフィール</TabItem>
25
+ */
26
+ declare function TabItem({ id, isDisabled, children, className }: {
27
+ id: string;
28
+ isDisabled?: boolean;
29
+ children?: ReactNode;
30
+ className?: string;
31
+ }): import("react").JSX.Element;
32
+ /**
33
+ * Tabs の中身1つ。`id` を見出しと合わせる。
34
+ *
35
+ * @example
36
+ * <TabContent id="profile">…</TabContent>
37
+ */
38
+ declare function TabContent({ id, children, className }: {
39
+ id: string;
40
+ children?: ReactNode;
41
+ className?: string;
42
+ }): import("react").JSX.Element;
43
+ /**
44
+ * 同じ階層の内容を切り替える。矢印キーでタブ間を移動できる。
45
+ *
46
+ * Flatlay では**地続きタブ**にする。選ばれている見出しとパネルが1枚の紙になり、
47
+ * 見出し列の罫線はその見出しの下でだけ途切れる。浮く層が無いので、
48
+ * 「いま開いているのはここ」を面の高さではなく罫線の連続で示す。
49
+ *
50
+ * 見出しとパネルの間に余白を置かないのは意図で、離すと罫線が繋がらず、
51
+ * ただ隣り合った2つの面に戻ってしまう。
52
+ *
53
+ * @example
54
+ * <Tabs selectedKey={tab} onSelectionChange={setTab}>
55
+ * <TabItems>
56
+ * <TabItem id="profile">プロフィール</TabItem>
57
+ * </TabItems>
58
+ * <TabContent id="profile">…</TabContent>
59
+ * </Tabs>
60
+ */
61
+ declare function Tabs({ variant, size, orientation, selectedKey, defaultSelectedKey, onSelectionChange, isDisabled, disabledKeys, children, className, classNames, id }: TabsProps): import("react").JSX.Element;
62
+ //#endregion
63
+ export { TabContent, TabItem, TabItems, Tabs };
64
+ //# 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;;;;;;;;;;;iBAkB9E,UACd,IACA,YACA,UACA;EAEA;EACA;EACA,WAAW;EACX;oBACD,IAAA;;;;;;;iBAmBe,aACd,IACA,UACA;EAEA;EACA,WAAW;EACX;oBACD,IAAA;;;;;;;;;;;;;;;;;;;iBA0Be,OACd,SACA,MACA,aACA,aACA,oBACA,mBACA,YACA,cACA,UACA,WACA,YACA,MACC,4BAAS,IAAA"}
@@ -0,0 +1,93 @@
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 の見出し列。下辺に罫線が1本走る。
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
+ * 選ばれると見出し列の罫線に切れ目が入り、そのままパネルへ繋がる。
25
+ * 切れ目を作るのは要素ではなく**自分の下辺罫線を地色で塗ること**なので、
26
+ * ここには印を描く子要素が無い(Tactile は塗り面を1枚敷く)。
27
+ *
28
+ * @example
29
+ * <TabItem id="profile">プロフィール</TabItem>
30
+ */
31
+ function TabItem({ id, isDisabled, children, className }) {
32
+ return /* @__PURE__ */ jsx(Tab, {
33
+ id,
34
+ isDisabled,
35
+ "data-slot": "tab",
36
+ className: tabsStyles().tab({ class: className }),
37
+ children
38
+ });
39
+ }
40
+ /**
41
+ * Tabs の中身1つ。`id` を見出しと合わせる。
42
+ *
43
+ * @example
44
+ * <TabContent id="profile">…</TabContent>
45
+ */
46
+ function TabContent({ id, children, className }) {
47
+ return /* @__PURE__ */ jsx(TabPanel, {
48
+ id,
49
+ "data-slot": "panel",
50
+ className: tabsStyles().panel({ class: className }),
51
+ children
52
+ });
53
+ }
54
+ /**
55
+ * 同じ階層の内容を切り替える。矢印キーでタブ間を移動できる。
56
+ *
57
+ * Flatlay では**地続きタブ**にする。選ばれている見出しとパネルが1枚の紙になり、
58
+ * 見出し列の罫線はその見出しの下でだけ途切れる。浮く層が無いので、
59
+ * 「いま開いているのはここ」を面の高さではなく罫線の連続で示す。
60
+ *
61
+ * 見出しとパネルの間に余白を置かないのは意図で、離すと罫線が繋がらず、
62
+ * ただ隣り合った2つの面に戻ってしまう。
63
+ *
64
+ * @example
65
+ * <Tabs selectedKey={tab} onSelectionChange={setTab}>
66
+ * <TabItems>
67
+ * <TabItem id="profile">プロフィール</TabItem>
68
+ * </TabItems>
69
+ * <TabContent id="profile">…</TabContent>
70
+ * </Tabs>
71
+ */
72
+ function Tabs$1({ variant, size, orientation, selectedKey, defaultSelectedKey, onSelectionChange, isDisabled, disabledKeys, children, className, classNames, id }) {
73
+ const s = tabsStyles({
74
+ variant,
75
+ size
76
+ });
77
+ return /* @__PURE__ */ jsx(Tabs, {
78
+ id,
79
+ orientation,
80
+ selectedKey,
81
+ defaultSelectedKey,
82
+ onSelectionChange: (key) => onSelectionChange?.(String(key)),
83
+ isDisabled,
84
+ disabledKeys,
85
+ "data-slot": "root",
86
+ className: s.root({ class: [className, classNames?.root] }),
87
+ children
88
+ });
89
+ }
90
+ //#endregion
91
+ export { TabContent, TabItem, TabItems, Tabs$1 as Tabs };
92
+
93
+ //# 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 の見出し列。下辺に罫線が1本走る。\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 * 選ばれると見出し列の罫線に切れ目が入り、そのままパネルへ繋がる。\n * 切れ目を作るのは要素ではなく**自分の下辺罫線を地色で塗ること**なので、\n * ここには印を描く子要素が無い(Tactile は塗り面を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 * Flatlay では**地続きタブ**にする。選ばれている見出しとパネルが1枚の紙になり、\n * 見出し列の罫線はその見出しの下でだけ途切れる。浮く層が無いので、\n * 「いま開いているのはここ」を面の高さではなく罫線の連続で示す。\n *\n * 見出しとパネルの間に余白を置かないのは意図で、離すと罫線が繋がらず、\n * ただ隣り合った2つの面に戻ってしまう。\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;;;;;;;;;;;AAYA,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;;;;;;;;;;;;;;;;;;;AAoBA,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,64 @@
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/flatlay'
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
+ panel: string;
16
+ }>;
17
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
18
+ list: string;
19
+ tab: string;
20
+ panel: string;
21
+ }>;
22
+ }, {
23
+ root: string;
24
+ list: string;
25
+ tab: string;
26
+ indicator: string;
27
+ panel: string;
28
+ }, undefined, {
29
+ size: VariantMap<"sm" | "md" | "lg", {
30
+ tab: string;
31
+ panel: string;
32
+ }>;
33
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
34
+ list: string;
35
+ tab: string;
36
+ panel: string;
37
+ }>;
38
+ }, {
39
+ root: string;
40
+ list: string;
41
+ tab: string;
42
+ indicator: string;
43
+ panel: string;
44
+ }, import("tailwind-variants").TVReturnTypeLike<{
45
+ size: VariantMap<"sm" | "md" | "lg", {
46
+ tab: string;
47
+ panel: string;
48
+ }>;
49
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
50
+ list: string;
51
+ tab: string;
52
+ panel: string;
53
+ }>;
54
+ }, {
55
+ root: string;
56
+ list: string;
57
+ tab: string;
58
+ indicator: string;
59
+ panel: string;
60
+ }>>;
61
+ type TabsStyleProps = Parameters<typeof tabsStyles>[0];
62
+ //#endregion
63
+ export { TabsStyleProps, tabsStyles };
64
+ //# 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":";;;;;;;;;;;cAqHa,wCAAU;;IAfiB;IAAe;;;IA9CR;IAAa;IAAe;;;;;;;;;;IA8CnC;IAAe;;;IA9CR;IAAa;IAAe;;;;;;;;;;IA8CnC;IAAe;;;IA9CR;IAAa;IAAe;;;;;;;;;KAoE/D,iBAAiB,kBAAkB"}
@@ -0,0 +1,118 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/tabs/tabs.styles.ts
4
+ /**
5
+ * Flatlay の Tabs は**地続きタブ**(Raster は下線1本・Tactile はセグメンテッド)。
6
+ *
7
+ * 選ばれているタブとパネルが**1枚の紙**になる。タブは見出し列の下辺罫線に 1px 重なり、
8
+ * その 1px を地色で塗って罫線に**切れ目**を作る。切れ目の向こう側がパネルなので、
9
+ * 「いまどれを見ているか」を浮かせずに示せる。
10
+ *
11
+ * 構造差の要点:
12
+ * - `root` に gap を置かない。離すと罫線が繋がらず、別の面になってしまう
13
+ * - `indicator` は**描かない**。切れ目は罫線であって面ではないので、
14
+ * 実体を持つ要素にすると「上に乗った何か」に見える(Tactile の塗り面がまさにそれ)
15
+ * - `panel` が三辺の罫線を持ち、上辺だけは見出し列の罫線と共有する
16
+ *
17
+ * 影も z-index も使えないので、階層はこの一続きの罫線だけで表す。
18
+ */
19
+ const slots = {
20
+ root: "flex flex-col",
21
+ list: "flex",
22
+ tab: [
23
+ "flex items-center justify-center whitespace-nowrap cursor-pointer select-none",
24
+ "text-[var(--novi-color-muted)] hover:text-[var(--novi-color-fg)]",
25
+ "border border-transparent",
26
+ "-mb-px",
27
+ "data-[selected]:text-[var(--novi-color-fg)] data-[selected]:font-medium",
28
+ "data-[pressed]:bg-[var(--novi-color-fg)] data-[pressed]:text-[var(--novi-color-bg)]",
29
+ "transition-[background-color,border-color,color]",
30
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
31
+ focusRing,
32
+ disabledState
33
+ ].join(" "),
34
+ indicator: "hidden",
35
+ panel: "outline-none text-[var(--novi-color-fg)]"
36
+ };
37
+ /**
38
+ * variant が決めるのは**罫線の強さと、切れ目の向こうに何色の紙があるか**。
39
+ *
40
+ * `ghost` / `plain` で囲みが消えるのは他のコンポーネントと同じ方針。
41
+ * ただし `ghost` は切れ目だけ残す。囲みが無くても「そこだけ罫線が抜けている」は成立する。
42
+ */
43
+ const variant = {
44
+ solid: {
45
+ list: "border-b border-[var(--novi-color-border-strong)]",
46
+ tab: [
47
+ "data-[selected]:border-[var(--novi-color-border-strong)]",
48
+ "data-[selected]:border-b-[var(--novi-color-bg)]",
49
+ "data-[selected]:bg-[var(--novi-color-bg)]"
50
+ ].join(" "),
51
+ panel: "border-x border-b border-[var(--novi-color-border-strong)]"
52
+ },
53
+ outline: {
54
+ list: "border-b border-[var(--novi-color-border)]",
55
+ tab: [
56
+ "data-[selected]:border-[var(--novi-color-border)]",
57
+ "data-[selected]:border-b-[var(--novi-color-bg)]",
58
+ "data-[selected]:bg-[var(--novi-color-bg)]"
59
+ ].join(" "),
60
+ panel: "border-x border-b border-[var(--novi-color-border)]"
61
+ },
62
+ soft: {
63
+ list: "border-b border-[var(--novi-color-border)]",
64
+ tab: [
65
+ "data-[selected]:border-[var(--novi-color-border)]",
66
+ "data-[selected]:border-b-[var(--novi-color-subtle)]",
67
+ "data-[selected]:bg-[var(--novi-color-subtle)]"
68
+ ].join(" "),
69
+ panel: "border-x border-b border-[var(--novi-color-border)] bg-[var(--novi-color-subtle)]"
70
+ },
71
+ ghost: {
72
+ list: "border-b border-[var(--novi-color-border)]",
73
+ tab: "hover:bg-[var(--novi-color-subtle)] data-[selected]:border-b-[var(--novi-color-bg)]",
74
+ panel: "p-0 pt-4"
75
+ },
76
+ plain: {
77
+ list: "border-b border-transparent",
78
+ tab: "",
79
+ panel: "p-0 pt-4"
80
+ }
81
+ };
82
+ /**
83
+ * Tabs のスタイル定義。
84
+ *
85
+ * @example
86
+ * import { tabsStyles } from '@novi-ui/flatlay'
87
+ * import { tv } from 'tailwind-variants'
88
+ *
89
+ * const myTabs = tv({ extend: tabsStyles, slots: { list: 'w-full' } })
90
+ */
91
+ const tabsStyles = tv({
92
+ slots,
93
+ variants: {
94
+ size: {
95
+ sm: {
96
+ tab: "h-7 px-3 text-[length:var(--novi-text-sm)]",
97
+ panel: "p-3"
98
+ },
99
+ md: {
100
+ tab: "h-8 px-4 text-[length:var(--novi-text-base)]",
101
+ panel: "p-4"
102
+ },
103
+ lg: {
104
+ tab: "h-10 px-5 text-[length:var(--novi-text-base)]",
105
+ panel: "p-5"
106
+ }
107
+ },
108
+ variant
109
+ },
110
+ defaultVariants: {
111
+ size: "md",
112
+ variant: "solid"
113
+ }
114
+ });
115
+ //#endregion
116
+ export { tabsStyles };
117
+
118
+ //# 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 { disabledState, focusRing } from '../styles/focus-ring'\n\n/**\n * Flatlay の Tabs は**地続きタブ**(Raster は下線1本・Tactile はセグメンテッド)。\n *\n * 選ばれているタブとパネルが**1枚の紙**になる。タブは見出し列の下辺罫線に 1px 重なり、\n * その 1px を地色で塗って罫線に**切れ目**を作る。切れ目の向こう側がパネルなので、\n * 「いまどれを見ているか」を浮かせずに示せる。\n *\n * 構造差の要点:\n * - `root` に gap を置かない。離すと罫線が繋がらず、別の面になってしまう\n * - `indicator` は**描かない**。切れ目は罫線であって面ではないので、\n * 実体を持つ要素にすると「上に乗った何か」に見える(Tactile の塗り面がまさにそれ)\n * - `panel` が三辺の罫線を持ち、上辺だけは見出し列の罫線と共有する\n *\n * 影も z-index も使えないので、階層はこの一続きの罫線だけで表す。\n */\nconst slots = {\n // 見出しとパネルは地続き。間に余白を入れた時点で罫線が切れて別の面になる\n root: 'flex flex-col',\n list: 'flex',\n tab: [\n 'flex items-center justify-center whitespace-nowrap cursor-pointer select-none',\n 'text-[var(--novi-color-muted)] hover:text-[var(--novi-color-fg)]',\n // 罫線の幅は全 variant が持つ。色は variant が決める\n 'border border-transparent',\n // 見出し列の下辺罫線に 1px 重ねる。選択中はこの 1px を地色で塗って切れ目にする\n '-mb-px',\n 'data-[selected]:text-[var(--novi-color-fg)] data-[selected]:font-medium',\n // 押下は反転スタンプ(ADR-F3)。他のコンポーネントと同じ手応えにする\n 'data-[pressed]:bg-[var(--novi-color-fg)] data-[pressed]:text-[var(--novi-color-bg)]',\n 'transition-[background-color,border-color,color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n focusRing,\n disabledState,\n ].join(' '),\n // 切れ目は罫線に空ける穴なので、描く要素を持たない(Tactile との決定的な差)\n indicator: 'hidden',\n panel: 'outline-none text-[var(--novi-color-fg)]',\n} satisfies SlotMap<typeof tabsSlots, (typeof tabsRequiredSlots)[number]>\n\n/**\n * variant が決めるのは**罫線の強さと、切れ目の向こうに何色の紙があるか**。\n *\n * `ghost` / `plain` で囲みが消えるのは他のコンポーネントと同じ方針。\n * ただし `ghost` は切れ目だけ残す。囲みが無くても「そこだけ罫線が抜けている」は成立する。\n */\nconst variant: VariantMap<NoviVariant, { list: string; tab: string; panel: string }> = {\n solid: {\n list: 'border-b border-[var(--novi-color-border-strong)]',\n tab: [\n 'data-[selected]:border-[var(--novi-color-border-strong)]',\n 'data-[selected]:border-b-[var(--novi-color-bg)]',\n 'data-[selected]:bg-[var(--novi-color-bg)]',\n ].join(' '),\n panel: 'border-x border-b border-[var(--novi-color-border-strong)]',\n },\n outline: {\n list: 'border-b border-[var(--novi-color-border)]',\n tab: [\n 'data-[selected]:border-[var(--novi-color-border)]',\n 'data-[selected]:border-b-[var(--novi-color-bg)]',\n 'data-[selected]:bg-[var(--novi-color-bg)]',\n ].join(' '),\n panel: 'border-x border-b border-[var(--novi-color-border)]',\n },\n soft: {\n list: 'border-b border-[var(--novi-color-border)]',\n tab: [\n 'data-[selected]:border-[var(--novi-color-border)]',\n 'data-[selected]:border-b-[var(--novi-color-subtle)]',\n 'data-[selected]:bg-[var(--novi-color-subtle)]',\n ].join(' '),\n panel: 'border-x border-b border-[var(--novi-color-border)] bg-[var(--novi-color-subtle)]',\n },\n ghost: {\n list: 'border-b border-[var(--novi-color-border)]',\n tab: 'hover:bg-[var(--novi-color-subtle)] data-[selected]:border-b-[var(--novi-color-bg)]',\n panel: 'p-0 pt-4',\n },\n plain: {\n list: 'border-b border-transparent',\n tab: '',\n panel: 'p-0 pt-4',\n },\n}\n\n/**\n * 見出しの高さは 28 / 32 / 40px(Button と同じ帳票の行)。\n *\n * パネルの余白も段で動かす。囲みの中の余白なので、行の高さと揃っていないと\n * 「紙が一続き」に見えない。\n */\nconst size: VariantMap<NoviSize, { tab: string; panel: string }> = {\n sm: { tab: 'h-7 px-3 text-[length:var(--novi-text-sm)]', panel: 'p-3' },\n md: { tab: 'h-8 px-4 text-[length:var(--novi-text-base)]', panel: 'p-4' },\n lg: { tab: 'h-10 px-5 text-[length:var(--novi-text-base)]', panel: 'p-5' },\n}\n\n/**\n * Tabs のスタイル定義。\n *\n * @example\n * import { tabsStyles } from '@novi-ui/flatlay'\n * import { tv } from 'tailwind-variants'\n *\n * const myTabs = tv({ extend: tabsStyles, slots: { list: 'w-full' } })\n */\nexport const tabsStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと size のクラスに負ける(申し送り6)\n variants: { size, variant },\n defaultVariants: { size: 'md', variant: 'solid' },\n})\n\nexport type TabsStyleProps = Parameters<typeof tabsStyles>[0]\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,MAAM,QAAQ;CAEZ,MAAM;CACN,MAAM;CACN,KAAK;EACH;EACA;EAEA;EAEA;EACA;EAEA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,WAAW;CACX,OAAO;AACT;;;;;;;AAQA,MAAM,UAAiF;CACrF,OAAO;EACL,MAAM;EACN,KAAK;GACH;GACA;GACA;EACF,CAAC,CAAC,KAAK,GAAG;EACV,OAAO;CACT;CACA,SAAS;EACP,MAAM;EACN,KAAK;GACH;GACA;GACA;EACF,CAAC,CAAC,KAAK,GAAG;EACV,OAAO;CACT;CACA,MAAM;EACJ,MAAM;EACN,KAAK;GACH;GACA;GACA;EACF,CAAC,CAAC,KAAK,GAAG;EACV,OAAO;CACT;CACA,OAAO;EACL,MAAM;EACN,KAAK;EACL,OAAO;CACT;CACA,OAAO;EACL,MAAM;EACN,KAAK;EACL,OAAO;CACT;AACF;;;;;;;;;;AAuBA,MAAa,aAAa,GAAG;CAC3B;CAEA,UAAU;EAAE;GAjBZ,IAAI;IAAE,KAAK;IAA8C,OAAO;GAAM;GACtE,IAAI;IAAE,KAAK;IAAgD,OAAO;GAAM;GACxE,IAAI;IAAE,KAAK;IAAiD,OAAO;GAAM;EAe7D;EAAM;CAAQ;CAC1B,iBAAiB;EAAE,MAAM;EAAM,SAAS;CAAQ;AAClD,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
+ * 複数行テキスト入力。Input と同じ罫線の記入欄で、行数だけが違う。
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
+ * 複数行テキスト入力。Input と同じ罫線の記入欄で、行数だけが違う。
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 * 複数行テキスト入力。Input と同じ罫線の記入欄で、行数だけが違う。\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,70 @@
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/flatlay'
8
+ * import { tv } from 'tailwind-variants'
9
+ *
10
+ * const myTextarea = tv({ extend: textareaStyles, slots: { textarea: 'resize-none' } })
11
+ */
12
+ declare const textareaStyles: import("tailwind-variants").TVReturnType<{
13
+ size: VariantMap<"sm" | "md" | "lg", {
14
+ inputWrapper: string;
15
+ textarea: string;
16
+ }>;
17
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
18
+ inputWrapper: string;
19
+ }>;
20
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
21
+ inputWrapper: string;
22
+ }>;
23
+ }, {
24
+ root: string;
25
+ label: string;
26
+ inputWrapper: string;
27
+ textarea: string;
28
+ description: string;
29
+ errorMessage: string;
30
+ }, undefined, {
31
+ size: VariantMap<"sm" | "md" | "lg", {
32
+ inputWrapper: string;
33
+ textarea: string;
34
+ }>;
35
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
36
+ inputWrapper: string;
37
+ }>;
38
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
39
+ inputWrapper: string;
40
+ }>;
41
+ }, {
42
+ root: string;
43
+ label: string;
44
+ inputWrapper: string;
45
+ textarea: string;
46
+ description: string;
47
+ errorMessage: string;
48
+ }, import("tailwind-variants").TVReturnTypeLike<{
49
+ size: VariantMap<"sm" | "md" | "lg", {
50
+ inputWrapper: string;
51
+ textarea: string;
52
+ }>;
53
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
54
+ inputWrapper: string;
55
+ }>;
56
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
57
+ inputWrapper: string;
58
+ }>;
59
+ }, {
60
+ root: string;
61
+ label: string;
62
+ inputWrapper: string;
63
+ textarea: string;
64
+ description: string;
65
+ errorMessage: string;
66
+ }>>;
67
+ type TextareaStyleProps = Parameters<typeof textareaStyles>[0];
68
+ //#endregion
69
+ export { TextareaStyleProps, textareaStyles };
70
+ //# 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":";;;;;;;;;;;cAkFa,4CAAc;;IAvBsB;IAAkB;;;IAMd;;;IAnBE;;;;;;;;;;;IAaN;IAAkB;;;IAMd;;;IAnBE;;;;;;;;;;;IAaN;IAAkB;;;IAMd;;;IAnBE;;;;;;;;;;KA2C3C,qBAAqB,kBAAkB"}
@@ -0,0 +1,85 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { mono } from "../styles/mono.mjs";
3
+ import { tv } from "tailwind-variants";
4
+ //#region src/textarea/textarea.styles.ts
5
+ /**
6
+ * Flatlay の TextArea は Input と同じ**記入欄**で、行数だけが違う。
7
+ *
8
+ * 縦だけリサイズを許すのは両テーマと同じ判断。横に伸びると罫線で作った
9
+ * 列の揃いが崩れ、帳票として読めなくなる。
10
+ */
11
+ const slots = {
12
+ root: "flex flex-col gap-1.5",
13
+ label: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-fg)] ${mono}`,
14
+ inputWrapper: [
15
+ "flex w-full",
16
+ "text-[var(--novi-color-fg)]",
17
+ "border",
18
+ "rounded-[var(--novi-radius-sm)]",
19
+ "data-[invalid]:border-[var(--novi-color-danger)]",
20
+ "transition-[border-color,opacity]",
21
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
22
+ focusRing,
23
+ disabledState
24
+ ].join(" "),
25
+ textarea: [
26
+ "w-full min-w-0 bg-transparent outline-none",
27
+ "text-[var(--novi-color-fg)]",
28
+ "placeholder:text-[var(--novi-color-muted)]",
29
+ "resize-y",
30
+ "leading-[var(--novi-leading-body)]"
31
+ ].join(" "),
32
+ description: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)] ${mono}`,
33
+ errorMessage: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-danger)] ${mono}`
34
+ };
35
+ /**
36
+ * TextArea のスタイル定義。
37
+ *
38
+ * @example
39
+ * import { textareaStyles } from '@novi-ui/flatlay'
40
+ * import { tv } from 'tailwind-variants'
41
+ *
42
+ * const myTextarea = tv({ extend: textareaStyles, slots: { textarea: 'resize-none' } })
43
+ */
44
+ const textareaStyles = tv({
45
+ slots,
46
+ variants: {
47
+ size: {
48
+ sm: {
49
+ inputWrapper: "px-2.5 py-1.5",
50
+ textarea: "text-[length:var(--novi-text-sm)]"
51
+ },
52
+ md: {
53
+ inputWrapper: "px-3 py-2",
54
+ textarea: "text-[length:var(--novi-text-base)]"
55
+ },
56
+ lg: {
57
+ inputWrapper: "px-4 py-2.5",
58
+ textarea: "text-[length:var(--novi-text-base)]"
59
+ }
60
+ },
61
+ radius: {
62
+ none: { inputWrapper: "rounded-[var(--novi-radius-none)]" },
63
+ sm: { inputWrapper: "rounded-[var(--novi-radius-sm)]" },
64
+ md: { inputWrapper: "rounded-[var(--novi-radius-md)]" },
65
+ lg: { inputWrapper: "rounded-[var(--novi-radius-lg)]" },
66
+ full: { inputWrapper: "rounded-[var(--novi-radius-full)]" }
67
+ },
68
+ variant: {
69
+ solid: { inputWrapper: "bg-[var(--novi-color-surface)] border-[var(--novi-color-border-strong)]" },
70
+ outline: { inputWrapper: "bg-transparent border-[var(--novi-color-border-strong)]" },
71
+ soft: { inputWrapper: "bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)]" },
72
+ ghost: { inputWrapper: "bg-transparent border-transparent border-b-[var(--novi-color-border-strong)]" },
73
+ plain: { inputWrapper: "bg-transparent border-transparent px-0" }
74
+ }
75
+ },
76
+ defaultVariants: {
77
+ size: "md",
78
+ radius: "sm",
79
+ variant: "outline"
80
+ }
81
+ });
82
+ //#endregion
83
+ export { textareaStyles };
84
+
85
+ //# sourceMappingURL=textarea.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.styles.mjs","names":[],"sources":["../../src/textarea/textarea.styles.ts"],"sourcesContent":["import type {\n NoviRadius,\n NoviSize,\n NoviVariant,\n SlotMap,\n textareaRequiredSlots,\n textareaSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\nimport { mono } from '../styles/mono'\n\n/**\n * Flatlay の TextArea は Input と同じ**記入欄**で、行数だけが違う。\n *\n * 縦だけリサイズを許すのは両テーマと同じ判断。横に伸びると罫線で作った\n * 列の揃いが崩れ、帳票として読めなくなる。\n */\nconst slots = {\n root: 'flex flex-col gap-1.5',\n label: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-fg)] ${mono}`,\n // 罫線の幅だけを base に置き、色は variant が決める(Input と同じ型)\n inputWrapper: [\n 'flex w-full',\n 'text-[var(--novi-color-fg)]',\n 'border',\n 'rounded-[var(--novi-radius-sm)]',\n 'data-[invalid]:border-[var(--novi-color-danger)]',\n 'transition-[border-color,opacity]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n focusRing,\n disabledState,\n ].join(' '),\n textarea: [\n 'w-full min-w-0 bg-transparent outline-none',\n 'text-[var(--novi-color-fg)]',\n 'placeholder:text-[var(--novi-color-muted)]',\n 'resize-y',\n 'leading-[var(--novi-leading-body)]',\n ].join(' '),\n // 文字数カウンタもここに置く。専用 slot を増やさない\n description: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)] ${mono}`,\n errorMessage: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-danger)] ${mono}`,\n} satisfies SlotMap<typeof textareaSlots, (typeof textareaRequiredSlots)[number]>\n\nconst variant: VariantMap<NoviVariant, { inputWrapper: string }> = {\n solid: {\n inputWrapper: 'bg-[var(--novi-color-surface)] border-[var(--novi-color-border-strong)]',\n },\n outline: { inputWrapper: 'bg-transparent border-[var(--novi-color-border-strong)]' },\n soft: { inputWrapper: 'bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)]' },\n ghost: {\n inputWrapper: 'bg-transparent border-transparent border-b-[var(--novi-color-border-strong)]',\n },\n plain: { inputWrapper: 'bg-transparent border-transparent px-0' },\n}\n\n/** 1行入力と違い高さは `rows` が決めるので、余白と文字サイズだけを段階で変える。 */\nconst size: VariantMap<NoviSize, { inputWrapper: string; textarea: string }> = {\n sm: { inputWrapper: 'px-2.5 py-1.5', textarea: 'text-[length:var(--novi-text-sm)]' },\n md: { inputWrapper: 'px-3 py-2', textarea: 'text-[length:var(--novi-text-base)]' },\n lg: { inputWrapper: 'px-4 py-2.5', textarea: 'text-[length:var(--novi-text-base)]' },\n}\n\nconst radius: VariantMap<NoviRadius, { inputWrapper: string }> = {\n none: { inputWrapper: 'rounded-[var(--novi-radius-none)]' },\n sm: { inputWrapper: 'rounded-[var(--novi-radius-sm)]' },\n md: { inputWrapper: 'rounded-[var(--novi-radius-md)]' },\n lg: { inputWrapper: 'rounded-[var(--novi-radius-lg)]' },\n full: { inputWrapper: 'rounded-[var(--novi-radius-full)]' },\n}\n\n/**\n * TextArea のスタイル定義。\n *\n * @example\n * import { textareaStyles } from '@novi-ui/flatlay'\n * import { tv } from 'tailwind-variants'\n *\n * const myTextarea = tv({ extend: textareaStyles, slots: { textarea: 'resize-none' } })\n */\nexport const textareaStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと size のクラスに負ける(申し送り6)\n variants: { size, radius, variant },\n defaultVariants: { size: 'md', radius: 'sm', variant: 'outline' },\n})\n\nexport type TextareaStyleProps = Parameters<typeof textareaStyles>[0]\n"],"mappings":";;;;;;;;;;AAmBA,MAAM,QAAQ;CACZ,MAAM;CACN,OAAO,iEAAiE;CAExE,cAAc;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,UAAU;EACR;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,aAAa,oEAAoE;CACjF,cAAc,qEAAqE;AACrF;;;;;;;;;;AAsCA,MAAa,iBAAiB,GAAG;CAC/B;CAEA,UAAU;EAAE;GAzBZ,IAAI;IAAE,cAAc;IAAiB,UAAU;GAAoC;GACnF,IAAI;IAAE,cAAc;IAAa,UAAU;GAAsC;GACjF,IAAI;IAAE,cAAc;IAAe,UAAU;GAAsC;EAuBvE;EAAM;GAnBlB,MAAM,EAAE,cAAc,oCAAoC;GAC1D,IAAI,EAAE,cAAc,kCAAkC;GACtD,IAAI,EAAE,cAAc,kCAAkC;GACtD,IAAI,EAAE,cAAc,kCAAkC;GACtD,MAAM,EAAE,cAAc,oCAAoC;EAexC;EAAQ;GAtC1B,OAAO,EACL,cAAc,0EAChB;GACA,SAAS,EAAE,cAAc,0DAA0D;GACnF,MAAM,EAAE,cAAc,kEAAkE;GACxF,OAAO,EACL,cAAc,+EAChB;GACA,OAAO,EAAE,cAAc,yCAAyC;EA8BtC;CAAQ;CAClC,iBAAiB;EAAE,MAAM;EAAM,QAAQ;EAAM,SAAS;CAAU;AAClE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { NoviToast, NoviToastRegion, createToastQueue } from "./toast.mjs";
2
+ import { ToastStyleProps, toastStyles } from "./toast.styles.mjs";
3
+ export { type NoviToast, NoviToastRegion, type ToastStyleProps, createToastQueue, toastStyles };