@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,136 @@
1
+ "use client";
2
+ import { selectStyles } from "./select.styles.mjs";
3
+ import { Button, FieldError, Label, ListBox, ListBoxItem, Popover, Select, SelectValue, Text } from "react-aria-components";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/select/select.tsx
6
+ /** 開閉を示す記号。上下の山で「下から出る/しまう」方向を示す。 */
7
+ function TriggerIcon() {
8
+ return /* @__PURE__ */ jsx("svg", {
9
+ viewBox: "0 0 16 16",
10
+ width: "0.9em",
11
+ height: "0.9em",
12
+ fill: "none",
13
+ "aria-hidden": "true",
14
+ children: /* @__PURE__ */ jsx("path", {
15
+ d: "M5 6.5L8 3.5l3 3M5 9.5l3 3 3-3",
16
+ stroke: "currentColor",
17
+ strokeWidth: "1.5"
18
+ })
19
+ });
20
+ }
21
+ /** 選択済みの印。シートでは行が大きいぶん、選択状態を明示しないと見失う。 */
22
+ function SelectedIcon() {
23
+ return /* @__PURE__ */ jsx("svg", {
24
+ viewBox: "0 0 16 16",
25
+ width: "1em",
26
+ height: "1em",
27
+ fill: "none",
28
+ "aria-hidden": "true",
29
+ children: /* @__PURE__ */ jsx("path", {
30
+ d: "M3.5 8.5l3 3 6-6",
31
+ stroke: "currentColor",
32
+ strokeWidth: "1.75"
33
+ })
34
+ });
35
+ }
36
+ /**
37
+ * Select の選択肢。`Select` の子として置く。
38
+ *
39
+ * @example
40
+ * <SelectItem id="tokyo">東京都</SelectItem>
41
+ */
42
+ function SelectItem({ id, isDisabled, children, className }) {
43
+ return /* @__PURE__ */ jsx(ListBoxItem, {
44
+ id,
45
+ isDisabled,
46
+ textValue: typeof children === "string" ? children : void 0,
47
+ "data-slot": "option",
48
+ className: className ?? selectStyles().option(),
49
+ children: ({ isSelected }) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
50
+ className: "truncate",
51
+ children
52
+ }), isSelected && /* @__PURE__ */ jsx("span", {
53
+ className: "shrink-0 text-[var(--novi-color-primary)]",
54
+ children: /* @__PURE__ */ jsx(SelectedIcon, {})
55
+ })] })
56
+ });
57
+ }
58
+ /**
59
+ * 一覧から1つ選ぶ。**選択肢は画面下端から出るシート**で表示される(Raster はトリガーの隣)。
60
+ * 矢印キーで移動、Escape で閉じてトリガーへフォーカスが戻る。
61
+ *
62
+ * トリガーは `<button>` で編集可能要素ではないため IME の変換は発生しない。
63
+ * テキスト入力を伴う選択が必要な場合は ComboBox を使う(MVP の対象外)。
64
+ *
65
+ * @example
66
+ * <Select label="都道府県" selectedKey={pref} onSelectionChange={setPref}>
67
+ * <SelectItem id="tokyo">東京都</SelectItem>
68
+ * <SelectItem id="osaka">大阪府</SelectItem>
69
+ * </Select>
70
+ */
71
+ function Select$1({ variant, size, radius, label, placeholder = "選択してください", description, errorMessage, name, selectedKey, defaultSelectedKey, onSelectionChange, isOpen, defaultOpen, onOpenChange, isDisabled, isRequired, isInvalid, children, className, classNames, id }) {
72
+ const s = selectStyles({
73
+ variant,
74
+ size,
75
+ radius
76
+ });
77
+ return /* @__PURE__ */ jsxs(Select, {
78
+ id,
79
+ name,
80
+ selectedKey,
81
+ defaultSelectedKey,
82
+ onSelectionChange: (key) => onSelectionChange?.(key === null ? null : String(key)),
83
+ isOpen,
84
+ defaultOpen,
85
+ onOpenChange,
86
+ isDisabled,
87
+ isRequired,
88
+ isInvalid,
89
+ placeholder,
90
+ "data-slot": "root",
91
+ className: `group ${s.root({ class: [className, classNames?.root] })}`,
92
+ children: [
93
+ label !== void 0 && /* @__PURE__ */ jsx(Label, {
94
+ "data-slot": "label",
95
+ className: s.label({ class: classNames?.label }),
96
+ children: label
97
+ }),
98
+ /* @__PURE__ */ jsxs(Button, {
99
+ "data-slot": "trigger",
100
+ className: s.trigger({ class: classNames?.trigger }),
101
+ children: [/* @__PURE__ */ jsx(SelectValue, {
102
+ "data-slot": "value",
103
+ className: s.value({ class: classNames?.value })
104
+ }), /* @__PURE__ */ jsx("span", {
105
+ "data-slot": "icon",
106
+ className: s.icon({ class: classNames?.icon }),
107
+ children: /* @__PURE__ */ jsx(TriggerIcon, {})
108
+ })]
109
+ }),
110
+ description !== void 0 && /* @__PURE__ */ jsx(Text, {
111
+ slot: "description",
112
+ "data-slot": "description",
113
+ className: s.description({ class: classNames?.description }),
114
+ children: description
115
+ }),
116
+ /* @__PURE__ */ jsx(FieldError, {
117
+ "data-slot": "errorMessage",
118
+ className: s.errorMessage({ class: classNames?.errorMessage }),
119
+ children: errorMessage
120
+ }),
121
+ /* @__PURE__ */ jsx(Popover, {
122
+ "data-slot": "popover",
123
+ className: s.popover({ class: classNames?.popover }),
124
+ children: /* @__PURE__ */ jsx(ListBox, {
125
+ "data-slot": "listbox",
126
+ className: s.listbox({ class: classNames?.listbox }),
127
+ children
128
+ })
129
+ })
130
+ ]
131
+ });
132
+ }
133
+ //#endregion
134
+ export { Select$1 as Select, SelectItem };
135
+
136
+ //# sourceMappingURL=select.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.mjs","names":["Select","RACSelect"],"sources":["../../src/select/select.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectProps } from '@novi-ui/core'\nimport type { ReactNode } from 'react'\nimport {\n Button,\n FieldError,\n Label,\n ListBox,\n ListBoxItem,\n Popover,\n Select as RACSelect,\n SelectValue,\n Text,\n} from 'react-aria-components'\nimport { selectStyles } from './select.styles'\n\n/** 開閉を示す記号。上下の山で「下から出る/しまう」方向を示す。 */\nfunction TriggerIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" width=\"0.9em\" height=\"0.9em\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 6.5L8 3.5l3 3M5 9.5l3 3 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n )\n}\n\n/** 選択済みの印。シートでは行が大きいぶん、選択状態を明示しないと見失う。 */\nfunction SelectedIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" width=\"1em\" height=\"1em\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-6\" stroke=\"currentColor\" strokeWidth=\"1.75\" />\n </svg>\n )\n}\n\nexport interface SelectItemProps {\n /** 選択値。`onSelectionChange` に渡る */\n id: string\n isDisabled?: boolean\n children?: ReactNode\n className?: string\n}\n\n/**\n * Select の選択肢。`Select` の子として置く。\n *\n * @example\n * <SelectItem id=\"tokyo\">東京都</SelectItem>\n */\nexport function SelectItem({ id, isDisabled, children, className }: SelectItemProps) {\n return (\n <ListBoxItem\n id={id}\n isDisabled={isDisabled}\n textValue={typeof children === 'string' ? children : undefined}\n data-slot=\"option\"\n className={className ?? selectStyles().option()}\n >\n {({ isSelected }) => (\n <>\n <span className=\"truncate\">{children}</span>\n {isSelected && (\n <span className=\"shrink-0 text-[var(--novi-color-primary)]\">\n <SelectedIcon />\n </span>\n )}\n </>\n )}\n </ListBoxItem>\n )\n}\n\n/**\n * 一覧から1つ選ぶ。**選択肢は画面下端から出るシート**で表示される(Raster はトリガーの隣)。\n * 矢印キーで移動、Escape で閉じてトリガーへフォーカスが戻る。\n *\n * トリガーは `<button>` で編集可能要素ではないため IME の変換は発生しない。\n * テキスト入力を伴う選択が必要な場合は ComboBox を使う(MVP の対象外)。\n *\n * @example\n * <Select label=\"都道府県\" selectedKey={pref} onSelectionChange={setPref}>\n * <SelectItem id=\"tokyo\">東京都</SelectItem>\n * <SelectItem id=\"osaka\">大阪府</SelectItem>\n * </Select>\n */\nexport function Select({\n variant,\n size,\n radius,\n label,\n placeholder = '選択してください',\n description,\n errorMessage,\n name,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n isOpen,\n defaultOpen,\n onOpenChange,\n isDisabled,\n isRequired,\n isInvalid,\n children,\n className,\n classNames,\n id,\n}: SelectProps) {\n const s = selectStyles({ variant, size, radius })\n\n return (\n <RACSelect\n id={id}\n name={name}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={(key) => onSelectionChange?.(key === null ? null : String(key))}\n isOpen={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n isDisabled={isDisabled}\n isRequired={isRequired}\n isInvalid={isInvalid}\n placeholder={placeholder}\n data-slot=\"root\"\n // trigger 側から invalid 状態を参照するために group を付ける\n className={`group ${s.root({ class: [className, classNames?.root] })}`}\n >\n {label !== undefined && (\n <Label data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {label}\n </Label>\n )}\n\n <Button data-slot=\"trigger\" className={s.trigger({ class: classNames?.trigger })}>\n <SelectValue data-slot=\"value\" className={s.value({ class: classNames?.value })} />\n <span data-slot=\"icon\" className={s.icon({ class: classNames?.icon })}>\n <TriggerIcon />\n </span>\n </Button>\n\n {description !== undefined && (\n <Text\n slot=\"description\"\n data-slot=\"description\"\n className={s.description({ class: classNames?.description })}\n >\n {description}\n </Text>\n )}\n\n <FieldError\n data-slot=\"errorMessage\"\n className={s.errorMessage({ class: classNames?.errorMessage })}\n >\n {errorMessage}\n </FieldError>\n\n <Popover data-slot=\"popover\" className={s.popover({ class: classNames?.popover })}>\n <ListBox data-slot=\"listbox\" className={s.listbox({ class: classNames?.listbox })}>\n {children}\n </ListBox>\n </Popover>\n </RACSelect>\n )\n}\n"],"mappings":";;;;;;AAkBA,SAAS,cAAc;CACrB,OACE,oBAAC,OAAD;EAAK,SAAQ;EAAY,OAAM;EAAQ,QAAO;EAAQ,MAAK;EAAO,eAAY;EAC5E,UAAA,oBAAC,QAAD;GAAM,GAAE;GAAiC,QAAO;GAAe,aAAY;EAAO,CAAA;CAC/E,CAAA;AAET;;AAGA,SAAS,eAAe;CACtB,OACE,oBAAC,OAAD;EAAK,SAAQ;EAAY,OAAM;EAAM,QAAO;EAAM,MAAK;EAAO,eAAY;EACxE,UAAA,oBAAC,QAAD;GAAM,GAAE;GAAmB,QAAO;GAAe,aAAY;EAAQ,CAAA;CAClE,CAAA;AAET;;;;;;;AAgBA,SAAgB,WAAW,EAAE,IAAI,YAAY,UAAU,aAA8B;CACnF,OACE,oBAAC,aAAD;EACM;EACQ;EACZ,WAAW,OAAO,aAAa,WAAW,WAAW,KAAA;EACrD,aAAU;EACV,WAAW,aAAa,aAAa,CAAC,CAAC,OAAO;EAE5C,WAAA,EAAE,iBACF,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;GAAM,WAAU;GAAY;EAAe,CAAA,GAC1C,cACC,oBAAC,QAAD;GAAM,WAAU;GACd,UAAA,oBAAC,cAAD,CAAe,CAAA;EACX,CAAA,CAER,EAAA,CAAA;CAEO,CAAA;AAEjB;;;;;;;;;;;;;;AAeA,SAAgBA,SAAO,EACrB,SACA,MACA,QACA,OACA,cAAc,YACd,aACA,cACA,MACA,aACA,oBACA,mBACA,QACA,aACA,cACA,YACA,YACA,WACA,UACA,WACA,YACA,MACc;CACd,MAAM,IAAI,aAAa;EAAE;EAAS;EAAM;CAAO,CAAC;CAEhD,OACE,qBAACC,QAAD;EACM;EACE;EACO;EACO;EACpB,oBAAoB,QAAQ,oBAAoB,QAAQ,OAAO,OAAO,OAAO,GAAG,CAAC;EACzE;EACK;EACC;EACF;EACA;EACD;EACE;EACb,aAAU;EAEV,WAAW,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAfrE,UAAA;GAiBG,UAAU,KAAA,KACT,oBAAC,OAAD;IAAO,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IACrE,UAAA;GACI,CAAA;GAGT,qBAAC,QAAD;IAAQ,aAAU;IAAU,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;IAA/E,UAAA,CACE,oBAAC,aAAD;KAAa,aAAU;KAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IAAI,CAAA,GAClF,oBAAC,QAAD;KAAM,aAAU;KAAO,WAAW,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC;KAClE,UAAA,oBAAC,aAAD,CAAc,CAAA;IACV,CAAA,CACA;;GAEP,gBAAgB,KAAA,KACf,oBAAC,MAAD;IACE,MAAK;IACL,aAAU;IACV,WAAW,EAAE,YAAY,EAAE,OAAO,YAAY,YAAY,CAAC;IAE1D,UAAA;GACG,CAAA;GAGR,oBAAC,YAAD;IACE,aAAU;IACV,WAAW,EAAE,aAAa,EAAE,OAAO,YAAY,aAAa,CAAC;IAE5D,UAAA;GACS,CAAA;GAEZ,oBAAC,SAAD;IAAS,aAAU;IAAU,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;IAC9E,UAAA,oBAAC,SAAD;KAAS,aAAU;KAAU,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;KAC7E;IACM,CAAA;GACF,CAAA;EACA;;AAEf"}
@@ -0,0 +1,85 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/select/select.styles.d.ts
3
+ /**
4
+ * Select のスタイル定義。
5
+ *
6
+ * `popover` の `!` 付きクラスを `classNames` で上書きすることはできない
7
+ * (`!important` 同士では後勝ちにならない)。配置を変えたい場合は `tv({ extend })` を使う。
8
+ *
9
+ * @example
10
+ * import { selectStyles } from '@novi-ui/tactile'
11
+ * import { tv } from 'tailwind-variants'
12
+ *
13
+ * const mySelect = tv({ extend: selectStyles, slots: { option: 'font-mono' } })
14
+ */
15
+ declare const selectStyles: import("tailwind-variants").TVReturnType<{
16
+ size: VariantMap<"sm" | "md" | "lg", {
17
+ trigger: string;
18
+ option: string;
19
+ }>;
20
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
21
+ trigger: string;
22
+ }>;
23
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
24
+ trigger: string;
25
+ }>;
26
+ }, {
27
+ root: string;
28
+ label: string;
29
+ trigger: string;
30
+ value: string;
31
+ icon: string;
32
+ popover: string;
33
+ listbox: string;
34
+ option: string;
35
+ description: string;
36
+ errorMessage: string;
37
+ }, undefined, {
38
+ size: VariantMap<"sm" | "md" | "lg", {
39
+ trigger: string;
40
+ option: string;
41
+ }>;
42
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
43
+ trigger: string;
44
+ }>;
45
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
46
+ trigger: string;
47
+ }>;
48
+ }, {
49
+ root: string;
50
+ label: string;
51
+ trigger: string;
52
+ value: string;
53
+ icon: string;
54
+ popover: string;
55
+ listbox: string;
56
+ option: string;
57
+ description: string;
58
+ errorMessage: string;
59
+ }, import("tailwind-variants").TVReturnTypeLike<{
60
+ size: VariantMap<"sm" | "md" | "lg", {
61
+ trigger: string;
62
+ option: string;
63
+ }>;
64
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
65
+ trigger: string;
66
+ }>;
67
+ variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
68
+ trigger: string;
69
+ }>;
70
+ }, {
71
+ root: string;
72
+ label: string;
73
+ trigger: string;
74
+ value: string;
75
+ icon: string;
76
+ popover: string;
77
+ listbox: string;
78
+ option: string;
79
+ description: string;
80
+ errorMessage: string;
81
+ }>>;
82
+ type SelectStyleProps = Parameters<typeof selectStyles>[0];
83
+ //#endregion
84
+ export { SelectStyleProps, selectStyles };
85
+ //# sourceMappingURL=select.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.styles.d.mts","names":[],"sources":["../../src/select/select.styles.ts"],"mappings":";;;;;;;;;;;;;;cA0Ha,0CAAY;;IAhDmB;IAAgB;;;IAeZ;;;IAQE;;;;;;;;;;;;;;;IAvBN;IAAgB;;;IAeZ;;;IAQE;;;;;;;;;;;;;;;IAvBN;IAAgB;;;IAeZ;;;IAQE;;;;;;;;;;;;;;KA+BtC,mBAAmB,kBAAkB"}
@@ -0,0 +1,109 @@
1
+ import { disabledState, focusRing } from "../styles/focus-ring.mjs";
2
+ import { tv } from "tailwind-variants";
3
+ //#region src/select/select.styles.ts
4
+ /**
5
+ * Tactile の Select は **画面下端から出るシート型ピッカー**(Raster はアンカー型ポップオーバー)。
6
+ *
7
+ * 一覧は誤タップが最も起きる場所なので、行を大きく取り、選択済みをチェックで示す。
8
+ *
9
+ * **`!` 付きのユーティリティは意図的**。RAC の `Popover` はトリガー基準の位置を
10
+ * インラインスタイルで書き込むため、通常のクラスでも `style` prop でも勝てない。
11
+ * スタイルシートの `!important` だけがインラインに勝つ(ADR-T2 / T-13 の実測)。
12
+ */
13
+ const slots = {
14
+ root: "flex flex-col gap-1.5",
15
+ label: "text-[length:var(--novi-text-sm)] font-medium text-[var(--novi-color-fg)]",
16
+ trigger: [
17
+ "text-[var(--novi-color-fg)]",
18
+ "flex items-center justify-between gap-2 w-full",
19
+ "text-left",
20
+ "bg-[var(--novi-color-surface)]",
21
+ "shadow-[var(--novi-shadow-sm)]",
22
+ "rounded-[var(--novi-radius-md)]",
23
+ "transition-[opacity,scale] duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
24
+ "data-[pressed]:scale-[0.99] motion-reduce:data-[pressed]:scale-100",
25
+ "group-data-[invalid]:ring-1 group-data-[invalid]:ring-[var(--novi-color-danger)]",
26
+ focusRing,
27
+ disabledState
28
+ ].join(" "),
29
+ value: ["truncate text-[var(--novi-color-fg)]", "data-[placeholder]:text-[var(--novi-color-muted)]"].join(" "),
30
+ icon: "shrink-0 text-[var(--novi-color-muted)]",
31
+ popover: [
32
+ "!fixed !top-auto !inset-x-0 !bottom-0 !max-w-none !w-full",
33
+ "!max-h-[70dvh]",
34
+ "bg-[var(--novi-color-surface)]",
35
+ "text-[var(--novi-color-fg)]",
36
+ "rounded-t-[var(--novi-radius-lg)]",
37
+ "shadow-[var(--novi-shadow-lg)]",
38
+ "overflow-auto",
39
+ "pb-[env(safe-area-inset-bottom,0px)]",
40
+ "data-[entering]:motion-safe:animate-[novi-slide-up_260ms_var(--novi-ease-emphasized)]"
41
+ ].join(" "),
42
+ listbox: "outline-none p-2 flex flex-col",
43
+ option: [
44
+ "flex items-center justify-between gap-3",
45
+ "px-3 cursor-pointer outline-none",
46
+ "text-[var(--novi-color-fg)]",
47
+ "rounded-[var(--novi-radius-md)]",
48
+ "transition-[background-color] duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
49
+ "data-[focused]:bg-[var(--novi-color-subtle)]",
50
+ "data-[selected]:font-bold",
51
+ disabledState
52
+ ].join(" "),
53
+ description: "text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]",
54
+ errorMessage: "text-[length:var(--novi-text-sm)] text-[var(--novi-color-danger)]"
55
+ };
56
+ /**
57
+ * Select のスタイル定義。
58
+ *
59
+ * `popover` の `!` 付きクラスを `classNames` で上書きすることはできない
60
+ * (`!important` 同士では後勝ちにならない)。配置を変えたい場合は `tv({ extend })` を使う。
61
+ *
62
+ * @example
63
+ * import { selectStyles } from '@novi-ui/tactile'
64
+ * import { tv } from 'tailwind-variants'
65
+ *
66
+ * const mySelect = tv({ extend: selectStyles, slots: { option: 'font-mono' } })
67
+ */
68
+ const selectStyles = tv({
69
+ slots,
70
+ variants: {
71
+ size: {
72
+ sm: {
73
+ trigger: "h-10 px-3 text-[length:var(--novi-text-sm)]",
74
+ option: "h-12 text-[length:var(--novi-text-sm)]"
75
+ },
76
+ md: {
77
+ trigger: "h-12 px-4 text-[length:var(--novi-text-base)]",
78
+ option: "h-14 text-[length:var(--novi-text-base)]"
79
+ },
80
+ lg: {
81
+ trigger: "h-14 px-5 text-[length:var(--novi-text-base)]",
82
+ option: "h-16 text-[length:var(--novi-text-base)]"
83
+ }
84
+ },
85
+ radius: {
86
+ none: { trigger: "rounded-[var(--novi-radius-none)]" },
87
+ sm: { trigger: "rounded-[var(--novi-radius-sm)]" },
88
+ md: { trigger: "rounded-[var(--novi-radius-md)]" },
89
+ lg: { trigger: "rounded-[var(--novi-radius-lg)]" },
90
+ full: { trigger: "rounded-[var(--novi-radius-full)]" }
91
+ },
92
+ variant: {
93
+ solid: { trigger: "bg-[var(--novi-color-surface)]" },
94
+ outline: { trigger: "bg-transparent shadow-[var(--novi-shadow-none)] ring-1 ring-[var(--novi-color-border-strong)]" },
95
+ soft: { trigger: "bg-[var(--novi-color-subtle)] shadow-[var(--novi-shadow-none)]" },
96
+ ghost: { trigger: "bg-transparent shadow-[var(--novi-shadow-none)]" },
97
+ plain: { trigger: "bg-transparent shadow-[var(--novi-shadow-none)] px-0 underline underline-offset-4" }
98
+ }
99
+ },
100
+ defaultVariants: {
101
+ size: "md",
102
+ radius: "md",
103
+ variant: "solid"
104
+ }
105
+ });
106
+ //#endregion
107
+ export { selectStyles };
108
+
109
+ //# sourceMappingURL=select.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.styles.mjs","names":[],"sources":["../../src/select/select.styles.ts"],"sourcesContent":["import type {\n NoviRadius,\n NoviSize,\n NoviVariant,\n SlotMap,\n selectRequiredSlots,\n selectSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\n\n/**\n * Tactile の Select は **画面下端から出るシート型ピッカー**(Raster はアンカー型ポップオーバー)。\n *\n * 一覧は誤タップが最も起きる場所なので、行を大きく取り、選択済みをチェックで示す。\n *\n * **`!` 付きのユーティリティは意図的**。RAC の `Popover` はトリガー基準の位置を\n * インラインスタイルで書き込むため、通常のクラスでも `style` prop でも勝てない。\n * スタイルシートの `!important` だけがインラインに勝つ(ADR-T2 / T-13 の実測)。\n */\nconst slots = {\n root: 'flex flex-col gap-1.5',\n label: 'text-[length:var(--novi-text-sm)] font-medium text-[var(--novi-color-fg)]',\n trigger: [\n 'text-[var(--novi-color-fg)]',\n 'flex items-center justify-between gap-2 w-full',\n 'text-left',\n 'bg-[var(--novi-color-surface)]',\n 'shadow-[var(--novi-shadow-sm)]',\n 'rounded-[var(--novi-radius-md)]',\n 'transition-[opacity,scale] duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'data-[pressed]:scale-[0.99] motion-reduce:data-[pressed]:scale-100',\n 'group-data-[invalid]:ring-1 group-data-[invalid]:ring-[var(--novi-color-danger)]',\n focusRing,\n disabledState,\n ].join(' '),\n value: [\n 'truncate text-[var(--novi-color-fg)]',\n 'data-[placeholder]:text-[var(--novi-color-muted)]',\n ].join(' '),\n icon: 'shrink-0 text-[var(--novi-color-muted)]',\n popover: [\n // ここが Raster との構造差そのもの。トリガーの隣ではなく画面下端に張り付く\n '!fixed !top-auto !inset-x-0 !bottom-0 !max-w-none !w-full',\n '!max-h-[70dvh]',\n 'bg-[var(--novi-color-surface)]',\n 'text-[var(--novi-color-fg)]',\n // 下端は画面に接するので上端だけ角丸。下から出てきた紙の形\n 'rounded-t-[var(--novi-radius-lg)]',\n 'shadow-[var(--novi-shadow-lg)]',\n 'overflow-auto',\n 'pb-[env(safe-area-inset-bottom,0px)]',\n 'data-[entering]:motion-safe:animate-[novi-slide-up_260ms_var(--novi-ease-emphasized)]',\n ].join(' '),\n listbox: 'outline-none p-2 flex flex-col',\n option: [\n 'flex items-center justify-between gap-3',\n 'px-3 cursor-pointer outline-none',\n 'text-[var(--novi-color-fg)]',\n 'rounded-[var(--novi-radius-md)]',\n 'transition-[background-color] duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'data-[focused]:bg-[var(--novi-color-subtle)]',\n 'data-[selected]:font-bold',\n disabledState,\n ].join(' '),\n description: 'text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]',\n errorMessage: 'text-[length:var(--novi-text-sm)] text-[var(--novi-color-danger)]',\n} satisfies SlotMap<typeof selectSlots, (typeof selectRequiredSlots)[number]>\n\n/**\n * `size` はトリガーの寸法と**行の密度**(ADR-T3)。\n * 行はどの段でも 48px を下回らない — 一覧は誤タップが最も起きる場所。\n */\nconst size: VariantMap<NoviSize, { trigger: string; option: string }> = {\n sm: {\n trigger: 'h-10 px-3 text-[length:var(--novi-text-sm)]',\n option: 'h-12 text-[length:var(--novi-text-sm)]',\n },\n md: {\n trigger: 'h-12 px-4 text-[length:var(--novi-text-base)]',\n option: 'h-14 text-[length:var(--novi-text-base)]',\n },\n lg: {\n trigger: 'h-14 px-5 text-[length:var(--novi-text-base)]',\n option: 'h-16 text-[length:var(--novi-text-base)]',\n },\n}\n\nconst radius: VariantMap<NoviRadius, { trigger: string }> = {\n none: { trigger: 'rounded-[var(--novi-radius-none)]' },\n sm: { trigger: 'rounded-[var(--novi-radius-sm)]' },\n md: { trigger: 'rounded-[var(--novi-radius-md)]' },\n lg: { trigger: 'rounded-[var(--novi-radius-lg)]' },\n full: { trigger: 'rounded-[var(--novi-radius-full)]' },\n}\n\nconst variant: VariantMap<NoviVariant, { trigger: string }> = {\n solid: { trigger: 'bg-[var(--novi-color-surface)]' },\n outline: {\n trigger:\n 'bg-transparent shadow-[var(--novi-shadow-none)] ring-1 ring-[var(--novi-color-border-strong)]',\n },\n soft: { trigger: 'bg-[var(--novi-color-subtle)] shadow-[var(--novi-shadow-none)]' },\n ghost: { trigger: 'bg-transparent shadow-[var(--novi-shadow-none)]' },\n plain: {\n trigger: 'bg-transparent shadow-[var(--novi-shadow-none)] px-0 underline underline-offset-4',\n },\n}\n\n/**\n * Select のスタイル定義。\n *\n * `popover` の `!` 付きクラスを `classNames` で上書きすることはできない\n * (`!important` 同士では後勝ちにならない)。配置を変えたい場合は `tv({ extend })` を使う。\n *\n * @example\n * import { selectStyles } from '@novi-ui/tactile'\n * import { tv } from 'tailwind-variants'\n *\n * const mySelect = tv({ extend: selectStyles, slots: { option: 'font-mono' } })\n */\nexport const selectStyles = tv({\n slots,\n variants: { size, radius, variant },\n defaultVariants: { size: 'md', radius: 'md', variant: 'solid' },\n})\n\nexport type SelectStyleProps = Parameters<typeof selectStyles>[0]\n"],"mappings":";;;;;;;;;;;;AAqBA,MAAM,QAAQ;CACZ,MAAM;CACN,OAAO;CACP,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO,CACL,wCACA,mDACF,CAAC,CAAC,KAAK,GAAG;CACV,MAAM;CACN,SAAS;EAEP;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,SAAS;CACT,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,aAAa;CACb,cAAc;AAChB;;;;;;;;;;;;;AAsDA,MAAa,eAAe,GAAG;CAC7B;CACA,UAAU;EAAE;GAjDZ,IAAI;IACF,SAAS;IACT,QAAQ;GACV;GACA,IAAI;IACF,SAAS;IACT,QAAQ;GACV;GACA,IAAI;IACF,SAAS;IACT,QAAQ;GACV;EAsCY;EAAM;GAlClB,MAAM,EAAE,SAAS,oCAAoC;GACrD,IAAI,EAAE,SAAS,kCAAkC;GACjD,IAAI,EAAE,SAAS,kCAAkC;GACjD,IAAI,EAAE,SAAS,kCAAkC;GACjD,MAAM,EAAE,SAAS,oCAAoC;EA8BnC;EAAQ;GA1B1B,OAAO,EAAE,SAAS,iCAAiC;GACnD,SAAS,EACP,SACE,gGACJ;GACA,MAAM,EAAE,SAAS,iEAAiE;GAClF,OAAO,EAAE,SAAS,kDAAkD;GACpE,OAAO,EACL,SAAS,oFACX;EAiB0B;CAAQ;CAClC,iBAAiB;EAAE,MAAM;EAAM,QAAQ;EAAM,SAAS;CAAQ;AAChE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Skeleton } from "./skeleton.mjs";
2
+ import { SkeletonStyleProps, skeletonStyles } from "./skeleton.styles.mjs";
3
+ export { Skeleton, type SkeletonStyleProps, skeletonStyles };
@@ -0,0 +1,15 @@
1
+ import { SkeletonProps } from "@novi-ui/core";
2
+ //#region src/skeleton/skeleton.d.ts
3
+ /**
4
+ * 読み込み中の場所取り。
5
+ *
6
+ * 支援技術には読ませない。読み込み状態は Spinner か live region で伝えること。
7
+ * 大きさは `className` で指定する。
8
+ *
9
+ * @example
10
+ * <Skeleton className="h-4 w-40" />
11
+ */
12
+ declare function Skeleton({ radius, className, classNames, id }: SkeletonProps): import("react").JSX.Element;
13
+ //#endregion
14
+ export { Skeleton };
15
+ //# sourceMappingURL=skeleton.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.mts","names":[],"sources":["../../src/skeleton/skeleton.tsx"],"mappings":";;;;;;;;;;;iBAcgB,WAAW,QAAQ,WAAW,YAAY,MAAM,gCAAa,IAAA"}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { skeletonStyles } from "./skeleton.styles.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/skeleton/skeleton.tsx
5
+ /**
6
+ * 読み込み中の場所取り。
7
+ *
8
+ * 支援技術には読ませない。読み込み状態は Spinner か live region で伝えること。
9
+ * 大きさは `className` で指定する。
10
+ *
11
+ * @example
12
+ * <Skeleton className="h-4 w-40" />
13
+ */
14
+ function Skeleton({ radius, className, classNames, id }) {
15
+ const s = skeletonStyles({ radius });
16
+ return /* @__PURE__ */ jsx("span", {
17
+ id,
18
+ "aria-hidden": "true",
19
+ "data-slot": "root",
20
+ className: s.root({ class: [className, classNames?.root] })
21
+ });
22
+ }
23
+ //#endregion
24
+ export { Skeleton };
25
+
26
+ //# sourceMappingURL=skeleton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.mjs","names":[],"sources":["../../src/skeleton/skeleton.tsx"],"sourcesContent":["'use client'\n\nimport type { SkeletonProps } from '@novi-ui/core'\nimport { skeletonStyles } from './skeleton.styles'\n\n/**\n * 読み込み中の場所取り。\n *\n * 支援技術には読ませない。読み込み状態は Spinner か live region で伝えること。\n * 大きさは `className` で指定する。\n *\n * @example\n * <Skeleton className=\"h-4 w-40\" />\n */\nexport function Skeleton({ radius, className, classNames, id }: SkeletonProps) {\n const s = skeletonStyles({ radius })\n\n return (\n <span\n id={id}\n aria-hidden=\"true\"\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,SAAS,EAAE,QAAQ,WAAW,YAAY,MAAqB;CAC7E,MAAM,IAAI,eAAe,EAAE,OAAO,CAAC;CAEnC,OACE,oBAAC,QAAD;EACM;EACJ,eAAY;EACZ,aAAU;EACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;CAC3D,CAAA;AAEL"}
@@ -0,0 +1,31 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/skeleton/skeleton.styles.d.ts
3
+ /**
4
+ * Skeleton のスタイル定義。
5
+ *
6
+ * @example
7
+ * const mySkeleton = tv({ extend: skeletonStyles, slots: { root: 'opacity-50' } })
8
+ */
9
+ declare const skeletonStyles: import("tailwind-variants").TVReturnType<{
10
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
11
+ root: string;
12
+ }>;
13
+ }, {
14
+ root: string;
15
+ }, undefined, {
16
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
17
+ root: string;
18
+ }>;
19
+ }, {
20
+ root: string;
21
+ }, import("tailwind-variants").TVReturnTypeLike<{
22
+ radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
23
+ root: string;
24
+ }>;
25
+ }, {
26
+ root: string;
27
+ }>>;
28
+ type SkeletonStyleProps = Parameters<typeof skeletonStyles>[0];
29
+ //#endregion
30
+ export { SkeletonStyleProps, skeletonStyles };
31
+ //# sourceMappingURL=skeleton.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.styles.d.mts","names":[],"sources":["../../src/skeleton/skeleton.styles.ts"],"mappings":";;;;;;;;cA6Ba,4CAAc;;IAdkB;;;;;;IAAA;;;;;;IAAA;;;;;KAoBjC,qBAAqB,kBAAkB"}
@@ -0,0 +1,22 @@
1
+ import { tv } from "tailwind-variants";
2
+ /**
3
+ * Skeleton のスタイル定義。
4
+ *
5
+ * @example
6
+ * const mySkeleton = tv({ extend: skeletonStyles, slots: { root: 'opacity-50' } })
7
+ */
8
+ const skeletonStyles = tv({
9
+ slots: { root: "block bg-[var(--novi-color-subtle)] motion-safe:animate-pulse" },
10
+ variants: { radius: {
11
+ none: { root: "rounded-[var(--novi-radius-none)]" },
12
+ sm: { root: "rounded-[var(--novi-radius-sm)]" },
13
+ md: { root: "rounded-[var(--novi-radius-md)]" },
14
+ lg: { root: "rounded-[var(--novi-radius-lg)]" },
15
+ full: { root: "rounded-[var(--novi-radius-full)]" }
16
+ } },
17
+ defaultVariants: { radius: "sm" }
18
+ });
19
+ //#endregion
20
+ export { skeletonStyles };
21
+
22
+ //# sourceMappingURL=skeleton.styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.styles.mjs","names":[],"sources":["../../src/skeleton/skeleton.styles.ts"],"sourcesContent":["import type {\n NoviRadius,\n SlotMap,\n skeletonRequiredSlots,\n skeletonSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\n\nconst slots = {\n // opacity のパルスのみ。シマー(translate するグラデーション)は使わない。\n // 動きで飾らないという Raster の原則に反するため。\n root: 'block bg-[var(--novi-color-subtle)] motion-safe:animate-pulse',\n} satisfies SlotMap<typeof skeletonSlots, (typeof skeletonRequiredSlots)[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 * Skeleton のスタイル定義。\n *\n * @example\n * const mySkeleton = tv({ extend: skeletonStyles, slots: { root: 'opacity-50' } })\n */\nexport const skeletonStyles = tv({\n slots,\n variants: { radius },\n defaultVariants: { radius: 'sm' },\n})\n\nexport type SkeletonStyleProps = Parameters<typeof skeletonStyles>[0]\n"],"mappings":";;;;;;;AA6BA,MAAa,iBAAiB,GAAG;CAC/B,SAlBA,MAAM,gEAkBN;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"}
@@ -0,0 +1,3 @@
1
+ import { Spinner } from "./spinner.mjs";
2
+ import { SpinnerStyleProps, spinnerStyles } from "./spinner.styles.mjs";
3
+ export { Spinner, type SpinnerStyleProps, spinnerStyles };
@@ -0,0 +1,15 @@
1
+ import { SpinnerProps } from "@novi-ui/core";
2
+ //#region src/spinner/spinner.d.ts
3
+ /**
4
+ * 処理中であることを示す回転表示。
5
+ *
6
+ * `label` を渡すと画面にも表示される。渡さない場合も支援技術には
7
+ * 「読み込み中」と伝わるようにしてある。
8
+ *
9
+ * @example
10
+ * <Spinner label="読み込み中" />
11
+ */
12
+ declare function Spinner({ size, color, label, className, classNames, id }: SpinnerProps): import("react").JSX.Element;
13
+ //#endregion
14
+ export { Spinner };
15
+ //# sourceMappingURL=spinner.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.mts","names":[],"sources":["../../src/spinner/spinner.tsx"],"mappings":";;;;;;;;;;;iBAcgB,UAAU,MAAM,OAAO,OAAO,WAAW,YAAY,MAAM,+BAAY,IAAA"}
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { spinnerStyles } from "./spinner.styles.mjs";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/spinner/spinner.tsx
5
+ /**
6
+ * 処理中であることを示す回転表示。
7
+ *
8
+ * `label` を渡すと画面にも表示される。渡さない場合も支援技術には
9
+ * 「読み込み中」と伝わるようにしてある。
10
+ *
11
+ * @example
12
+ * <Spinner label="読み込み中" />
13
+ */
14
+ function Spinner({ size, color, label, className, classNames, id }) {
15
+ const s = spinnerStyles({
16
+ size,
17
+ color
18
+ });
19
+ return /* @__PURE__ */ jsxs("span", {
20
+ id,
21
+ role: "status",
22
+ "data-slot": "root",
23
+ className: s.root({ class: [className, classNames?.root] }),
24
+ children: [/* @__PURE__ */ jsxs("svg", {
25
+ "data-slot": "circle",
26
+ className: s.circle({ class: classNames?.circle }),
27
+ viewBox: "0 0 24 24",
28
+ fill: "none",
29
+ "aria-hidden": "true",
30
+ children: [/* @__PURE__ */ jsx("circle", {
31
+ cx: "12",
32
+ cy: "12",
33
+ r: "9",
34
+ stroke: "currentColor",
35
+ strokeWidth: "2",
36
+ opacity: "0.2"
37
+ }), /* @__PURE__ */ jsx("path", {
38
+ d: "M21 12a9 9 0 0 0-9-9",
39
+ stroke: "currentColor",
40
+ strokeWidth: "2"
41
+ })]
42
+ }), label !== void 0 ? /* @__PURE__ */ jsx("span", {
43
+ "data-slot": "label",
44
+ className: s.label({ class: classNames?.label }),
45
+ children: label
46
+ }) : /* @__PURE__ */ jsx("span", {
47
+ className: "sr-only",
48
+ children: "読み込み中"
49
+ })]
50
+ });
51
+ }
52
+ //#endregion
53
+ export { Spinner };
54
+
55
+ //# sourceMappingURL=spinner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.mjs","names":[],"sources":["../../src/spinner/spinner.tsx"],"sourcesContent":["'use client'\n\nimport type { SpinnerProps } from '@novi-ui/core'\nimport { spinnerStyles } from './spinner.styles'\n\n/**\n * 処理中であることを示す回転表示。\n *\n * `label` を渡すと画面にも表示される。渡さない場合も支援技術には\n * 「読み込み中」と伝わるようにしてある。\n *\n * @example\n * <Spinner label=\"読み込み中\" />\n */\nexport function Spinner({ size, color, label, className, classNames, id }: SpinnerProps) {\n const s = spinnerStyles({ size, color })\n\n return (\n <span\n id={id}\n role=\"status\"\n data-slot=\"root\"\n className={s.root({ class: [className, classNames?.root] })}\n >\n <svg\n data-slot=\"circle\"\n className={s.circle({ class: classNames?.circle })}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.2\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n\n {label !== undefined ? (\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {label}\n </span>\n ) : (\n <span className=\"sr-only\">読み込み中</span>\n )}\n </span>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,QAAQ,EAAE,MAAM,OAAO,OAAO,WAAW,YAAY,MAAoB;CACvF,MAAM,IAAI,cAAc;EAAE;EAAM;CAAM,CAAC;CAEvC,OACE,qBAAC,QAAD;EACM;EACJ,MAAK;EACL,aAAU;EACV,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAJ5D,UAAA,CAME,qBAAC,OAAD;GACE,aAAU;GACV,WAAW,EAAE,OAAO,EAAE,OAAO,YAAY,OAAO,CAAC;GACjD,SAAQ;GACR,MAAK;GACL,eAAY;GALd,UAAA,CAOE,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAI,QAAO;IAAe,aAAY;IAAI,SAAQ;GAAO,CAAA,GACnF,oBAAC,QAAD;IAAM,GAAE;IAAuB,QAAO;IAAe,aAAY;GAAK,CAAA,CACnE;EAEJ,CAAA,GAAA,UAAU,KAAA,IACT,oBAAC,QAAD;GAAM,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GACpE,UAAA;EACG,CAAA,IAEN,oBAAC,QAAD;GAAM,WAAU;GAAU,UAAA;EAAW,CAAA,CAEnC;;AAEV"}
@@ -0,0 +1,46 @@
1
+ import { VariantMap } from "@novi-ui/core";
2
+ //#region src/spinner/spinner.styles.d.ts
3
+ /**
4
+ * Spinner のスタイル定義。
5
+ *
6
+ * @example
7
+ * const mySpinner = tv({ extend: spinnerStyles, slots: { label: 'font-medium' } })
8
+ */
9
+ declare const spinnerStyles: import("tailwind-variants").TVReturnType<{
10
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
11
+ root: string;
12
+ }>;
13
+ size: VariantMap<"sm" | "md" | "lg", {
14
+ circle: string;
15
+ }>;
16
+ }, {
17
+ root: string;
18
+ circle: string;
19
+ label: string;
20
+ }, undefined, {
21
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
22
+ root: string;
23
+ }>;
24
+ size: VariantMap<"sm" | "md" | "lg", {
25
+ circle: string;
26
+ }>;
27
+ }, {
28
+ root: string;
29
+ circle: string;
30
+ label: string;
31
+ }, import("tailwind-variants").TVReturnTypeLike<{
32
+ color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
33
+ root: string;
34
+ }>;
35
+ size: VariantMap<"sm" | "md" | "lg", {
36
+ circle: string;
37
+ }>;
38
+ }, {
39
+ root: string;
40
+ circle: string;
41
+ label: string;
42
+ }>>;
43
+ type SpinnerStyleProps = Parameters<typeof spinnerStyles>[0];
44
+ //#endregion
45
+ export { SpinnerStyleProps, spinnerStyles };
46
+ //# sourceMappingURL=spinner.styles.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.styles.d.mts","names":[],"sources":["../../src/spinner/spinner.styles.ts"],"mappings":";;;;;;;;cA4Ca,2CAAa;;IArBiB;;;IASA;;;;;;;;IATA;;;IASA;;;;;;;;IATA;;;IASA;;;;;;;KAkB/B,oBAAoB,kBAAkB"}