@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,97 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/input/input.styles.d.ts
3
+ /**
4
+ * Input のスタイル定義。
5
+ *
6
+ * @example
7
+ * import { inputStyles } from '@novi-ui/flatlay'
8
+ * import { tv } from 'tailwind-variants'
9
+ *
10
+ * const myInput = tv({ extend: inputStyles, slots: { input: 'text-right' } })
11
+ */
12
+ declare const inputStyles: import("tailwind-variants").TVReturnType<{
13
+ size: VariantMap<"sm" | "md" | "lg", {
14
+ inputWrapper: string;
15
+ input: 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
+ /**
27
+ * 記入欄の枠。RAC の `Group` は `data-focus-visible` / `data-invalid` を出すので、
28
+ * Button と同じ `focusRing` がそのまま効く。
29
+ *
30
+ * 罫線の幅は全 variant が持ち、色だけを variant が決める(Flatlay の型)。
31
+ * 色を base に書くと tailwind-merge が後勝ちで落とすので、ここには幅しか置かない。
32
+ */
33
+ inputWrapper: string;
34
+ input: string;
35
+ startContent: string;
36
+ endContent: string;
37
+ description: string;
38
+ errorMessage: string;
39
+ }, undefined, {
40
+ size: VariantMap<"sm" | "md" | "lg", {
41
+ inputWrapper: string;
42
+ input: string;
43
+ }>;
44
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
45
+ inputWrapper: string;
46
+ }>;
47
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
48
+ inputWrapper: string;
49
+ }>;
50
+ }, {
51
+ root: string;
52
+ label: string;
53
+ /**
54
+ * 記入欄の枠。RAC の `Group` は `data-focus-visible` / `data-invalid` を出すので、
55
+ * Button と同じ `focusRing` がそのまま効く。
56
+ *
57
+ * 罫線の幅は全 variant が持ち、色だけを variant が決める(Flatlay の型)。
58
+ * 色を base に書くと tailwind-merge が後勝ちで落とすので、ここには幅しか置かない。
59
+ */
60
+ inputWrapper: string;
61
+ input: string;
62
+ startContent: string;
63
+ endContent: string;
64
+ description: string;
65
+ errorMessage: string;
66
+ }, import("tailwind-variants").TVReturnTypeLike<{
67
+ size: VariantMap<"sm" | "md" | "lg", {
68
+ inputWrapper: string;
69
+ input: string;
70
+ }>;
71
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
72
+ inputWrapper: string;
73
+ }>;
74
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
75
+ inputWrapper: string;
76
+ }>;
77
+ }, {
78
+ root: string;
79
+ label: string;
80
+ /**
81
+ * 記入欄の枠。RAC の `Group` は `data-focus-visible` / `data-invalid` を出すので、
82
+ * Button と同じ `focusRing` がそのまま効く。
83
+ *
84
+ * 罫線の幅は全 variant が持ち、色だけを variant が決める(Flatlay の型)。
85
+ * 色を base に書くと tailwind-merge が後勝ちで落とすので、ここには幅しか置かない。
86
+ */
87
+ inputWrapper: string;
88
+ input: string;
89
+ startContent: string;
90
+ endContent: string;
91
+ description: string;
92
+ errorMessage: string;
93
+ }>>;
94
+ type InputStyleProps = Parameters<typeof inputStyles>[0];
95
+ //#endregion
96
+ export { InputStyleProps, inputStyles };
97
+ //# sourceMappingURL=input.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.styles.d.mts","names":[],"sources":["../../src/input/input.styles.ts"],"mappings":";;;;;;;;;;;cAoGa,yCAAW;;IAvByB;IAAe;;;IAMX;;;IAnBE;;;;;;;;;;;;;;;;;;;;IAaN;IAAe;;;IAMX;;;IAnBE;;;;;;;;;;;;;;;;;;;;IAaN;IAAe;;;IAMX;;;IAnBE;;;;;;;;;;;;;;;;;;;KA2C3C,kBAAkB,kBAAkB"}
@@ -0,0 +1,96 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { mono, monoNumeric } from "../styles/mono.mjs";
3
+ import { tv } from "tailwind-variants";
4
+ //#region src/input/input.styles.ts
5
+ /**
6
+ * Flatlay の Input は**記入欄**。罫線で囲った枠に書き込む。
7
+ *
8
+ * 押下の反転(ADR-F3)はここには無い。入力欄は「押す」ものではなく、
9
+ * カーソルが入って書くものなので、反転させると書いた文字が読めなくなる。
10
+ * 手応えを返すのは罫線の色だけで、フォーカスはリングが担う。
11
+ *
12
+ * ラベルが等幅なのは ADR-F7 の運用。**読ませる文(本文)と読み取らせる項目名**を
13
+ * 書体で分けるのが帳票の作法で、Flatlay が影を持たない代わりの区別になっている。
14
+ */
15
+ const slots = {
16
+ root: "flex flex-col gap-1.5",
17
+ label: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-fg)] ${mono}`,
18
+ /**
19
+ * 記入欄の枠。RAC の `Group` は `data-focus-visible` / `data-invalid` を出すので、
20
+ * Button と同じ `focusRing` がそのまま効く。
21
+ *
22
+ * 罫線の幅は全 variant が持ち、色だけを variant が決める(Flatlay の型)。
23
+ * 色を base に書くと tailwind-merge が後勝ちで落とすので、ここには幅しか置かない。
24
+ */
25
+ inputWrapper: [
26
+ "flex items-center gap-2 w-full",
27
+ "text-[var(--novi-color-fg)]",
28
+ "border",
29
+ "rounded-[var(--novi-radius-sm)]",
30
+ "data-[invalid]:border-[var(--novi-color-danger)]",
31
+ "transition-[border-color,opacity]",
32
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
33
+ focusRing,
34
+ disabledState
35
+ ].join(" "),
36
+ input: [
37
+ "w-full min-w-0 bg-transparent outline-none",
38
+ "text-[var(--novi-color-fg)]",
39
+ "placeholder:text-[var(--novi-color-muted)]"
40
+ ].join(" "),
41
+ startContent: `shrink-0 inline-flex text-[var(--novi-color-muted)] ${monoNumeric}`,
42
+ endContent: `shrink-0 inline-flex text-[var(--novi-color-muted)] ${monoNumeric}`,
43
+ description: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)] ${mono}`,
44
+ errorMessage: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-danger)] ${mono}`
45
+ };
46
+ /**
47
+ * Input のスタイル定義。
48
+ *
49
+ * @example
50
+ * import { inputStyles } from '@novi-ui/flatlay'
51
+ * import { tv } from 'tailwind-variants'
52
+ *
53
+ * const myInput = tv({ extend: inputStyles, slots: { input: 'text-right' } })
54
+ */
55
+ const inputStyles = tv({
56
+ slots,
57
+ variants: {
58
+ size: {
59
+ sm: {
60
+ inputWrapper: "h-7 px-2.5",
61
+ input: "text-[length:var(--novi-text-sm)]"
62
+ },
63
+ md: {
64
+ inputWrapper: "h-8 px-3",
65
+ input: "text-[length:var(--novi-text-base)]"
66
+ },
67
+ lg: {
68
+ inputWrapper: "h-10 px-4",
69
+ input: "text-[length:var(--novi-text-base)]"
70
+ }
71
+ },
72
+ radius: {
73
+ none: { inputWrapper: "rounded-[var(--novi-radius-none)]" },
74
+ sm: { inputWrapper: "rounded-[var(--novi-radius-sm)]" },
75
+ md: { inputWrapper: "rounded-[var(--novi-radius-md)]" },
76
+ lg: { inputWrapper: "rounded-[var(--novi-radius-lg)]" },
77
+ full: { inputWrapper: "rounded-[var(--novi-radius-full)]" }
78
+ },
79
+ variant: {
80
+ solid: { inputWrapper: "bg-[var(--novi-color-surface)] border-[var(--novi-color-border-strong)]" },
81
+ outline: { inputWrapper: "bg-transparent border-[var(--novi-color-border-strong)]" },
82
+ soft: { inputWrapper: "bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)]" },
83
+ ghost: { inputWrapper: "bg-transparent border-transparent border-b-[var(--novi-color-border-strong)]" },
84
+ plain: { inputWrapper: "bg-transparent border-transparent px-0" }
85
+ }
86
+ },
87
+ defaultVariants: {
88
+ size: "md",
89
+ radius: "sm",
90
+ variant: "outline"
91
+ }
92
+ });
93
+ //#endregion
94
+ export { inputStyles };
95
+
96
+ //# sourceMappingURL=input.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.styles.mjs","names":[],"sources":["../../src/input/input.styles.ts"],"sourcesContent":["import type {\n inputRequiredSlots,\n inputSlots,\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 { mono, monoNumeric } from '../styles/mono'\n\n/**\n * Flatlay の Input は**記入欄**。罫線で囲った枠に書き込む。\n *\n * 押下の反転(ADR-F3)はここには無い。入力欄は「押す」ものではなく、\n * カーソルが入って書くものなので、反転させると書いた文字が読めなくなる。\n * 手応えを返すのは罫線の色だけで、フォーカスはリングが担う。\n *\n * ラベルが等幅なのは ADR-F7 の運用。**読ませる文(本文)と読み取らせる項目名**を\n * 書体で分けるのが帳票の作法で、Flatlay が影を持たない代わりの区別になっている。\n */\nconst slots = {\n root: 'flex flex-col gap-1.5',\n // 項目名は等幅。プレースホルダをラベル代わりにはしない\n label: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-fg)] ${mono}`,\n /**\n * 記入欄の枠。RAC の `Group` は `data-focus-visible` / `data-invalid` を出すので、\n * Button と同じ `focusRing` がそのまま効く。\n *\n * 罫線の幅は全 variant が持ち、色だけを variant が決める(Flatlay の型)。\n * 色を base に書くと tailwind-merge が後勝ちで落とすので、ここには幅しか置かない。\n */\n inputWrapper: [\n 'flex items-center gap-2 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 input: [\n 'w-full min-w-0 bg-transparent outline-none',\n 'text-[var(--novi-color-fg)]',\n 'placeholder:text-[var(--novi-color-muted)]',\n ].join(' '),\n // 差し込まれるのは単位・通貨記号・件数といった「読み取らせる値」なので等幅(ADR-F7)\n startContent: `shrink-0 inline-flex text-[var(--novi-color-muted)] ${monoNumeric}`,\n endContent: `shrink-0 inline-flex text-[var(--novi-color-muted)] ${monoNumeric}`,\n description: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)] ${mono}`,\n // 色だけに頼らずテキストを必ず伴う(WCAG 1.4.1)\n errorMessage: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-danger)] ${mono}`,\n} satisfies SlotMap<typeof inputSlots, (typeof inputRequiredSlots)[number]>\n\n/**\n * variant が決めるのは**枠の強さと地の色**。\n *\n * `ghost` が下線だけになるのは帳票の記入線そのもので、表を詰めて並べたときに\n * 面を増やさずに「ここに書く」を示せる。Flatlay で唯一これが自然に効く形。\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/** 高さは Button と同じ帳票の行。28 / 32 / 40px。 */\nconst size: VariantMap<NoviSize, { inputWrapper: string; input: string }> = {\n sm: { inputWrapper: 'h-7 px-2.5', input: 'text-[length:var(--novi-text-sm)]' },\n md: { inputWrapper: 'h-8 px-3', input: 'text-[length:var(--novi-text-base)]' },\n lg: { inputWrapper: 'h-10 px-4', input: '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 * Input のスタイル定義。\n *\n * @example\n * import { inputStyles } from '@novi-ui/flatlay'\n * import { tv } from 'tailwind-variants'\n *\n * const myInput = tv({ extend: inputStyles, slots: { input: 'text-right' } })\n */\nexport const inputStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと size のクラスに負ける(申し送り6)\n variants: { size, radius, variant },\n defaultVariants: { size: 'md', radius: 'sm', variant: 'outline' },\n})\n\nexport type InputStyleProps = Parameters<typeof inputStyles>[0]\n"],"mappings":";;;;;;;;;;;;;;AAuBA,MAAM,QAAQ;CACZ,MAAM;CAEN,OAAO,iEAAiE;;;;;;;;CAQxE,cAAc;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;EACL;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,cAAc,uDAAuD;CACrE,YAAY,uDAAuD;CACnE,aAAa,oEAAoE;CAEjF,cAAc,qEAAqE;AACrF;;;;;;;;;;AA4CA,MAAa,cAAc,GAAG;CAC5B;CAEA,UAAU;EAAE;GAzBZ,IAAI;IAAE,cAAc;IAAc,OAAO;GAAoC;GAC7E,IAAI;IAAE,cAAc;IAAY,OAAO;GAAsC;GAC7E,IAAI;IAAE,cAAc;IAAa,OAAO;GAAsC;EAuBlE;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 { Menu, MenuItemComponent, MenuItemProps, MenuSection, MenuSeparator } from "./menu.mjs";
2
+ import { MenuStyleProps, menuStyles } from "./menu.styles.mjs";
3
+ export { Menu, MenuItemComponent as MenuItem, type MenuItemProps, MenuSection, MenuSeparator, type MenuStyleProps, menuStyles };
@@ -0,0 +1,66 @@
1
+ import { ReactNode } from "react";
2
+ import { MenuProps } from "@novi-ui/core";
3
+ //#region src/menu/menu.d.ts
4
+ interface MenuItemProps {
5
+ /** 選ばれたときに `onAction` へ渡る値 */
6
+ id: string;
7
+ isDisabled?: boolean;
8
+ /** 補足説明。項目名だけで足りないときに使う */
9
+ description?: ReactNode;
10
+ /** キーボードショートカットの表示。Flatlay では本文と同じ濃さで右端に揃う */
11
+ shortcut?: ReactNode;
12
+ children?: ReactNode;
13
+ className?: string;
14
+ }
15
+ /**
16
+ * Menu の項目。
17
+ *
18
+ * @example
19
+ * <MenuItem id="rename" shortcut="⌘R">名前を変更</MenuItem>
20
+ */
21
+ declare function MenuItemComponent({ id, isDisabled, description, shortcut, children, className }: MenuItemProps): import("react").JSX.Element;
22
+ /**
23
+ * Menu の区切り線。行の罫線より濃く、まとまりの切れ目を示す。
24
+ *
25
+ * @example
26
+ * <MenuSeparator />
27
+ */
28
+ declare function MenuSeparator({ className }: {
29
+ className?: string;
30
+ }): import("react").JSX.Element;
31
+ /**
32
+ * Menu の見出し付きグループ。項目が多いときに種類でまとめる。
33
+ *
34
+ * @example
35
+ * <MenuSection title="ファイル">
36
+ * <MenuItem id="rename">名前を変更</MenuItem>
37
+ * </MenuSection>
38
+ */
39
+ declare function MenuSection({ title, children, className }: {
40
+ title: ReactNode;
41
+ children?: ReactNode;
42
+ className?: string;
43
+ }): import("react").JSX.Element;
44
+ /**
45
+ * トリガーから開く操作の一覧。**一覧はトリガーの直後、フローの中に展開される**
46
+ * (Raster は隣に浮き、Tactile は画面下端のシート)。
47
+ *
48
+ * 開くと後続が押し下げられるので、何かが隠れることが無い。
49
+ * 矢印キーで移動、Escape で閉じてトリガーへフォーカスが戻る。
50
+ *
51
+ * `placement` / `offset` は受け取るが**効かない**。浮かないものに寄せる先は無い。
52
+ * 他テーマ向けに書いたコードがそのまま動くよう、受け取ること自体はやめていない。
53
+ *
54
+ * 最初の子要素がトリガーになる。残りが項目として扱われる。
55
+ *
56
+ * @example
57
+ * <Menu onAction={(key) => run(key)}>
58
+ * <Button>操作</Button>
59
+ * <MenuItem id="rename" shortcut="⌘R">名前を変更</MenuItem>
60
+ * <MenuItem id="delete">削除</MenuItem>
61
+ * </Menu>
62
+ */
63
+ declare function Menu({ isOpen, defaultOpen, onOpenChange, onAction, disabledKeys, children, className, classNames, id }: MenuProps): import("react").JSX.Element;
64
+ //#endregion
65
+ export { Menu, MenuItemComponent, MenuItemProps, MenuSection, MenuSeparator };
66
+ //# sourceMappingURL=menu.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.mts","names":[],"sources":["../../src/menu/menu.tsx"],"mappings":";;;UAeiB;;EAEf;EACA;;EAEA,cAAc;;EAEd,WAAW;EACX,WAAW;EACX;;;;;;;;iBASc,oBACd,IACA,YACA,aACA,UACA,UACA,aACC,gCAAa,IAAA;;;;;;;iBAoCA,gBAAgB;EAAe;oBAAoB,IAAA;;;;;;;;;iBAcnD,cACd,OACA,UACA;EAEA,OAAO;EACP,WAAW;EACX;oBACD,IAAA;;;;;;;;;;;;;;;;;;;;iBAgCe,OACd,QACA,aACA,cACA,UACA,cACA,UACA,WACA,YACA,MACC,4BAAS,IAAA"}
@@ -0,0 +1,118 @@
1
+ "use client";
2
+ import { InflowPopover } from "../styles/inflow.mjs";
3
+ import { menuStyles } from "./menu.styles.mjs";
4
+ import { Header, Menu, MenuItem, MenuSection, MenuTrigger, Separator } from "react-aria-components";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/menu/menu.tsx
7
+ /**
8
+ * Menu の項目。
9
+ *
10
+ * @example
11
+ * <MenuItem id="rename" shortcut="⌘R">名前を変更</MenuItem>
12
+ */
13
+ function MenuItemComponent({ id, isDisabled, description, shortcut, children, className }) {
14
+ const s = menuStyles();
15
+ return /* @__PURE__ */ jsxs(MenuItem, {
16
+ id,
17
+ isDisabled,
18
+ textValue: typeof children === "string" ? children : void 0,
19
+ "data-slot": "item",
20
+ className: s.item({ class: className }),
21
+ children: [/* @__PURE__ */ jsxs("span", {
22
+ className: "flex flex-col min-w-0",
23
+ children: [/* @__PURE__ */ jsx("span", {
24
+ "data-slot": "itemLabel",
25
+ className: s.itemLabel(),
26
+ children
27
+ }), description !== void 0 && /* @__PURE__ */ jsx("span", {
28
+ "data-slot": "itemDescription",
29
+ className: s.itemDescription(),
30
+ children: description
31
+ })]
32
+ }), shortcut !== void 0 && /* @__PURE__ */ jsx("span", {
33
+ "data-slot": "itemShortcut",
34
+ className: s.itemShortcut(),
35
+ children: shortcut
36
+ })]
37
+ });
38
+ }
39
+ /**
40
+ * Menu の区切り線。行の罫線より濃く、まとまりの切れ目を示す。
41
+ *
42
+ * @example
43
+ * <MenuSeparator />
44
+ */
45
+ function MenuSeparator({ className }) {
46
+ return /* @__PURE__ */ jsx(Separator, {
47
+ "data-slot": "separator",
48
+ className: menuStyles().separator({ class: className })
49
+ });
50
+ }
51
+ /**
52
+ * Menu の見出し付きグループ。項目が多いときに種類でまとめる。
53
+ *
54
+ * @example
55
+ * <MenuSection title="ファイル">
56
+ * <MenuItem id="rename">名前を変更</MenuItem>
57
+ * </MenuSection>
58
+ */
59
+ function MenuSection$1({ title, children, className }) {
60
+ const s = menuStyles();
61
+ return /* @__PURE__ */ jsxs(MenuSection, {
62
+ "data-slot": "section",
63
+ className: s.section({ class: className }),
64
+ children: [/* @__PURE__ */ jsx(Header, {
65
+ "data-slot": "sectionLabel",
66
+ className: s.sectionLabel(),
67
+ children: title
68
+ }), children]
69
+ });
70
+ }
71
+ /**
72
+ * トリガーから開く操作の一覧。**一覧はトリガーの直後、フローの中に展開される**
73
+ * (Raster は隣に浮き、Tactile は画面下端のシート)。
74
+ *
75
+ * 開くと後続が押し下げられるので、何かが隠れることが無い。
76
+ * 矢印キーで移動、Escape で閉じてトリガーへフォーカスが戻る。
77
+ *
78
+ * `placement` / `offset` は受け取るが**効かない**。浮かないものに寄せる先は無い。
79
+ * 他テーマ向けに書いたコードがそのまま動くよう、受け取ること自体はやめていない。
80
+ *
81
+ * 最初の子要素がトリガーになる。残りが項目として扱われる。
82
+ *
83
+ * @example
84
+ * <Menu onAction={(key) => run(key)}>
85
+ * <Button>操作</Button>
86
+ * <MenuItem id="rename" shortcut="⌘R">名前を変更</MenuItem>
87
+ * <MenuItem id="delete">削除</MenuItem>
88
+ * </Menu>
89
+ */
90
+ function Menu$1({ isOpen, defaultOpen, onOpenChange, onAction, disabledKeys, children, className, classNames, id }) {
91
+ const s = menuStyles();
92
+ const [trigger, ...rest] = Array.isArray(children) ? children : [children];
93
+ return /* @__PURE__ */ jsxs(MenuTrigger, {
94
+ isOpen,
95
+ defaultOpen,
96
+ onOpenChange,
97
+ children: [/* @__PURE__ */ jsx("span", {
98
+ "data-slot": "trigger",
99
+ className: s.trigger({ class: classNames?.trigger }),
100
+ children: trigger
101
+ }), /* @__PURE__ */ jsx(InflowPopover, {
102
+ dataSlot: "popover",
103
+ className: s.popover({ class: [className, classNames?.popover] }),
104
+ children: /* @__PURE__ */ jsx(Menu, {
105
+ id,
106
+ "data-slot": "list",
107
+ className: s.list({ class: classNames?.list }),
108
+ onAction: (key) => onAction?.(String(key)),
109
+ disabledKeys,
110
+ children: rest
111
+ })
112
+ })]
113
+ });
114
+ }
115
+ //#endregion
116
+ export { Menu$1 as Menu, MenuItemComponent, MenuSection$1 as MenuSection, MenuSeparator };
117
+
118
+ //# sourceMappingURL=menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.mjs","names":["MenuSection","RACMenuSection","Menu","RACMenu"],"sources":["../../src/menu/menu.tsx"],"sourcesContent":["'use client'\n\nimport type { MenuProps } from '@novi-ui/core'\nimport type { ReactNode } from 'react'\nimport {\n Header,\n MenuItem,\n MenuTrigger,\n Menu as RACMenu,\n MenuSection as RACMenuSection,\n Separator,\n} from 'react-aria-components'\nimport { InflowPopover } from '../styles/inflow'\nimport { menuStyles } from './menu.styles'\n\nexport interface MenuItemProps {\n /** 選ばれたときに `onAction` へ渡る値 */\n id: string\n isDisabled?: boolean\n /** 補足説明。項目名だけで足りないときに使う */\n description?: ReactNode\n /** キーボードショートカットの表示。Flatlay では本文と同じ濃さで右端に揃う */\n shortcut?: ReactNode\n children?: ReactNode\n className?: string\n}\n\n/**\n * Menu の項目。\n *\n * @example\n * <MenuItem id=\"rename\" shortcut=\"⌘R\">名前を変更</MenuItem>\n */\nexport function MenuItemComponent({\n id,\n isDisabled,\n description,\n shortcut,\n children,\n className,\n}: MenuItemProps) {\n const s = menuStyles()\n\n return (\n <MenuItem\n id={id}\n isDisabled={isDisabled}\n textValue={typeof children === 'string' ? children : undefined}\n data-slot=\"item\"\n className={s.item({ class: className })}\n >\n <span className=\"flex flex-col min-w-0\">\n <span data-slot=\"itemLabel\" className={s.itemLabel()}>\n {children}\n </span>\n {description !== undefined && (\n <span data-slot=\"itemDescription\" className={s.itemDescription()}>\n {description}\n </span>\n )}\n </span>\n {shortcut !== undefined && (\n <span data-slot=\"itemShortcut\" className={s.itemShortcut()}>\n {shortcut}\n </span>\n )}\n </MenuItem>\n )\n}\n\n/**\n * Menu の区切り線。行の罫線より濃く、まとまりの切れ目を示す。\n *\n * @example\n * <MenuSeparator />\n */\nexport function MenuSeparator({ className }: { className?: string }) {\n return (\n <Separator data-slot=\"separator\" className={menuStyles().separator({ class: className })} />\n )\n}\n\n/**\n * Menu の見出し付きグループ。項目が多いときに種類でまとめる。\n *\n * @example\n * <MenuSection title=\"ファイル\">\n * <MenuItem id=\"rename\">名前を変更</MenuItem>\n * </MenuSection>\n */\nexport function MenuSection({\n title,\n children,\n className,\n}: {\n title: ReactNode\n children?: ReactNode\n className?: string\n}) {\n const s = menuStyles()\n\n return (\n <RACMenuSection data-slot=\"section\" className={s.section({ class: className })}>\n <Header data-slot=\"sectionLabel\" className={s.sectionLabel()}>\n {title}\n </Header>\n {children}\n </RACMenuSection>\n )\n}\n\n/**\n * トリガーから開く操作の一覧。**一覧はトリガーの直後、フローの中に展開される**\n * (Raster は隣に浮き、Tactile は画面下端のシート)。\n *\n * 開くと後続が押し下げられるので、何かが隠れることが無い。\n * 矢印キーで移動、Escape で閉じてトリガーへフォーカスが戻る。\n *\n * `placement` / `offset` は受け取るが**効かない**。浮かないものに寄せる先は無い。\n * 他テーマ向けに書いたコードがそのまま動くよう、受け取ること自体はやめていない。\n *\n * 最初の子要素がトリガーになる。残りが項目として扱われる。\n *\n * @example\n * <Menu onAction={(key) => run(key)}>\n * <Button>操作</Button>\n * <MenuItem id=\"rename\" shortcut=\"⌘R\">名前を変更</MenuItem>\n * <MenuItem id=\"delete\">削除</MenuItem>\n * </Menu>\n */\nexport function Menu({\n isOpen,\n defaultOpen,\n onOpenChange,\n onAction,\n disabledKeys,\n children,\n className,\n classNames,\n id,\n}: MenuProps) {\n const s = menuStyles()\n const items = Array.isArray(children) ? children : [children]\n const [trigger, ...rest] = items\n\n return (\n <MenuTrigger isOpen={isOpen} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <span data-slot=\"trigger\" className={s.trigger({ class: classNames?.trigger })}>\n {trigger}\n </span>\n\n {/* 展開部はトリガーの直後。ここに面が生えることで、後続が押し下がる */}\n <InflowPopover\n dataSlot=\"popover\"\n className={s.popover({ class: [className, classNames?.popover] })}\n >\n {/* RAC の Popover は id を受け取らないため Menu 本体に付ける */}\n <RACMenu\n id={id}\n data-slot=\"list\"\n className={s.list({ class: classNames?.list })}\n onAction={(key) => onAction?.(String(key))}\n disabledKeys={disabledKeys}\n >\n {rest}\n </RACMenu>\n </InflowPopover>\n </MenuTrigger>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAiCA,SAAgB,kBAAkB,EAChC,IACA,YACA,aACA,UACA,UACA,aACgB;CAChB,MAAM,IAAI,WAAW;CAErB,OACE,qBAAC,UAAD;EACM;EACQ;EACZ,WAAW,OAAO,aAAa,WAAW,WAAW,KAAA;EACrD,aAAU;EACV,WAAW,EAAE,KAAK,EAAE,OAAO,UAAU,CAAC;EALxC,UAAA,CAOE,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,oBAAC,QAAD;IAAM,aAAU;IAAY,WAAW,EAAE,UAAU;IAChD;GACG,CAAA,GACL,gBAAgB,KAAA,KACf,oBAAC,QAAD;IAAM,aAAU;IAAkB,WAAW,EAAE,gBAAgB;IAC5D,UAAA;GACG,CAAA,CAEJ;EACL,CAAA,GAAA,aAAa,KAAA,KACZ,oBAAC,QAAD;GAAM,aAAU;GAAe,WAAW,EAAE,aAAa;GACtD,UAAA;EACG,CAAA,CAEA;;AAEd;;;;;;;AAQA,SAAgB,cAAc,EAAE,aAAqC;CACnE,OACE,oBAAC,WAAD;EAAW,aAAU;EAAY,WAAW,WAAW,CAAC,CAAC,UAAU,EAAE,OAAO,UAAU,CAAC;CAAI,CAAA;AAE/F;;;;;;;;;AAUA,SAAgBA,cAAY,EAC1B,OACA,UACA,aAKC;CACD,MAAM,IAAI,WAAW;CAErB,OACE,qBAACC,aAAD;EAAgB,aAAU;EAAU,WAAW,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC;EAA7E,UAAA,CACE,oBAAC,QAAD;GAAQ,aAAU;GAAe,WAAW,EAAE,aAAa;GACxD,UAAA;EACK,CAAA,GACP,QACa;;AAEpB;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgBC,OAAK,EACnB,QACA,aACA,cACA,UACA,cACA,UACA,WACA,YACA,MACY;CACZ,MAAM,IAAI,WAAW;CAErB,MAAM,CAAC,SAAS,GAAG,QADL,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;CAG5D,OACE,qBAAC,aAAD;EAAqB;EAAqB;EAA2B;EAArE,UAAA,CACE,oBAAC,QAAD;GAAM,aAAU;GAAU,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;GAC1E,UAAA;EACG,CAAA,GAGN,oBAAC,eAAD;GACE,UAAS;GACT,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,WAAW,YAAY,OAAO,EAAE,CAAC;GAGhE,UAAA,oBAACC,MAAD;IACM;IACJ,aAAU;IACV,WAAW,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC;IAC7C,WAAW,QAAQ,WAAW,OAAO,GAAG,CAAC;IAC3B;IAEb,UAAA;GACM,CAAA;EACI,CAAA,CACJ;;AAEjB"}
@@ -0,0 +1,114 @@
1
+ //#region src/menu/menu.styles.d.ts
2
+ /**
3
+ * Menu のスタイル定義。
4
+ *
5
+ * 展開部の位置は `InflowPopover` が `!` 付きのリセットで固定するので、
6
+ * ここで `position` 系を書いても効かない(書く必要も無い)。
7
+ *
8
+ * @example
9
+ * const myMenu = tv({ extend: menuStyles, slots: { popover: 'min-w-56' } })
10
+ */
11
+ declare const menuStyles: import("tailwind-variants").TVReturnType<{
12
+ [key: string]: {
13
+ [key: string]: import("tailwind-variants").ClassValue | {
14
+ item?: import("tailwind-variants").ClassValue;
15
+ trigger?: import("tailwind-variants").ClassValue;
16
+ list?: import("tailwind-variants").ClassValue;
17
+ itemLabel?: import("tailwind-variants").ClassValue;
18
+ separator?: import("tailwind-variants").ClassValue;
19
+ popover?: import("tailwind-variants").ClassValue;
20
+ itemDescription?: import("tailwind-variants").ClassValue;
21
+ itemShortcut?: import("tailwind-variants").ClassValue;
22
+ section?: import("tailwind-variants").ClassValue;
23
+ sectionLabel?: import("tailwind-variants").ClassValue;
24
+ };
25
+ };
26
+ } | {
27
+ [x: string]: {
28
+ [x: string]: import("tailwind-variants").ClassValue | {
29
+ item?: import("tailwind-variants").ClassValue;
30
+ trigger?: import("tailwind-variants").ClassValue;
31
+ list?: import("tailwind-variants").ClassValue;
32
+ itemLabel?: import("tailwind-variants").ClassValue;
33
+ separator?: import("tailwind-variants").ClassValue;
34
+ popover?: import("tailwind-variants").ClassValue;
35
+ itemDescription?: import("tailwind-variants").ClassValue;
36
+ itemShortcut?: import("tailwind-variants").ClassValue;
37
+ section?: import("tailwind-variants").ClassValue;
38
+ sectionLabel?: import("tailwind-variants").ClassValue;
39
+ };
40
+ };
41
+ } | {}, {
42
+ trigger: string;
43
+ popover: string;
44
+ list: string;
45
+ item: string;
46
+ itemLabel: string;
47
+ itemDescription: string;
48
+ /**
49
+ * ショートカットは**主役**(FR-10)。
50
+ *
51
+ * 両テーマは muted の小さな注記として右端に添えるが、帳票の世界では
52
+ * 「キーで引ける」ことが操作そのものの見出しになる。本文と同じ濃さ・
53
+ * 同じ大きさで、等幅の列として縦に揃える。
54
+ */
55
+ itemShortcut: string;
56
+ separator: string;
57
+ section: string;
58
+ sectionLabel: string;
59
+ }, undefined, {
60
+ [key: string]: {
61
+ [key: string]: import("tailwind-variants").ClassValue | {
62
+ item?: import("tailwind-variants").ClassValue;
63
+ trigger?: import("tailwind-variants").ClassValue;
64
+ list?: import("tailwind-variants").ClassValue;
65
+ itemLabel?: import("tailwind-variants").ClassValue;
66
+ separator?: import("tailwind-variants").ClassValue;
67
+ popover?: import("tailwind-variants").ClassValue;
68
+ itemDescription?: import("tailwind-variants").ClassValue;
69
+ itemShortcut?: import("tailwind-variants").ClassValue;
70
+ section?: import("tailwind-variants").ClassValue;
71
+ sectionLabel?: import("tailwind-variants").ClassValue;
72
+ };
73
+ };
74
+ } | {}, {
75
+ trigger: string;
76
+ popover: string;
77
+ list: string;
78
+ item: string;
79
+ itemLabel: string;
80
+ itemDescription: string;
81
+ /**
82
+ * ショートカットは**主役**(FR-10)。
83
+ *
84
+ * 両テーマは muted の小さな注記として右端に添えるが、帳票の世界では
85
+ * 「キーで引ける」ことが操作そのものの見出しになる。本文と同じ濃さ・
86
+ * 同じ大きさで、等幅の列として縦に揃える。
87
+ */
88
+ itemShortcut: string;
89
+ separator: string;
90
+ section: string;
91
+ sectionLabel: string;
92
+ }, import("tailwind-variants").TVReturnTypeLike<unknown, {
93
+ trigger: string;
94
+ popover: string;
95
+ list: string;
96
+ item: string;
97
+ itemLabel: string;
98
+ itemDescription: string;
99
+ /**
100
+ * ショートカットは**主役**(FR-10)。
101
+ *
102
+ * 両テーマは muted の小さな注記として右端に添えるが、帳票の世界では
103
+ * 「キーで引ける」ことが操作そのものの見出しになる。本文と同じ濃さ・
104
+ * 同じ大きさで、等幅の列として縦に揃える。
105
+ */
106
+ itemShortcut: string;
107
+ separator: string;
108
+ section: string;
109
+ sectionLabel: string;
110
+ }>>;
111
+ type MenuStyleProps = Parameters<typeof menuStyles>[0];
112
+ //#endregion
113
+ export { MenuStyleProps, menuStyles };
114
+ //# sourceMappingURL=menu.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.styles.d.mts","names":[],"sources":["../../src/menu/menu.styles.ts"],"mappings":";;;;;;;;;;cAoEa,wCAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEX,iBAAiB,kBAAkB"}
@@ -0,0 +1,66 @@
1
+ import { disabledState } from "../styles/focus-ring.mjs";
2
+ import { mono, monoNumeric } from "../styles/mono.mjs";
3
+ import { tv } from "tailwind-variants";
4
+ //#region src/menu/menu.styles.ts
5
+ /**
6
+ * Flatlay の Menu は **インフロー押し下げ**(FR-05)。
7
+ *
8
+ * 両テーマはトリガーの隣(Raster)か画面下端(Tactile)に浮かせるが、Flatlay には
9
+ * 浮かせる先が無い。**一覧はトリガーの直後に生えて後続を押し下げる**。
10
+ * 配置は `styles/inflow.tsx` が担い、ここは面の見た目だけを決める。
11
+ *
12
+ * `placement` / `offset` は受け取るが効かない。浮かないものに寄せる先は無い。
13
+ */
14
+ const slots = {
15
+ trigger: "outline-none",
16
+ popover: [
17
+ "min-w-40 outline-none",
18
+ "border border-[var(--novi-color-border-strong)]",
19
+ "bg-[var(--novi-color-bg)] text-[var(--novi-color-fg)]",
20
+ "rounded-[var(--novi-radius-sm)]",
21
+ "overflow-hidden"
22
+ ].join(" "),
23
+ list: "outline-none flex flex-col divide-y divide-[var(--novi-color-border)]",
24
+ item: [
25
+ "flex items-center justify-between gap-3",
26
+ "min-h-7 px-2 py-1 cursor-pointer outline-none",
27
+ "text-[var(--novi-color-fg)]",
28
+ "data-[focused]:bg-[var(--novi-color-subtle)]",
29
+ "data-[pressed]:bg-[var(--novi-color-fg)] data-[pressed]:text-[var(--novi-color-bg)]",
30
+ "transition-[background-color,color]",
31
+ "duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
32
+ disabledState
33
+ ].join(" "),
34
+ itemLabel: "truncate",
35
+ itemDescription: `text-[length:var(--novi-text-xs)] text-[var(--novi-color-muted)] ${mono}`,
36
+ /**
37
+ * ショートカットは**主役**(FR-10)。
38
+ *
39
+ * 両テーマは muted の小さな注記として右端に添えるが、帳票の世界では
40
+ * 「キーで引ける」ことが操作そのものの見出しになる。本文と同じ濃さ・
41
+ * 同じ大きさで、等幅の列として縦に揃える。
42
+ */
43
+ itemShortcut: `shrink-0 text-[length:var(--novi-text-sm)] text-[var(--novi-color-fg)] ${monoNumeric}`,
44
+ separator: "h-px bg-[var(--novi-color-border-strong)]",
45
+ section: "flex flex-col",
46
+ sectionLabel: [
47
+ "px-2 py-1",
48
+ "bg-[var(--novi-color-subtle)]",
49
+ "text-[length:var(--novi-text-xs)] text-[var(--novi-color-muted)]",
50
+ mono
51
+ ].join(" ")
52
+ };
53
+ /**
54
+ * Menu のスタイル定義。
55
+ *
56
+ * 展開部の位置は `InflowPopover` が `!` 付きのリセットで固定するので、
57
+ * ここで `position` 系を書いても効かない(書く必要も無い)。
58
+ *
59
+ * @example
60
+ * const myMenu = tv({ extend: menuStyles, slots: { popover: 'min-w-56' } })
61
+ */
62
+ const menuStyles = tv({ slots });
63
+ //#endregion
64
+ export { menuStyles };
65
+
66
+ //# sourceMappingURL=menu.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.styles.mjs","names":[],"sources":["../../src/menu/menu.styles.ts"],"sourcesContent":["import type { menuRequiredSlots, menuSlots, SlotMap } from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState } from '../styles/focus-ring'\nimport { mono, monoNumeric } from '../styles/mono'\n\n/**\n * Flatlay の Menu は **インフロー押し下げ**(FR-05)。\n *\n * 両テーマはトリガーの隣(Raster)か画面下端(Tactile)に浮かせるが、Flatlay には\n * 浮かせる先が無い。**一覧はトリガーの直後に生えて後続を押し下げる**。\n * 配置は `styles/inflow.tsx` が担い、ここは面の見た目だけを決める。\n *\n * `placement` / `offset` は受け取るが効かない。浮かないものに寄せる先は無い。\n */\nconst slots = {\n trigger: 'outline-none',\n popover: [\n // 影が無い以上、面の存在を示せるのは罫線だけ\n 'min-w-40 outline-none',\n 'border border-[var(--novi-color-border-strong)]',\n 'bg-[var(--novi-color-bg)] text-[var(--novi-color-fg)]',\n 'rounded-[var(--novi-radius-sm)]',\n 'overflow-hidden',\n ].join(' '),\n // 行の切れ目も線。Select の一覧と同じ帳票の目\n list: 'outline-none flex flex-col divide-y divide-[var(--novi-color-border)]',\n item: [\n 'flex items-center justify-between gap-3',\n 'min-h-7 px-2 py-1 cursor-pointer outline-none',\n 'text-[var(--novi-color-fg)]',\n 'data-[focused]:bg-[var(--novi-color-subtle)]',\n // 押下は反転スタンプ(ADR-F3)。選ばれた瞬間だけ面が返る\n 'data-[pressed]:bg-[var(--novi-color-fg)] data-[pressed]:text-[var(--novi-color-bg)]',\n 'transition-[background-color,color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n disabledState,\n ].join(' '),\n itemLabel: 'truncate',\n itemDescription: `text-[length:var(--novi-text-xs)] text-[var(--novi-color-muted)] ${mono}`,\n /**\n * ショートカットは**主役**(FR-10)。\n *\n * 両テーマは muted の小さな注記として右端に添えるが、帳票の世界では\n * 「キーで引ける」ことが操作そのものの見出しになる。本文と同じ濃さ・\n * 同じ大きさで、等幅の列として縦に揃える。\n */\n itemShortcut: `shrink-0 text-[length:var(--novi-text-sm)] text-[var(--novi-color-fg)] ${monoNumeric}`,\n // 行の線より濃い。ここが「まとまりの切れ目」であることを線の濃さで示す\n separator: 'h-px bg-[var(--novi-color-border-strong)]',\n section: 'flex flex-col',\n // 表の見出し行。地を一段落として、浮かせずに階層を作る\n sectionLabel: [\n 'px-2 py-1',\n 'bg-[var(--novi-color-subtle)]',\n 'text-[length:var(--novi-text-xs)] text-[var(--novi-color-muted)]',\n mono,\n ].join(' '),\n} satisfies SlotMap<typeof menuSlots, (typeof menuRequiredSlots)[number]>\n\n/**\n * Menu のスタイル定義。\n *\n * 展開部の位置は `InflowPopover` が `!` 付きのリセットで固定するので、\n * ここで `position` 系を書いても効かない(書く必要も無い)。\n *\n * @example\n * const myMenu = tv({ extend: menuStyles, slots: { popover: 'min-w-56' } })\n */\nexport const menuStyles = tv({ slots })\n\nexport type MenuStyleProps = Parameters<typeof menuStyles>[0]\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,QAAQ;CACZ,SAAS;CACT,SAAS;EAEP;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,MAAM;CACN,MAAM;EACJ;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,WAAW;CACX,iBAAiB,oEAAoE;;;;;;;;CAQrF,cAAc,0EAA0E;CAExF,WAAW;CACX,SAAS;CAET,cAAc;EACZ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;AACZ;;;;;;;;;;AAWA,MAAa,aAAa,GAAG,EAAE,MAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Modal, ModalBody, ModalFooter, ModalTitle } from "./modal.mjs";
2
+ import { ModalStyleProps, modalStyles } from "./modal.styles.mjs";
3
+ export { Modal, ModalBody, ModalFooter, type ModalStyleProps, ModalTitle, modalStyles };