@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,45 @@
1
+ import { tv } from "tailwind-variants";
2
+ //#region src/avatar/avatar.styles.ts
3
+ const slots = {
4
+ root: [
5
+ "relative inline-grid place-items-center shrink-0",
6
+ "bg-[var(--novi-color-subtle)]",
7
+ "shadow-[var(--novi-shadow-sm)]",
8
+ "overflow-hidden select-none",
9
+ "text-[var(--novi-color-muted)] font-medium"
10
+ ].join(" "),
11
+ image: "size-full object-cover",
12
+ fallback: "uppercase tracking-wide",
13
+ badge: "absolute -bottom-0.5 -right-0.5 ring-2 ring-[var(--novi-color-bg)]"
14
+ };
15
+ /**
16
+ * Avatar のスタイル定義。
17
+ *
18
+ * @example
19
+ * const myAvatar = tv({ extend: avatarStyles, slots: { root: 'border-2' } })
20
+ */
21
+ const avatarStyles = tv({
22
+ slots,
23
+ variants: {
24
+ size: {
25
+ sm: { root: "size-10 text-[length:var(--novi-text-sm)]" },
26
+ md: { root: "size-12 text-[length:var(--novi-text-base)]" },
27
+ lg: { root: "size-14 text-[length:var(--novi-text-lg)]" }
28
+ },
29
+ radius: {
30
+ none: { root: "rounded-[var(--novi-radius-none)]" },
31
+ sm: { root: "rounded-[var(--novi-radius-sm)]" },
32
+ md: { root: "rounded-[var(--novi-radius-md)]" },
33
+ lg: { root: "rounded-[var(--novi-radius-lg)]" },
34
+ full: { root: "rounded-[var(--novi-radius-full)]" }
35
+ }
36
+ },
37
+ defaultVariants: {
38
+ size: "md",
39
+ radius: "full"
40
+ }
41
+ });
42
+ //#endregion
43
+ export { avatarStyles };
44
+
45
+ //# sourceMappingURL=avatar.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.styles.mjs","names":[],"sources":["../../src/avatar/avatar.styles.ts"],"sourcesContent":["import type {\n avatarRequiredSlots,\n avatarSlots,\n NoviRadius,\n NoviSize,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\n\nconst slots = {\n root: [\n 'relative inline-grid place-items-center shrink-0',\n 'bg-[var(--novi-color-subtle)]',\n 'shadow-[var(--novi-shadow-sm)]',\n 'overflow-hidden select-none',\n 'text-[var(--novi-color-muted)] font-medium',\n ].join(' '),\n image: 'size-full object-cover',\n fallback: 'uppercase tracking-wide',\n // 右下に重ねる。地色で縁取りして境目を作る(影を使わない)\n badge: 'absolute -bottom-0.5 -right-0.5 ring-2 ring-[var(--novi-color-bg)]',\n} satisfies SlotMap<typeof avatarSlots, (typeof avatarRequiredSlots)[number]>\n\nconst size: VariantMap<NoviSize, { root: string }> = {\n sm: { root: 'size-10 text-[length:var(--novi-text-sm)]' },\n md: { root: 'size-12 text-[length:var(--novi-text-base)]' },\n lg: { root: 'size-14 text-[length:var(--novi-text-lg)]' },\n}\n\n/** Avatar は `full` を既定にする唯一のコンポーネント。人を表すものは丸で示す慣習に従う。 */\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 * Avatar のスタイル定義。\n *\n * @example\n * const myAvatar = tv({ extend: avatarStyles, slots: { root: 'border-2' } })\n */\nexport const avatarStyles = tv({\n slots,\n variants: { size, radius },\n defaultVariants: { size: 'md', radius: 'full' },\n})\n\nexport type AvatarStyleProps = Parameters<typeof avatarStyles>[0]\n"],"mappings":";;AAUA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CACP,UAAU;CAEV,OAAO;AACT;;;;;;;AAuBA,MAAa,eAAe,GAAG;CAC7B;CACA,UAAU;EAAE;GAtBZ,IAAI,EAAE,MAAM,4CAA4C;GACxD,IAAI,EAAE,MAAM,8CAA8C;GAC1D,IAAI,EAAE,MAAM,4CAA4C;EAoB5C;EAAM;GAflB,MAAM,EAAE,MAAM,oCAAoC;GAClD,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,MAAM,EAAE,MAAM,oCAAoC;EAWhC;CAAO;CACzB,iBAAiB;EAAE,MAAM;EAAM,QAAQ;CAAO;AAChD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Avatar, initialsOf } from "./avatar.mjs";
2
+ import { AvatarStyleProps, avatarStyles } from "./avatar.styles.mjs";
3
+ export { Avatar, type AvatarStyleProps, avatarStyles, initialsOf };
@@ -0,0 +1,15 @@
1
+ import { BadgeProps } from "@novi-ui/core";
2
+ //#region src/badge/badge.d.ts
3
+ /**
4
+ * 短いラベルで状態や分類を示す。
5
+ *
6
+ * 色だけで意味を伝えないこと。`success` と `danger` は色相が違うが、
7
+ * 色覚特性によっては区別できない。必ず文言を伴わせる(WCAG 1.4.1)。
8
+ *
9
+ * @example
10
+ * <Badge color="success" variant="soft">公開中</Badge>
11
+ */
12
+ declare function Badge({ variant, size, color, radius, withDot, children, className, classNames, id }: BadgeProps): import("react").JSX.Element;
13
+ //#endregion
14
+ export { Badge };
15
+ //# sourceMappingURL=badge.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.mts","names":[],"sources":["../../src/badge/badge.tsx"],"mappings":";;;;;;;;;;;iBAcgB,QACd,SACA,MACA,OACA,QACA,SACA,UACA,WACA,YACA,MACC,6BAAU,IAAA"}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { badgeStyles } from "./badge.styles.mjs";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/badge/badge.tsx
5
+ /**
6
+ * 短いラベルで状態や分類を示す。
7
+ *
8
+ * 色だけで意味を伝えないこと。`success` と `danger` は色相が違うが、
9
+ * 色覚特性によっては区別できない。必ず文言を伴わせる(WCAG 1.4.1)。
10
+ *
11
+ * @example
12
+ * <Badge color="success" variant="soft">公開中</Badge>
13
+ */
14
+ function Badge({ variant, size, color, radius, withDot, children, className, classNames, id }) {
15
+ const s = badgeStyles({
16
+ variant,
17
+ size,
18
+ color,
19
+ radius
20
+ });
21
+ return /* @__PURE__ */ jsxs("span", {
22
+ id,
23
+ "data-slot": "root",
24
+ className: s.root({ class: [className, classNames?.root] }),
25
+ children: [withDot === true && /* @__PURE__ */ jsx("span", {
26
+ "data-slot": "dot",
27
+ className: s.dot({ class: classNames?.dot }),
28
+ "aria-hidden": "true"
29
+ }), /* @__PURE__ */ jsx("span", {
30
+ "data-slot": "label",
31
+ className: s.label({ class: classNames?.label }),
32
+ children
33
+ })]
34
+ });
35
+ }
36
+ //#endregion
37
+ export { Badge };
38
+
39
+ //# sourceMappingURL=badge.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.mjs","names":[],"sources":["../../src/badge/badge.tsx"],"sourcesContent":["'use client'\n\nimport type { BadgeProps } from '@novi-ui/core'\nimport { badgeStyles } from './badge.styles'\n\n/**\n * 短いラベルで状態や分類を示す。\n *\n * 色だけで意味を伝えないこと。`success` と `danger` は色相が違うが、\n * 色覚特性によっては区別できない。必ず文言を伴わせる(WCAG 1.4.1)。\n *\n * @example\n * <Badge color=\"success\" variant=\"soft\">公開中</Badge>\n */\nexport function Badge({\n variant,\n size,\n color,\n radius,\n withDot,\n children,\n className,\n classNames,\n id,\n}: BadgeProps) {\n const s = badgeStyles({ variant, size, color, radius })\n\n return (\n <span id={id} data-slot=\"root\" className={s.root({ class: [className, classNames?.root] })}>\n {withDot === true && (\n <span data-slot=\"dot\" className={s.dot({ class: classNames?.dot })} aria-hidden=\"true\" />\n )}\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {children}\n </span>\n </span>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,MAAM,EACpB,SACA,MACA,OACA,QACA,SACA,UACA,WACA,YACA,MACa;CACb,MAAM,IAAI,YAAY;EAAE;EAAS;EAAM;EAAO;CAAO,CAAC;CAEtD,OACE,qBAAC,QAAD;EAAU;EAAI,aAAU;EAAO,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAAzF,UAAA,CACG,YAAY,QACX,oBAAC,QAAD;GAAM,aAAU;GAAM,WAAW,EAAE,IAAI,EAAE,OAAO,YAAY,IAAI,CAAC;GAAG,eAAY;EAAQ,CAAA,GAE1F,oBAAC,QAAD;GAAM,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GACpE;EACG,CAAA,CACF;;AAEV"}
@@ -0,0 +1,67 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/badge/badge.styles.d.ts
3
+ /**
4
+ * Badge のスタイル定義。
5
+ *
6
+ * @example
7
+ * const myBadge = tv({ extend: badgeStyles, slots: { label: 'uppercase' } })
8
+ */
9
+ declare const badgeStyles: import("tailwind-variants").TVReturnType<{
10
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
11
+ root: string;
12
+ }>;
13
+ size: VariantMap<"sm" | "md" | "lg", {
14
+ root: string;
15
+ dot: string;
16
+ }>;
17
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
18
+ root: string;
19
+ }>;
20
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
21
+ root: string;
22
+ }>;
23
+ }, {
24
+ root: string;
25
+ dot: string;
26
+ label: string;
27
+ }, undefined, {
28
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
29
+ root: string;
30
+ }>;
31
+ size: VariantMap<"sm" | "md" | "lg", {
32
+ root: string;
33
+ dot: string;
34
+ }>;
35
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
36
+ root: string;
37
+ }>;
38
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
39
+ root: string;
40
+ }>;
41
+ }, {
42
+ root: string;
43
+ dot: string;
44
+ label: string;
45
+ }, import("tailwind-variants").TVReturnTypeLike<{
46
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
47
+ root: string;
48
+ }>;
49
+ size: VariantMap<"sm" | "md" | "lg", {
50
+ root: string;
51
+ dot: string;
52
+ }>;
53
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
54
+ root: string;
55
+ }>;
56
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
57
+ root: string;
58
+ }>;
59
+ }, {
60
+ root: string;
61
+ dot: string;
62
+ label: string;
63
+ }>>;
64
+ type BadgeStyleProps = Parameters<typeof badgeStyles>[0];
65
+ //#endregion
66
+ export { BadgeStyleProps, badgeStyles };
67
+ //# sourceMappingURL=badge.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.styles.d.mts","names":[],"sources":["../../src/badge/badge.styles.ts"],"mappings":";;;;;;;;cAwGa,yCAAW;;IAjFmB;;;IA2DF;IAAa;;;IAQT;;;IAhBE;;;;;;;;IAnDJ;;;IA2DF;IAAa;;;IAQT;;;IAhBE;;;;;;;;IAnDJ;;;IA2DF;IAAa;;;IAQT;;;IAhBE;;;;;;;KAsCnC,kBAAkB,kBAAkB"}
@@ -0,0 +1,99 @@
1
+ import { tv } from "tailwind-variants";
2
+ //#region src/badge/badge.styles.ts
3
+ const slots = {
4
+ root: [
5
+ "inline-flex items-center gap-1.5",
6
+ "font-medium whitespace-nowrap",
7
+ "border border-transparent"
8
+ ].join(" "),
9
+ dot: "shrink-0 rounded-[var(--novi-radius-full)] bg-current",
10
+ label: "truncate"
11
+ };
12
+ const color = {
13
+ default: { root: [
14
+ "[--c:var(--novi-color-default)]",
15
+ "[--c-fg:var(--novi-color-default-fg)]",
16
+ "[--c-text:var(--novi-color-fg)]",
17
+ "[--c-line:var(--novi-color-border-strong)]"
18
+ ].join(" ") },
19
+ primary: { root: [
20
+ "[--c:var(--novi-color-primary)]",
21
+ "[--c-fg:var(--novi-color-primary-fg)]",
22
+ "[--c-text:var(--novi-color-primary)]",
23
+ "[--c-line:var(--novi-color-primary)]"
24
+ ].join(" ") },
25
+ secondary: { root: [
26
+ "[--c:var(--novi-color-secondary)]",
27
+ "[--c-fg:var(--novi-color-secondary-fg)]",
28
+ "[--c-text:var(--novi-color-secondary)]",
29
+ "[--c-line:var(--novi-color-secondary)]"
30
+ ].join(" ") },
31
+ success: { root: [
32
+ "[--c:var(--novi-color-success)]",
33
+ "[--c-fg:var(--novi-color-success-fg)]",
34
+ "[--c-text:var(--novi-color-success)]",
35
+ "[--c-line:var(--novi-color-success)]"
36
+ ].join(" ") },
37
+ warning: { root: [
38
+ "[--c:var(--novi-color-warning)]",
39
+ "[--c-fg:var(--novi-color-warning-fg)]",
40
+ "[--c-text:var(--novi-color-warning)]",
41
+ "[--c-line:var(--novi-color-warning)]"
42
+ ].join(" ") },
43
+ danger: { root: [
44
+ "[--c:var(--novi-color-danger)]",
45
+ "[--c-fg:var(--novi-color-danger-fg)]",
46
+ "[--c-text:var(--novi-color-danger)]",
47
+ "[--c-line:var(--novi-color-danger)]"
48
+ ].join(" ") }
49
+ };
50
+ /**
51
+ * Badge のスタイル定義。
52
+ *
53
+ * @example
54
+ * const myBadge = tv({ extend: badgeStyles, slots: { label: 'uppercase' } })
55
+ */
56
+ const badgeStyles = tv({
57
+ slots,
58
+ variants: {
59
+ color,
60
+ size: {
61
+ sm: {
62
+ root: "h-6 px-2 text-[length:var(--novi-text-xs)]",
63
+ dot: "size-1.5"
64
+ },
65
+ md: {
66
+ root: "h-7 px-2.5 text-[length:var(--novi-text-sm)]",
67
+ dot: "size-2"
68
+ },
69
+ lg: {
70
+ root: "h-8 px-3 text-[length:var(--novi-text-sm)]",
71
+ dot: "size-2.5"
72
+ }
73
+ },
74
+ radius: {
75
+ none: { root: "rounded-[var(--novi-radius-none)]" },
76
+ sm: { root: "rounded-[var(--novi-radius-sm)]" },
77
+ md: { root: "rounded-[var(--novi-radius-md)]" },
78
+ lg: { root: "rounded-[var(--novi-radius-lg)]" },
79
+ full: { root: "rounded-[var(--novi-radius-full)]" }
80
+ },
81
+ variant: {
82
+ solid: { root: "bg-[var(--c)] text-[var(--c-fg)]" },
83
+ outline: { root: "border-[var(--c-line)] text-[var(--c-text)]" },
84
+ soft: { root: "bg-[var(--novi-color-subtle)] text-[var(--c-text)]" },
85
+ ghost: { root: "text-[var(--c-text)]" },
86
+ plain: { root: "text-[var(--c-text)] px-0" }
87
+ }
88
+ },
89
+ defaultVariants: {
90
+ color: "default",
91
+ variant: "soft",
92
+ size: "md",
93
+ radius: "sm"
94
+ }
95
+ });
96
+ //#endregion
97
+ export { badgeStyles };
98
+
99
+ //# sourceMappingURL=badge.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.styles.mjs","names":[],"sources":["../../src/badge/badge.styles.ts"],"sourcesContent":["import type {\n badgeRequiredSlots,\n badgeSlots,\n NoviColor,\n NoviRadius,\n NoviSize,\n NoviVariant,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\n\nconst slots = {\n root: [\n 'inline-flex items-center gap-1.5',\n 'font-medium whitespace-nowrap',\n 'border border-transparent',\n ].join(' '),\n // 円ではなく正方形。Raster では点も角を立てる\n dot: 'shrink-0 rounded-[var(--novi-radius-full)] bg-current',\n label: 'truncate',\n} satisfies SlotMap<typeof badgeSlots, (typeof badgeRequiredSlots)[number]>\n\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: {\n root: [\n '[--c:var(--novi-color-default)]',\n '[--c-fg:var(--novi-color-default-fg)]',\n '[--c-text:var(--novi-color-fg)]',\n '[--c-line:var(--novi-color-border-strong)]',\n ].join(' '),\n },\n primary: {\n root: [\n '[--c:var(--novi-color-primary)]',\n '[--c-fg:var(--novi-color-primary-fg)]',\n '[--c-text:var(--novi-color-primary)]',\n '[--c-line:var(--novi-color-primary)]',\n ].join(' '),\n },\n secondary: {\n root: [\n '[--c:var(--novi-color-secondary)]',\n '[--c-fg:var(--novi-color-secondary-fg)]',\n '[--c-text:var(--novi-color-secondary)]',\n '[--c-line:var(--novi-color-secondary)]',\n ].join(' '),\n },\n success: {\n root: [\n '[--c:var(--novi-color-success)]',\n '[--c-fg:var(--novi-color-success-fg)]',\n '[--c-text:var(--novi-color-success)]',\n '[--c-line:var(--novi-color-success)]',\n ].join(' '),\n },\n warning: {\n root: [\n '[--c:var(--novi-color-warning)]',\n '[--c-fg:var(--novi-color-warning-fg)]',\n '[--c-text:var(--novi-color-warning)]',\n '[--c-line:var(--novi-color-warning)]',\n ].join(' '),\n },\n danger: {\n root: [\n '[--c:var(--novi-color-danger)]',\n '[--c-fg:var(--novi-color-danger-fg)]',\n '[--c-text:var(--novi-color-danger)]',\n '[--c-line:var(--novi-color-danger)]',\n ].join(' '),\n },\n}\n\nconst variant: VariantMap<NoviVariant, { root: string }> = {\n solid: { root: 'bg-[var(--c)] text-[var(--c-fg)]' },\n outline: { root: 'border-[var(--c-line)] text-[var(--c-text)]' },\n soft: { root: 'bg-[var(--novi-color-subtle)] text-[var(--c-text)]' },\n ghost: { root: 'text-[var(--c-text)]' },\n plain: { root: 'text-[var(--c-text)] px-0' },\n}\n\nconst size: VariantMap<NoviSize, { root: string; dot: string }> = {\n // Badge は表示専用でタップ対象ではないため、高さの下限(40px)の対象外。\n // 文字だけは読める大きさを保つ\n sm: { root: 'h-6 px-2 text-[length:var(--novi-text-xs)]', dot: 'size-1.5' },\n md: { root: 'h-7 px-2.5 text-[length:var(--novi-text-sm)]', dot: 'size-2' },\n lg: { root: 'h-8 px-3 text-[length:var(--novi-text-sm)]', dot: 'size-2.5' },\n}\n\nconst radius: VariantMap<NoviRadius, { root: string }> = {\n none: { root: 'rounded-[var(--novi-radius-none)]' },\n sm: { root: 'rounded-[var(--novi-radius-sm)]' },\n md: { root: 'rounded-[var(--novi-radius-md)]' },\n lg: { root: 'rounded-[var(--novi-radius-lg)]' },\n full: { root: 'rounded-[var(--novi-radius-full)]' },\n}\n\n/**\n * Badge のスタイル定義。\n *\n * @example\n * const myBadge = tv({ extend: badgeStyles, slots: { label: 'uppercase' } })\n */\nexport const badgeStyles = tv({\n slots,\n // variant を最後に宣言する。tv は宣言順に適用するため、\n // 先に書くと `plain` の px-0 が size の px-2 に負けて ghost と同じ見た目になる。\n variants: { color, size, radius, variant },\n defaultVariants: { color: 'default', variant: 'soft', size: 'md', radius: 'sm' },\n})\n\nexport type BadgeStyleProps = Parameters<typeof badgeStyles>[0]\n"],"mappings":";;AAYA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,KAAK;CACL,OAAO;AACT;AAEA,MAAM,QAAiD;CACrD,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,WAAW,EACT,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,QAAQ,EACN,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;AACF;;;;;;;AAgCA,MAAa,cAAc,GAAG;CAC5B;CAGA,UAAU;EAAE;EAAO;GAvBnB,IAAI;IAAE,MAAM;IAA8C,KAAK;GAAW;GAC1E,IAAI;IAAE,MAAM;IAAgD,KAAK;GAAS;GAC1E,IAAI;IAAE,MAAM;IAA8C,KAAK;GAAW;EAqBvD;EAAM;GAjBzB,MAAM,EAAE,MAAM,oCAAoC;GAClD,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,MAAM,EAAE,MAAM,oCAAoC;EAazB;EAAQ;GAjCjC,OAAO,EAAE,MAAM,mCAAmC;GAClD,SAAS,EAAE,MAAM,8CAA8C;GAC/D,MAAM,EAAE,MAAM,qDAAqD;GACnE,OAAO,EAAE,MAAM,uBAAuB;GACtC,OAAO,EAAE,MAAM,4BAA4B;EA6BV;CAAQ;CACzC,iBAAiB;EAAE,OAAO;EAAW,SAAS;EAAQ,MAAM;EAAM,QAAQ;CAAK;AACjF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Badge } from "./badge.mjs";
2
+ import { BadgeStyleProps, badgeStyles } from "./badge.styles.mjs";
3
+ export { Badge, type BadgeStyleProps, badgeStyles };
@@ -0,0 +1,33 @@
1
+ import { ReactNode } from "react";
2
+ import { BreadcrumbsProps } from "@novi-ui/core";
3
+ //#region src/breadcrumbs/breadcrumbs.d.ts
4
+ interface BreadcrumbProps {
5
+ /** 省略すると現在地として扱い、リンクにしない */
6
+ href?: string;
7
+ children?: ReactNode;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * 階層の1段。`href` を省略した項目が現在地になる。
12
+ *
13
+ * @example
14
+ * <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
15
+ */
16
+ declare function Breadcrumb({ href, children, className }: BreadcrumbProps): import("react").JSX.Element;
17
+ /**
18
+ * 階層の中で現在どこにいるかを示す。
19
+ *
20
+ * 区切り文字は装飾なので支援技術には読ませない。
21
+ * `href` を省いた項目が現在地になり、リンクにならない。
22
+ *
23
+ * @example
24
+ * <Breadcrumbs>
25
+ * <Breadcrumb href="/">ホーム</Breadcrumb>
26
+ * <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
27
+ * <Breadcrumb>Button</Breadcrumb>
28
+ * </Breadcrumbs>
29
+ */
30
+ declare function Breadcrumbs({ size, separator, isDisabled, children, className, classNames, id }: BreadcrumbsProps): import("react").JSX.Element;
31
+ //#endregion
32
+ export { Breadcrumb, BreadcrumbProps, Breadcrumbs };
33
+ //# sourceMappingURL=breadcrumbs.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.d.mts","names":[],"sources":["../../src/breadcrumbs/breadcrumbs.tsx"],"mappings":";;;UAoBiB;;EAEf;EACA,WAAW;EACX;;;;;;;;iBASc,aAAa,MAAM,UAAU,aAAa,kCAAe,IAAA;;;;;;;;;;;;;;iBAsCzD,cACd,MACA,WACA,YACA,UACA,WACA,YACA,MACC,mCAAgB,IAAA"}
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import { breadcrumbsStyles } from "./breadcrumbs.styles.mjs";
3
+ import { Breadcrumb, Breadcrumbs, Link } from "react-aria-components";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { createContext, useContext } from "react";
6
+ //#region src/breadcrumbs/breadcrumbs.tsx
7
+ /**
8
+ * 区切り文字を子へ渡す。
9
+ *
10
+ * 各項目が自分の前に区切りを描画し、先頭だけ CSS で隠す。
11
+ * 親側で children を加工して区切りを差し込むと、
12
+ * RAC が期待する `<ol> > <li>` の構造が壊れる。
13
+ */
14
+ const SeparatorContext = createContext("/");
15
+ /**
16
+ * 階層の1段。`href` を省略した項目が現在地になる。
17
+ *
18
+ * @example
19
+ * <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
20
+ */
21
+ function Breadcrumb$1({ href, children, className }) {
22
+ const s = breadcrumbsStyles();
23
+ const separator = useContext(SeparatorContext);
24
+ return /* @__PURE__ */ jsxs(Breadcrumb, {
25
+ "data-slot": "item",
26
+ className: s.item({ class: className }),
27
+ children: [/* @__PURE__ */ jsx("span", {
28
+ "data-slot": "separator",
29
+ className: s.separator(),
30
+ "aria-hidden": "true",
31
+ children: separator
32
+ }), href === void 0 ? /* @__PURE__ */ jsx("span", {
33
+ "data-slot": "current",
34
+ "aria-current": "page",
35
+ className: s.current(),
36
+ children
37
+ }) : /* @__PURE__ */ jsx(Link, {
38
+ href,
39
+ "data-slot": "link",
40
+ className: s.link(),
41
+ children
42
+ })]
43
+ });
44
+ }
45
+ /**
46
+ * 階層の中で現在どこにいるかを示す。
47
+ *
48
+ * 区切り文字は装飾なので支援技術には読ませない。
49
+ * `href` を省いた項目が現在地になり、リンクにならない。
50
+ *
51
+ * @example
52
+ * <Breadcrumbs>
53
+ * <Breadcrumb href="/">ホーム</Breadcrumb>
54
+ * <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
55
+ * <Breadcrumb>Button</Breadcrumb>
56
+ * </Breadcrumbs>
57
+ */
58
+ function Breadcrumbs$1({ size, separator = "/", isDisabled, children, className, classNames, id }) {
59
+ const s = breadcrumbsStyles({ size });
60
+ return /* @__PURE__ */ jsx(SeparatorContext.Provider, {
61
+ value: separator,
62
+ children: /* @__PURE__ */ jsx("nav", {
63
+ id,
64
+ "aria-label": "パンくずリスト",
65
+ "data-slot": "root",
66
+ className: s.root({ class: [className, classNames?.root] }),
67
+ children: /* @__PURE__ */ jsx(Breadcrumbs, {
68
+ isDisabled,
69
+ "data-slot": "list",
70
+ className: s.list({ class: classNames?.list }),
71
+ children
72
+ })
73
+ })
74
+ });
75
+ }
76
+ //#endregion
77
+ export { Breadcrumb$1 as Breadcrumb, Breadcrumbs$1 as Breadcrumbs };
78
+
79
+ //# sourceMappingURL=breadcrumbs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.mjs","names":["Breadcrumb","RACBreadcrumb","Breadcrumbs","RACBreadcrumbs"],"sources":["../../src/breadcrumbs/breadcrumbs.tsx"],"sourcesContent":["'use client'\n\nimport type { BreadcrumbsProps } from '@novi-ui/core'\nimport { createContext, type ReactNode, useContext } from 'react'\nimport {\n Link,\n Breadcrumb as RACBreadcrumb,\n Breadcrumbs as RACBreadcrumbs,\n} from 'react-aria-components'\nimport { breadcrumbsStyles } from './breadcrumbs.styles'\n\n/**\n * 区切り文字を子へ渡す。\n *\n * 各項目が自分の前に区切りを描画し、先頭だけ CSS で隠す。\n * 親側で children を加工して区切りを差し込むと、\n * RAC が期待する `<ol> > <li>` の構造が壊れる。\n */\nconst SeparatorContext = createContext<ReactNode>('/')\n\nexport interface BreadcrumbProps {\n /** 省略すると現在地として扱い、リンクにしない */\n href?: string\n children?: ReactNode\n className?: string\n}\n\n/**\n * 階層の1段。`href` を省略した項目が現在地になる。\n *\n * @example\n * <Breadcrumb href=\"/docs\">ドキュメント</Breadcrumb>\n */\nexport function Breadcrumb({ href, children, className }: BreadcrumbProps) {\n const s = breadcrumbsStyles()\n const separator = useContext(SeparatorContext)\n\n return (\n <RACBreadcrumb data-slot=\"item\" className={s.item({ class: className })}>\n <span data-slot=\"separator\" className={s.separator()} aria-hidden=\"true\">\n {separator}\n </span>\n\n {href === undefined ? (\n // 現在地はリンクにしない。RAC は Link にしか aria-current を付けないので、\n // ここでは自分で付ける必要がある\n <span data-slot=\"current\" aria-current=\"page\" className={s.current()}>\n {children}\n </span>\n ) : (\n <Link href={href} data-slot=\"link\" className={s.link()}>\n {children}\n </Link>\n )}\n </RACBreadcrumb>\n )\n}\n\n/**\n * 階層の中で現在どこにいるかを示す。\n *\n * 区切り文字は装飾なので支援技術には読ませない。\n * `href` を省いた項目が現在地になり、リンクにならない。\n *\n * @example\n * <Breadcrumbs>\n * <Breadcrumb href=\"/\">ホーム</Breadcrumb>\n * <Breadcrumb href=\"/docs\">ドキュメント</Breadcrumb>\n * <Breadcrumb>Button</Breadcrumb>\n * </Breadcrumbs>\n */\nexport function Breadcrumbs({\n size,\n separator = '/',\n isDisabled,\n children,\n className,\n classNames,\n id,\n}: BreadcrumbsProps) {\n const s = breadcrumbsStyles({ size })\n\n return (\n <SeparatorContext.Provider value={separator}>\n {/* nav でラップして現在地の階層であることを伝える */}\n <nav\n id={id}\n aria-label=\"パンくずリスト\"\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n >\n <RACBreadcrumbs\n isDisabled={isDisabled}\n data-slot=\"list\"\n className={s.list({ class: classNames?.list })}\n >\n {children}\n </RACBreadcrumbs>\n </nav>\n </SeparatorContext.Provider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAkBA,MAAM,mBAAmB,cAAyB,GAAG;;;;;;;AAerD,SAAgBA,aAAW,EAAE,MAAM,UAAU,aAA8B;CACzE,MAAM,IAAI,kBAAkB;CAC5B,MAAM,YAAY,WAAW,gBAAgB;CAE7C,OACE,qBAACC,YAAD;EAAe,aAAU;EAAO,WAAW,EAAE,KAAK,EAAE,OAAO,UAAU,CAAC;EAAtE,UAAA,CACE,oBAAC,QAAD;GAAM,aAAU;GAAY,WAAW,EAAE,UAAU;GAAG,eAAY;GAC/D,UAAA;EACG,CAAA,GAEL,SAAS,KAAA,IAGR,oBAAC,QAAD;GAAM,aAAU;GAAU,gBAAa;GAAO,WAAW,EAAE,QAAQ;GAChE;EACG,CAAA,IAEN,oBAAC,MAAD;GAAY;GAAM,aAAU;GAAO,WAAW,EAAE,KAAK;GAClD;EACG,CAAA,CAEK;;AAEnB;;;;;;;;;;;;;;AAeA,SAAgBC,cAAY,EAC1B,MACA,YAAY,KACZ,YACA,UACA,WACA,YACA,MACmB;CACnB,MAAM,IAAI,kBAAkB,EAAE,KAAK,CAAC;CAEpC,OACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;EAEhC,UAAA,oBAAC,OAAD;GACM;GACJ,cAAW;GACX,aAAU;GACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;GAE1D,UAAA,oBAACC,aAAD;IACc;IACZ,aAAU;IACV,WAAW,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC;IAE5C;GACa,CAAA;EACb,CAAA;CACoB,CAAA;AAE/B"}
@@ -0,0 +1,46 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/breadcrumbs/breadcrumbs.styles.d.ts
3
+ /**
4
+ * Breadcrumbs のスタイル定義。
5
+ *
6
+ * @example
7
+ * const myCrumbs = tv({ extend: breadcrumbsStyles, slots: { separator: 'mx-2' } })
8
+ */
9
+ declare const breadcrumbsStyles: import("tailwind-variants").TVReturnType<{
10
+ size: VariantMap<"sm" | "md" | "lg", {
11
+ list: string;
12
+ }>;
13
+ }, {
14
+ root: string;
15
+ list: string;
16
+ item: string;
17
+ link: string;
18
+ separator: string;
19
+ current: string;
20
+ }, undefined, {
21
+ size: VariantMap<"sm" | "md" | "lg", {
22
+ list: string;
23
+ }>;
24
+ }, {
25
+ root: string;
26
+ list: string;
27
+ item: string;
28
+ link: string;
29
+ separator: string;
30
+ current: string;
31
+ }, import("tailwind-variants").TVReturnTypeLike<{
32
+ size: VariantMap<"sm" | "md" | "lg", {
33
+ list: string;
34
+ }>;
35
+ }, {
36
+ root: string;
37
+ list: string;
38
+ item: string;
39
+ link: string;
40
+ separator: string;
41
+ current: string;
42
+ }>>;
43
+ type BreadcrumbsStyleProps = Parameters<typeof breadcrumbsStyles>[0];
44
+ //#endregion
45
+ export { BreadcrumbsStyleProps, breadcrumbsStyles };
46
+ //# sourceMappingURL=breadcrumbs.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.styles.d.mts","names":[],"sources":["../../src/breadcrumbs/breadcrumbs.styles.ts"],"mappings":";;;;;;;;cA+Ca,+CAAiB;;IAZW;;;;;;;;;;;IAAA;;;;;;;;;;;IAAA;;;;;;;;;;KAkB7B,wBAAwB,kBAAkB"}
@@ -0,0 +1,38 @@
1
+ import { focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/breadcrumbs/breadcrumbs.styles.ts
4
+ const slots = {
5
+ root: "flex",
6
+ list: ["flex flex-wrap items-center gap-1.5", "[&>li:first-child>[data-slot=separator]]:hidden"].join(" "),
7
+ item: "flex items-center gap-2",
8
+ link: [
9
+ "relative inline-flex items-center min-h-11",
10
+ "before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2",
11
+ "before:h-11 before:content-[\"\"]",
12
+ "text-[var(--novi-color-muted)] underline-offset-4",
13
+ "transition-colors duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
14
+ "hover:text-[var(--novi-color-fg)] hover:underline",
15
+ focusRing
16
+ ].join(" "),
17
+ separator: "text-[var(--novi-color-border-strong)] select-none",
18
+ current: "text-[var(--novi-color-fg)] font-medium"
19
+ };
20
+ /**
21
+ * Breadcrumbs のスタイル定義。
22
+ *
23
+ * @example
24
+ * const myCrumbs = tv({ extend: breadcrumbsStyles, slots: { separator: 'mx-2' } })
25
+ */
26
+ const breadcrumbsStyles = tv({
27
+ slots,
28
+ variants: { size: {
29
+ sm: { list: "text-[length:var(--novi-text-xs)]" },
30
+ md: { list: "text-[length:var(--novi-text-sm)]" },
31
+ lg: { list: "text-[length:var(--novi-text-base)]" }
32
+ } },
33
+ defaultVariants: { size: "md" }
34
+ });
35
+ //#endregion
36
+ export { breadcrumbsStyles };
37
+
38
+ //# sourceMappingURL=breadcrumbs.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.styles.mjs","names":[],"sources":["../../src/breadcrumbs/breadcrumbs.styles.ts"],"sourcesContent":["import type {\n breadcrumbsRequiredSlots,\n breadcrumbsSlots,\n NoviSize,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { focusRing } from '../styles/focus-ring'\n\nconst slots = {\n // root は <nav>、list は RAC が描画する <ol>。nav > ol が意味的に正しい構造\n root: 'flex',\n list: [\n 'flex flex-wrap items-center gap-1.5',\n // 先頭の項目だけ区切り文字を隠す。各項目が自分の前に区切りを持つ構造\n '[&>li:first-child>[data-slot=separator]]:hidden',\n ].join(' '),\n item: 'flex items-center gap-2',\n // 薄く小さいリンクはタップ違反の典型。当たり判定を擬似要素で 44px に広げる\n link: [\n 'relative inline-flex items-center min-h-11',\n 'before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2',\n 'before:h-11 before:content-[\"\"]',\n 'text-[var(--novi-color-muted)] underline-offset-4',\n 'transition-colors duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'hover:text-[var(--novi-color-fg)] hover:underline',\n focusRing,\n ].join(' '),\n // 装飾なので支援技術には読ませない\n separator: 'text-[var(--novi-color-border-strong)] select-none',\n // 現在地はリンクにしない。色ではなく太さで示す\n current: 'text-[var(--novi-color-fg)] font-medium',\n} satisfies SlotMap<typeof breadcrumbsSlots, (typeof breadcrumbsRequiredSlots)[number]>\n\nconst size: VariantMap<NoviSize, { list: string }> = {\n sm: { list: 'text-[length:var(--novi-text-xs)]' },\n md: { list: 'text-[length:var(--novi-text-sm)]' },\n lg: { list: 'text-[length:var(--novi-text-base)]' },\n}\n\n/**\n * Breadcrumbs のスタイル定義。\n *\n * @example\n * const myCrumbs = tv({ extend: breadcrumbsStyles, slots: { separator: 'mx-2' } })\n */\nexport const breadcrumbsStyles = tv({\n slots,\n variants: { size },\n defaultVariants: { size: 'md' },\n})\n\nexport type BreadcrumbsStyleProps = Parameters<typeof breadcrumbsStyles>[0]\n"],"mappings":";;;AAUA,MAAM,QAAQ;CAEZ,MAAM;CACN,MAAM,CACJ,uCAEA,iDACF,CAAC,CAAC,KAAK,GAAG;CACV,MAAM;CAEN,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,WAAW;CAEX,SAAS;AACX;;;;;;;AAcA,MAAa,oBAAoB,GAAG;CAClC;CACA,UAAU,EAAE;EAbZ,IAAI,EAAE,MAAM,oCAAoC;EAChD,IAAI,EAAE,MAAM,oCAAoC;EAChD,IAAI,EAAE,MAAM,sCAAsC;CAWtC,EAAK;CACjB,iBAAiB,EAAE,MAAM,KAAK;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Breadcrumb, BreadcrumbProps, Breadcrumbs } from "./breadcrumbs.mjs";
2
+ import { BreadcrumbsStyleProps, breadcrumbsStyles } from "./breadcrumbs.styles.mjs";
3
+ export { Breadcrumb, type BreadcrumbProps, Breadcrumbs, type BreadcrumbsStyleProps, breadcrumbsStyles };
@@ -0,0 +1,17 @@
1
+ import { ButtonProps } from "@novi-ui/core";
2
+ //#region src/button/button.d.ts
3
+ /**
4
+ * ボタン。
5
+ *
6
+ * 押すと少し沈み、`solid` では影が消える。指で触れている手応えを返すため。
7
+ * 実効タップ領域は視覚寸法と独立に 44px 以上を保つ。
8
+ *
9
+ * @example
10
+ * <Button variant="solid" color="primary" onPress={() => save()}>
11
+ * 保存
12
+ * </Button>
13
+ */
14
+ declare function Button({ variant, size, color, radius, isDisabled, isLoading, type, onPress, startContent, endContent, children, className, classNames, id }: ButtonProps): import("react").JSX.Element;
15
+ //#endregion
16
+ export { Button };
17
+ //# sourceMappingURL=button.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.mts","names":[],"sources":["../../src/button/button.tsx"],"mappings":";;;;;;;;;;;;;iBAiBgB,SACd,SACA,MACA,OACA,QACA,YACA,WACA,MACA,SACA,cACA,YACA,UACA,WACA,YACA,MACC,8BAAW,IAAA"}
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { buttonStyles } from "./button.styles.mjs";
3
+ import { Button } from "react-aria-components";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/button/button.tsx
6
+ /**
7
+ * ボタン。
8
+ *
9
+ * 押すと少し沈み、`solid` では影が消える。指で触れている手応えを返すため。
10
+ * 実効タップ領域は視覚寸法と独立に 44px 以上を保つ。
11
+ *
12
+ * @example
13
+ * <Button variant="solid" color="primary" onPress={() => save()}>
14
+ * 保存
15
+ * </Button>
16
+ */
17
+ function Button$1({ variant, size, color, radius, isDisabled, isLoading, type = "button", onPress, startContent, endContent, children, className, classNames, id }) {
18
+ const s = buttonStyles({
19
+ variant,
20
+ size,
21
+ color,
22
+ radius
23
+ });
24
+ return /* @__PURE__ */ jsxs(Button, {
25
+ id,
26
+ type,
27
+ isDisabled: isDisabled === true || isLoading === true,
28
+ onPress,
29
+ "data-slot": "root",
30
+ "data-loading": isLoading === true ? true : void 0,
31
+ className: s.root({ class: [className, classNames?.root] }),
32
+ children: [
33
+ isLoading === true && /* @__PURE__ */ jsx("span", {
34
+ "data-slot": "spinner",
35
+ className: s.spinner({ class: classNames?.spinner }),
36
+ "aria-hidden": "true",
37
+ children: /* @__PURE__ */ jsxs("svg", {
38
+ viewBox: "0 0 16 16",
39
+ width: "1em",
40
+ height: "1em",
41
+ fill: "none",
42
+ "aria-hidden": "true",
43
+ children: [/* @__PURE__ */ jsx("circle", {
44
+ cx: "8",
45
+ cy: "8",
46
+ r: "6",
47
+ stroke: "currentColor",
48
+ strokeWidth: "2",
49
+ opacity: "0.25"
50
+ }), /* @__PURE__ */ jsx("path", {
51
+ d: "M14 8a6 6 0 0 0-6-6",
52
+ stroke: "currentColor",
53
+ strokeWidth: "2"
54
+ })]
55
+ })
56
+ }),
57
+ startContent !== void 0 && /* @__PURE__ */ jsx("span", {
58
+ "data-slot": "startContent",
59
+ className: s.startContent({ class: classNames?.startContent }),
60
+ children: startContent
61
+ }),
62
+ /* @__PURE__ */ jsx("span", {
63
+ "data-slot": "label",
64
+ className: s.label({ class: classNames?.label }),
65
+ children
66
+ }),
67
+ endContent !== void 0 && /* @__PURE__ */ jsx("span", {
68
+ "data-slot": "endContent",
69
+ className: s.endContent({ class: classNames?.endContent }),
70
+ children: endContent
71
+ })
72
+ ]
73
+ });
74
+ }
75
+ //#endregion
76
+ export { Button$1 as Button };
77
+
78
+ //# sourceMappingURL=button.mjs.map