@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,91 @@
|
|
|
1
|
+
import { focusRing } from "../styles/focus-ring.mjs";
|
|
2
|
+
import { mono } from "../styles/mono.mjs";
|
|
3
|
+
import { tv } from "tailwind-variants";
|
|
4
|
+
//#region src/accordion/accordion.styles.ts
|
|
5
|
+
/**
|
|
6
|
+
* Accordion は Flatlay の**主役**。
|
|
7
|
+
*
|
|
8
|
+
* 他のすべては「浮くものをフローに直した」形だが、Accordion だけは
|
|
9
|
+
* もともとインフロー展開で、直す必要が無かった。z 軸を持たないモデルが
|
|
10
|
+
* 無理なく成立する唯一の既存パターンで、他の展開系はここに寄せてある。
|
|
11
|
+
*
|
|
12
|
+
* 開閉の印は `▸` / `▾` の差し替え。シェブロンの回転(Tactile)は使わない。
|
|
13
|
+
* 回転は「同じものが向きを変えた」という 3 次元の言葉で、字を替えるのは
|
|
14
|
+
* 「状態が別の記号になった」という帳票の言葉になる(FR-11 / ADR-F7)。
|
|
15
|
+
*
|
|
16
|
+
* 印が**行頭**にあるのは、Select の選択済み `▸` と同じ列の作り方。
|
|
17
|
+
* 右端(両テーマ)に置くと見出しの長さで位置が変わり、縦に読めなくなる。
|
|
18
|
+
*/
|
|
19
|
+
const slots = {
|
|
20
|
+
root: "flex flex-col border-t border-[var(--novi-color-border-strong)]",
|
|
21
|
+
item: "border-b border-[var(--novi-color-border-strong)]",
|
|
22
|
+
heading: "m-0",
|
|
23
|
+
trigger: [
|
|
24
|
+
"flex items-center gap-2 w-full text-left",
|
|
25
|
+
"cursor-pointer outline-none",
|
|
26
|
+
"text-[var(--novi-color-fg)]",
|
|
27
|
+
"hover:bg-[var(--novi-color-subtle)]",
|
|
28
|
+
"data-[pressed]:bg-[var(--novi-color-fg)] data-[pressed]:text-[var(--novi-color-bg)]",
|
|
29
|
+
"transition-[background-color,color]",
|
|
30
|
+
"duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
|
|
31
|
+
"data-[disabled]:opacity-40 data-[disabled]:cursor-default",
|
|
32
|
+
focusRing
|
|
33
|
+
].join(" "),
|
|
34
|
+
indicator: `w-[1ch] shrink-0 leading-none text-[var(--novi-color-muted)] ${mono}`,
|
|
35
|
+
panel: "text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]"
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Accordion のスタイル定義。
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const myAccordion = tv({ extend: accordionStyles, slots: { panel: 'pt-2' } })
|
|
42
|
+
*/
|
|
43
|
+
const accordionStyles = tv({
|
|
44
|
+
slots,
|
|
45
|
+
variants: {
|
|
46
|
+
size: {
|
|
47
|
+
sm: {
|
|
48
|
+
trigger: "px-2 py-1.5 text-[length:var(--novi-text-sm)]",
|
|
49
|
+
panel: "pl-6 pr-2 pb-1.5"
|
|
50
|
+
},
|
|
51
|
+
md: {
|
|
52
|
+
trigger: "px-3 py-2 text-[length:var(--novi-text-base)]",
|
|
53
|
+
panel: "pl-8 pr-3 pb-2"
|
|
54
|
+
},
|
|
55
|
+
lg: {
|
|
56
|
+
trigger: "px-4 py-3 text-[length:var(--novi-text-base)]",
|
|
57
|
+
panel: "pl-10 pr-4 pb-3"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
variant: {
|
|
61
|
+
solid: {
|
|
62
|
+
root: "border-t-0",
|
|
63
|
+
item: "bg-[var(--novi-color-subtle)] border-b"
|
|
64
|
+
},
|
|
65
|
+
outline: {
|
|
66
|
+
root: "border-t",
|
|
67
|
+
item: "border-b"
|
|
68
|
+
},
|
|
69
|
+
soft: {
|
|
70
|
+
root: "border-t-0",
|
|
71
|
+
item: "bg-[var(--novi-color-subtle)] border-b"
|
|
72
|
+
},
|
|
73
|
+
ghost: {
|
|
74
|
+
root: "border-t-0",
|
|
75
|
+
item: "border-b border-[var(--novi-color-border)]"
|
|
76
|
+
},
|
|
77
|
+
plain: {
|
|
78
|
+
root: "border-t-0",
|
|
79
|
+
item: "border-b-0"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
defaultVariants: {
|
|
84
|
+
variant: "outline",
|
|
85
|
+
size: "md"
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
//#endregion
|
|
89
|
+
export { accordionStyles };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=accordion.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.styles.mjs","names":[],"sources":["../../src/accordion/accordion.styles.ts"],"sourcesContent":["import type {\n accordionRequiredSlots,\n accordionSlots,\n NoviSize,\n NoviVariant,\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 * Accordion は Flatlay の**主役**。\n *\n * 他のすべては「浮くものをフローに直した」形だが、Accordion だけは\n * もともとインフロー展開で、直す必要が無かった。z 軸を持たないモデルが\n * 無理なく成立する唯一の既存パターンで、他の展開系はここに寄せてある。\n *\n * 開閉の印は `▸` / `▾` の差し替え。シェブロンの回転(Tactile)は使わない。\n * 回転は「同じものが向きを変えた」という 3 次元の言葉で、字を替えるのは\n * 「状態が別の記号になった」という帳票の言葉になる(FR-11 / ADR-F7)。\n *\n * 印が**行頭**にあるのは、Select の選択済み `▸` と同じ列の作り方。\n * 右端(両テーマ)に置くと見出しの長さで位置が変わり、縦に読めなくなる。\n */\nconst slots = {\n root: 'flex flex-col border-t border-[var(--novi-color-border-strong)]',\n item: 'border-b border-[var(--novi-color-border-strong)]',\n // 見出し要素とその中のボタンを分ける。支援技術のために必要\n heading: 'm-0',\n trigger: [\n 'flex items-center gap-2 w-full text-left',\n 'cursor-pointer outline-none',\n 'text-[var(--novi-color-fg)]',\n 'hover:bg-[var(--novi-color-subtle)]',\n // 押した瞬間だけ反転する。開いているという状態は記号が持つ(ADR-F3)\n 'data-[pressed]:bg-[var(--novi-color-fg)] data-[pressed]:text-[var(--novi-color-bg)]',\n 'transition-[background-color,color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-default',\n focusRing,\n ].join(' '),\n // 幅を 1 文字ぶんに固定する。`▸` と `▾` で見出しの開始位置がずれない\n indicator: `w-[1ch] shrink-0 leading-none text-[var(--novi-color-muted)] ${mono}`,\n panel: 'text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]',\n} satisfies SlotMap<typeof accordionSlots, (typeof accordionRequiredSlots)[number]>\n\n/**\n * 罫線の引き方だけが変わる。地で段差を作れないので、\n * `solid` と `soft` は「地を一段落とした行」として同じ見え方になる。\n */\nconst variant: VariantMap<NoviVariant, { root: string; item: string }> = {\n solid: { root: 'border-t-0', item: 'bg-[var(--novi-color-subtle)] border-b' },\n outline: { root: 'border-t', item: 'border-b' },\n soft: { root: 'border-t-0', item: 'bg-[var(--novi-color-subtle)] border-b' },\n ghost: { root: 'border-t-0', item: 'border-b border-[var(--novi-color-border)]' },\n plain: { root: 'border-t-0', item: 'border-b-0' },\n}\n\n/** 行の高さは Select / Menu と同じ帳票の刻み。パネルは見出しの字下げに揃える。 */\nconst size: VariantMap<NoviSize, { trigger: string; panel: string }> = {\n sm: { trigger: 'px-2 py-1.5 text-[length:var(--novi-text-sm)]', panel: 'pl-6 pr-2 pb-1.5' },\n md: { trigger: 'px-3 py-2 text-[length:var(--novi-text-base)]', panel: 'pl-8 pr-3 pb-2' },\n lg: { trigger: 'px-4 py-3 text-[length:var(--novi-text-base)]', panel: 'pl-10 pr-4 pb-3' },\n}\n\n/**\n * Accordion のスタイル定義。\n *\n * @example\n * const myAccordion = tv({ extend: accordionStyles, slots: { panel: 'pt-2' } })\n */\nexport const accordionStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと size のクラスに負ける(申し送り6)\n variants: { size, variant },\n defaultVariants: { variant: 'outline', size: 'md' },\n})\n\nexport type AccordionStyleProps = Parameters<typeof accordionStyles>[0]\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,MAAM,QAAQ;CACZ,MAAM;CACN,MAAM;CAEN,SAAS;CACT,SAAS;EACP;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,WAAW,gEAAgE;CAC3E,OAAO;AACT;;;;;;;AA2BA,MAAa,kBAAkB,GAAG;CAChC;CAEA,UAAU;EAAE;GAdZ,IAAI;IAAE,SAAS;IAAiD,OAAO;GAAmB;GAC1F,IAAI;IAAE,SAAS;IAAiD,OAAO;GAAiB;GACxF,IAAI;IAAE,SAAS;IAAiD,OAAO;GAAkB;EAY7E;EAAM;GAvBlB,OAAO;IAAE,MAAM;IAAc,MAAM;GAAyC;GAC5E,SAAS;IAAE,MAAM;IAAY,MAAM;GAAW;GAC9C,MAAM;IAAE,MAAM;IAAc,MAAM;GAAyC;GAC3E,OAAO;IAAE,MAAM;IAAc,MAAM;GAA6C;GAChF,OAAO;IAAE,MAAM;IAAc,MAAM;GAAa;EAmB9B;CAAQ;CAC1B,iBAAiB;EAAE,SAAS;EAAW,MAAM;CAAK;AACpD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AvatarProps } from "@novi-ui/core";
|
|
2
|
+
//#region src/avatar/avatar.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* 表示名からイニシャルを作る。
|
|
5
|
+
*
|
|
6
|
+
* 日本語の氏名は空白で区切られないことが多いので、
|
|
7
|
+
* 空白があれば各語の先頭、なければ先頭1文字を使う。
|
|
8
|
+
*/
|
|
9
|
+
declare function initialsOf(name: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* 人や組織を表す画像。読み込みに失敗したら fallback を表示する。
|
|
12
|
+
*
|
|
13
|
+
* Flatlay では枠だけが丸くなる(Radio と並ぶ `radius-full` の例外)。
|
|
14
|
+
* `badge` は枠の外に浮かず、**内側の下端**に収まる。
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* <Avatar src="/me.jpg" name="山本 太郎" />
|
|
18
|
+
*/
|
|
19
|
+
declare function Avatar({ size, radius, src, name, fallback, badge, className, classNames, id }: AvatarProps): import("react").JSX.Element;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { Avatar, initialsOf };
|
|
22
|
+
//# sourceMappingURL=avatar.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.mts","names":[],"sources":["../../src/avatar/avatar.tsx"],"mappings":";;;;;;;;iBAYgB,WAAW;;;;;;;;;;iBAmBX,SACd,MACA,QACA,KACA,MACA,UACA,OACA,WACA,YACA,MACC,8BAAW,IAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { avatarStyles } from "./avatar.styles.mjs";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
//#region src/avatar/avatar.tsx
|
|
6
|
+
/**
|
|
7
|
+
* 表示名からイニシャルを作る。
|
|
8
|
+
*
|
|
9
|
+
* 日本語の氏名は空白で区切られないことが多いので、
|
|
10
|
+
* 空白があれば各語の先頭、なければ先頭1文字を使う。
|
|
11
|
+
*/
|
|
12
|
+
function initialsOf(name) {
|
|
13
|
+
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
14
|
+
if (parts.length === 0) return "";
|
|
15
|
+
if (parts.length === 1) return [...parts[0]][0] ?? "";
|
|
16
|
+
return parts.slice(0, 2).map((part) => [...part][0] ?? "").join("");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 人や組織を表す画像。読み込みに失敗したら fallback を表示する。
|
|
20
|
+
*
|
|
21
|
+
* Flatlay では枠だけが丸くなる(Radio と並ぶ `radius-full` の例外)。
|
|
22
|
+
* `badge` は枠の外に浮かず、**内側の下端**に収まる。
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <Avatar src="/me.jpg" name="山本 太郎" />
|
|
26
|
+
*/
|
|
27
|
+
function Avatar({ size, radius, src, name, fallback, badge, className, classNames, id }) {
|
|
28
|
+
const s = avatarStyles({
|
|
29
|
+
size,
|
|
30
|
+
radius
|
|
31
|
+
});
|
|
32
|
+
const [failed, setFailed] = useState(false);
|
|
33
|
+
const showImage = src !== void 0 && src !== "" && !failed;
|
|
34
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
35
|
+
id,
|
|
36
|
+
"data-slot": "root",
|
|
37
|
+
className: s.root({ class: [className, classNames?.root] }),
|
|
38
|
+
children: [showImage ? /* @__PURE__ */ jsx("img", {
|
|
39
|
+
"data-slot": "image",
|
|
40
|
+
className: s.image({ class: classNames?.image }),
|
|
41
|
+
src,
|
|
42
|
+
alt: name ?? "",
|
|
43
|
+
onError: () => setFailed(true)
|
|
44
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
45
|
+
"data-slot": "fallback",
|
|
46
|
+
className: s.fallback({ class: classNames?.fallback }),
|
|
47
|
+
role: "img",
|
|
48
|
+
"aria-label": name,
|
|
49
|
+
children: fallback ?? (name !== void 0 ? initialsOf(name) : null)
|
|
50
|
+
}), badge !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
51
|
+
"data-slot": "badge",
|
|
52
|
+
className: s.badge({ class: classNames?.badge }),
|
|
53
|
+
children: badge
|
|
54
|
+
})]
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { Avatar, initialsOf };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=avatar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.mjs","names":[],"sources":["../../src/avatar/avatar.tsx"],"sourcesContent":["'use client'\n\nimport type { AvatarProps } from '@novi-ui/core'\nimport { useState } from 'react'\nimport { avatarStyles } from './avatar.styles'\n\n/**\n * 表示名からイニシャルを作る。\n *\n * 日本語の氏名は空白で区切られないことが多いので、\n * 空白があれば各語の先頭、なければ先頭1文字を使う。\n */\nexport function initialsOf(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return ''\n if (parts.length === 1) return [...(parts[0] as string)][0] ?? ''\n return parts\n .slice(0, 2)\n .map((part) => [...part][0] ?? '')\n .join('')\n}\n\n/**\n * 人や組織を表す画像。読み込みに失敗したら fallback を表示する。\n *\n * Flatlay では枠だけが丸くなる(Radio と並ぶ `radius-full` の例外)。\n * `badge` は枠の外に浮かず、**内側の下端**に収まる。\n *\n * @example\n * <Avatar src=\"/me.jpg\" name=\"山本 太郎\" />\n */\nexport function Avatar({\n size,\n radius,\n src,\n name,\n fallback,\n badge,\n className,\n classNames,\n id,\n}: AvatarProps) {\n const s = avatarStyles({ size, radius })\n const [failed, setFailed] = useState(false)\n const showImage = src !== undefined && src !== '' && !failed\n\n return (\n <span id={id} data-slot=\"root\" className={s.root({ class: [className, classNames?.root] })}>\n {showImage ? (\n <img\n data-slot=\"image\"\n className={s.image({ class: classNames?.image })}\n src={src}\n alt={name ?? ''}\n onError={() => setFailed(true)}\n />\n ) : (\n // 画像の代わりなので role=\"img\" を与える。\n // これがないと aria-label が効かず、読み上げが「山太」のような\n // イニシャルだけになって氏名が伝わらない\n <span\n data-slot=\"fallback\"\n className={s.fallback({ class: classNames?.fallback })}\n role=\"img\"\n aria-label={name}\n >\n {fallback ?? (name !== undefined ? initialsOf(name) : null)}\n </span>\n )}\n\n {/* 画像と同じ升に重ねる。最後に置くことで上に描かれる(z-index は使わない) */}\n {badge !== undefined && (\n <span data-slot=\"badge\" className={s.badge({ class: classNames?.badge })}>\n {badge}\n </span>\n )}\n </span>\n )\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,WAAW,MAAsB;CAC/C,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;CACrD,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC,GAAI,MAAM,EAAa,CAAC,CAAC,MAAM;CAC/D,OAAO,MACJ,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CACjC,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,SAAgB,OAAO,EACrB,MACA,QACA,KACA,MACA,UACA,OACA,WACA,YACA,MACc;CACd,MAAM,IAAI,aAAa;EAAE;EAAM;CAAO,CAAC;CACvC,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,YAAY,QAAQ,KAAA,KAAa,QAAQ,MAAM,CAAC;CAEtD,OACE,qBAAC,QAAD;EAAU;EAAI,aAAU;EAAO,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAAzF,UAAA,CACG,YACC,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GAC1C;GACL,KAAK,QAAQ;GACb,eAAe,UAAU,IAAI;EAC9B,CAAA,IAKD,oBAAC,QAAD;GACE,aAAU;GACV,WAAW,EAAE,SAAS,EAAE,OAAO,YAAY,SAAS,CAAC;GACrD,MAAK;GACL,cAAY;GAEX,UAAA,aAAa,SAAS,KAAA,IAAY,WAAW,IAAI,IAAI;EAClD,CAAA,GAIP,UAAU,KAAA,KACT,oBAAC,QAAD;GAAM,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GACpE,UAAA;EACG,CAAA,CAEJ;;AAEV"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/avatar/avatar.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Avatar のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const myAvatar = tv({ extend: avatarStyles, slots: { root: 'border-2' } })
|
|
8
|
+
*/
|
|
9
|
+
declare const avatarStyles: import("tailwind-variants").TVReturnType<{
|
|
10
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
11
|
+
root: string;
|
|
12
|
+
}>;
|
|
13
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
14
|
+
root: string;
|
|
15
|
+
}>;
|
|
16
|
+
}, {
|
|
17
|
+
root: string;
|
|
18
|
+
image: string;
|
|
19
|
+
fallback: string;
|
|
20
|
+
badge: string;
|
|
21
|
+
}, undefined, {
|
|
22
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
23
|
+
root: string;
|
|
24
|
+
}>;
|
|
25
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
26
|
+
root: string;
|
|
27
|
+
}>;
|
|
28
|
+
}, {
|
|
29
|
+
root: string;
|
|
30
|
+
image: string;
|
|
31
|
+
fallback: string;
|
|
32
|
+
badge: string;
|
|
33
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
34
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
35
|
+
root: string;
|
|
36
|
+
}>;
|
|
37
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
38
|
+
root: string;
|
|
39
|
+
}>;
|
|
40
|
+
}, {
|
|
41
|
+
root: string;
|
|
42
|
+
image: string;
|
|
43
|
+
fallback: string;
|
|
44
|
+
badge: string;
|
|
45
|
+
}>>;
|
|
46
|
+
type AvatarStyleProps = Parameters<typeof avatarStyles>[0];
|
|
47
|
+
//#endregion
|
|
48
|
+
export { AvatarStyleProps, avatarStyles };
|
|
49
|
+
//# sourceMappingURL=avatar.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.styles.d.mts","names":[],"sources":["../../src/avatar/avatar.styles.ts"],"mappings":";;;;;;;;cAwDa,0CAAY;;IApBgB;;;IAMI;;;;;;;;;IANJ;;;IAMI;;;;;;;;;IANJ;;;IAMI;;;;;;;;KAoBjC,mBAAmB,kBAAkB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { mono } from "../styles/mono.mjs";
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
//#region src/avatar/avatar.styles.ts
|
|
4
|
+
/**
|
|
5
|
+
* Flatlay の Avatar は Radio と並ぶ **`radius-full` の例外**。
|
|
6
|
+
* 人を丸で示す慣習は書類の直角より強い(顔写真の枠だけは角を落とす)。
|
|
7
|
+
*
|
|
8
|
+
* **badge は浮かない。** 両テーマは `absolute` で枠の外に出すが、Flatlay の
|
|
9
|
+
* `position` 例外は Modal と Tooltip の2つで凍結してある(NG1)。
|
|
10
|
+
* 代わりに画像と同じグリッドの升に重ね、枠の**内側**の下端に収める。
|
|
11
|
+
* 重なりの順序は z-index ではなく DOM 順が決める(FR-02)。
|
|
12
|
+
*/
|
|
13
|
+
const slots = {
|
|
14
|
+
root: [
|
|
15
|
+
"inline-grid shrink-0",
|
|
16
|
+
"bg-[var(--novi-color-subtle)]",
|
|
17
|
+
"border border-[var(--novi-color-border-strong)]",
|
|
18
|
+
"overflow-hidden select-none",
|
|
19
|
+
"text-[var(--novi-color-muted)]"
|
|
20
|
+
].join(" "),
|
|
21
|
+
image: "size-full object-cover [grid-area:1/1]",
|
|
22
|
+
fallback: `[grid-area:1/1] place-self-center uppercase tracking-wide ${mono}`,
|
|
23
|
+
badge: "[grid-area:1/1] self-end justify-self-center pb-0.5"
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Avatar のスタイル定義。
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const myAvatar = tv({ extend: avatarStyles, slots: { root: 'border-2' } })
|
|
30
|
+
*/
|
|
31
|
+
const avatarStyles = tv({
|
|
32
|
+
slots,
|
|
33
|
+
variants: {
|
|
34
|
+
size: {
|
|
35
|
+
sm: { root: "size-7 text-[length:var(--novi-text-xs)]" },
|
|
36
|
+
md: { root: "size-8 text-[length:var(--novi-text-sm)]" },
|
|
37
|
+
lg: { root: "size-10 text-[length:var(--novi-text-base)]" }
|
|
38
|
+
},
|
|
39
|
+
radius: {
|
|
40
|
+
none: { root: "rounded-[var(--novi-radius-none)]" },
|
|
41
|
+
sm: { root: "rounded-[var(--novi-radius-sm)]" },
|
|
42
|
+
md: { root: "rounded-[var(--novi-radius-md)]" },
|
|
43
|
+
lg: { root: "rounded-[var(--novi-radius-lg)]" },
|
|
44
|
+
full: { root: "rounded-[var(--novi-radius-full)]" }
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
defaultVariants: {
|
|
48
|
+
size: "md",
|
|
49
|
+
radius: "full"
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
//#endregion
|
|
53
|
+
export { avatarStyles };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=avatar.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.styles.mjs","names":[],"sources":["../../src/avatar/avatar.styles.ts"],"sourcesContent":["import type {\n avatarRequiredSlots,\n avatarSlots,\n NoviRadius,\n NoviSize,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { mono } from '../styles/mono'\n\n/**\n * Flatlay の Avatar は Radio と並ぶ **`radius-full` の例外**。\n * 人を丸で示す慣習は書類の直角より強い(顔写真の枠だけは角を落とす)。\n *\n * **badge は浮かない。** 両テーマは `absolute` で枠の外に出すが、Flatlay の\n * `position` 例外は Modal と Tooltip の2つで凍結してある(NG1)。\n * 代わりに画像と同じグリッドの升に重ね、枠の**内側**の下端に収める。\n * 重なりの順序は z-index ではなく DOM 順が決める(FR-02)。\n */\nconst slots = {\n root: [\n 'inline-grid shrink-0',\n 'bg-[var(--novi-color-subtle)]',\n 'border border-[var(--novi-color-border-strong)]',\n 'overflow-hidden select-none',\n 'text-[var(--novi-color-muted)]',\n ].join(' '),\n image: 'size-full object-cover [grid-area:1/1]',\n // イニシャルは名前の略号なので等幅(ADR-F7)\n fallback: `[grid-area:1/1] place-self-center uppercase tracking-wide ${mono}`,\n // 同じ升に重ね、枠の内側の下端に収める。外へはみ出させない\n badge: '[grid-area:1/1] self-end justify-self-center pb-0.5',\n} satisfies SlotMap<typeof avatarSlots, (typeof avatarRequiredSlots)[number]>\n\n/** 28 / 32 / 40px。Button の高さと同じ寸法で、行に混ぜても列が揃う。 */\nconst size: VariantMap<NoviSize, { root: string }> = {\n sm: { root: 'size-7 text-[length:var(--novi-text-xs)]' },\n md: { root: 'size-8 text-[length:var(--novi-text-sm)]' },\n lg: { root: 'size-10 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 * Avatar のスタイル定義。\n *\n * @example\n * const myAvatar = tv({ extend: avatarStyles, slots: { root: 'border-2' } })\n */\nexport const avatarStyles = tv({\n slots,\n variants: { size, radius },\n defaultVariants: { size: 'md', radius: 'full' },\n})\n\nexport type AvatarStyleProps = Parameters<typeof avatarStyles>[0]\n"],"mappings":";;;;;;;;;;;;AAoBA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CAEP,UAAU,6DAA6D;CAEvE,OAAO;AACT;;;;;;;AAuBA,MAAa,eAAe,GAAG;CAC7B;CACA,UAAU;EAAE;GArBZ,IAAI,EAAE,MAAM,2CAA2C;GACvD,IAAI,EAAE,MAAM,2CAA2C;GACvD,IAAI,EAAE,MAAM,8CAA8C;EAmB9C;EAAM;GAflB,MAAM,EAAE,MAAM,oCAAoC;GAClD,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,MAAM,EAAE,MAAM,oCAAoC;EAWhC;CAAO;CACzB,iBAAiB;EAAE,MAAM;EAAM,QAAQ;CAAO;AAChD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BadgeProps } from "@novi-ui/core";
|
|
2
|
+
//#region src/badge/badge.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* 短いラベルで状態や分類を示す。Flatlay では**書類に押した区分印**として並ぶ。
|
|
5
|
+
*
|
|
6
|
+
* 色だけで意味を伝えないこと。`success` と `danger` は色相が違うが、
|
|
7
|
+
* 色覚特性によっては区別できない。必ず文言を伴わせる(WCAG 1.4.1)。
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* <Badge color="success" variant="outline">公開中</Badge>
|
|
11
|
+
*/
|
|
12
|
+
declare function Badge({ variant, size, color, radius, withDot, children, className, classNames, id }: BadgeProps): import("react").JSX.Element;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { Badge };
|
|
15
|
+
//# sourceMappingURL=badge.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.mts","names":[],"sources":["../../src/badge/badge.tsx"],"mappings":";;;;;;;;;;;iBAcgB,QACd,SACA,MACA,OACA,QACA,SACA,UACA,WACA,YACA,MACC,6BAAU,IAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { badgeStyles } from "./badge.styles.mjs";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/badge/badge.tsx
|
|
5
|
+
/**
|
|
6
|
+
* 短いラベルで状態や分類を示す。Flatlay では**書類に押した区分印**として並ぶ。
|
|
7
|
+
*
|
|
8
|
+
* 色だけで意味を伝えないこと。`success` と `danger` は色相が違うが、
|
|
9
|
+
* 色覚特性によっては区別できない。必ず文言を伴わせる(WCAG 1.4.1)。
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <Badge color="success" variant="outline">公開中</Badge>
|
|
13
|
+
*/
|
|
14
|
+
function Badge({ variant, size, color, radius, withDot, children, className, classNames, id }) {
|
|
15
|
+
const s = badgeStyles({
|
|
16
|
+
variant,
|
|
17
|
+
size,
|
|
18
|
+
color,
|
|
19
|
+
radius
|
|
20
|
+
});
|
|
21
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
22
|
+
id,
|
|
23
|
+
"data-slot": "root",
|
|
24
|
+
className: s.root({ class: [className, classNames?.root] }),
|
|
25
|
+
children: [withDot === true && /* @__PURE__ */ jsx("span", {
|
|
26
|
+
"data-slot": "dot",
|
|
27
|
+
className: s.dot({ class: classNames?.dot }),
|
|
28
|
+
"aria-hidden": "true"
|
|
29
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
30
|
+
"data-slot": "label",
|
|
31
|
+
className: s.label({ class: classNames?.label }),
|
|
32
|
+
children
|
|
33
|
+
})]
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { Badge };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=badge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.mjs","names":[],"sources":["../../src/badge/badge.tsx"],"sourcesContent":["'use client'\n\nimport type { BadgeProps } from '@novi-ui/core'\nimport { badgeStyles } from './badge.styles'\n\n/**\n * 短いラベルで状態や分類を示す。Flatlay では**書類に押した区分印**として並ぶ。\n *\n * 色だけで意味を伝えないこと。`success` と `danger` は色相が違うが、\n * 色覚特性によっては区別できない。必ず文言を伴わせる(WCAG 1.4.1)。\n *\n * @example\n * <Badge color=\"success\" variant=\"outline\">公開中</Badge>\n */\nexport function Badge({\n variant,\n size,\n color,\n radius,\n withDot,\n children,\n className,\n classNames,\n id,\n}: BadgeProps) {\n const s = badgeStyles({ variant, size, color, radius })\n\n return (\n <span id={id} data-slot=\"root\" className={s.root({ class: [className, classNames?.root] })}>\n {withDot === true && (\n <span data-slot=\"dot\" className={s.dot({ class: classNames?.dot })} aria-hidden=\"true\" />\n )}\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {children}\n </span>\n </span>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,MAAM,EACpB,SACA,MACA,OACA,QACA,SACA,UACA,WACA,YACA,MACa;CACb,MAAM,IAAI,YAAY;EAAE;EAAS;EAAM;EAAO;CAAO,CAAC;CAEtD,OACE,qBAAC,QAAD;EAAU;EAAI,aAAU;EAAO,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAAzF,UAAA,CACG,YAAY,QACX,oBAAC,QAAD;GAAM,aAAU;GAAM,WAAW,EAAE,IAAI,EAAE,OAAO,YAAY,IAAI,CAAC;GAAG,eAAY;EAAQ,CAAA,GAE1F,oBAAC,QAAD;GAAM,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GACpE;EACG,CAAA,CACF;;AAEV"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/badge/badge.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Badge のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const myBadge = tv({ extend: badgeStyles, slots: { label: 'uppercase' } })
|
|
8
|
+
*/
|
|
9
|
+
declare const badgeStyles: import("tailwind-variants").TVReturnType<{
|
|
10
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
11
|
+
root: string;
|
|
12
|
+
}>;
|
|
13
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
14
|
+
root: string;
|
|
15
|
+
dot: string;
|
|
16
|
+
}>;
|
|
17
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
18
|
+
root: string;
|
|
19
|
+
}>;
|
|
20
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
21
|
+
root: string;
|
|
22
|
+
}>;
|
|
23
|
+
}, {
|
|
24
|
+
root: string;
|
|
25
|
+
dot: string;
|
|
26
|
+
label: string;
|
|
27
|
+
}, undefined, {
|
|
28
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
29
|
+
root: string;
|
|
30
|
+
}>;
|
|
31
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
32
|
+
root: string;
|
|
33
|
+
dot: string;
|
|
34
|
+
}>;
|
|
35
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
36
|
+
root: string;
|
|
37
|
+
}>;
|
|
38
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
39
|
+
root: string;
|
|
40
|
+
}>;
|
|
41
|
+
}, {
|
|
42
|
+
root: string;
|
|
43
|
+
dot: string;
|
|
44
|
+
label: string;
|
|
45
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
46
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
47
|
+
root: string;
|
|
48
|
+
}>;
|
|
49
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
50
|
+
root: string;
|
|
51
|
+
dot: string;
|
|
52
|
+
}>;
|
|
53
|
+
radius: VariantMap<"sm" | "md" | "lg" | "none" | "full", {
|
|
54
|
+
root: string;
|
|
55
|
+
}>;
|
|
56
|
+
variant: VariantMap<"solid" | "outline" | "soft" | "ghost" | "plain", {
|
|
57
|
+
root: string;
|
|
58
|
+
}>;
|
|
59
|
+
}, {
|
|
60
|
+
root: string;
|
|
61
|
+
dot: string;
|
|
62
|
+
label: string;
|
|
63
|
+
}>>;
|
|
64
|
+
type BadgeStyleProps = Parameters<typeof badgeStyles>[0];
|
|
65
|
+
//#endregion
|
|
66
|
+
export { BadgeStyleProps, badgeStyles };
|
|
67
|
+
//# sourceMappingURL=badge.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.styles.d.mts","names":[],"sources":["../../src/badge/badge.styles.ts"],"mappings":";;;;;;;;cAmHa,yCAAW;;IAlFmB;;;IA8DF;IAAa;;;IAMT;;;IAjBE;;;;;;;;IAnDJ;;;IA8DF;IAAa;;;IAMT;;;IAjBE;;;;;;;;IAnDJ;;;IA8DF;IAAa;;;IAMT;;;IAjBE;;;;;;;KAsCnC,kBAAkB,kBAAkB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { mono } from "../styles/mono.mjs";
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
//#region src/badge/badge.styles.ts
|
|
4
|
+
/**
|
|
5
|
+
* Flatlay の Badge は**書類に押した区分印**。
|
|
6
|
+
*
|
|
7
|
+
* ラベルが等幅なのは、状態や分類の語が帳票では「読ませる文」ではなく
|
|
8
|
+
* 「読み取らせる記号」だから(ADR-F7)。列に並べたとき幅が揃う効果も兼ねる。
|
|
9
|
+
*
|
|
10
|
+
* 点も正方形。円は Radio と Avatar の2つに予約してあり、
|
|
11
|
+
* ここで丸を使うと「1つ選ぶ」の形と紛れる。
|
|
12
|
+
*/
|
|
13
|
+
const slots = {
|
|
14
|
+
root: [
|
|
15
|
+
"inline-flex items-center gap-1.5",
|
|
16
|
+
"whitespace-nowrap",
|
|
17
|
+
"border border-transparent",
|
|
18
|
+
"rounded-[var(--novi-radius-sm)]"
|
|
19
|
+
].join(" "),
|
|
20
|
+
dot: "shrink-0 rounded-[var(--novi-radius-none)] bg-current",
|
|
21
|
+
label: `truncate ${mono}`
|
|
22
|
+
};
|
|
23
|
+
const color = {
|
|
24
|
+
default: { root: [
|
|
25
|
+
"[--c:var(--novi-color-default)]",
|
|
26
|
+
"[--c-fg:var(--novi-color-default-fg)]",
|
|
27
|
+
"[--c-text:var(--novi-color-fg)]",
|
|
28
|
+
"[--c-line:var(--novi-color-border-strong)]"
|
|
29
|
+
].join(" ") },
|
|
30
|
+
primary: { root: [
|
|
31
|
+
"[--c:var(--novi-color-primary)]",
|
|
32
|
+
"[--c-fg:var(--novi-color-primary-fg)]",
|
|
33
|
+
"[--c-text:var(--novi-color-primary)]",
|
|
34
|
+
"[--c-line:var(--novi-color-primary)]"
|
|
35
|
+
].join(" ") },
|
|
36
|
+
secondary: { root: [
|
|
37
|
+
"[--c:var(--novi-color-secondary)]",
|
|
38
|
+
"[--c-fg:var(--novi-color-secondary-fg)]",
|
|
39
|
+
"[--c-text:var(--novi-color-secondary)]",
|
|
40
|
+
"[--c-line:var(--novi-color-secondary)]"
|
|
41
|
+
].join(" ") },
|
|
42
|
+
success: { root: [
|
|
43
|
+
"[--c:var(--novi-color-success)]",
|
|
44
|
+
"[--c-fg:var(--novi-color-success-fg)]",
|
|
45
|
+
"[--c-text:var(--novi-color-success)]",
|
|
46
|
+
"[--c-line:var(--novi-color-success)]"
|
|
47
|
+
].join(" ") },
|
|
48
|
+
warning: { root: [
|
|
49
|
+
"[--c:var(--novi-color-warning)]",
|
|
50
|
+
"[--c-fg:var(--novi-color-warning-fg)]",
|
|
51
|
+
"[--c-text:var(--novi-color-warning)]",
|
|
52
|
+
"[--c-line:var(--novi-color-warning)]"
|
|
53
|
+
].join(" ") },
|
|
54
|
+
danger: { root: [
|
|
55
|
+
"[--c:var(--novi-color-danger)]",
|
|
56
|
+
"[--c-fg:var(--novi-color-danger-fg)]",
|
|
57
|
+
"[--c-text:var(--novi-color-danger)]",
|
|
58
|
+
"[--c-line:var(--novi-color-danger)]"
|
|
59
|
+
].join(" ") }
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Badge のスタイル定義。
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* const myBadge = tv({ extend: badgeStyles, slots: { label: 'uppercase' } })
|
|
66
|
+
*/
|
|
67
|
+
const badgeStyles = tv({
|
|
68
|
+
slots,
|
|
69
|
+
variants: {
|
|
70
|
+
color,
|
|
71
|
+
size: {
|
|
72
|
+
sm: {
|
|
73
|
+
root: "h-4 px-1 text-[length:var(--novi-text-xs)]",
|
|
74
|
+
dot: "size-1.5"
|
|
75
|
+
},
|
|
76
|
+
md: {
|
|
77
|
+
root: "h-5 px-1.5 text-[length:var(--novi-text-xs)]",
|
|
78
|
+
dot: "size-1.5"
|
|
79
|
+
},
|
|
80
|
+
lg: {
|
|
81
|
+
root: "h-6 px-2 text-[length:var(--novi-text-sm)]",
|
|
82
|
+
dot: "size-2"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
radius: {
|
|
86
|
+
none: { root: "rounded-[var(--novi-radius-none)]" },
|
|
87
|
+
sm: { root: "rounded-[var(--novi-radius-sm)]" },
|
|
88
|
+
md: { root: "rounded-[var(--novi-radius-md)]" },
|
|
89
|
+
lg: { root: "rounded-[var(--novi-radius-lg)]" },
|
|
90
|
+
full: { root: "rounded-[var(--novi-radius-full)]" }
|
|
91
|
+
},
|
|
92
|
+
variant: {
|
|
93
|
+
solid: { root: "bg-[var(--c)] text-[var(--c-fg)] border-[var(--c)]" },
|
|
94
|
+
outline: { root: "border-[var(--c-line)] text-[var(--c-text)]" },
|
|
95
|
+
soft: { root: "bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)] text-[var(--c-text)]" },
|
|
96
|
+
ghost: { root: "text-[var(--c-text)]" },
|
|
97
|
+
plain: { root: "text-[var(--c-text)] px-0" }
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
defaultVariants: {
|
|
101
|
+
color: "default",
|
|
102
|
+
variant: "outline",
|
|
103
|
+
size: "md",
|
|
104
|
+
radius: "sm"
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
//#endregion
|
|
108
|
+
export { badgeStyles };
|
|
109
|
+
|
|
110
|
+
//# sourceMappingURL=badge.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.styles.mjs","names":[],"sources":["../../src/badge/badge.styles.ts"],"sourcesContent":["import type {\n badgeRequiredSlots,\n badgeSlots,\n NoviColor,\n NoviRadius,\n NoviSize,\n NoviVariant,\n SlotMap,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { mono } from '../styles/mono'\n\n/**\n * Flatlay の Badge は**書類に押した区分印**。\n *\n * ラベルが等幅なのは、状態や分類の語が帳票では「読ませる文」ではなく\n * 「読み取らせる記号」だから(ADR-F7)。列に並べたとき幅が揃う効果も兼ねる。\n *\n * 点も正方形。円は Radio と Avatar の2つに予約してあり、\n * ここで丸を使うと「1つ選ぶ」の形と紛れる。\n */\nconst slots = {\n root: [\n 'inline-flex items-center gap-1.5',\n 'whitespace-nowrap',\n 'border border-transparent',\n 'rounded-[var(--novi-radius-sm)]',\n ].join(' '),\n dot: 'shrink-0 rounded-[var(--novi-radius-none)] bg-current',\n label: `truncate ${mono}`,\n} satisfies SlotMap<typeof badgeSlots, (typeof badgeRequiredSlots)[number]>\n\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: {\n root: [\n '[--c:var(--novi-color-default)]',\n '[--c-fg:var(--novi-color-default-fg)]',\n '[--c-text:var(--novi-color-fg)]',\n '[--c-line:var(--novi-color-border-strong)]',\n ].join(' '),\n },\n primary: {\n root: [\n '[--c:var(--novi-color-primary)]',\n '[--c-fg:var(--novi-color-primary-fg)]',\n '[--c-text:var(--novi-color-primary)]',\n '[--c-line:var(--novi-color-primary)]',\n ].join(' '),\n },\n secondary: {\n root: [\n '[--c:var(--novi-color-secondary)]',\n '[--c-fg:var(--novi-color-secondary-fg)]',\n '[--c-text:var(--novi-color-secondary)]',\n '[--c-line:var(--novi-color-secondary)]',\n ].join(' '),\n },\n success: {\n root: [\n '[--c:var(--novi-color-success)]',\n '[--c-fg:var(--novi-color-success-fg)]',\n '[--c-text:var(--novi-color-success)]',\n '[--c-line:var(--novi-color-success)]',\n ].join(' '),\n },\n warning: {\n root: [\n '[--c:var(--novi-color-warning)]',\n '[--c-fg:var(--novi-color-warning-fg)]',\n '[--c-text:var(--novi-color-warning)]',\n '[--c-line:var(--novi-color-warning)]',\n ].join(' '),\n },\n danger: {\n root: [\n '[--c:var(--novi-color-danger)]',\n '[--c-fg:var(--novi-color-danger-fg)]',\n '[--c-text:var(--novi-color-danger)]',\n '[--c-line:var(--novi-color-danger)]',\n ].join(' '),\n },\n}\n\nconst variant: VariantMap<NoviVariant, { root: string }> = {\n solid: { root: 'bg-[var(--c)] text-[var(--c-fg)] border-[var(--c)]' },\n outline: { root: 'border-[var(--c-line)] text-[var(--c-text)]' },\n soft: {\n root: 'bg-[var(--novi-color-subtle)] border-[var(--novi-color-border)] text-[var(--c-text)]',\n },\n ghost: { root: 'text-[var(--c-text)]' },\n plain: { root: 'text-[var(--c-text)] px-0' },\n}\n\n/** 16 / 20 / 24px。行の中に置いても行が膨らまない高さ(Raster は 20/24/28)。 */\nconst size: VariantMap<NoviSize, { root: string; dot: string }> = {\n sm: { root: 'h-4 px-1 text-[length:var(--novi-text-xs)]', dot: 'size-1.5' },\n md: { root: 'h-5 px-1.5 text-[length:var(--novi-text-xs)]', dot: 'size-1.5' },\n lg: { root: 'h-6 px-2 text-[length:var(--novi-text-sm)]', dot: 'size-2' },\n}\n\nconst radius: VariantMap<NoviRadius, { root: string }> = {\n none: { root: 'rounded-[var(--novi-radius-none)]' },\n sm: { root: 'rounded-[var(--novi-radius-sm)]' },\n md: { root: 'rounded-[var(--novi-radius-md)]' },\n lg: { root: 'rounded-[var(--novi-radius-lg)]' },\n full: { root: 'rounded-[var(--novi-radius-full)]' },\n}\n\n/**\n * Badge のスタイル定義。\n *\n * @example\n * const myBadge = tv({ extend: badgeStyles, slots: { label: 'uppercase' } })\n */\nexport const badgeStyles = tv({\n slots,\n // `variant` は最後に宣言する。先に書くと `plain` の px-0 が size の px に負ける(申し送り6)\n variants: { color, size, radius, variant },\n defaultVariants: { color: 'default', variant: 'outline', size: 'md', radius: 'sm' },\n})\n\nexport type BadgeStyleProps = Parameters<typeof badgeStyles>[0]\n"],"mappings":";;;;;;;;;;;;AAsBA,MAAM,QAAQ;CACZ,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,KAAK;CACL,OAAO,YAAY;AACrB;AAEA,MAAM,QAAiD;CACrD,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,WAAW,EACT,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,SAAS,EACP,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;CACA,QAAQ,EACN,MAAM;EACJ;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,EACZ;AACF;;;;;;;AAiCA,MAAa,cAAc,GAAG;CAC5B;CAEA,UAAU;EAAE;EAAO;GAtBnB,IAAI;IAAE,MAAM;IAA8C,KAAK;GAAW;GAC1E,IAAI;IAAE,MAAM;IAAgD,KAAK;GAAW;GAC5E,IAAI;IAAE,MAAM;IAA8C,KAAK;GAAS;EAoBrD;EAAM;GAhBzB,MAAM,EAAE,MAAM,oCAAoC;GAClD,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,IAAI,EAAE,MAAM,kCAAkC;GAC9C,MAAM,EAAE,MAAM,oCAAoC;EAYzB;EAAQ;GAjCjC,OAAO,EAAE,MAAM,qDAAqD;GACpE,SAAS,EAAE,MAAM,8CAA8C;GAC/D,MAAM,EACJ,MAAM,uFACR;GACA,OAAO,EAAE,MAAM,uBAAuB;GACtC,OAAO,EAAE,MAAM,4BAA4B;EA2BV;CAAQ;CACzC,iBAAiB;EAAE,OAAO;EAAW,SAAS;EAAW,MAAM;EAAM,QAAQ;CAAK;AACpF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { BreadcrumbsProps } from "@novi-ui/core";
|
|
3
|
+
//#region src/breadcrumbs/breadcrumbs.d.ts
|
|
4
|
+
interface BreadcrumbProps {
|
|
5
|
+
/** 省略すると現在地として扱い、リンクにしない */
|
|
6
|
+
href?: string;
|
|
7
|
+
children?: ReactNode;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 階層の1段。`href` を省略した項目が現在地になる。
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
|
|
15
|
+
*/
|
|
16
|
+
declare function Breadcrumb({ href, children, className }: BreadcrumbProps): import("react").JSX.Element;
|
|
17
|
+
/**
|
|
18
|
+
* 階層の中で現在どこにいるかを示す。
|
|
19
|
+
*
|
|
20
|
+
* 区切りの `/` は等幅で出ます。階層の列を「文」ではなく「番地」として
|
|
21
|
+
* 読ませるためで、段の深さが目で数えられます。
|
|
22
|
+
*
|
|
23
|
+
* リンクは既定で下線を持ちます。色だけで押せることを示さないためです。
|
|
24
|
+
* 現在地はリンクにならず、太さだけで示します。
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* <Breadcrumbs>
|
|
28
|
+
* <Breadcrumb href="/">ホーム</Breadcrumb>
|
|
29
|
+
* <Breadcrumb href="/docs">ドキュメント</Breadcrumb>
|
|
30
|
+
* <Breadcrumb>Button</Breadcrumb>
|
|
31
|
+
* </Breadcrumbs>
|
|
32
|
+
*/
|
|
33
|
+
declare function Breadcrumbs({ size, separator, isDisabled, children, className, classNames, id }: BreadcrumbsProps): import("react").JSX.Element;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { Breadcrumb, BreadcrumbProps, Breadcrumbs };
|
|
36
|
+
//# sourceMappingURL=breadcrumbs.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumbs.d.mts","names":[],"sources":["../../src/breadcrumbs/breadcrumbs.tsx"],"mappings":";;;UAoBiB;;EAEf;EACA,WAAW;EACX;;;;;;;;iBASc,aAAa,MAAM,UAAU,aAAa,kCAAe,IAAA;;;;;;;;;;;;;;;;;iBAyCzD,cACd,MACA,WACA,YACA,UACA,WACA,YACA,MACC,mCAAgB,IAAA"}
|