@novi-ui/tactile 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/README.md +195 -0
  2. package/dist/accordion/accordion.d.mts +31 -0
  3. package/dist/accordion/accordion.d.mts.map +1 -0
  4. package/dist/accordion/accordion.mjs +88 -0
  5. package/dist/accordion/accordion.mjs.map +1 -0
  6. package/dist/accordion/accordion.styles.d.mts +61 -0
  7. package/dist/accordion/accordion.styles.d.mts.map +1 -0
  8. package/dist/accordion/accordion.styles.mjs +83 -0
  9. package/dist/accordion/accordion.styles.mjs.map +1 -0
  10. package/dist/accordion/index.d.mts +3 -0
  11. package/dist/avatar/avatar.d.mts +19 -0
  12. package/dist/avatar/avatar.d.mts.map +1 -0
  13. package/dist/avatar/avatar.mjs +57 -0
  14. package/dist/avatar/avatar.mjs.map +1 -0
  15. package/dist/avatar/avatar.styles.d.mts +49 -0
  16. package/dist/avatar/avatar.styles.d.mts.map +1 -0
  17. package/dist/avatar/avatar.styles.mjs +45 -0
  18. package/dist/avatar/avatar.styles.mjs.map +1 -0
  19. package/dist/avatar/index.d.mts +3 -0
  20. package/dist/badge/badge.d.mts +15 -0
  21. package/dist/badge/badge.d.mts.map +1 -0
  22. package/dist/badge/badge.mjs +39 -0
  23. package/dist/badge/badge.mjs.map +1 -0
  24. package/dist/badge/badge.styles.d.mts +67 -0
  25. package/dist/badge/badge.styles.d.mts.map +1 -0
  26. package/dist/badge/badge.styles.mjs +99 -0
  27. package/dist/badge/badge.styles.mjs.map +1 -0
  28. package/dist/badge/index.d.mts +3 -0
  29. package/dist/breadcrumbs/breadcrumbs.d.mts +33 -0
  30. package/dist/breadcrumbs/breadcrumbs.d.mts.map +1 -0
  31. package/dist/breadcrumbs/breadcrumbs.mjs +79 -0
  32. package/dist/breadcrumbs/breadcrumbs.mjs.map +1 -0
  33. package/dist/breadcrumbs/breadcrumbs.styles.d.mts +46 -0
  34. package/dist/breadcrumbs/breadcrumbs.styles.d.mts.map +1 -0
  35. package/dist/breadcrumbs/breadcrumbs.styles.mjs +38 -0
  36. package/dist/breadcrumbs/breadcrumbs.styles.mjs.map +1 -0
  37. package/dist/breadcrumbs/index.d.mts +3 -0
  38. package/dist/button/button.d.mts +17 -0
  39. package/dist/button/button.d.mts.map +1 -0
  40. package/dist/button/button.mjs +78 -0
  41. package/dist/button/button.mjs.map +1 -0
  42. package/dist/button/button.styles.d.mts +82 -0
  43. package/dist/button/button.styles.d.mts.map +1 -0
  44. package/dist/button/button.styles.mjs +136 -0
  45. package/dist/button/button.styles.mjs.map +1 -0
  46. package/dist/button/index.d.mts +3 -0
  47. package/dist/card/card.d.mts +51 -0
  48. package/dist/card/card.d.mts.map +1 -0
  49. package/dist/card/card.mjs +96 -0
  50. package/dist/card/card.mjs.map +1 -0
  51. package/dist/card/card.styles.d.mts +70 -0
  52. package/dist/card/card.styles.d.mts.map +1 -0
  53. package/dist/card/card.styles.mjs +61 -0
  54. package/dist/card/card.styles.mjs.map +1 -0
  55. package/dist/card/index.d.mts +3 -0
  56. package/dist/checkbox/checkbox.d.mts +24 -0
  57. package/dist/checkbox/checkbox.d.mts.map +1 -0
  58. package/dist/checkbox/checkbox.mjs +124 -0
  59. package/dist/checkbox/checkbox.mjs.map +1 -0
  60. package/dist/checkbox/checkbox.styles.d.mts +111 -0
  61. package/dist/checkbox/checkbox.styles.d.mts.map +1 -0
  62. package/dist/checkbox/checkbox.styles.mjs +99 -0
  63. package/dist/checkbox/checkbox.styles.mjs.map +1 -0
  64. package/dist/checkbox/index.d.mts +3 -0
  65. package/dist/index.d.mts +61 -0
  66. package/dist/index.mjs +42 -0
  67. package/dist/input/index.d.mts +3 -0
  68. package/dist/input/input.d.mts +20 -0
  69. package/dist/input/input.d.mts.map +1 -0
  70. package/dist/input/input.mjs +86 -0
  71. package/dist/input/input.mjs.map +1 -0
  72. package/dist/input/input.styles.d.mts +81 -0
  73. package/dist/input/input.styles.d.mts.map +1 -0
  74. package/dist/input/input.styles.mjs +88 -0
  75. package/dist/input/input.styles.mjs.map +1 -0
  76. package/dist/menu/index.d.mts +3 -0
  77. package/dist/menu/menu.d.mts +62 -0
  78. package/dist/menu/menu.d.mts.map +1 -0
  79. package/dist/menu/menu.mjs +115 -0
  80. package/dist/menu/menu.mjs.map +1 -0
  81. package/dist/menu/menu.styles.d.mts +90 -0
  82. package/dist/menu/menu.styles.d.mts.map +1 -0
  83. package/dist/menu/menu.styles.mjs +42 -0
  84. package/dist/menu/menu.styles.mjs.map +1 -0
  85. package/dist/modal/index.d.mts +3 -0
  86. package/dist/modal/modal.d.mts +55 -0
  87. package/dist/modal/modal.d.mts.map +1 -0
  88. package/dist/modal/modal.mjs +122 -0
  89. package/dist/modal/modal.mjs.map +1 -0
  90. package/dist/modal/modal.styles.d.mts +58 -0
  91. package/dist/modal/modal.styles.d.mts.map +1 -0
  92. package/dist/modal/modal.styles.mjs +91 -0
  93. package/dist/modal/modal.styles.mjs.map +1 -0
  94. package/dist/popover/index.d.mts +3 -0
  95. package/dist/popover/popover.d.mts +40 -0
  96. package/dist/popover/popover.d.mts.map +1 -0
  97. package/dist/popover/popover.mjs +86 -0
  98. package/dist/popover/popover.mjs.map +1 -0
  99. package/dist/popover/popover.styles.d.mts +81 -0
  100. package/dist/popover/popover.styles.d.mts.map +1 -0
  101. package/dist/popover/popover.styles.mjs +53 -0
  102. package/dist/popover/popover.styles.mjs.map +1 -0
  103. package/dist/progress/index.d.mts +3 -0
  104. package/dist/progress/progress.d.mts +14 -0
  105. package/dist/progress/progress.d.mts.map +1 -0
  106. package/dist/progress/progress.mjs +54 -0
  107. package/dist/progress/progress.mjs.map +1 -0
  108. package/dist/progress/progress.styles.d.mts +70 -0
  109. package/dist/progress/progress.styles.d.mts.map +1 -0
  110. package/dist/progress/progress.styles.mjs +54 -0
  111. package/dist/progress/progress.styles.mjs.map +1 -0
  112. package/dist/radio/index.d.mts +3 -0
  113. package/dist/radio/radio.d.mts +22 -0
  114. package/dist/radio/radio.d.mts.map +1 -0
  115. package/dist/radio/radio.mjs +95 -0
  116. package/dist/radio/radio.mjs.map +1 -0
  117. package/dist/radio/radio.styles.d.mts +111 -0
  118. package/dist/radio/radio.styles.d.mts.map +1 -0
  119. package/dist/radio/radio.styles.mjs +95 -0
  120. package/dist/radio/radio.styles.mjs.map +1 -0
  121. package/dist/select/index.d.mts +3 -0
  122. package/dist/select/select.d.mts +34 -0
  123. package/dist/select/select.d.mts.map +1 -0
  124. package/dist/select/select.mjs +136 -0
  125. package/dist/select/select.mjs.map +1 -0
  126. package/dist/select/select.styles.d.mts +85 -0
  127. package/dist/select/select.styles.d.mts.map +1 -0
  128. package/dist/select/select.styles.mjs +109 -0
  129. package/dist/select/select.styles.mjs.map +1 -0
  130. package/dist/skeleton/index.d.mts +3 -0
  131. package/dist/skeleton/skeleton.d.mts +15 -0
  132. package/dist/skeleton/skeleton.d.mts.map +1 -0
  133. package/dist/skeleton/skeleton.mjs +26 -0
  134. package/dist/skeleton/skeleton.mjs.map +1 -0
  135. package/dist/skeleton/skeleton.styles.d.mts +31 -0
  136. package/dist/skeleton/skeleton.styles.d.mts.map +1 -0
  137. package/dist/skeleton/skeleton.styles.mjs +22 -0
  138. package/dist/skeleton/skeleton.styles.mjs.map +1 -0
  139. package/dist/spinner/index.d.mts +3 -0
  140. package/dist/spinner/spinner.d.mts +15 -0
  141. package/dist/spinner/spinner.d.mts.map +1 -0
  142. package/dist/spinner/spinner.mjs +55 -0
  143. package/dist/spinner/spinner.mjs.map +1 -0
  144. package/dist/spinner/spinner.styles.d.mts +46 -0
  145. package/dist/spinner/spinner.styles.d.mts.map +1 -0
  146. package/dist/spinner/spinner.styles.mjs +37 -0
  147. package/dist/spinner/spinner.styles.mjs.map +1 -0
  148. package/dist/styles/focus-ring.mjs +23 -0
  149. package/dist/styles/focus-ring.mjs.map +1 -0
  150. package/dist/styles/tap-target.mjs +25 -0
  151. package/dist/styles/tap-target.mjs.map +1 -0
  152. package/dist/switch/index.d.mts +3 -0
  153. package/dist/switch/switch.d.mts +17 -0
  154. package/dist/switch/switch.d.mts.map +1 -0
  155. package/dist/switch/switch.mjs +57 -0
  156. package/dist/switch/switch.mjs.map +1 -0
  157. package/dist/switch/switch.styles.d.mts +58 -0
  158. package/dist/switch/switch.styles.d.mts.map +1 -0
  159. package/dist/switch/switch.styles.mjs +79 -0
  160. package/dist/switch/switch.styles.mjs.map +1 -0
  161. package/dist/tabs/index.d.mts +3 -0
  162. package/dist/tabs/tabs.d.mts +57 -0
  163. package/dist/tabs/tabs.d.mts.map +1 -0
  164. package/dist/tabs/tabs.mjs +91 -0
  165. package/dist/tabs/tabs.mjs.map +1 -0
  166. package/dist/tabs/tabs.styles.d.mts +58 -0
  167. package/dist/tabs/tabs.styles.d.mts.map +1 -0
  168. package/dist/tabs/tabs.styles.mjs +92 -0
  169. package/dist/tabs/tabs.styles.mjs.map +1 -0
  170. package/dist/tactile.css +528 -0
  171. package/dist/tactile.scoped.css +528 -0
  172. package/dist/textarea/index.d.mts +3 -0
  173. package/dist/textarea/textarea.d.mts +15 -0
  174. package/dist/textarea/textarea.d.mts.map +1 -0
  175. package/dist/textarea/textarea.mjs +70 -0
  176. package/dist/textarea/textarea.mjs.map +1 -0
  177. package/dist/textarea/textarea.styles.d.mts +73 -0
  178. package/dist/textarea/textarea.styles.d.mts.map +1 -0
  179. package/dist/textarea/textarea.styles.mjs +83 -0
  180. package/dist/textarea/textarea.styles.mjs.map +1 -0
  181. package/dist/toast/index.d.mts +3 -0
  182. package/dist/toast/toast.d.mts +38 -0
  183. package/dist/toast/toast.d.mts.map +1 -0
  184. package/dist/toast/toast.mjs +86 -0
  185. package/dist/toast/toast.mjs.map +1 -0
  186. package/dist/toast/toast.styles.d.mts +61 -0
  187. package/dist/toast/toast.styles.d.mts.map +1 -0
  188. package/dist/toast/toast.styles.mjs +59 -0
  189. package/dist/toast/toast.styles.mjs.map +1 -0
  190. package/package.json +68 -0
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { grabberClass, modalStyles } from "./modal.styles.mjs";
3
+ import { Button, Dialog, Heading, Modal, ModalOverlay } from "react-aria-components";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Children, isValidElement } from "react";
6
+ //#region src/modal/modal.tsx
7
+ /**
8
+ * Modal の見出し。
9
+ *
10
+ * Raster と違い**ヘッダー行を作らない** — 閉じるボタンはフッターにあるので、
11
+ * 横方向に並べる相手がいない。見出しは本文の上に素直に載る。
12
+ * それでも描画するのは、ダイアログにアクセシブルな名前が要るため。
13
+ *
14
+ * @example
15
+ * <ModalTitle>削除しますか</ModalTitle>
16
+ */
17
+ function ModalTitle({ children, className }) {
18
+ return /* @__PURE__ */ jsx(Heading, {
19
+ slot: "title",
20
+ "data-slot": "title",
21
+ className: modalStyles().title({ class: className }),
22
+ children
23
+ });
24
+ }
25
+ /**
26
+ * Modal の本体。
27
+ *
28
+ * @example
29
+ * <ModalBody>この操作は取り消せません。</ModalBody>
30
+ */
31
+ function ModalBody({ children, className }) {
32
+ return /* @__PURE__ */ jsx("div", {
33
+ "data-slot": "body",
34
+ className: modalStyles().body({ class: className }),
35
+ children
36
+ });
37
+ }
38
+ /** 閉じるボタン。`slot="close"` は Dialog の文脈から閉じる手段を受け取る。 */
39
+ function CloseButton({ className }) {
40
+ return /* @__PURE__ */ jsx(Button, {
41
+ slot: "close",
42
+ "data-slot": "closeButton",
43
+ className: modalStyles().closeButton({ class: className }),
44
+ children: "閉じる"
45
+ });
46
+ }
47
+ /**
48
+ * Modal の操作列。**縦積みでフルワイド**になり、末尾に閉じるボタンが入る。
49
+ *
50
+ * 横に並べると1つあたりの幅が指に対して狭くなるため、Tactile では積む。
51
+ * 閉じるを最後に置くのは、親指が最も届く位置が下端だから。
52
+ *
53
+ * @example
54
+ * <ModalFooter>
55
+ * <Button color="danger">削除</Button>
56
+ * </ModalFooter>
57
+ */
58
+ function ModalFooter({ children, className }) {
59
+ return /* @__PURE__ */ jsxs("div", {
60
+ "data-slot": "footer",
61
+ className: modalStyles().footer({ class: className }),
62
+ children: [children, /* @__PURE__ */ jsx(CloseButton, {})]
63
+ });
64
+ }
65
+ /** 子に `ModalFooter` が含まれるか。含まれない場合だけ既定のフッターを足す。 */
66
+ function hasFooter(children) {
67
+ return Children.toArray(children).some((child) => isValidElement(child) && child.type === ModalFooter);
68
+ }
69
+ /**
70
+ * 画面下端から出るボトムシート。開いている間フォーカスは内側に閉じ込められ、
71
+ * Escape で閉じる。
72
+ *
73
+ * Raster が中央のダイアログで閉じるを右上に置くのに対し、Tactile は
74
+ * **下から出て、閉じるをフッターのフルワイドボタンにする**。親指の届く位置に
75
+ * 出口を置くため。`size` は幅ではなく**最大高**の意味になる(ADR-T3)。
76
+ *
77
+ * @example
78
+ * <Modal isOpen={isOpen} onOpenChange={setIsOpen}>
79
+ * <ModalTitle>削除しますか</ModalTitle>
80
+ * <ModalBody>この操作は取り消せません。</ModalBody>
81
+ * </Modal>
82
+ */
83
+ function Modal$1({ size, radius, isOpen, defaultOpen, onOpenChange, isDismissable = true, isKeyboardDismissDisabled, children, className, classNames, id }) {
84
+ const s = modalStyles({
85
+ size,
86
+ radius
87
+ });
88
+ return /* @__PURE__ */ jsx(ModalOverlay, {
89
+ isOpen,
90
+ defaultOpen,
91
+ onOpenChange,
92
+ isDismissable,
93
+ isKeyboardDismissDisabled,
94
+ "data-slot": "backdrop",
95
+ className: s.backdrop({ class: classNames?.backdrop }),
96
+ children: /* @__PURE__ */ jsx(Modal, {
97
+ "data-slot": "panel",
98
+ className: s.panel({ class: [className, classNames?.panel] }),
99
+ children: /* @__PURE__ */ jsxs(Dialog, {
100
+ id,
101
+ className: "outline-none flex flex-col",
102
+ children: [
103
+ /* @__PURE__ */ jsx("div", {
104
+ "data-tactile-grabber": true,
105
+ "aria-hidden": "true",
106
+ className: grabberClass
107
+ }),
108
+ children,
109
+ !hasFooter(children) && /* @__PURE__ */ jsx("div", {
110
+ "data-slot": "footer",
111
+ className: s.footer({ class: classNames?.footer }),
112
+ children: /* @__PURE__ */ jsx(CloseButton, { className: classNames?.closeButton })
113
+ })
114
+ ]
115
+ })
116
+ })
117
+ });
118
+ }
119
+ //#endregion
120
+ export { Modal$1 as Modal, ModalBody, ModalFooter, ModalTitle };
121
+
122
+ //# sourceMappingURL=modal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.mjs","names":["Modal","RACModal"],"sources":["../../src/modal/modal.tsx"],"sourcesContent":["'use client'\n\nimport type { ModalProps } from '@novi-ui/core'\nimport { Children, isValidElement, type ReactNode } from 'react'\nimport { Button, Dialog, Heading, ModalOverlay, Modal as RACModal } from 'react-aria-components'\nimport { grabberClass, modalStyles } from './modal.styles'\n\ninterface PartProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Modal の見出し。\n *\n * Raster と違い**ヘッダー行を作らない** — 閉じるボタンはフッターにあるので、\n * 横方向に並べる相手がいない。見出しは本文の上に素直に載る。\n * それでも描画するのは、ダイアログにアクセシブルな名前が要るため。\n *\n * @example\n * <ModalTitle>削除しますか</ModalTitle>\n */\nexport function ModalTitle({ children, className }: PartProps) {\n return (\n <Heading slot=\"title\" data-slot=\"title\" className={modalStyles().title({ class: className })}>\n {children}\n </Heading>\n )\n}\n\n/**\n * Modal の本体。\n *\n * @example\n * <ModalBody>この操作は取り消せません。</ModalBody>\n */\nexport function ModalBody({ children, className }: PartProps) {\n return (\n <div data-slot=\"body\" className={modalStyles().body({ class: className })}>\n {children}\n </div>\n )\n}\n\n/** 閉じるボタン。`slot=\"close\"` は Dialog の文脈から閉じる手段を受け取る。 */\nfunction CloseButton({ className }: { className?: string }) {\n return (\n <Button\n slot=\"close\"\n data-slot=\"closeButton\"\n className={modalStyles().closeButton({ class: className })}\n >\n 閉じる\n </Button>\n )\n}\n\n/**\n * Modal の操作列。**縦積みでフルワイド**になり、末尾に閉じるボタンが入る。\n *\n * 横に並べると1つあたりの幅が指に対して狭くなるため、Tactile では積む。\n * 閉じるを最後に置くのは、親指が最も届く位置が下端だから。\n *\n * @example\n * <ModalFooter>\n * <Button color=\"danger\">削除</Button>\n * </ModalFooter>\n */\nexport function ModalFooter({ children, className }: PartProps) {\n return (\n <div data-slot=\"footer\" className={modalStyles().footer({ class: className })}>\n {children}\n <CloseButton />\n </div>\n )\n}\n\n/** 子に `ModalFooter` が含まれるか。含まれない場合だけ既定のフッターを足す。 */\nfunction hasFooter(children: ReactNode): boolean {\n return Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === ModalFooter,\n )\n}\n\n/**\n * 画面下端から出るボトムシート。開いている間フォーカスは内側に閉じ込められ、\n * Escape で閉じる。\n *\n * Raster が中央のダイアログで閉じるを右上に置くのに対し、Tactile は\n * **下から出て、閉じるをフッターのフルワイドボタンにする**。親指の届く位置に\n * 出口を置くため。`size` は幅ではなく**最大高**の意味になる(ADR-T3)。\n *\n * @example\n * <Modal isOpen={isOpen} onOpenChange={setIsOpen}>\n * <ModalTitle>削除しますか</ModalTitle>\n * <ModalBody>この操作は取り消せません。</ModalBody>\n * </Modal>\n */\nexport function Modal({\n size,\n radius,\n isOpen,\n defaultOpen,\n onOpenChange,\n isDismissable = true,\n isKeyboardDismissDisabled,\n children,\n className,\n classNames,\n id,\n}: ModalProps) {\n const s = modalStyles({ size, radius })\n\n return (\n <ModalOverlay\n isOpen={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n isDismissable={isDismissable}\n isKeyboardDismissDisabled={isKeyboardDismissDisabled}\n data-slot=\"backdrop\"\n className={s.backdrop({ class: classNames?.backdrop })}\n >\n <RACModal data-slot=\"panel\" className={s.panel({ class: [className, classNames?.panel] })}>\n {/* RAC の ModalOverlay / Modal は id を受け取らないため Dialog に付ける */}\n <Dialog id={id} className=\"outline-none flex flex-col\">\n {/* 掴み手。slot 語彙に無いので data-slot を付けず aria-hidden にする。\n ドラッグ開閉は未実装(NG6)なので、掴めそうに見せすぎない細さに留める */}\n <div data-tactile-grabber aria-hidden=\"true\" className={grabberClass} />\n\n {children}\n\n {/* 出口を必ず1つ持たせる。利用者が ModalFooter を置いた場合はそちらに入るので、\n ここで足すと footer slot が二重になる */}\n {!hasFooter(children) && (\n <div data-slot=\"footer\" className={s.footer({ class: classNames?.footer })}>\n <CloseButton className={classNames?.closeButton} />\n </div>\n )}\n </Dialog>\n </RACModal>\n </ModalOverlay>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,SAAgB,WAAW,EAAE,UAAU,aAAwB;CAC7D,OACE,oBAAC,SAAD;EAAS,MAAK;EAAQ,aAAU;EAAQ,WAAW,YAAY,CAAC,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;EACxF;CACM,CAAA;AAEb;;;;;;;AAQA,SAAgB,UAAU,EAAE,UAAU,aAAwB;CAC5D,OACE,oBAAC,OAAD;EAAK,aAAU;EAAO,WAAW,YAAY,CAAC,CAAC,KAAK,EAAE,OAAO,UAAU,CAAC;EACrE;CACE,CAAA;AAET;;AAGA,SAAS,YAAY,EAAE,aAAqC;CAC1D,OACE,oBAAC,QAAD;EACE,MAAK;EACL,aAAU;EACV,WAAW,YAAY,CAAC,CAAC,YAAY,EAAE,OAAO,UAAU,CAAC;EAC1D,UAAA;CAEO,CAAA;AAEZ;;;;;;;;;;;;AAaA,SAAgB,YAAY,EAAE,UAAU,aAAwB;CAC9D,OACE,qBAAC,OAAD;EAAK,aAAU;EAAS,WAAW,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,UAAU,CAAC;EAA5E,UAAA,CACG,UACD,oBAAC,aAAD,CAAc,CAAA,CACX;;AAET;;AAGA,SAAS,UAAU,UAA8B;CAC/C,OAAO,SAAS,QAAQ,QAAQ,CAAC,CAAC,MAC/B,UAAU,eAAe,KAAK,KAAK,MAAM,SAAS,WACrD;AACF;;;;;;;;;;;;;;;AAgBA,SAAgBA,QAAM,EACpB,MACA,QACA,QACA,aACA,cACA,gBAAgB,MAChB,2BACA,UACA,WACA,YACA,MACa;CACb,MAAM,IAAI,YAAY;EAAE;EAAM;CAAO,CAAC;CAEtC,OACE,oBAAC,cAAD;EACU;EACK;EACC;EACC;EACY;EAC3B,aAAU;EACV,WAAW,EAAE,SAAS,EAAE,OAAO,YAAY,SAAS,CAAC;EAErD,UAAA,oBAACC,OAAD;GAAU,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,YAAY,KAAK,EAAE,CAAC;GAEtF,UAAA,qBAAC,QAAD;IAAY;IAAI,WAAU;IAA1B,UAAA;KAGE,oBAAC,OAAD;MAAK,wBAAA;MAAqB,eAAY;MAAO,WAAW;KAAe,CAAA;KAEtE;KAIA,CAAC,UAAU,QAAQ,KAClB,oBAAC,OAAD;MAAK,aAAU;MAAS,WAAW,EAAE,OAAO,EAAE,OAAO,YAAY,OAAO,CAAC;MACvE,UAAA,oBAAC,aAAD,EAAa,WAAW,YAAY,YAAc,CAAA;KAC/C,CAAA;IAED;;EACA,CAAA;CACE,CAAA;AAElB"}
@@ -0,0 +1,58 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/modal/modal.styles.d.ts
3
+ /**
4
+ * Modal のスタイル定義。
5
+ *
6
+ * @example
7
+ * import { modalStyles } from '@novi-ui/tactile'
8
+ * import { tv } from 'tailwind-variants'
9
+ *
10
+ * const myModal = tv({ extend: modalStyles, slots: { panel: 'max-h-[50dvh]' } })
11
+ */
12
+ declare const modalStyles: import("tailwind-variants").TVReturnType<{
13
+ size: VariantMap<"sm" | "md" | "lg" | "full", {
14
+ panel: string;
15
+ }>;
16
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
17
+ panel: string;
18
+ }>;
19
+ }, {
20
+ backdrop: string;
21
+ panel: string;
22
+ title: string;
23
+ closeButton: string;
24
+ body: string;
25
+ footer: string;
26
+ }, undefined, {
27
+ size: VariantMap<"sm" | "md" | "lg" | "full", {
28
+ panel: string;
29
+ }>;
30
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
31
+ panel: string;
32
+ }>;
33
+ }, {
34
+ backdrop: string;
35
+ panel: string;
36
+ title: string;
37
+ closeButton: string;
38
+ body: string;
39
+ footer: string;
40
+ }, import("tailwind-variants").TVReturnTypeLike<{
41
+ size: VariantMap<"sm" | "md" | "lg" | "full", {
42
+ panel: string;
43
+ }>;
44
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
45
+ panel: string;
46
+ }>;
47
+ }, {
48
+ backdrop: string;
49
+ panel: string;
50
+ title: string;
51
+ closeButton: string;
52
+ body: string;
53
+ footer: string;
54
+ }>>;
55
+ type ModalStyleProps = Parameters<typeof modalStyles>[0];
56
+ //#endregion
57
+ export { ModalStyleProps, modalStyles };
58
+ //# sourceMappingURL=modal.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.styles.d.mts","names":[],"sources":["../../src/modal/modal.styles.ts"],"mappings":";;;;;;;;;;;cA4Fa,yCAAW;;IAzB2B;;;IAQL;;;;;;;;;;;IARK;;;IAQL;;;;;;;;;;;IARK;;;IAQL;;;;;;;;;;KAuBlC,kBAAkB,kBAAkB"}
@@ -0,0 +1,91 @@
1
+ import { focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/modal/modal.styles.ts
4
+ /**
5
+ * Tactile の Modal は **下端から出るボトムシート**(architecture.md §5 テーマB)。
6
+ *
7
+ * Raster との構造差:
8
+ * - 中央配置 → 画面下端に張り付く(`items-end`)
9
+ * - ヘッダー行に ✕ → **フッターのフルワイドボタン**(親指の届く位置に出口を置く)
10
+ * - 上下すべて角丸 → **上端だけ角丸**(下から出てきた紙という形)
11
+ * - 影は下向き → **上向き**(下端から来る面には上から光が当たる)
12
+ */
13
+ const slots = {
14
+ backdrop: [
15
+ "fixed inset-0 z-50 flex items-end justify-center",
16
+ "bg-[var(--novi-color-overlay)]",
17
+ "data-[entering]:motion-safe:animate-[novi-fade-in_200ms_ease-out]"
18
+ ].join(" "),
19
+ panel: [
20
+ "text-[var(--novi-color-fg)]",
21
+ "w-full outline-none",
22
+ "bg-[var(--novi-color-surface)]",
23
+ "shadow-[var(--novi-shadow-lg)]",
24
+ "overflow-auto",
25
+ "pb-[env(safe-area-inset-bottom,0px)]",
26
+ "data-[entering]:motion-safe:animate-[novi-slide-up_260ms_var(--novi-ease-emphasized)]"
27
+ ].join(" "),
28
+ title: [
29
+ "px-5 pt-5 pb-2",
30
+ "text-[length:var(--novi-text-lg)] font-bold",
31
+ "text-[var(--novi-color-fg)]"
32
+ ].join(" "),
33
+ closeButton: [
34
+ "w-full h-14 grid place-items-center",
35
+ "text-[length:var(--novi-text-base)] font-bold",
36
+ "text-[var(--novi-color-fg)]",
37
+ "bg-[var(--novi-color-subtle)]",
38
+ "rounded-[var(--novi-radius-md)]",
39
+ "transition-[background-color,scale] duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
40
+ "data-[pressed]:scale-[0.97] motion-reduce:data-[pressed]:scale-100",
41
+ focusRing
42
+ ].join(" "),
43
+ body: ["px-5 pb-5 pt-1", "text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]"].join(" "),
44
+ footer: "flex flex-col gap-2 px-5 pb-5"
45
+ };
46
+ /**
47
+ * Modal のスタイル定義。
48
+ *
49
+ * @example
50
+ * import { modalStyles } from '@novi-ui/tactile'
51
+ * import { tv } from 'tailwind-variants'
52
+ *
53
+ * const myModal = tv({ extend: modalStyles, slots: { panel: 'max-h-[50dvh]' } })
54
+ */
55
+ const modalStyles = tv({
56
+ slots,
57
+ variants: {
58
+ size: {
59
+ sm: { panel: "max-h-[40dvh]" },
60
+ md: { panel: "max-h-[60dvh]" },
61
+ lg: { panel: "max-h-[80dvh]" },
62
+ full: { panel: "max-h-[100dvh] h-[100dvh]" }
63
+ },
64
+ radius: {
65
+ none: { panel: "rounded-t-[var(--novi-radius-none)]" },
66
+ sm: { panel: "rounded-t-[var(--novi-radius-sm)]" },
67
+ md: { panel: "rounded-t-[var(--novi-radius-md)]" },
68
+ lg: { panel: "rounded-t-[var(--novi-radius-lg)]" },
69
+ full: { panel: "rounded-t-[var(--novi-radius-full)]" }
70
+ }
71
+ },
72
+ defaultVariants: {
73
+ size: "md",
74
+ radius: "lg"
75
+ }
76
+ });
77
+ /**
78
+ * シート上端の掴み手。**装飾であり slot ではない**(architecture.md §5 の運用)。
79
+ *
80
+ * ドラッグ開閉は MVP の対象外(NG6)なので、掴めそうに見せすぎない。
81
+ * 細く低コントラストにして「シートの上端」を示す線に留める。
82
+ */
83
+ const grabberClass = [
84
+ "mx-auto mt-2 mb-1 h-1 w-9 shrink-0",
85
+ "rounded-[var(--novi-radius-full)]",
86
+ "bg-[var(--novi-color-border)]"
87
+ ].join(" ");
88
+ //#endregion
89
+ export { grabberClass, modalStyles };
90
+
91
+ //# sourceMappingURL=modal.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.styles.mjs","names":[],"sources":["../../src/modal/modal.styles.ts"],"sourcesContent":["import type {\n modalRequiredSlots,\n modalSlots,\n NoviRadius,\n NoviSize,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { focusRing } from '../styles/focus-ring'\n\n/**\n * Tactile の Modal は **下端から出るボトムシート**(architecture.md §5 テーマB)。\n *\n * Raster との構造差:\n * - 中央配置 → 画面下端に張り付く(`items-end`)\n * - ヘッダー行に ✕ → **フッターのフルワイドボタン**(親指の届く位置に出口を置く)\n * - 上下すべて角丸 → **上端だけ角丸**(下から出てきた紙という形)\n * - 影は下向き → **上向き**(下端から来る面には上から光が当たる)\n */\nconst slots = {\n backdrop: [\n // items-end が「下から出る」の全て。Raster は place-items-center\n 'fixed inset-0 z-50 flex items-end justify-center',\n 'bg-[var(--novi-color-overlay)]',\n 'data-[entering]:motion-safe:animate-[novi-fade-in_200ms_ease-out]',\n ].join(' '),\n panel: [\n 'text-[var(--novi-color-fg)]',\n 'w-full outline-none',\n 'bg-[var(--novi-color-surface)]',\n 'shadow-[var(--novi-shadow-lg)]',\n 'overflow-auto',\n // 下端の余白はホームインジケータぶんを足す。env() の第2引数で\n // safe-area の無い環境(デスクトップ)では 0 に落ちる(AC-10-3 / FR-13)\n 'pb-[env(safe-area-inset-bottom,0px)]',\n // 下から せり上がる。260ms は移動距離に見合う時間(120ms では瞬間移動に見える)\n 'data-[entering]:motion-safe:animate-[novi-slide-up_260ms_var(--novi-ease-emphasized)]',\n ].join(' '),\n // header は描画しない(任意 slot の省略)。title だけが body の上に載る\n title: [\n 'px-5 pt-5 pb-2',\n 'text-[length:var(--novi-text-lg)] font-bold',\n 'text-[var(--novi-color-fg)]',\n ].join(' '),\n closeButton: [\n // フルワイド。指がどこに落ちても当たる\n 'w-full h-14 grid place-items-center',\n 'text-[length:var(--novi-text-base)] font-bold',\n 'text-[var(--novi-color-fg)]',\n 'bg-[var(--novi-color-subtle)]',\n 'rounded-[var(--novi-radius-md)]',\n 'transition-[background-color,scale] duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'data-[pressed]:scale-[0.97] motion-reduce:data-[pressed]:scale-100',\n focusRing,\n ].join(' '),\n body: ['px-5 pb-5 pt-1', 'text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]'].join(\n ' ',\n ),\n // 縦積み。横並びだと1つあたりの幅が指に対して狭くなる\n footer: 'flex flex-col gap-2 px-5 pb-5',\n} satisfies SlotMap<typeof modalSlots, (typeof modalRequiredSlots)[number]>\n\n/**\n * 全幅シートに幅の段階は存在しないため、`size` は**最大高**として解釈する(ADR-T3)。\n * 語彙は共通、解釈はテーマの自由(ADR-06)。\n */\nconst size: VariantMap<NoviSize | 'full', { panel: string }> = {\n sm: { panel: 'max-h-[40dvh]' },\n md: { panel: 'max-h-[60dvh]' },\n lg: { panel: 'max-h-[80dvh]' },\n full: { panel: 'max-h-[100dvh] h-[100dvh]' },\n}\n\n/** 下端は画面に接しているので、角丸は上端だけに効く。 */\nconst radius: VariantMap<NoviRadius, { panel: string }> = {\n none: { panel: 'rounded-t-[var(--novi-radius-none)]' },\n sm: { panel: 'rounded-t-[var(--novi-radius-sm)]' },\n md: { panel: 'rounded-t-[var(--novi-radius-md)]' },\n lg: { panel: 'rounded-t-[var(--novi-radius-lg)]' },\n full: { panel: 'rounded-t-[var(--novi-radius-full)]' },\n}\n\n/**\n * Modal のスタイル定義。\n *\n * @example\n * import { modalStyles } from '@novi-ui/tactile'\n * import { tv } from 'tailwind-variants'\n *\n * const myModal = tv({ extend: modalStyles, slots: { panel: 'max-h-[50dvh]' } })\n */\nexport const modalStyles = tv({\n slots,\n variants: { size, radius },\n defaultVariants: { size: 'md', radius: 'lg' },\n})\n\nexport type ModalStyleProps = Parameters<typeof modalStyles>[0]\n\n/**\n * シート上端の掴み手。**装飾であり slot ではない**(architecture.md §5 の運用)。\n *\n * ドラッグ開閉は MVP の対象外(NG6)なので、掴めそうに見せすぎない。\n * 細く低コントラストにして「シートの上端」を示す線に留める。\n */\nexport const grabberClass = [\n 'mx-auto mt-2 mb-1 h-1 w-9 shrink-0',\n 'rounded-[var(--novi-radius-full)]',\n 'bg-[var(--novi-color-border)]',\n].join(' ')\n"],"mappings":";;;;;;;;;;;;AAoBA,MAAM,QAAQ;CACZ,UAAU;EAER;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;EACL;EACA;EACA;EACA;EACA;EAGA;EAEA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,OAAO;EACL;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,aAAa;EAEX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,MAAM,CAAC,kBAAkB,gEAAgE,CAAC,CAAC,KACzF,GACF;CAEA,QAAQ;AACV;;;;;;;;;;AA+BA,MAAa,cAAc,GAAG;CAC5B;CACA,UAAU;EAAE;GA1BZ,IAAI,EAAE,OAAO,gBAAgB;GAC7B,IAAI,EAAE,OAAO,gBAAgB;GAC7B,IAAI,EAAE,OAAO,gBAAgB;GAC7B,MAAM,EAAE,OAAO,4BAA4B;EAuB/B;EAAM;GAlBlB,MAAM,EAAE,OAAO,sCAAsC;GACrD,IAAI,EAAE,OAAO,oCAAoC;GACjD,IAAI,EAAE,OAAO,oCAAoC;GACjD,IAAI,EAAE,OAAO,oCAAoC;GACjD,MAAM,EAAE,OAAO,sCAAsC;EAcnC;CAAO;CACzB,iBAAiB;EAAE,MAAM;EAAM,QAAQ;CAAK;AAC9C,CAAC;;;;;;;AAUD,MAAa,eAAe;CAC1B;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG"}
@@ -0,0 +1,3 @@
1
+ import { Popover, PopoverContent, Tooltip } from "./popover.mjs";
2
+ import { PopoverStyleProps, TooltipStyleProps, popoverStyles, tooltipStyles } from "./popover.styles.mjs";
3
+ export { Popover, PopoverContent, type PopoverStyleProps, Tooltip, type TooltipStyleProps, popoverStyles, tooltipStyles };
@@ -0,0 +1,40 @@
1
+ import { ReactNode } from "react";
2
+ import { PopoverProps, TooltipProps } from "@novi-ui/core";
3
+ //#region src/popover/popover.d.ts
4
+ /**
5
+ * Popover の中身。
6
+ *
7
+ * @example
8
+ * <PopoverContent>ここに補足を書く</PopoverContent>
9
+ */
10
+ declare function PopoverContent({ children, className }: {
11
+ children?: ReactNode;
12
+ className?: string;
13
+ }): import("react").JSX.Element;
14
+ /**
15
+ * トリガーに紐づいて浮かぶ小さな面。Escape で閉じてトリガーへフォーカスが戻る。
16
+ *
17
+ * Raster では矢印(arrow slot)を描画しない。任意 slot を省略できることの実例。
18
+ *
19
+ * @example
20
+ * <Popover placement="bottom">
21
+ * <Button>詳細</Button>
22
+ * <PopoverContent>ここに補足を書く</PopoverContent>
23
+ * </Popover>
24
+ */
25
+ declare function Popover({ radius, placement, offset, isOpen, defaultOpen, onOpenChange, children, className, classNames, id }: PopoverProps): import("react").JSX.Element;
26
+ /**
27
+ * 要素の補足説明。ホバーとフォーカスの両方で開く。
28
+ *
29
+ * ツールチップだけに情報を置かないこと。触れないと読めないため、
30
+ * 操作に必須の情報は本文かラベルに書く。
31
+ *
32
+ * @example
33
+ * <Tooltip content="コピーする">
34
+ * <Button>複製</Button>
35
+ * </Tooltip>
36
+ */
37
+ declare function Tooltip({ content, placement, offset, delay, isOpen, defaultOpen, onOpenChange, isDisabled, children, className, classNames, id }: TooltipProps): import("react").JSX.Element;
38
+ //#endregion
39
+ export { Popover, PopoverContent, Tooltip };
40
+ //# sourceMappingURL=popover.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.d.mts","names":[],"sources":["../../src/popover/popover.tsx"],"mappings":";;;;;;;;;iBAmBgB,iBACd,UACA;EAEA,WAAW;EACX;oBACD,IAAA;;;;;;;;;;;;iBAmBe,UACd,QACA,WACA,QACA,QACA,aACA,cACA,UACA,WACA,YACA,MACC,+BAAY,IAAA;;;;;;;;;;;;iBAkCC,UACd,SACA,WACA,QACA,OACA,QACA,aACA,cACA,YACA,UACA,WACA,YACA,MACC,+BAAY,IAAA"}
@@ -0,0 +1,86 @@
1
+ "use client";
2
+ import { popoverStyles, tooltipStyles } from "./popover.styles.mjs";
3
+ import { Dialog, DialogTrigger, Popover, Tooltip, TooltipTrigger } from "react-aria-components";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/popover/popover.tsx
6
+ /**
7
+ * Popover の中身。
8
+ *
9
+ * @example
10
+ * <PopoverContent>ここに補足を書く</PopoverContent>
11
+ */
12
+ function PopoverContent({ children, className }) {
13
+ return /* @__PURE__ */ jsx("div", {
14
+ "data-slot": "content",
15
+ className: popoverStyles().content({ class: className }),
16
+ children
17
+ });
18
+ }
19
+ /**
20
+ * トリガーに紐づいて浮かぶ小さな面。Escape で閉じてトリガーへフォーカスが戻る。
21
+ *
22
+ * Raster では矢印(arrow slot)を描画しない。任意 slot を省略できることの実例。
23
+ *
24
+ * @example
25
+ * <Popover placement="bottom">
26
+ * <Button>詳細</Button>
27
+ * <PopoverContent>ここに補足を書く</PopoverContent>
28
+ * </Popover>
29
+ */
30
+ function Popover$1({ radius, placement = "bottom", offset = 6, isOpen, defaultOpen, onOpenChange, children, className, classNames, id }) {
31
+ const s = popoverStyles({ radius });
32
+ const [trigger, ...content] = Array.isArray(children) ? children : [children];
33
+ return /* @__PURE__ */ jsxs(DialogTrigger, {
34
+ isOpen,
35
+ defaultOpen,
36
+ onOpenChange,
37
+ children: [trigger, /* @__PURE__ */ jsx(Popover, {
38
+ placement,
39
+ offset,
40
+ "data-slot": "root",
41
+ className: s.root({ class: [className, classNames?.root] }),
42
+ children: /* @__PURE__ */ jsx(Dialog, {
43
+ id,
44
+ className: "outline-none",
45
+ children: content
46
+ })
47
+ })]
48
+ });
49
+ }
50
+ /**
51
+ * 要素の補足説明。ホバーとフォーカスの両方で開く。
52
+ *
53
+ * ツールチップだけに情報を置かないこと。触れないと読めないため、
54
+ * 操作に必須の情報は本文かラベルに書く。
55
+ *
56
+ * @example
57
+ * <Tooltip content="コピーする">
58
+ * <Button>複製</Button>
59
+ * </Tooltip>
60
+ */
61
+ function Tooltip$1({ content, placement = "top", offset = 6, delay = 400, isOpen, defaultOpen, onOpenChange, isDisabled, children, className, classNames, id }) {
62
+ const s = tooltipStyles();
63
+ return /* @__PURE__ */ jsxs(TooltipTrigger, {
64
+ isOpen,
65
+ defaultOpen,
66
+ onOpenChange,
67
+ isDisabled,
68
+ delay,
69
+ children: [children, /* @__PURE__ */ jsx(Tooltip, {
70
+ placement,
71
+ offset,
72
+ "data-slot": "root",
73
+ className: s.root({ class: [className, classNames?.root] }),
74
+ children: /* @__PURE__ */ jsx("span", {
75
+ id,
76
+ "data-slot": "content",
77
+ className: s.content({ class: classNames?.content }),
78
+ children: content
79
+ })
80
+ })]
81
+ });
82
+ }
83
+ //#endregion
84
+ export { Popover$1 as Popover, PopoverContent, Tooltip$1 as Tooltip };
85
+
86
+ //# sourceMappingURL=popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.mjs","names":["Popover","RACPopover","Tooltip","RACTooltip"],"sources":["../../src/popover/popover.tsx"],"sourcesContent":["'use client'\n\nimport type { PopoverProps, TooltipProps } from '@novi-ui/core'\nimport type { ReactNode } from 'react'\nimport {\n Dialog,\n DialogTrigger,\n Popover as RACPopover,\n Tooltip as RACTooltip,\n TooltipTrigger,\n} from 'react-aria-components'\nimport { popoverStyles, tooltipStyles } from './popover.styles'\n\n/**\n * Popover の中身。\n *\n * @example\n * <PopoverContent>ここに補足を書く</PopoverContent>\n */\nexport function PopoverContent({\n children,\n className,\n}: {\n children?: ReactNode\n className?: string\n}) {\n return (\n <div data-slot=\"content\" className={popoverStyles().content({ class: className })}>\n {children}\n </div>\n )\n}\n\n/**\n * トリガーに紐づいて浮かぶ小さな面。Escape で閉じてトリガーへフォーカスが戻る。\n *\n * Raster では矢印(arrow slot)を描画しない。任意 slot を省略できることの実例。\n *\n * @example\n * <Popover placement=\"bottom\">\n * <Button>詳細</Button>\n * <PopoverContent>ここに補足を書く</PopoverContent>\n * </Popover>\n */\nexport function Popover({\n radius,\n placement = 'bottom',\n offset = 6,\n isOpen,\n defaultOpen,\n onOpenChange,\n children,\n className,\n classNames,\n id,\n}: PopoverProps) {\n const s = popoverStyles({ radius })\n const items = Array.isArray(children) ? children : [children]\n const [trigger, ...content] = items\n\n return (\n <DialogTrigger isOpen={isOpen} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n {trigger}\n <RACPopover\n placement={placement}\n offset={offset}\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n >\n {/* RAC の Popover は id を受け取らないため Dialog に付ける */}\n <Dialog id={id} className=\"outline-none\">\n {content}\n </Dialog>\n </RACPopover>\n </DialogTrigger>\n )\n}\n\n/**\n * 要素の補足説明。ホバーとフォーカスの両方で開く。\n *\n * ツールチップだけに情報を置かないこと。触れないと読めないため、\n * 操作に必須の情報は本文かラベルに書く。\n *\n * @example\n * <Tooltip content=\"コピーする\">\n * <Button>複製</Button>\n * </Tooltip>\n */\nexport function Tooltip({\n content,\n placement = 'top',\n offset = 6,\n delay = 400,\n isOpen,\n defaultOpen,\n onOpenChange,\n isDisabled,\n children,\n className,\n classNames,\n id,\n}: TooltipProps) {\n const s = tooltipStyles()\n\n return (\n <TooltipTrigger\n isOpen={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n isDisabled={isDisabled}\n delay={delay}\n >\n {children}\n <RACTooltip\n placement={placement}\n offset={offset}\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n >\n {/* RAC の Tooltip は id を受け取らないため中身に付ける */}\n <span id={id} data-slot=\"content\" className={s.content({ class: classNames?.content })}>\n {content}\n </span>\n </RACTooltip>\n </TooltipTrigger>\n )\n}\n"],"mappings":";;;;;;;;;;;AAmBA,SAAgB,eAAe,EAC7B,UACA,aAIC;CACD,OACE,oBAAC,OAAD;EAAK,aAAU;EAAU,WAAW,cAAc,CAAC,CAAC,QAAQ,EAAE,OAAO,UAAU,CAAC;EAC7E;CACE,CAAA;AAET;;;;;;;;;;;;AAaA,SAAgBA,UAAQ,EACtB,QACA,YAAY,UACZ,SAAS,GACT,QACA,aACA,cACA,UACA,WACA,YACA,MACe;CACf,MAAM,IAAI,cAAc,EAAE,OAAO,CAAC;CAElC,MAAM,CAAC,SAAS,GAAG,WADL,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;CAG5D,OACE,qBAAC,eAAD;EAAuB;EAAqB;EAA2B;EAAvE,UAAA,CACG,SACD,oBAACC,SAAD;GACa;GACH;GACR,aAAU;GACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;GAG1D,UAAA,oBAAC,QAAD;IAAY;IAAI,WAAU;IACvB,UAAA;GACK,CAAA;EACE,CAAA,CACC;;AAEnB;;;;;;;;;;;;AAaA,SAAgBC,UAAQ,EACtB,SACA,YAAY,OACZ,SAAS,GACT,QAAQ,KACR,QACA,aACA,cACA,YACA,UACA,WACA,YACA,MACe;CACf,MAAM,IAAI,cAAc;CAExB,OACE,qBAAC,gBAAD;EACU;EACK;EACC;EACF;EACL;EALT,UAAA,CAOG,UACD,oBAACC,SAAD;GACa;GACH;GACR,aAAU;GACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;GAG1D,UAAA,oBAAC,QAAD;IAAU;IAAI,aAAU;IAAU,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;IAClF,UAAA;GACG,CAAA;EACI,CAAA,CACE;;AAEpB"}
@@ -0,0 +1,81 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/popover/popover.styles.d.ts
3
+ /**
4
+ * Popover のスタイル定義。
5
+ *
6
+ * @example
7
+ * const myPopover = tv({ extend: popoverStyles, slots: { content: 'p-6' } })
8
+ */
9
+ declare const popoverStyles: import("tailwind-variants").TVReturnType<{
10
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
11
+ root: string;
12
+ }>;
13
+ }, {
14
+ root: string;
15
+ arrow: string;
16
+ content: string;
17
+ }, undefined, {
18
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
19
+ root: string;
20
+ }>;
21
+ }, {
22
+ root: string;
23
+ arrow: string;
24
+ content: string;
25
+ }, import("tailwind-variants").TVReturnTypeLike<{
26
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
27
+ root: string;
28
+ }>;
29
+ }, {
30
+ root: string;
31
+ arrow: string;
32
+ content: string;
33
+ }>>;
34
+ /**
35
+ * Tooltip のスタイル定義。
36
+ *
37
+ * Popover と違い**反転色**(暗い面に明るい文字)で出す。
38
+ * 補足であって操作対象ではない、という区別を色で伝える。
39
+ */
40
+ declare const tooltipStyles: import("tailwind-variants").TVReturnType<{
41
+ [key: string]: {
42
+ [key: string]: import("tailwind-variants").ClassValue | {
43
+ root?: import("tailwind-variants").ClassValue;
44
+ content?: import("tailwind-variants").ClassValue;
45
+ arrow?: import("tailwind-variants").ClassValue;
46
+ };
47
+ };
48
+ } | {
49
+ [x: string]: {
50
+ [x: string]: import("tailwind-variants").ClassValue | {
51
+ root?: import("tailwind-variants").ClassValue;
52
+ content?: import("tailwind-variants").ClassValue;
53
+ arrow?: import("tailwind-variants").ClassValue;
54
+ };
55
+ };
56
+ } | {}, {
57
+ root: string;
58
+ arrow: string;
59
+ content: string;
60
+ }, undefined, {
61
+ [key: string]: {
62
+ [key: string]: import("tailwind-variants").ClassValue | {
63
+ root?: import("tailwind-variants").ClassValue;
64
+ content?: import("tailwind-variants").ClassValue;
65
+ arrow?: import("tailwind-variants").ClassValue;
66
+ };
67
+ };
68
+ } | {}, {
69
+ root: string;
70
+ arrow: string;
71
+ content: string;
72
+ }, import("tailwind-variants").TVReturnTypeLike<unknown, {
73
+ root: string;
74
+ arrow: string;
75
+ content: string;
76
+ }>>;
77
+ type PopoverStyleProps = Parameters<typeof popoverStyles>[0];
78
+ type TooltipStyleProps = Parameters<typeof tooltipStyles>[0];
79
+ //#endregion
80
+ export { PopoverStyleProps, TooltipStyleProps, popoverStyles, tooltipStyles };
81
+ //# sourceMappingURL=popover.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.styles.d.mts","names":[],"sources":["../../src/popover/popover.styles.ts"],"mappings":";;;;;;;;cAuCa,2CAAa;;IAdmB;;;;;;;;IAAA;;;;;;;;IAAA;;;;;;;;;;;;;cA0BhC,2CAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAed,oBAAoB,kBAAkB;KACtC,oBAAoB,kBAAkB"}
@@ -0,0 +1,53 @@
1
+ import { tv } from "tailwind-variants";
2
+ //#region src/popover/popover.styles.ts
3
+ const slots = {
4
+ root: [
5
+ "text-[var(--novi-color-fg)]",
6
+ "outline-none",
7
+ "bg-[var(--novi-color-bg)]",
8
+ "ring-1 ring-[var(--novi-color-border)]",
9
+ "shadow-[var(--novi-shadow-md)]",
10
+ "data-[entering]:motion-safe:animate-[novi-fade-in_120ms_ease-out]"
11
+ ].join(" "),
12
+ arrow: "hidden",
13
+ content: "px-4 py-3 text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]"
14
+ };
15
+ /**
16
+ * Popover のスタイル定義。
17
+ *
18
+ * @example
19
+ * const myPopover = tv({ extend: popoverStyles, slots: { content: 'p-6' } })
20
+ */
21
+ const popoverStyles = tv({
22
+ slots,
23
+ variants: { radius: {
24
+ none: { root: "rounded-[var(--novi-radius-none)]" },
25
+ sm: { root: "rounded-[var(--novi-radius-sm)]" },
26
+ md: { root: "rounded-[var(--novi-radius-md)]" },
27
+ lg: { root: "rounded-[var(--novi-radius-lg)]" },
28
+ full: { root: "rounded-[var(--novi-radius-full)]" }
29
+ } },
30
+ defaultVariants: { radius: "lg" }
31
+ });
32
+ /**
33
+ * Tooltip のスタイル定義。
34
+ *
35
+ * Popover と違い**反転色**(暗い面に明るい文字)で出す。
36
+ * 補足であって操作対象ではない、という区別を色で伝える。
37
+ */
38
+ const tooltipStyles = tv({ slots: {
39
+ root: [
40
+ "outline-none max-w-xs",
41
+ "bg-[var(--novi-color-fg)] text-[var(--novi-color-bg)]",
42
+ "border border-transparent",
43
+ "rounded-[var(--novi-radius-sm)]",
44
+ "shadow-[var(--novi-shadow-md)]",
45
+ "data-[entering]:motion-safe:animate-[novi-fade-in_120ms_ease-out]"
46
+ ].join(" "),
47
+ arrow: "hidden",
48
+ content: "px-2 py-1 text-[length:var(--novi-text-xs)] leading-snug"
49
+ } });
50
+ //#endregion
51
+ export { popoverStyles, tooltipStyles };
52
+
53
+ //# sourceMappingURL=popover.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.styles.mjs","names":[],"sources":["../../src/popover/popover.styles.ts"],"sourcesContent":["import type {\n NoviRadius,\n popoverRequiredSlots,\n popoverSlots,\n SlotMap,\n tooltipRequiredSlots,\n tooltipSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\n\nconst slots = {\n root: [\n 'text-[var(--novi-color-fg)]',\n 'outline-none',\n 'bg-[var(--novi-color-bg)]',\n 'ring-1 ring-[var(--novi-color-border)]',\n 'shadow-[var(--novi-shadow-md)]',\n 'data-[entering]:motion-safe:animate-[novi-fade-in_120ms_ease-out]',\n ].join(' '),\n // Raster では arrow を描画しない。任意 slot を省略する実例\n arrow: 'hidden',\n content: 'px-4 py-3 text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]',\n} satisfies SlotMap<typeof popoverSlots, (typeof popoverRequiredSlots)[number]>\n\nconst radius: VariantMap<NoviRadius, { root: string }> = {\n none: { root: 'rounded-[var(--novi-radius-none)]' },\n sm: { root: 'rounded-[var(--novi-radius-sm)]' },\n md: { root: 'rounded-[var(--novi-radius-md)]' },\n lg: { root: 'rounded-[var(--novi-radius-lg)]' },\n full: { root: 'rounded-[var(--novi-radius-full)]' },\n}\n\n/**\n * Popover のスタイル定義。\n *\n * @example\n * const myPopover = tv({ extend: popoverStyles, slots: { content: 'p-6' } })\n */\nexport const popoverStyles = tv({\n slots,\n variants: { radius },\n defaultVariants: { radius: 'lg' },\n})\n\n/**\n * Tooltip のスタイル定義。\n *\n * Popover と違い**反転色**(暗い面に明るい文字)で出す。\n * 補足であって操作対象ではない、という区別を色で伝える。\n */\nexport const tooltipStyles = tv({\n slots: {\n root: [\n 'outline-none max-w-xs',\n 'bg-[var(--novi-color-fg)] text-[var(--novi-color-bg)]',\n 'border border-transparent',\n 'rounded-[var(--novi-radius-sm)]',\n 'shadow-[var(--novi-shadow-md)]',\n 'data-[entering]:motion-safe:animate-[novi-fade-in_120ms_ease-out]',\n ].join(' '),\n arrow: 'hidden',\n content: 'px-2 py-1 text-[length:var(--novi-text-xs)] leading-snug',\n } satisfies SlotMap<typeof tooltipSlots, (typeof tooltipRequiredSlots)[number]>,\n})\n\nexport type PopoverStyleProps = Parameters<typeof popoverStyles>[0]\nexport type TooltipStyleProps = Parameters<typeof tooltipStyles>[0]\n"],"mappings":";;AAWA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,OAAO;CACP,SAAS;AACX;;;;;;;AAgBA,MAAa,gBAAgB,GAAG;CAC9B;CACA,UAAU,EAAE;EAfZ,MAAM,EAAE,MAAM,oCAAoC;EAClD,IAAI,EAAE,MAAM,kCAAkC;EAC9C,IAAI,EAAE,MAAM,kCAAkC;EAC9C,IAAI,EAAE,MAAM,kCAAkC;EAC9C,MAAM,EAAE,MAAM,oCAAoC;CAWtC,EAAO;CACnB,iBAAiB,EAAE,QAAQ,KAAK;AAClC,CAAC;;;;;;;AAQD,MAAa,gBAAgB,GAAG,EAC9B,OAAO;CACL,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CACP,SAAS;AACX,EACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Progress } from "./progress.mjs";
2
+ import { ProgressStyleProps, progressStyles } from "./progress.styles.mjs";
3
+ export { Progress, type ProgressStyleProps, progressStyles };
@@ -0,0 +1,14 @@
1
+ import { ProgressProps } from "@novi-ui/core";
2
+ //#region src/progress/progress.d.ts
3
+ /**
4
+ * 進捗の表示。`value` を省略すると不確定(indeterminate)表示になる。
5
+ *
6
+ * `prefers-reduced-motion` が有効なときは不確定表示のアニメーションを止める。
7
+ *
8
+ * @example
9
+ * <Progress label="アップロード中" value={62} showValueLabel />
10
+ */
11
+ declare function Progress({ size, color, label, value, minValue, maxValue, showValueLabel, className, classNames, id }: ProgressProps): import("react").JSX.Element;
12
+ //#endregion
13
+ export { Progress };
14
+ //# sourceMappingURL=progress.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.mts","names":[],"sources":["../../src/progress/progress.tsx"],"mappings":";;;;;;;;;;iBAcgB,WACd,MACA,OACA,OACA,OACA,UACA,UACA,gBACA,WACA,YACA,MACC,gCAAa,IAAA"}