@novi-ui/flatlay 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +418 -0
- package/dist/accordion/accordion.d.mts +35 -0
- package/dist/accordion/accordion.d.mts.map +1 -0
- package/dist/accordion/accordion.mjs +74 -0
- package/dist/accordion/accordion.mjs.map +1 -0
- package/dist/accordion/accordion.styles.d.mts +61 -0
- package/dist/accordion/accordion.styles.d.mts.map +1 -0
- package/dist/accordion/accordion.styles.mjs +91 -0
- package/dist/accordion/accordion.styles.mjs.map +1 -0
- package/dist/accordion/index.d.mts +3 -0
- package/dist/avatar/avatar.d.mts +22 -0
- package/dist/avatar/avatar.d.mts.map +1 -0
- package/dist/avatar/avatar.mjs +60 -0
- package/dist/avatar/avatar.mjs.map +1 -0
- package/dist/avatar/avatar.styles.d.mts +49 -0
- package/dist/avatar/avatar.styles.d.mts.map +1 -0
- package/dist/avatar/avatar.styles.mjs +55 -0
- package/dist/avatar/avatar.styles.mjs.map +1 -0
- package/dist/avatar/index.d.mts +3 -0
- package/dist/badge/badge.d.mts +15 -0
- package/dist/badge/badge.d.mts.map +1 -0
- package/dist/badge/badge.mjs +39 -0
- package/dist/badge/badge.mjs.map +1 -0
- package/dist/badge/badge.styles.d.mts +67 -0
- package/dist/badge/badge.styles.d.mts.map +1 -0
- package/dist/badge/badge.styles.mjs +110 -0
- package/dist/badge/badge.styles.mjs.map +1 -0
- package/dist/badge/index.d.mts +3 -0
- package/dist/breadcrumbs/breadcrumbs.d.mts +36 -0
- package/dist/breadcrumbs/breadcrumbs.d.mts.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.mjs +82 -0
- package/dist/breadcrumbs/breadcrumbs.mjs.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.styles.d.mts +46 -0
- package/dist/breadcrumbs/breadcrumbs.styles.d.mts.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.styles.mjs +45 -0
- package/dist/breadcrumbs/breadcrumbs.styles.mjs.map +1 -0
- package/dist/breadcrumbs/index.d.mts +3 -0
- package/dist/button/button.d.mts +18 -0
- package/dist/button/button.d.mts.map +1 -0
- package/dist/button/button.mjs +79 -0
- package/dist/button/button.mjs.map +1 -0
- package/dist/button/button.styles.d.mts +82 -0
- package/dist/button/button.styles.d.mts.map +1 -0
- package/dist/button/button.styles.mjs +137 -0
- package/dist/button/button.styles.mjs.map +1 -0
- package/dist/button/index.d.mts +3 -0
- package/dist/card/card.d.mts +51 -0
- package/dist/card/card.d.mts.map +1 -0
- package/dist/card/card.mjs +96 -0
- package/dist/card/card.mjs.map +1 -0
- package/dist/card/card.styles.d.mts +73 -0
- package/dist/card/card.styles.d.mts.map +1 -0
- package/dist/card/card.styles.mjs +72 -0
- package/dist/card/card.styles.mjs.map +1 -0
- package/dist/card/index.d.mts +3 -0
- package/dist/checkbox/checkbox.d.mts +27 -0
- package/dist/checkbox/checkbox.d.mts.map +1 -0
- package/dist/checkbox/checkbox.mjs +109 -0
- package/dist/checkbox/checkbox.mjs.map +1 -0
- package/dist/checkbox/checkbox.styles.d.mts +114 -0
- package/dist/checkbox/checkbox.styles.d.mts.map +1 -0
- package/dist/checkbox/checkbox.styles.mjs +105 -0
- package/dist/checkbox/checkbox.styles.mjs.map +1 -0
- package/dist/checkbox/index.d.mts +3 -0
- package/dist/color-picker/color-picker.d.mts +30 -0
- package/dist/color-picker/color-picker.d.mts.map +1 -0
- package/dist/color-picker/color-picker.mjs +100 -0
- package/dist/color-picker/color-picker.mjs.map +1 -0
- package/dist/color-picker/color-picker.styles.d.mts +91 -0
- package/dist/color-picker/color-picker.styles.d.mts.map +1 -0
- package/dist/color-picker/color-picker.styles.mjs +79 -0
- package/dist/color-picker/color-picker.styles.mjs.map +1 -0
- package/dist/color-picker/index.d.mts +3 -0
- package/dist/flatlay.css +381 -0
- package/dist/flatlay.scoped.css +381 -0
- package/dist/index.d.mts +67 -0
- package/dist/index.mjs +46 -0
- package/dist/input/index.d.mts +3 -0
- package/dist/input/input.d.mts +23 -0
- package/dist/input/input.d.mts.map +1 -0
- package/dist/input/input.mjs +89 -0
- package/dist/input/input.mjs.map +1 -0
- package/dist/input/input.styles.d.mts +97 -0
- package/dist/input/input.styles.d.mts.map +1 -0
- package/dist/input/input.styles.mjs +96 -0
- package/dist/input/input.styles.mjs.map +1 -0
- package/dist/menu/index.d.mts +3 -0
- package/dist/menu/menu.d.mts +66 -0
- package/dist/menu/menu.d.mts.map +1 -0
- package/dist/menu/menu.mjs +118 -0
- package/dist/menu/menu.mjs.map +1 -0
- package/dist/menu/menu.styles.d.mts +114 -0
- package/dist/menu/menu.styles.d.mts.map +1 -0
- package/dist/menu/menu.styles.mjs +66 -0
- package/dist/menu/menu.styles.mjs.map +1 -0
- package/dist/modal/index.d.mts +3 -0
- package/dist/modal/modal.d.mts +55 -0
- package/dist/modal/modal.d.mts.map +1 -0
- package/dist/modal/modal.mjs +120 -0
- package/dist/modal/modal.mjs.map +1 -0
- package/dist/modal/modal.styles.d.mts +70 -0
- package/dist/modal/modal.styles.d.mts.map +1 -0
- package/dist/modal/modal.styles.mjs +83 -0
- package/dist/modal/modal.styles.mjs.map +1 -0
- package/dist/popover/index.d.mts +3 -0
- package/dist/popover/popover.d.mts +33 -0
- package/dist/popover/popover.d.mts.map +1 -0
- package/dist/popover/popover.mjs +57 -0
- package/dist/popover/popover.mjs.map +1 -0
- package/dist/popover/popover.styles.d.mts +40 -0
- package/dist/popover/popover.styles.d.mts.map +1 -0
- package/dist/popover/popover.styles.mjs +47 -0
- package/dist/popover/popover.styles.mjs.map +1 -0
- package/dist/progress/index.d.mts +3 -0
- package/dist/progress/progress.d.mts +15 -0
- package/dist/progress/progress.d.mts.map +1 -0
- package/dist/progress/progress.mjs +55 -0
- package/dist/progress/progress.mjs.map +1 -0
- package/dist/progress/progress.styles.d.mts +100 -0
- package/dist/progress/progress.styles.d.mts.map +1 -0
- package/dist/progress/progress.styles.mjs +65 -0
- package/dist/progress/progress.styles.mjs.map +1 -0
- package/dist/radio/index.d.mts +3 -0
- package/dist/radio/radio.d.mts +25 -0
- package/dist/radio/radio.d.mts.map +1 -0
- package/dist/radio/radio.mjs +99 -0
- package/dist/radio/radio.mjs.map +1 -0
- package/dist/radio/radio.styles.d.mts +114 -0
- package/dist/radio/radio.styles.d.mts.map +1 -0
- package/dist/radio/radio.styles.mjs +103 -0
- package/dist/radio/radio.styles.mjs.map +1 -0
- package/dist/select/index.d.mts +3 -0
- package/dist/select/select.d.mts +40 -0
- package/dist/select/select.d.mts.map +1 -0
- package/dist/select/select.mjs +121 -0
- package/dist/select/select.mjs.map +1 -0
- package/dist/select/select.styles.d.mts +85 -0
- package/dist/select/select.styles.d.mts.map +1 -0
- package/dist/select/select.styles.mjs +111 -0
- package/dist/select/select.styles.mjs.map +1 -0
- package/dist/skeleton/index.d.mts +3 -0
- package/dist/skeleton/skeleton.d.mts +15 -0
- package/dist/skeleton/skeleton.d.mts.map +1 -0
- package/dist/skeleton/skeleton.mjs +26 -0
- package/dist/skeleton/skeleton.mjs.map +1 -0
- package/dist/skeleton/skeleton.styles.d.mts +47 -0
- package/dist/skeleton/skeleton.styles.d.mts.map +1 -0
- package/dist/skeleton/skeleton.styles.mjs +31 -0
- package/dist/skeleton/skeleton.styles.mjs.map +1 -0
- package/dist/spinner/index.d.mts +3 -0
- package/dist/spinner/spinner.d.mts +15 -0
- package/dist/spinner/spinner.d.mts.map +1 -0
- package/dist/spinner/spinner.mjs +55 -0
- package/dist/spinner/spinner.mjs.map +1 -0
- package/dist/spinner/spinner.styles.d.mts +46 -0
- package/dist/spinner/spinner.styles.d.mts.map +1 -0
- package/dist/spinner/spinner.styles.mjs +50 -0
- package/dist/spinner/spinner.styles.mjs.map +1 -0
- package/dist/styles/focus-ring.mjs +30 -0
- package/dist/styles/focus-ring.mjs.map +1 -0
- package/dist/styles/inflow.mjs +156 -0
- package/dist/styles/inflow.mjs.map +1 -0
- package/dist/styles/mono.mjs +24 -0
- package/dist/styles/mono.mjs.map +1 -0
- package/dist/switch/index.d.mts +3 -0
- package/dist/switch/switch.d.mts +18 -0
- package/dist/switch/switch.d.mts.map +1 -0
- package/dist/switch/switch.mjs +58 -0
- package/dist/switch/switch.mjs.map +1 -0
- package/dist/switch/switch.styles.d.mts +58 -0
- package/dist/switch/switch.styles.d.mts.map +1 -0
- package/dist/switch/switch.styles.mjs +86 -0
- package/dist/switch/switch.styles.mjs.map +1 -0
- package/dist/tabs/index.d.mts +3 -0
- package/dist/tabs/tabs.d.mts +64 -0
- package/dist/tabs/tabs.d.mts.map +1 -0
- package/dist/tabs/tabs.mjs +93 -0
- package/dist/tabs/tabs.mjs.map +1 -0
- package/dist/tabs/tabs.styles.d.mts +64 -0
- package/dist/tabs/tabs.styles.d.mts.map +1 -0
- package/dist/tabs/tabs.styles.mjs +118 -0
- package/dist/tabs/tabs.styles.mjs.map +1 -0
- package/dist/textarea/index.d.mts +3 -0
- package/dist/textarea/textarea.d.mts +15 -0
- package/dist/textarea/textarea.d.mts.map +1 -0
- package/dist/textarea/textarea.mjs +70 -0
- package/dist/textarea/textarea.mjs.map +1 -0
- package/dist/textarea/textarea.styles.d.mts +70 -0
- package/dist/textarea/textarea.styles.d.mts.map +1 -0
- package/dist/textarea/textarea.styles.mjs +85 -0
- package/dist/textarea/textarea.styles.mjs.map +1 -0
- package/dist/toast/index.d.mts +3 -0
- package/dist/toast/toast.d.mts +47 -0
- package/dist/toast/toast.d.mts.map +1 -0
- package/dist/toast/toast.mjs +100 -0
- package/dist/toast/toast.mjs.map +1 -0
- package/dist/toast/toast.styles.d.mts +61 -0
- package/dist/toast/toast.styles.d.mts.map +1 -0
- package/dist/toast/toast.styles.mjs +79 -0
- package/dist/toast/toast.styles.mjs.map +1 -0
- package/dist/tokens/color-set.mjs +124 -0
- package/dist/tokens/color-set.mjs.map +1 -0
- package/dist/tooltip/index.d.mts +3 -0
- package/dist/tooltip/tooltip.d.mts +20 -0
- package/dist/tooltip/tooltip.d.mts.map +1 -0
- package/dist/tooltip/tooltip.mjs +45 -0
- package/dist/tooltip/tooltip.mjs.map +1 -0
- package/dist/tooltip/tooltip.styles.d.mts +48 -0
- package/dist/tooltip/tooltip.styles.d.mts.map +1 -0
- package/dist/tooltip/tooltip.styles.mjs +39 -0
- package/dist/tooltip/tooltip.styles.mjs.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
* 読ませるためで、段の深さが目で数えられます。
|
|
50
|
+
*
|
|
51
|
+
* リンクは既定で下線を持ちます。色だけで押せることを示さないためです。
|
|
52
|
+
* 現在地はリンクにならず、太さだけで示します。
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* <Breadcrumbs>
|
|
56
|
+
* <Breadcrumb href="/">ホーム</Breadcrumb>
|
|
57
|
+
* <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
|
|
58
|
+
* <Breadcrumb>Button</Breadcrumb>
|
|
59
|
+
* </Breadcrumbs>
|
|
60
|
+
*/
|
|
61
|
+
function Breadcrumbs$1({ size, separator = "/", isDisabled, children, className, classNames, id }) {
|
|
62
|
+
const s = breadcrumbsStyles({ size });
|
|
63
|
+
return /* @__PURE__ */ jsx(SeparatorContext.Provider, {
|
|
64
|
+
value: separator,
|
|
65
|
+
children: /* @__PURE__ */ jsx("nav", {
|
|
66
|
+
id,
|
|
67
|
+
"aria-label": "パンくずリスト",
|
|
68
|
+
"data-slot": "root",
|
|
69
|
+
className: s.root({ class: [className, classNames?.root] }),
|
|
70
|
+
children: /* @__PURE__ */ jsx(Breadcrumbs, {
|
|
71
|
+
isDisabled,
|
|
72
|
+
"data-slot": "list",
|
|
73
|
+
className: s.list({ class: classNames?.list }),
|
|
74
|
+
children
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { Breadcrumb$1 as Breadcrumb, Breadcrumbs$1 as Breadcrumbs };
|
|
81
|
+
|
|
82
|
+
//# 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 * 読ませるためで、段の深さが目で数えられます。\n *\n * リンクは既定で下線を持ちます。色だけで押せることを示さないためです。\n * 現在地はリンクにならず、太さだけで示します。\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;;;;;;;;;;;;;;;;;AAkBA,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":";;;;;;;;cAqDa,+CAAiB;;IAZW;;;;;;;;;;;IAAA;;;;;;;;;;;IAAA;;;;;;;;;;KAkB7B,wBAAwB,kBAAkB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { focusRing } from "../styles/focus-ring.mjs";
|
|
2
|
+
import { mono } from "../styles/mono.mjs";
|
|
3
|
+
import { tv } from "tailwind-variants";
|
|
4
|
+
//#region src/breadcrumbs/breadcrumbs.styles.ts
|
|
5
|
+
/**
|
|
6
|
+
* Flatlay の Breadcrumbs は**書類の参照番号**。
|
|
7
|
+
*
|
|
8
|
+
* 区切りの `/` を等幅で出すのは、階層の列が「文」ではなく「番地」だから(ADR-F7)。
|
|
9
|
+
* 等幅にすると段の深さが目で数えられ、折り返しても列がずれない。
|
|
10
|
+
*
|
|
11
|
+
* 現在地は色を変えず太さだけで示す。色で示すと「リンクの色違い」に見え、
|
|
12
|
+
* 押せるのか押せないのかが読めなくなる。
|
|
13
|
+
*/
|
|
14
|
+
const slots = {
|
|
15
|
+
root: "flex",
|
|
16
|
+
list: ["flex flex-wrap items-center gap-1.5", "[&>li:first-child>[data-slot=separator]]:hidden"].join(" "),
|
|
17
|
+
item: "flex items-center gap-1.5",
|
|
18
|
+
link: [
|
|
19
|
+
"text-[var(--novi-color-muted)] underline underline-offset-4",
|
|
20
|
+
"transition-colors duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
|
|
21
|
+
"hover:text-[var(--novi-color-fg)]",
|
|
22
|
+
focusRing
|
|
23
|
+
].join(" "),
|
|
24
|
+
separator: `text-[var(--novi-color-border-strong)] select-none ${mono}`,
|
|
25
|
+
current: "text-[var(--novi-color-fg)] font-medium"
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Breadcrumbs のスタイル定義。
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const myCrumbs = tv({ extend: breadcrumbsStyles, slots: { separator: 'mx-2' } })
|
|
32
|
+
*/
|
|
33
|
+
const breadcrumbsStyles = tv({
|
|
34
|
+
slots,
|
|
35
|
+
variants: { size: {
|
|
36
|
+
sm: { list: "text-[length:var(--novi-text-xs)]" },
|
|
37
|
+
md: { list: "text-[length:var(--novi-text-sm)]" },
|
|
38
|
+
lg: { list: "text-[length:var(--novi-text-base)]" }
|
|
39
|
+
} },
|
|
40
|
+
defaultVariants: { size: "md" }
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { breadcrumbsStyles };
|
|
44
|
+
|
|
45
|
+
//# 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'\nimport { mono } from '../styles/mono'\n\n/**\n * Flatlay の Breadcrumbs は**書類の参照番号**。\n *\n * 区切りの `/` を等幅で出すのは、階層の列が「文」ではなく「番地」だから(ADR-F7)。\n * 等幅にすると段の深さが目で数えられ、折り返しても列がずれない。\n *\n * 現在地は色を変えず太さだけで示す。色で示すと「リンクの色違い」に見え、\n * 押せるのか押せないのかが読めなくなる。\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-1.5',\n link: [\n 'text-[var(--novi-color-muted)] underline underline-offset-4',\n 'transition-colors duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'hover:text-[var(--novi-color-fg)]',\n focusRing,\n ].join(' '),\n // 装飾なので支援技術には読ませない\n separator: `text-[var(--novi-color-border-strong)] select-none ${mono}`,\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":";;;;;;;;;;;;;AAoBA,MAAM,QAAQ;CAEZ,MAAM;CACN,MAAM,CACJ,uCAEA,iDACF,CAAC,CAAC,KAAK,GAAG;CACV,MAAM;CACN,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,WAAW,sDAAsD;CAEjE,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,18 @@
|
|
|
1
|
+
import { ButtonProps } from "@novi-ui/core";
|
|
2
|
+
//#region src/button/button.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* ボタン。
|
|
5
|
+
*
|
|
6
|
+
* 押すと面と文字が入れ替わる。**スタンプを押した跡**の見え方で、
|
|
7
|
+
* 沈む・浮くといった奥行きの表現を使わずに押した瞬間を返す。
|
|
8
|
+
* 既定で罫線を持つのは、影の無い紙面で輪郭を示せるのが線だけだから。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* <Button variant="solid" color="primary" onPress={() => save()}>
|
|
12
|
+
* 保存
|
|
13
|
+
* </Button>
|
|
14
|
+
*/
|
|
15
|
+
declare function Button({ variant, size, color, radius, isDisabled, isLoading, type, onPress, startContent, endContent, children, className, classNames, id }: ButtonProps): import("react").JSX.Element;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Button };
|
|
18
|
+
//# sourceMappingURL=button.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.mts","names":[],"sources":["../../src/button/button.tsx"],"mappings":";;;;;;;;;;;;;;iBAkBgB,SACd,SACA,MACA,OACA,QACA,YACA,WACA,MACA,SACA,cACA,YACA,UACA,WACA,YACA,MACC,8BAAW,IAAA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
* 押すと面と文字が入れ替わる。**スタンプを押した跡**の見え方で、
|
|
10
|
+
* 沈む・浮くといった奥行きの表現を使わずに押した瞬間を返す。
|
|
11
|
+
* 既定で罫線を持つのは、影の無い紙面で輪郭を示せるのが線だけだから。
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* <Button variant="solid" color="primary" onPress={() => save()}>
|
|
15
|
+
* 保存
|
|
16
|
+
* </Button>
|
|
17
|
+
*/
|
|
18
|
+
function Button$1({ variant, size, color, radius, isDisabled, isLoading, type = "button", onPress, startContent, endContent, children, className, classNames, id }) {
|
|
19
|
+
const s = buttonStyles({
|
|
20
|
+
variant,
|
|
21
|
+
size,
|
|
22
|
+
color,
|
|
23
|
+
radius
|
|
24
|
+
});
|
|
25
|
+
return /* @__PURE__ */ jsxs(Button, {
|
|
26
|
+
id,
|
|
27
|
+
type,
|
|
28
|
+
isDisabled: isDisabled === true || isLoading === true,
|
|
29
|
+
onPress,
|
|
30
|
+
"data-slot": "root",
|
|
31
|
+
"data-loading": isLoading === true ? true : void 0,
|
|
32
|
+
className: s.root({ class: [className, classNames?.root] }),
|
|
33
|
+
children: [
|
|
34
|
+
isLoading === true && /* @__PURE__ */ jsx("span", {
|
|
35
|
+
"data-slot": "spinner",
|
|
36
|
+
className: s.spinner({ class: classNames?.spinner }),
|
|
37
|
+
"aria-hidden": "true",
|
|
38
|
+
children: /* @__PURE__ */ jsxs("svg", {
|
|
39
|
+
viewBox: "0 0 16 16",
|
|
40
|
+
width: "1em",
|
|
41
|
+
height: "1em",
|
|
42
|
+
fill: "none",
|
|
43
|
+
"aria-hidden": "true",
|
|
44
|
+
children: [/* @__PURE__ */ jsx("circle", {
|
|
45
|
+
cx: "8",
|
|
46
|
+
cy: "8",
|
|
47
|
+
r: "6",
|
|
48
|
+
stroke: "currentColor",
|
|
49
|
+
strokeWidth: "2",
|
|
50
|
+
opacity: "0.25"
|
|
51
|
+
}), /* @__PURE__ */ jsx("path", {
|
|
52
|
+
d: "M14 8a6 6 0 0 0-6-6",
|
|
53
|
+
stroke: "currentColor",
|
|
54
|
+
strokeWidth: "2"
|
|
55
|
+
})]
|
|
56
|
+
})
|
|
57
|
+
}),
|
|
58
|
+
startContent !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
59
|
+
"data-slot": "startContent",
|
|
60
|
+
className: s.startContent({ class: classNames?.startContent }),
|
|
61
|
+
children: startContent
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ jsx("span", {
|
|
64
|
+
"data-slot": "label",
|
|
65
|
+
className: s.label({ class: classNames?.label }),
|
|
66
|
+
children
|
|
67
|
+
}),
|
|
68
|
+
endContent !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
69
|
+
"data-slot": "endContent",
|
|
70
|
+
className: s.endContent({ class: classNames?.endContent }),
|
|
71
|
+
children: endContent
|
|
72
|
+
})
|
|
73
|
+
]
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { Button$1 as Button };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=button.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.mjs","names":["Button","RACButton"],"sources":["../../src/button/button.tsx"],"sourcesContent":["'use client'\n\nimport type { ButtonProps } from '@novi-ui/core'\nimport { Button as RACButton } from 'react-aria-components'\nimport { buttonStyles } from './button.styles'\n\n/**\n * ボタン。\n *\n * 押すと面と文字が入れ替わる。**スタンプを押した跡**の見え方で、\n * 沈む・浮くといった奥行きの表現を使わずに押した瞬間を返す。\n * 既定で罫線を持つのは、影の無い紙面で輪郭を示せるのが線だけだから。\n *\n * @example\n * <Button variant=\"solid\" color=\"primary\" onPress={() => save()}>\n * 保存\n * </Button>\n */\nexport function Button({\n variant,\n size,\n color,\n radius,\n isDisabled,\n isLoading,\n type = 'button',\n onPress,\n startContent,\n endContent,\n children,\n className,\n classNames,\n id,\n}: ButtonProps) {\n const s = buttonStyles({ variant, size, color, radius })\n\n return (\n <RACButton\n id={id}\n type={type}\n // 読み込み中は押せないようにする。見た目だけ変えて押せる状態にしない\n isDisabled={isDisabled === true || isLoading === true}\n onPress={onPress}\n data-slot=\"root\"\n data-loading={isLoading === true ? true : undefined}\n className={s.root({ class: [className, classNames?.root] })}\n >\n {isLoading === true && (\n <span\n data-slot=\"spinner\"\n className={s.spinner({ class: classNames?.spinner })}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"1em\" height=\"1em\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.25\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </span>\n )}\n\n {startContent !== undefined && (\n <span\n data-slot=\"startContent\"\n className={s.startContent({ class: classNames?.startContent })}\n >\n {startContent}\n </span>\n )}\n\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {children}\n </span>\n\n {endContent !== undefined && (\n <span data-slot=\"endContent\" className={s.endContent({ class: classNames?.endContent })}>\n {endContent}\n </span>\n )}\n </RACButton>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgBA,SAAO,EACrB,SACA,MACA,OACA,QACA,YACA,WACA,OAAO,UACP,SACA,cACA,YACA,UACA,WACA,YACA,MACc;CACd,MAAM,IAAI,aAAa;EAAE;EAAS;EAAM;EAAO;CAAO,CAAC;CAEvD,OACE,qBAACC,QAAD;EACM;EACE;EAEN,YAAY,eAAe,QAAQ,cAAc;EACxC;EACT,aAAU;EACV,gBAAc,cAAc,OAAO,OAAO,KAAA;EAC1C,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAR5D,UAAA;GAUG,cAAc,QACb,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,EAAE,QAAQ,EAAE,OAAO,YAAY,QAAQ,CAAC;IACnD,eAAY;IAEZ,UAAA,qBAAC,OAAD;KAAK,SAAQ;KAAY,OAAM;KAAM,QAAO;KAAM,MAAK;KAAO,eAAY;KAA1E,UAAA,CACE,oBAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAI,GAAE;MAAI,QAAO;MAAe,aAAY;MAAI,SAAQ;KAAQ,CAAA,GAClF,oBAAC,QAAD;MAAM,GAAE;MAAsB,QAAO;MAAe,aAAY;KAAK,CAAA,CAClE;;GACD,CAAA;GAGP,iBAAiB,KAAA,KAChB,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,EAAE,aAAa,EAAE,OAAO,YAAY,aAAa,CAAC;IAE5D,UAAA;GACG,CAAA;GAGR,oBAAC,QAAD;IAAM,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IACpE;GACG,CAAA;GAEL,eAAe,KAAA,KACd,oBAAC,QAAD;IAAM,aAAU;IAAa,WAAW,EAAE,WAAW,EAAE,OAAO,YAAY,WAAW,CAAC;IACnF,UAAA;GACG,CAAA;EAEC;;AAEf"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/button/button.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Button のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* `tv({ extend: buttonStyles })` で拡張できるよう named export する。
|
|
7
|
+
* npm 配布の「コードを所有できない」という不満への回答(FR-04)。
|
|
8
|
+
*
|
|
9
|
+
* slot ベースの定義なので、拡張は `base` ではなく `slots` で行う。
|
|
10
|
+
* `base` は黙って無視される。
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* import { buttonStyles } from '@novi-ui/flatlay'
|
|
14
|
+
* import { tv } from 'tailwind-variants'
|
|
15
|
+
*
|
|
16
|
+
* const myButton = tv({
|
|
17
|
+
* extend: buttonStyles,
|
|
18
|
+
* slots: { root: 'uppercase tracking-widest' },
|
|
19
|
+
* })
|
|
20
|
+
*/
|
|
21
|
+
declare const buttonStyles: import("tailwind-variants").TVReturnType<{
|
|
22
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
23
|
+
root: string;
|
|
24
|
+
}>;
|
|
25
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
26
|
+
root: string;
|
|
27
|
+
}>;
|
|
28
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
29
|
+
root: string;
|
|
30
|
+
}>;
|
|
31
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
32
|
+
root: string;
|
|
33
|
+
}>;
|
|
34
|
+
}, {
|
|
35
|
+
root: string;
|
|
36
|
+
label: string;
|
|
37
|
+
startContent: string;
|
|
38
|
+
endContent: string;
|
|
39
|
+
spinner: string;
|
|
40
|
+
}, undefined, {
|
|
41
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
42
|
+
root: string;
|
|
43
|
+
}>;
|
|
44
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
45
|
+
root: string;
|
|
46
|
+
}>;
|
|
47
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
48
|
+
root: string;
|
|
49
|
+
}>;
|
|
50
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
51
|
+
root: string;
|
|
52
|
+
}>;
|
|
53
|
+
}, {
|
|
54
|
+
root: string;
|
|
55
|
+
label: string;
|
|
56
|
+
startContent: string;
|
|
57
|
+
endContent: string;
|
|
58
|
+
spinner: string;
|
|
59
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
60
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
61
|
+
root: string;
|
|
62
|
+
}>;
|
|
63
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
64
|
+
root: string;
|
|
65
|
+
}>;
|
|
66
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
67
|
+
root: string;
|
|
68
|
+
}>;
|
|
69
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
70
|
+
root: string;
|
|
71
|
+
}>;
|
|
72
|
+
}, {
|
|
73
|
+
root: string;
|
|
74
|
+
label: string;
|
|
75
|
+
startContent: string;
|
|
76
|
+
endContent: string;
|
|
77
|
+
spinner: string;
|
|
78
|
+
}>>;
|
|
79
|
+
type ButtonStyleProps = Parameters<typeof buttonStyles>[0];
|
|
80
|
+
//#endregion
|
|
81
|
+
export { ButtonStyleProps, buttonStyles };
|
|
82
|
+
//# sourceMappingURL=button.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.styles.d.mts","names":[],"sources":["../../src/button/button.styles.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;cAkLa,0CAAY;;IAlIkB;;;IAyDF;;;IAMI;;;IAgBE;;;;;;;;;;IA/EJ;;;IAyDF;;;IAMI;;;IAgBE;;;;;;;;;;IA/EJ;;;IAyDF;;;IAMI;;;IAgBE;;;;;;;;;KA0DnC,mBAAmB,kBAAkB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { disabledState, focusRing } from "../styles/focus-ring.mjs";
|
|
2
|
+
import { monoNumeric } from "../styles/mono.mjs";
|
|
3
|
+
import { tv } from "tailwind-variants";
|
|
4
|
+
//#region src/button/button.styles.ts
|
|
5
|
+
const slots = {
|
|
6
|
+
root: [
|
|
7
|
+
"inline-flex items-center justify-center gap-2",
|
|
8
|
+
"font-medium whitespace-nowrap select-none",
|
|
9
|
+
"border",
|
|
10
|
+
"rounded-[var(--novi-radius-sm)]",
|
|
11
|
+
"transition-[background-color,border-color,color]",
|
|
12
|
+
"duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
|
|
13
|
+
focusRing,
|
|
14
|
+
disabledState
|
|
15
|
+
].join(" "),
|
|
16
|
+
label: "truncate",
|
|
17
|
+
startContent: `shrink-0 inline-flex ${monoNumeric}`,
|
|
18
|
+
endContent: `shrink-0 inline-flex ${monoNumeric}`,
|
|
19
|
+
spinner: "shrink-0 inline-flex"
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 色は「役割ごとのローカル変数」に落としてから variant が参照する。
|
|
23
|
+
* こうしないと variant 5 × color 6 = 30 通りの組み合わせを書くことになる。
|
|
24
|
+
*
|
|
25
|
+
* - `--c` 面の色(solid の背景)
|
|
26
|
+
* - `--c-fg` その面に乗る文字色
|
|
27
|
+
* - `--c-text` 面を持たない variant での文字色
|
|
28
|
+
* - `--c-line` 境界線の色
|
|
29
|
+
*/
|
|
30
|
+
const color = {
|
|
31
|
+
default: { root: [
|
|
32
|
+
"[--c:var(--novi-color-default)]",
|
|
33
|
+
"[--c-fg:var(--novi-color-default-fg)]",
|
|
34
|
+
"[--c-text:var(--novi-color-fg)]",
|
|
35
|
+
"[--c-line:var(--novi-color-border-strong)]"
|
|
36
|
+
].join(" ") },
|
|
37
|
+
primary: { root: [
|
|
38
|
+
"[--c:var(--novi-color-primary)]",
|
|
39
|
+
"[--c-fg:var(--novi-color-primary-fg)]",
|
|
40
|
+
"[--c-text:var(--novi-color-primary)]",
|
|
41
|
+
"[--c-line:var(--novi-color-primary)]"
|
|
42
|
+
].join(" ") },
|
|
43
|
+
secondary: { root: [
|
|
44
|
+
"[--c:var(--novi-color-secondary)]",
|
|
45
|
+
"[--c-fg:var(--novi-color-secondary-fg)]",
|
|
46
|
+
"[--c-text:var(--novi-color-secondary)]",
|
|
47
|
+
"[--c-line:var(--novi-color-secondary)]"
|
|
48
|
+
].join(" ") },
|
|
49
|
+
success: { root: [
|
|
50
|
+
"[--c:var(--novi-color-success)]",
|
|
51
|
+
"[--c-fg:var(--novi-color-success-fg)]",
|
|
52
|
+
"[--c-text:var(--novi-color-success)]",
|
|
53
|
+
"[--c-line:var(--novi-color-success)]"
|
|
54
|
+
].join(" ") },
|
|
55
|
+
warning: { root: [
|
|
56
|
+
"[--c:var(--novi-color-warning)]",
|
|
57
|
+
"[--c-fg:var(--novi-color-warning-fg)]",
|
|
58
|
+
"[--c-text:var(--novi-color-warning)]",
|
|
59
|
+
"[--c-line:var(--novi-color-warning)]"
|
|
60
|
+
].join(" ") },
|
|
61
|
+
danger: { root: [
|
|
62
|
+
"[--c:var(--novi-color-danger)]",
|
|
63
|
+
"[--c-fg:var(--novi-color-danger-fg)]",
|
|
64
|
+
"[--c-text:var(--novi-color-danger)]",
|
|
65
|
+
"[--c-line:var(--novi-color-danger)]"
|
|
66
|
+
].join(" ") }
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* 高さは 28 / 32 / 40px(Raster は 32/40/48、Tactile は 40/48/56)。
|
|
70
|
+
*
|
|
71
|
+
* **帳票の行の高さ**にあたる。前提はポインタとキーボードで、指の当たり判定を
|
|
72
|
+
* 広げる細工はしない(それは Tactile の領分で、そこが3本目の密度の identity)。
|
|
73
|
+
*/
|
|
74
|
+
const size = {
|
|
75
|
+
sm: { root: "h-7 px-2.5 text-[length:var(--novi-text-sm)]" },
|
|
76
|
+
md: { root: "h-8 px-3 text-[length:var(--novi-text-base)]" },
|
|
77
|
+
lg: { root: "h-10 px-4 text-[length:var(--novi-text-base)]" }
|
|
78
|
+
};
|
|
79
|
+
const radius = {
|
|
80
|
+
none: { root: "rounded-[var(--novi-radius-none)]" },
|
|
81
|
+
sm: { root: "rounded-[var(--novi-radius-sm)]" },
|
|
82
|
+
md: { root: "rounded-[var(--novi-radius-md)]" },
|
|
83
|
+
lg: { root: "rounded-[var(--novi-radius-lg)]" },
|
|
84
|
+
full: { root: "rounded-[var(--novi-radius-full)]" }
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* 語彙の実装漏れ・語彙外の追加はここでコンパイルエラーになる(AC-04-2)。
|
|
88
|
+
*
|
|
89
|
+
* **押下は反転**(FR-11 / ADR-F3)。面と文字が入れ替わる、スタンプを押した跡の見え方。
|
|
90
|
+
* 沈む・縮む・影が消えるといった表現はすべて z 軸の語彙なので使えない。
|
|
91
|
+
* 反転は面積のある変化なので、動かさなくても押した瞬間が確実に伝わる。
|
|
92
|
+
* 前後どちらの状態も 4.5:1 を満たすことは `flatlay-tokens.test.ts` が固定している。
|
|
93
|
+
*/
|
|
94
|
+
const variant = {
|
|
95
|
+
solid: { root: ["bg-[var(--c)] text-[var(--c-fg)] border-[var(--c)]", "data-[pressed]:bg-[var(--c-fg)] data-[pressed]:text-[var(--c)]"].join(" ") },
|
|
96
|
+
outline: { root: ["border-[var(--c-line)] text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]", "data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]"].join(" ") },
|
|
97
|
+
soft: { root: ["bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)] text-[var(--c-text)]", "data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]"].join(" ") },
|
|
98
|
+
ghost: { root: ["border-transparent text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]", "data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]"].join(" ") },
|
|
99
|
+
plain: { root: ["border-transparent text-[var(--c-text)] underline-offset-4 hover:underline", "data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]"].join(" ") }
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Button のスタイル定義。
|
|
103
|
+
*
|
|
104
|
+
* `tv({ extend: buttonStyles })` で拡張できるよう named export する。
|
|
105
|
+
* npm 配布の「コードを所有できない」という不満への回答(FR-04)。
|
|
106
|
+
*
|
|
107
|
+
* slot ベースの定義なので、拡張は `base` ではなく `slots` で行う。
|
|
108
|
+
* `base` は黙って無視される。
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* import { buttonStyles } from '@novi-ui/flatlay'
|
|
112
|
+
* import { tv } from 'tailwind-variants'
|
|
113
|
+
*
|
|
114
|
+
* const myButton = tv({
|
|
115
|
+
* extend: buttonStyles,
|
|
116
|
+
* slots: { root: 'uppercase tracking-widest' },
|
|
117
|
+
* })
|
|
118
|
+
*/
|
|
119
|
+
const buttonStyles = tv({
|
|
120
|
+
slots,
|
|
121
|
+
variants: {
|
|
122
|
+
color,
|
|
123
|
+
size,
|
|
124
|
+
radius,
|
|
125
|
+
variant
|
|
126
|
+
},
|
|
127
|
+
defaultVariants: {
|
|
128
|
+
color: "default",
|
|
129
|
+
variant: "solid",
|
|
130
|
+
size: "md",
|
|
131
|
+
radius: "sm"
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
//#endregion
|
|
135
|
+
export { buttonStyles };
|
|
136
|
+
|
|
137
|
+
//# sourceMappingURL=button.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.styles.mjs","names":[],"sources":["../../src/button/button.styles.ts"],"sourcesContent":["import type {\n buttonRequiredSlots,\n buttonSlots,\n NoviColor,\n NoviRadius,\n NoviSize,\n NoviVariant,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\nimport { monoNumeric } from '../styles/mono'\n\n// 型注釈ではなく `satisfies` を使う。\n// 型注釈だと「任意 slot は無いかもしれない」まで型が広がり、\n// tv() の戻り値で `s.startContent` が undefined 扱いになって呼べなくなる(ADR-R5)。\nconst slots = {\n root: [\n 'inline-flex items-center justify-center gap-2',\n 'font-medium whitespace-nowrap select-none',\n // 罫線の幅は全 variant が持つ。影が無い以上、輪郭を示せるのは線だけ。\n // 色は variant が決める(ghost / plain だけが transparent を選ぶ)\n 'border',\n 'rounded-[var(--novi-radius-sm)]',\n // 動かすのは色だけ。位置も大きさも変えない(FR-11)\n 'transition-[background-color,border-color,color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n focusRing,\n disabledState,\n ].join(' '),\n label: 'truncate',\n // 差し込まれるのは記号・数値・ショートカットであることが多い。\n // 等幅と tabular-nums を既定にすると、ボタンが並んだときに幅が暴れない(ADR-F7)\n startContent: `shrink-0 inline-flex ${monoNumeric}`,\n endContent: `shrink-0 inline-flex ${monoNumeric}`,\n spinner: 'shrink-0 inline-flex',\n} satisfies SlotMap<typeof buttonSlots, (typeof buttonRequiredSlots)[number]>\n\n/**\n * 色は「役割ごとのローカル変数」に落としてから variant が参照する。\n * こうしないと variant 5 × color 6 = 30 通りの組み合わせを書くことになる。\n *\n * - `--c` 面の色(solid の背景)\n * - `--c-fg` その面に乗る文字色\n * - `--c-text` 面を持たない variant での文字色\n * - `--c-line` 境界線の色\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\n/**\n * 高さは 28 / 32 / 40px(Raster は 32/40/48、Tactile は 40/48/56)。\n *\n * **帳票の行の高さ**にあたる。前提はポインタとキーボードで、指の当たり判定を\n * 広げる細工はしない(それは Tactile の領分で、そこが3本目の密度の identity)。\n */\nconst size: VariantMap<NoviSize, { root: string }> = {\n sm: { root: 'h-7 px-2.5 text-[length:var(--novi-text-sm)]' },\n md: { root: 'h-8 px-3 text-[length:var(--novi-text-base)]' },\n lg: { root: 'h-10 px-4 text-[length:var(--novi-text-base)]' },\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 * 語彙の実装漏れ・語彙外の追加はここでコンパイルエラーになる(AC-04-2)。\n *\n * **押下は反転**(FR-11 / ADR-F3)。面と文字が入れ替わる、スタンプを押した跡の見え方。\n * 沈む・縮む・影が消えるといった表現はすべて z 軸の語彙なので使えない。\n * 反転は面積のある変化なので、動かさなくても押した瞬間が確実に伝わる。\n * 前後どちらの状態も 4.5:1 を満たすことは `flatlay-tokens.test.ts` が固定している。\n */\nconst variant: VariantMap<NoviVariant, { root: string }> = {\n solid: {\n root: [\n 'bg-[var(--c)] text-[var(--c-fg)] border-[var(--c)]',\n 'data-[pressed]:bg-[var(--c-fg)] data-[pressed]:text-[var(--c)]',\n ].join(' '),\n },\n outline: {\n root: [\n 'border-[var(--c-line)] text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]',\n 'data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]',\n ].join(' '),\n },\n soft: {\n root: [\n 'bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)] text-[var(--c-text)]',\n 'data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]',\n ].join(' '),\n },\n ghost: {\n root: [\n 'border-transparent text-[var(--c-text)] hover:bg-[var(--novi-color-subtle)]',\n 'data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]',\n ].join(' '),\n },\n plain: {\n root: [\n 'border-transparent text-[var(--c-text)] underline-offset-4 hover:underline',\n 'data-[pressed]:bg-[var(--c)] data-[pressed]:text-[var(--c-fg)]',\n ].join(' '),\n },\n}\n\n/**\n * Button のスタイル定義。\n *\n * `tv({ extend: buttonStyles })` で拡張できるよう named export する。\n * npm 配布の「コードを所有できない」という不満への回答(FR-04)。\n *\n * slot ベースの定義なので、拡張は `base` ではなく `slots` で行う。\n * `base` は黙って無視される。\n *\n * @example\n * import { buttonStyles } from '@novi-ui/flatlay'\n * import { tv } from 'tailwind-variants'\n *\n * const myButton = tv({\n * extend: buttonStyles,\n * slots: { root: 'uppercase tracking-widest' },\n * })\n */\nexport const buttonStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと size のクラスに負ける(申し送り6)\n variants: { color, size, radius, variant },\n defaultVariants: { color: 'default', variant: 'solid', size: 'md', radius: 'sm' },\n})\n\nexport type ButtonStyleProps = Parameters<typeof buttonStyles>[0]\n"],"mappings":";;;;AAiBA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EAGA;EACA;EAEA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CAGP,cAAc,wBAAwB;CACtC,YAAY,wBAAwB;CACpC,SAAS;AACX;;;;;;;;;;AAWA,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;;;;;;;AAQA,MAAM,OAA+C;CACnD,IAAI,EAAE,MAAM,+CAA+C;CAC3D,IAAI,EAAE,MAAM,+CAA+C;CAC3D,IAAI,EAAE,MAAM,gDAAgD;AAC9D;AAEA,MAAM,SAAmD;CACvD,MAAM,EAAE,MAAM,oCAAoC;CAClD,IAAI,EAAE,MAAM,kCAAkC;CAC9C,IAAI,EAAE,MAAM,kCAAkC;CAC9C,IAAI,EAAE,MAAM,kCAAkC;CAC9C,MAAM,EAAE,MAAM,oCAAoC;AACpD;;;;;;;;;AAUA,MAAM,UAAqD;CACzD,OAAO,EACL,MAAM,CACJ,sDACA,gEACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM,CACJ,mFACA,gEACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,MAAM,EACJ,MAAM,CACJ,wFACA,gEACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,OAAO,EACL,MAAM,CACJ,+EACA,gEACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,OAAO,EACL,MAAM,CACJ,8EACA,gEACF,CAAC,CAAC,KAAK,GAAG,EACZ;AACF;;;;;;;;;;;;;;;;;;;AAoBA,MAAa,eAAe,GAAG;CAC7B;CAEA,UAAU;EAAE;EAAO;EAAM;EAAQ;CAAQ;CACzC,iBAAiB;EAAE,OAAO;EAAW,SAAS;EAAS,MAAM;EAAM,QAAQ;CAAK;AAClF,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ImgHTMLAttributes, ReactNode } from "react";
|
|
2
|
+
import { CardProps } from "@novi-ui/core";
|
|
3
|
+
//#region src/card/card.d.ts
|
|
4
|
+
interface PartProps {
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Card の見出し部分。下端が罫線で仕切られる。
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <CardHeader>売上</CardHeader>
|
|
13
|
+
*/
|
|
14
|
+
declare function CardHeader({ children, className }: PartProps): import("react").JSX.Element;
|
|
15
|
+
/**
|
|
16
|
+
* Card の本体。
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* <CardBody>¥1,240,000</CardBody>
|
|
20
|
+
*/
|
|
21
|
+
declare function CardBody({ children, className }: PartProps): import("react").JSX.Element;
|
|
22
|
+
/**
|
|
23
|
+
* Card の脚部。上端が罫線で仕切られる。
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* <CardFooter>前月比 +12%</CardFooter>
|
|
27
|
+
*/
|
|
28
|
+
declare function CardFooter({ children, className }: PartProps): import("react").JSX.Element;
|
|
29
|
+
/**
|
|
30
|
+
* Card の上部に置く画像。
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* <CardImage src="/thumb.jpg" alt="" />
|
|
34
|
+
*/
|
|
35
|
+
declare function CardImage({ className, alt, ...props }: ImgHTMLAttributes<HTMLImageElement>): import("react").JSX.Element;
|
|
36
|
+
/**
|
|
37
|
+
* 情報のまとまりを囲む器。
|
|
38
|
+
*
|
|
39
|
+
* Flatlay では**書類の枠**。影が存在しないので、枠の罫線と区切りの罫線だけで
|
|
40
|
+
* まとまりを作る。`onPress` を渡すと押せるカードになり、押下で全面が反転する。
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* <Card>
|
|
44
|
+
* <CardHeader>売上</CardHeader>
|
|
45
|
+
* <CardBody>¥1,240,000</CardBody>
|
|
46
|
+
* </Card>
|
|
47
|
+
*/
|
|
48
|
+
declare function Card({ variant, radius, onPress, isDisabled, children, className, classNames, id }: CardProps): import("react").JSX.Element;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { Card, CardBody, CardFooter, CardHeader, CardImage };
|
|
51
|
+
//# sourceMappingURL=card.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.mts","names":[],"sources":["../../src/card/card.tsx"],"mappings":";;;UAOU;EACR,WAAW;EACX;;;;;;;;iBASc,aAAa,UAAU,aAAa,4BAAS,IAAA;;;;;;;iBAc7C,WAAW,UAAU,aAAa,4BAAS,IAAA;;;;;;;iBAc3C,aAAa,UAAU,aAAa,4BAAS,IAAA;;;;;;;iBAc7C,YAAY,WAAW,QAAa,SAAS,kBAAkB,oCAAiB,IAAA;;;;;;;;;;;;;iBAuBhF,OACd,SACA,QACA,SACA,YACA,UACA,WACA,YACA,MACC,4BAAS,IAAA"}
|