@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,46 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/spinner/spinner.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Spinner のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const mySpinner = tv({ extend: spinnerStyles, slots: { label: 'text-[var(--novi-color-fg)]' } })
|
|
8
|
+
*/
|
|
9
|
+
declare const spinnerStyles: import("tailwind-variants").TVReturnType<{
|
|
10
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
11
|
+
root: string;
|
|
12
|
+
}>;
|
|
13
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
14
|
+
circle: string;
|
|
15
|
+
}>;
|
|
16
|
+
}, {
|
|
17
|
+
root: string;
|
|
18
|
+
circle: string;
|
|
19
|
+
label: string;
|
|
20
|
+
}, undefined, {
|
|
21
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
22
|
+
root: string;
|
|
23
|
+
}>;
|
|
24
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
25
|
+
circle: string;
|
|
26
|
+
}>;
|
|
27
|
+
}, {
|
|
28
|
+
root: string;
|
|
29
|
+
circle: string;
|
|
30
|
+
label: string;
|
|
31
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
32
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
33
|
+
root: string;
|
|
34
|
+
}>;
|
|
35
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
36
|
+
circle: string;
|
|
37
|
+
}>;
|
|
38
|
+
}, {
|
|
39
|
+
root: string;
|
|
40
|
+
circle: string;
|
|
41
|
+
label: string;
|
|
42
|
+
}>>;
|
|
43
|
+
type SpinnerStyleProps = Parameters<typeof spinnerStyles>[0];
|
|
44
|
+
//#endregion
|
|
45
|
+
export { SpinnerStyleProps, spinnerStyles };
|
|
46
|
+
//# sourceMappingURL=spinner.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.styles.d.mts","names":[],"sources":["../../src/spinner/spinner.styles.ts"],"mappings":";;;;;;;;cAgDa,2CAAa;;IArBiB;;;IASA;;;;;;;;IATA;;;IASA;;;;;;;;IATA;;;IASA;;;;;;;KAkB/B,oBAAoB,kBAAkB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { mono } from "../styles/mono.mjs";
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
//#region src/spinner/spinner.styles.ts
|
|
4
|
+
/**
|
|
5
|
+
* Spinner は `transform`(`animate-spin`)を使う**唯一の例外**。
|
|
6
|
+
*
|
|
7
|
+
* Flatlay は動きで飾らないテーマだが、ここだけは規律の外に置いている。
|
|
8
|
+
* 代替(点滅・バーの往復)は「処理中」であることの視認性か情報量で必ず劣り、
|
|
9
|
+
* 待たされている人にとっては世界観よりも「動いていると分かること」が先だから。
|
|
10
|
+
* 例外は `design-rules.data.mjs` にも登録済みで、両テーマと同じ判断。
|
|
11
|
+
*
|
|
12
|
+
* `prefers-reduced-motion` のときは回転を止める。
|
|
13
|
+
*/
|
|
14
|
+
const slots = {
|
|
15
|
+
root: "inline-flex items-center gap-2",
|
|
16
|
+
circle: "shrink-0 motion-safe:animate-spin text-[var(--c)]",
|
|
17
|
+
label: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)] ${mono}`
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Spinner のスタイル定義。
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const mySpinner = tv({ extend: spinnerStyles, slots: { label: 'text-[var(--novi-color-fg)]' } })
|
|
24
|
+
*/
|
|
25
|
+
const spinnerStyles = tv({
|
|
26
|
+
slots,
|
|
27
|
+
variants: {
|
|
28
|
+
color: {
|
|
29
|
+
default: { root: "[--c:var(--novi-color-fg)]" },
|
|
30
|
+
primary: { root: "[--c:var(--novi-color-primary)]" },
|
|
31
|
+
secondary: { root: "[--c:var(--novi-color-secondary)]" },
|
|
32
|
+
success: { root: "[--c:var(--novi-color-success)]" },
|
|
33
|
+
warning: { root: "[--c:var(--novi-color-warning)]" },
|
|
34
|
+
danger: { root: "[--c:var(--novi-color-danger)]" }
|
|
35
|
+
},
|
|
36
|
+
size: {
|
|
37
|
+
sm: { circle: "size-4" },
|
|
38
|
+
md: { circle: "size-5" },
|
|
39
|
+
lg: { circle: "size-6" }
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
color: "default",
|
|
44
|
+
size: "md"
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
//#endregion
|
|
48
|
+
export { spinnerStyles };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=spinner.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.styles.mjs","names":[],"sources":["../../src/spinner/spinner.styles.ts"],"sourcesContent":["import type {\n NoviColor,\n NoviSize,\n SlotMap,\n spinnerRequiredSlots,\n spinnerSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { mono } from '../styles/mono'\n\n/**\n * Spinner は `transform`(`animate-spin`)を使う**唯一の例外**。\n *\n * Flatlay は動きで飾らないテーマだが、ここだけは規律の外に置いている。\n * 代替(点滅・バーの往復)は「処理中」であることの視認性か情報量で必ず劣り、\n * 待たされている人にとっては世界観よりも「動いていると分かること」が先だから。\n * 例外は `design-rules.data.mjs` にも登録済みで、両テーマと同じ判断。\n *\n * `prefers-reduced-motion` のときは回転を止める。\n */\nconst slots = {\n root: 'inline-flex items-center gap-2',\n circle: 'shrink-0 motion-safe:animate-spin text-[var(--c)]',\n label: `text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)] ${mono}`,\n} satisfies SlotMap<typeof spinnerSlots, (typeof spinnerRequiredSlots)[number]>\n\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: { root: '[--c:var(--novi-color-fg)]' },\n primary: { root: '[--c:var(--novi-color-primary)]' },\n secondary: { root: '[--c:var(--novi-color-secondary)]' },\n success: { root: '[--c:var(--novi-color-success)]' },\n warning: { root: '[--c:var(--novi-color-warning)]' },\n danger: { root: '[--c:var(--novi-color-danger)]' },\n}\n\nconst size: VariantMap<NoviSize, { circle: string }> = {\n sm: { circle: 'size-4' },\n md: { circle: 'size-5' },\n lg: { circle: 'size-6' },\n}\n\n/**\n * Spinner のスタイル定義。\n *\n * @example\n * const mySpinner = tv({ extend: spinnerStyles, slots: { label: 'text-[var(--novi-color-fg)]' } })\n */\nexport const spinnerStyles = tv({\n slots,\n variants: { color, size },\n defaultVariants: { color: 'default', size: 'md' },\n})\n\nexport type SpinnerStyleProps = Parameters<typeof spinnerStyles>[0]\n"],"mappings":";;;;;;;;;;;;;AAqBA,MAAM,QAAQ;CACZ,MAAM;CACN,QAAQ;CACR,OAAO,oEAAoE;AAC7E;;;;;;;AAuBA,MAAa,gBAAgB,GAAG;CAC9B;CACA,UAAU;EAAE;GAtBZ,SAAS,EAAE,MAAM,6BAA6B;GAC9C,SAAS,EAAE,MAAM,kCAAkC;GACnD,WAAW,EAAE,MAAM,oCAAoC;GACvD,SAAS,EAAE,MAAM,kCAAkC;GACnD,SAAS,EAAE,MAAM,kCAAkC;GACnD,QAAQ,EAAE,MAAM,iCAAiC;EAiBrC;EAAO;GAbnB,IAAI,EAAE,QAAQ,SAAS;GACvB,IAAI,EAAE,QAAQ,SAAS;GACvB,IAAI,EAAE,QAAQ,SAAS;EAWJ;CAAK;CACxB,iBAAiB;EAAE,OAAO;EAAW,MAAM;CAAK;AAClD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/styles/focus-ring.ts
|
|
2
|
+
/**
|
|
3
|
+
* 全コンポーネント共通のフォーカスリング。
|
|
4
|
+
*
|
|
5
|
+
* 両テーマと**同じ書き方をそのまま採る**。ここで独自色を出さないのは意図で、
|
|
6
|
+
* フォーカスの見え方はテーマの表現ではなく操作の保証だから。3本のモデルで
|
|
7
|
+
* 挙動が揺れると、テーマを差し替えた瞬間にキーボード操作の手応えが変わる。
|
|
8
|
+
*
|
|
9
|
+
* React Aria Components はキーボード操作時にのみ `data-focus-visible` を立てるため、
|
|
10
|
+
* `:focus-visible` 擬似クラスではなくその属性を使う。
|
|
11
|
+
* ポインタで押しただけでリングが出る誤動作を避けられる。
|
|
12
|
+
*/
|
|
13
|
+
const focusRing = [
|
|
14
|
+
"outline-none",
|
|
15
|
+
"data-[focus-visible]:outline",
|
|
16
|
+
"data-[focus-visible]:outline-[length:var(--novi-focus-ring-width)]",
|
|
17
|
+
"data-[focus-visible]:outline-[var(--novi-focus-ring-color)]",
|
|
18
|
+
"data-[focus-visible]:outline-offset-[var(--novi-focus-ring-offset)]"
|
|
19
|
+
].join(" ");
|
|
20
|
+
/**
|
|
21
|
+
* 無効状態の共通表現。色は変えず、透明度と操作不能だけで示す。
|
|
22
|
+
*
|
|
23
|
+
* Flatlay では特に効く。罫線しか階層の手がかりが無いので、無効色を別に持つと
|
|
24
|
+
* 「染まる罫線」と紛れる。薄くするだけなら罫線の意味を壊さない。
|
|
25
|
+
*/
|
|
26
|
+
const disabledState = "data-[disabled]:opacity-40 data-[disabled]:pointer-events-none";
|
|
27
|
+
//#endregion
|
|
28
|
+
export { disabledState, focusRing };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=focus-ring.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-ring.mjs","names":[],"sources":["../../src/styles/focus-ring.ts"],"sourcesContent":["/**\n * 全コンポーネント共通のフォーカスリング。\n *\n * 両テーマと**同じ書き方をそのまま採る**。ここで独自色を出さないのは意図で、\n * フォーカスの見え方はテーマの表現ではなく操作の保証だから。3本のモデルで\n * 挙動が揺れると、テーマを差し替えた瞬間にキーボード操作の手応えが変わる。\n *\n * React Aria Components はキーボード操作時にのみ `data-focus-visible` を立てるため、\n * `:focus-visible` 擬似クラスではなくその属性を使う。\n * ポインタで押しただけでリングが出る誤動作を避けられる。\n */\nexport const focusRing = [\n 'outline-none',\n 'data-[focus-visible]:outline',\n 'data-[focus-visible]:outline-[length:var(--novi-focus-ring-width)]',\n 'data-[focus-visible]:outline-[var(--novi-focus-ring-color)]',\n 'data-[focus-visible]:outline-offset-[var(--novi-focus-ring-offset)]',\n].join(' ')\n\n/**\n * 無効状態の共通表現。色は変えず、透明度と操作不能だけで示す。\n *\n * Flatlay では特に効く。罫線しか階層の手がかりが無いので、無効色を別に持つと\n * 「染まる罫線」と紛れる。薄くするだけなら罫線の意味を壊さない。\n */\nexport const disabledState = 'data-[disabled]:opacity-40 data-[disabled]:pointer-events-none'\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,YAAY;CACvB;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;;;;;;;AAQV,MAAa,gBAAgB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { OverlayTriggerStateContext, Popover } from "react-aria-components";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
import { inflowPortalProps } from "@novi-ui/core/client";
|
|
6
|
+
//#region src/styles/inflow.tsx
|
|
7
|
+
/**
|
|
8
|
+
* オーバーレイをドキュメントフローの中に展開する(FR-05 / FR-09)。
|
|
9
|
+
*
|
|
10
|
+
* Flatlay は z 軸を持たない。**開く = 場所を取る**。Select も Menu も Popover も、
|
|
11
|
+
* 開いたら後続を押し下げる。浮いてこないので「どこかが隠れている」が起きない。
|
|
12
|
+
*
|
|
13
|
+
* 実装は **Popover を捨てず、置き場所だけ変える**。理由はスパイクで2案を潰したから:
|
|
14
|
+
* - 開いた時だけ中身をマウントする → Select のコレクションが空になり、そもそも開かない
|
|
15
|
+
* - 常時マウントして hidden で隠す → 閉じている間 option が描画されず、
|
|
16
|
+
* 開いた瞬間のフォーカス初期化とトリガの keydown 分岐が Popover 前提で壊れる
|
|
17
|
+
*
|
|
18
|
+
* `INFLOW_PORTAL_PROP`(core が封じ込めた上流の不安定 prop)でトリガ直後の
|
|
19
|
+
* フロー内コンテナへポータルし、`useOverlayPosition` が書き込むインラインの
|
|
20
|
+
* `position: absolute / top / left` を `static!` で無効化する。
|
|
21
|
+
* FocusScope・キーボード操作・コレクション・Escape・フォーカス復帰は
|
|
22
|
+
* すべて RAC 本来の経路のまま生き、**描画位置だけがフローに落ちる**。
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* 上流が書き込むインラインスタイルを打ち消す。**`!` はここでの必需品。**
|
|
26
|
+
*
|
|
27
|
+
* `useOverlayPosition` は `style` 属性に直接書き込むため、クラスの詳細度では勝てない。
|
|
28
|
+
* - `static!` 浮かせない。フローに戻す(これが原理そのもの)
|
|
29
|
+
* - `z-auto!` 上流は `z-index: 100000` を書く。層を持たないので剥がす
|
|
30
|
+
* - `max-h-none!` 上流は viewport 収まりで高さを刻むが、フローなら刻む理由がない
|
|
31
|
+
* - `w-auto!` トリガ幅の計算値を捨て、中身とレイアウトに任せる
|
|
32
|
+
* - `transform-none!` 出現時の変形も打ち消す。動きで飾らない(FR-11)
|
|
33
|
+
*/
|
|
34
|
+
const INFLOW_POPOVER_RESET = "static! z-auto! max-h-none! w-auto! transform-none!";
|
|
35
|
+
/**
|
|
36
|
+
* 開いた瞬間に画面外へはみ出していれば最小限だけスクロールし、
|
|
37
|
+
* **そのスクロールで自分が閉じないようにする。**
|
|
38
|
+
*
|
|
39
|
+
* インフロー展開は下方向に伸びるので、ページ末尾のトリガでは中身が折り返しの外に出る。
|
|
40
|
+
* `block: 'nearest'` なのは意図で、`'center'` や `'start'` はトリガまで動かしてしまい、
|
|
41
|
+
* 「押し下げた」という因果が見えなくなる。**見えるところまでしか動かさない。**
|
|
42
|
+
*
|
|
43
|
+
* 見張りを先に張るのは、上流(`useCloseOnScroll`)が非モーダル Popover を
|
|
44
|
+
* スクロールで閉じるから。アンカー型なら正しい判断だが、インフロー展開は
|
|
45
|
+
* 文書と一緒に動くのでずれようがない。自前のスクロールで即座に閉じてしまうし、
|
|
46
|
+
* 長い一覧を読むために送っただけで畳まれるのはモデルの否定になる。
|
|
47
|
+
*
|
|
48
|
+
* 捕捉リスナは上流より先に登録される(子の effect が先に走る)ので、
|
|
49
|
+
* 上流が `close` を呼ぶ時点では必ず旗が立っている。
|
|
50
|
+
*
|
|
51
|
+
* 押している最中は動かさず、離すまで待つ。Select は押し下げたまま項目へ滑らせて
|
|
52
|
+
* 離す操作を受けるので、指の下でページが動くとそのまま誤選択になる。
|
|
53
|
+
*
|
|
54
|
+
* Popover は閉じている間アンマウントされるので、この効果は開閉ごとに1度だけ走る。
|
|
55
|
+
*/
|
|
56
|
+
function InflowScroll({ target, scrolling, pressed }) {
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
const raise = () => {
|
|
59
|
+
scrolling.current = true;
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
scrolling.current = false;
|
|
62
|
+
}, 0);
|
|
63
|
+
};
|
|
64
|
+
const scroll = () => target.scrollIntoView({ block: "nearest" });
|
|
65
|
+
window.addEventListener("scroll", raise, true);
|
|
66
|
+
if (pressed.current) window.addEventListener("pointerup", scroll, {
|
|
67
|
+
once: true,
|
|
68
|
+
capture: true
|
|
69
|
+
});
|
|
70
|
+
else scroll();
|
|
71
|
+
return () => {
|
|
72
|
+
window.removeEventListener("scroll", raise, true);
|
|
73
|
+
window.removeEventListener("pointerup", scroll, true);
|
|
74
|
+
};
|
|
75
|
+
}, [
|
|
76
|
+
target,
|
|
77
|
+
scrolling,
|
|
78
|
+
pressed
|
|
79
|
+
]);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* ポインタが押されている間だけ立つ旗。
|
|
84
|
+
*
|
|
85
|
+
* 展開は pointerdown で始まるので、押されたことを知るには**開く前から**張っておく
|
|
86
|
+
* 必要がある。`InflowPopover` 自体は閉じている間も生きているのでここに置ける。
|
|
87
|
+
*/
|
|
88
|
+
function usePressed() {
|
|
89
|
+
const pressed = useRef(false);
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
const down = () => {
|
|
92
|
+
pressed.current = true;
|
|
93
|
+
};
|
|
94
|
+
const up = () => {
|
|
95
|
+
pressed.current = false;
|
|
96
|
+
};
|
|
97
|
+
window.addEventListener("pointerdown", down, true);
|
|
98
|
+
window.addEventListener("pointerup", up, true);
|
|
99
|
+
window.addEventListener("pointercancel", up, true);
|
|
100
|
+
return () => {
|
|
101
|
+
window.removeEventListener("pointerdown", down, true);
|
|
102
|
+
window.removeEventListener("pointerup", up, true);
|
|
103
|
+
window.removeEventListener("pointercancel", up, true);
|
|
104
|
+
};
|
|
105
|
+
}, []);
|
|
106
|
+
return pressed;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* スクロール中に来た `close` だけを捨てる状態を作る。
|
|
110
|
+
*
|
|
111
|
+
* 上流には close-on-scroll を切る口が無い(`isNonModal` と抱き合わせ)。
|
|
112
|
+
* Escape・外側クリック・選択による `close` はそのまま通す。
|
|
113
|
+
*/
|
|
114
|
+
function useScrollGuardedState(scrolling) {
|
|
115
|
+
const state = useContext(OverlayTriggerStateContext);
|
|
116
|
+
return useMemo(() => state === null ? null : {
|
|
117
|
+
...state,
|
|
118
|
+
close: () => {
|
|
119
|
+
if (!scrolling.current) state.close();
|
|
120
|
+
}
|
|
121
|
+
}, [state, scrolling]);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Select / Menu / Popover の展開部をフローに置くための包み。
|
|
125
|
+
*
|
|
126
|
+
* `isNonModal` は必須。モーダルにすると背後が inert になり、
|
|
127
|
+
* 「押し下げられた後続」を読むことも触ることもできなくなって、
|
|
128
|
+
* インフローにした意味が消える。
|
|
129
|
+
*/
|
|
130
|
+
function InflowPopover({ children, className, dataSlot }) {
|
|
131
|
+
const [container, setContainer] = useState(null);
|
|
132
|
+
const scrolling = useRef(false);
|
|
133
|
+
const pressed = usePressed();
|
|
134
|
+
const state = useScrollGuardedState(scrolling);
|
|
135
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
136
|
+
ref: setContainer,
|
|
137
|
+
"data-novi-inflow": ""
|
|
138
|
+
}), container !== null && /* @__PURE__ */ jsx(OverlayTriggerStateContext.Provider, {
|
|
139
|
+
value: state,
|
|
140
|
+
children: /* @__PURE__ */ jsxs(Popover, {
|
|
141
|
+
isNonModal: true,
|
|
142
|
+
...inflowPortalProps(container),
|
|
143
|
+
"data-slot": dataSlot,
|
|
144
|
+
className: className === void 0 ? INFLOW_POPOVER_RESET : `${INFLOW_POPOVER_RESET} ${className}`,
|
|
145
|
+
children: [/* @__PURE__ */ jsx(InflowScroll, {
|
|
146
|
+
target: container,
|
|
147
|
+
scrolling,
|
|
148
|
+
pressed
|
|
149
|
+
}), children]
|
|
150
|
+
})
|
|
151
|
+
})] });
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { InflowPopover };
|
|
155
|
+
|
|
156
|
+
//# sourceMappingURL=inflow.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inflow.mjs","names":[],"sources":["../../src/styles/inflow.tsx"],"sourcesContent":["'use client'\n\nimport { inflowPortalProps } from '@novi-ui/core/client'\nimport {\n type ReactNode,\n type RefObject,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { OverlayTriggerStateContext, Popover } from 'react-aria-components'\n\n/**\n * オーバーレイをドキュメントフローの中に展開する(FR-05 / FR-09)。\n *\n * Flatlay は z 軸を持たない。**開く = 場所を取る**。Select も Menu も Popover も、\n * 開いたら後続を押し下げる。浮いてこないので「どこかが隠れている」が起きない。\n *\n * 実装は **Popover を捨てず、置き場所だけ変える**。理由はスパイクで2案を潰したから:\n * - 開いた時だけ中身をマウントする → Select のコレクションが空になり、そもそも開かない\n * - 常時マウントして hidden で隠す → 閉じている間 option が描画されず、\n * 開いた瞬間のフォーカス初期化とトリガの keydown 分岐が Popover 前提で壊れる\n *\n * `INFLOW_PORTAL_PROP`(core が封じ込めた上流の不安定 prop)でトリガ直後の\n * フロー内コンテナへポータルし、`useOverlayPosition` が書き込むインラインの\n * `position: absolute / top / left` を `static!` で無効化する。\n * FocusScope・キーボード操作・コレクション・Escape・フォーカス復帰は\n * すべて RAC 本来の経路のまま生き、**描画位置だけがフローに落ちる**。\n */\n\n/**\n * 上流が書き込むインラインスタイルを打ち消す。**`!` はここでの必需品。**\n *\n * `useOverlayPosition` は `style` 属性に直接書き込むため、クラスの詳細度では勝てない。\n * - `static!` 浮かせない。フローに戻す(これが原理そのもの)\n * - `z-auto!` 上流は `z-index: 100000` を書く。層を持たないので剥がす\n * - `max-h-none!` 上流は viewport 収まりで高さを刻むが、フローなら刻む理由がない\n * - `w-auto!` トリガ幅の計算値を捨て、中身とレイアウトに任せる\n * - `transform-none!` 出現時の変形も打ち消す。動きで飾らない(FR-11)\n */\nconst INFLOW_POPOVER_RESET = 'static! z-auto! max-h-none! w-auto! transform-none!'\n\n/**\n * 開いた瞬間に画面外へはみ出していれば最小限だけスクロールし、\n * **そのスクロールで自分が閉じないようにする。**\n *\n * インフロー展開は下方向に伸びるので、ページ末尾のトリガでは中身が折り返しの外に出る。\n * `block: 'nearest'` なのは意図で、`'center'` や `'start'` はトリガまで動かしてしまい、\n * 「押し下げた」という因果が見えなくなる。**見えるところまでしか動かさない。**\n *\n * 見張りを先に張るのは、上流(`useCloseOnScroll`)が非モーダル Popover を\n * スクロールで閉じるから。アンカー型なら正しい判断だが、インフロー展開は\n * 文書と一緒に動くのでずれようがない。自前のスクロールで即座に閉じてしまうし、\n * 長い一覧を読むために送っただけで畳まれるのはモデルの否定になる。\n *\n * 捕捉リスナは上流より先に登録される(子の effect が先に走る)ので、\n * 上流が `close` を呼ぶ時点では必ず旗が立っている。\n *\n * 押している最中は動かさず、離すまで待つ。Select は押し下げたまま項目へ滑らせて\n * 離す操作を受けるので、指の下でページが動くとそのまま誤選択になる。\n *\n * Popover は閉じている間アンマウントされるので、この効果は開閉ごとに1度だけ走る。\n */\nfunction InflowScroll({\n target,\n scrolling,\n pressed,\n}: {\n target: HTMLElement\n scrolling: RefObject<boolean>\n pressed: RefObject<boolean>\n}): null {\n useEffect(() => {\n const raise = () => {\n scrolling.current = true\n // 上流のリスナは同じイベントの中で走る。タスクを跨いだ時点で降ろす\n setTimeout(() => {\n scrolling.current = false\n }, 0)\n }\n const scroll = () => target.scrollIntoView({ block: 'nearest' })\n\n window.addEventListener('scroll', raise, true)\n if (pressed.current) window.addEventListener('pointerup', scroll, { once: true, capture: true })\n else scroll()\n\n return () => {\n window.removeEventListener('scroll', raise, true)\n window.removeEventListener('pointerup', scroll, true)\n }\n }, [target, scrolling, pressed])\n return null\n}\n\n/**\n * ポインタが押されている間だけ立つ旗。\n *\n * 展開は pointerdown で始まるので、押されたことを知るには**開く前から**張っておく\n * 必要がある。`InflowPopover` 自体は閉じている間も生きているのでここに置ける。\n */\nfunction usePressed(): RefObject<boolean> {\n const pressed = useRef(false)\n\n useEffect(() => {\n const down = () => {\n pressed.current = true\n }\n const up = () => {\n pressed.current = false\n }\n window.addEventListener('pointerdown', down, true)\n window.addEventListener('pointerup', up, true)\n window.addEventListener('pointercancel', up, true)\n return () => {\n window.removeEventListener('pointerdown', down, true)\n window.removeEventListener('pointerup', up, true)\n window.removeEventListener('pointercancel', up, true)\n }\n }, [])\n\n return pressed\n}\n\n/**\n * スクロール中に来た `close` だけを捨てる状態を作る。\n *\n * 上流には close-on-scroll を切る口が無い(`isNonModal` と抱き合わせ)。\n * Escape・外側クリック・選択による `close` はそのまま通す。\n */\nfunction useScrollGuardedState(scrolling: RefObject<boolean>) {\n const state = useContext(OverlayTriggerStateContext)\n\n return useMemo(\n () =>\n state === null\n ? null\n : {\n ...state,\n close: () => {\n if (!scrolling.current) state.close()\n },\n },\n [state, scrolling],\n )\n}\n\nexport interface InflowPopoverProps {\n children: ReactNode\n /** 展開部そのものに乗せるクラス。枠線や余白はテーマ側の styles が渡す。 */\n className?: string\n /**\n * 展開面に出す `data-slot`。押し下げ面は slot 契約上の `popover` そのものなので、\n * 名前は呼び出し側(各コンポーネント)が決める。\n */\n dataSlot?: string\n}\n\n/**\n * Select / Menu / Popover の展開部をフローに置くための包み。\n *\n * `isNonModal` は必須。モーダルにすると背後が inert になり、\n * 「押し下げられた後続」を読むことも触ることもできなくなって、\n * インフローにした意味が消える。\n */\nexport function InflowPopover({ children, className, dataSlot }: InflowPopoverProps) {\n const [container, setContainer] = useState<HTMLElement | null>(null)\n const scrolling = useRef(false)\n const pressed = usePressed()\n const state = useScrollGuardedState(scrolling)\n\n return (\n <>\n {/* 展開部の置き場所。閉じている間は高さ 0 で、押し下げは起きない */}\n <div ref={setContainer} data-novi-inflow=\"\" />\n {container !== null && (\n <OverlayTriggerStateContext.Provider value={state}>\n <Popover\n isNonModal\n {...inflowPortalProps(container)}\n data-slot={dataSlot}\n className={\n className === undefined\n ? INFLOW_POPOVER_RESET\n : `${INFLOW_POPOVER_RESET} ${className}`\n }\n >\n <InflowScroll target={container} scrolling={scrolling} pressed={pressed} />\n {children}\n </Popover>\n </OverlayTriggerStateContext.Provider>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;AAuB7B,SAAS,aAAa,EACpB,QACA,WACA,WAKO;CACP,gBAAgB;EACd,MAAM,cAAc;GAClB,UAAU,UAAU;GAEpB,iBAAiB;IACf,UAAU,UAAU;GACtB,GAAG,CAAC;EACN;EACA,MAAM,eAAe,OAAO,eAAe,EAAE,OAAO,UAAU,CAAC;EAE/D,OAAO,iBAAiB,UAAU,OAAO,IAAI;EAC7C,IAAI,QAAQ,SAAS,OAAO,iBAAiB,aAAa,QAAQ;GAAE,MAAM;GAAM,SAAS;EAAK,CAAC;OAC1F,OAAO;EAEZ,aAAa;GACX,OAAO,oBAAoB,UAAU,OAAO,IAAI;GAChD,OAAO,oBAAoB,aAAa,QAAQ,IAAI;EACtD;CACF,GAAG;EAAC;EAAQ;EAAW;CAAO,CAAC;CAC/B,OAAO;AACT;;;;;;;AAQA,SAAS,aAAiC;CACxC,MAAM,UAAU,OAAO,KAAK;CAE5B,gBAAgB;EACd,MAAM,aAAa;GACjB,QAAQ,UAAU;EACpB;EACA,MAAM,WAAW;GACf,QAAQ,UAAU;EACpB;EACA,OAAO,iBAAiB,eAAe,MAAM,IAAI;EACjD,OAAO,iBAAiB,aAAa,IAAI,IAAI;EAC7C,OAAO,iBAAiB,iBAAiB,IAAI,IAAI;EACjD,aAAa;GACX,OAAO,oBAAoB,eAAe,MAAM,IAAI;GACpD,OAAO,oBAAoB,aAAa,IAAI,IAAI;GAChD,OAAO,oBAAoB,iBAAiB,IAAI,IAAI;EACtD;CACF,GAAG,CAAC,CAAC;CAEL,OAAO;AACT;;;;;;;AAQA,SAAS,sBAAsB,WAA+B;CAC5D,MAAM,QAAQ,WAAW,0BAA0B;CAEnD,OAAO,cAEH,UAAU,OACN,OACA;EACE,GAAG;EACH,aAAa;GACX,IAAI,CAAC,UAAU,SAAS,MAAM,MAAM;EACtC;CACF,GACN,CAAC,OAAO,SAAS,CACnB;AACF;;;;;;;;AAoBA,SAAgB,cAAc,EAAE,UAAU,WAAW,YAAgC;CACnF,MAAM,CAAC,WAAW,gBAAgB,SAA6B,IAAI;CACnE,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,UAAU,WAAW;CAC3B,MAAM,QAAQ,sBAAsB,SAAS;CAE7C,OACE,qBAAA,UAAA,EAAA,UAAA,CAEE,oBAAC,OAAD;EAAK,KAAK;EAAc,oBAAiB;CAAI,CAAA,GAC5C,cAAc,QACb,oBAAC,2BAA2B,UAA5B;EAAqC,OAAO;EAC1C,UAAA,qBAAC,SAAD;GACE,YAAA;GACA,GAAI,kBAAkB,SAAS;GAC/B,aAAW;GACX,WACE,cAAc,KAAA,IACV,uBACA,GAAG,qBAAqB,GAAG;GAPnC,UAAA,CAUE,oBAAC,cAAD;IAAc,QAAQ;IAAsB;IAAoB;GAAU,CAAA,GACzE,QACM;;CAC0B,CAAA,CAEvC,EAAA,CAAA;AAEN"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/styles/mono.ts
|
|
2
|
+
/**
|
|
3
|
+
* 等幅の断片(ADR-F7)。**Flatlay のタイポの声はここに集約する。**
|
|
4
|
+
*
|
|
5
|
+
* 影も奥行きも持たないテーマで、階層の次に効く区別が書体の切り替えになる。
|
|
6
|
+
* 帳票や伝票がそうであるように、「読ませる文」と「読み取らせる値」は別の顔を持つ。
|
|
7
|
+
*
|
|
8
|
+
* Web フォントは同梱しない(依存ゼロ原則)。`--novi-font-mono` に精度の高い
|
|
9
|
+
* システムスタックを積み、各 slot はこの断片経由でのみそれを消費する。
|
|
10
|
+
* 個別に `font-mono` と書くと Tailwind 既定のスタックに落ち、トークンを外れる。
|
|
11
|
+
*/
|
|
12
|
+
/** 等幅の地。コード・ショートカット・記号インジケータなど、値ではない等幅に使う。 */
|
|
13
|
+
const mono = "font-(family-name:--novi-font-mono)";
|
|
14
|
+
/**
|
|
15
|
+
* 数値用。**桁が縦に揃うことが情報になる**列(金額・件数・進捗)に使う。
|
|
16
|
+
*
|
|
17
|
+
* `tabular-nums` を等幅と併せるのは、等幅フォントでも比例数字を持つ環境があるため。
|
|
18
|
+
* 揃わない数字は、書類として読むときに一覧性を丸ごと失う。
|
|
19
|
+
*/
|
|
20
|
+
const monoNumeric = `${mono} tabular-nums`;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { mono, monoNumeric };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=mono.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mono.mjs","names":[],"sources":["../../src/styles/mono.ts"],"sourcesContent":["/**\n * 等幅の断片(ADR-F7)。**Flatlay のタイポの声はここに集約する。**\n *\n * 影も奥行きも持たないテーマで、階層の次に効く区別が書体の切り替えになる。\n * 帳票や伝票がそうであるように、「読ませる文」と「読み取らせる値」は別の顔を持つ。\n *\n * Web フォントは同梱しない(依存ゼロ原則)。`--novi-font-mono` に精度の高い\n * システムスタックを積み、各 slot はこの断片経由でのみそれを消費する。\n * 個別に `font-mono` と書くと Tailwind 既定のスタックに落ち、トークンを外れる。\n */\n\n/** 等幅の地。コード・ショートカット・記号インジケータなど、値ではない等幅に使う。 */\nexport const mono = 'font-(family-name:--novi-font-mono)'\n\n/**\n * 数値用。**桁が縦に揃うことが情報になる**列(金額・件数・進捗)に使う。\n *\n * `tabular-nums` を等幅と併せるのは、等幅フォントでも比例数字を持つ環境があるため。\n * 揃わない数字は、書類として読むときに一覧性を丸ごと失う。\n */\nexport const monoNumeric = `${mono} tabular-nums`\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,OAAO;;;;;;;AAQpB,MAAa,cAAc,GAAG,KAAK"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SwitchProps } from "@novi-ui/core";
|
|
2
|
+
//#region src/switch/switch.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* オン / オフの切り替え。
|
|
5
|
+
*
|
|
6
|
+
* Flatlay では**矩形のトラックに矩形のつまみ**で表示する。つまみは滑らず、
|
|
7
|
+
* 左端と右端を即座に行き来する(FR-11)。形が見慣れないぶん状態が
|
|
8
|
+
* 読み取りにくいため、ラベルの併記を強く推奨する。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* <Switch isSelected={enabled} onChange={setEnabled}>
|
|
12
|
+
* メール通知を受け取る
|
|
13
|
+
* </Switch>
|
|
14
|
+
*/
|
|
15
|
+
declare function Switch({ size, color, name, value, isSelected, defaultSelected, onChange, isDisabled, isReadOnly, description, children, className, classNames, id }: SwitchProps): import("react").JSX.Element;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Switch };
|
|
18
|
+
//# sourceMappingURL=switch.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.d.mts","names":[],"sources":["../../src/switch/switch.tsx"],"mappings":";;;;;;;;;;;;;;iBAkBgB,SACd,MACA,OACA,MACA,OACA,YACA,iBACA,UACA,YACA,YACA,aACA,UACA,WACA,YACA,MACC,8BAAW,IAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { switchStyles } from "./switch.styles.mjs";
|
|
3
|
+
import { Switch } from "react-aria-components";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/switch/switch.tsx
|
|
6
|
+
/**
|
|
7
|
+
* オン / オフの切り替え。
|
|
8
|
+
*
|
|
9
|
+
* Flatlay では**矩形のトラックに矩形のつまみ**で表示する。つまみは滑らず、
|
|
10
|
+
* 左端と右端を即座に行き来する(FR-11)。形が見慣れないぶん状態が
|
|
11
|
+
* 読み取りにくいため、ラベルの併記を強く推奨する。
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* <Switch isSelected={enabled} onChange={setEnabled}>
|
|
15
|
+
* メール通知を受け取る
|
|
16
|
+
* </Switch>
|
|
17
|
+
*/
|
|
18
|
+
function Switch$1({ size, color, name, value, isSelected, defaultSelected, onChange, isDisabled, isReadOnly, description, children, className, classNames, id }) {
|
|
19
|
+
const s = switchStyles({
|
|
20
|
+
size,
|
|
21
|
+
color
|
|
22
|
+
});
|
|
23
|
+
return /* @__PURE__ */ jsxs(Switch, {
|
|
24
|
+
id,
|
|
25
|
+
name,
|
|
26
|
+
value,
|
|
27
|
+
isSelected,
|
|
28
|
+
defaultSelected,
|
|
29
|
+
onChange,
|
|
30
|
+
isDisabled,
|
|
31
|
+
isReadOnly,
|
|
32
|
+
"data-slot": "root",
|
|
33
|
+
className: `group ${s.root({ class: [className, classNames?.root] })}`,
|
|
34
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
35
|
+
"data-slot": "track",
|
|
36
|
+
className: s.track({ class: classNames?.track }),
|
|
37
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
38
|
+
"data-slot": "thumb",
|
|
39
|
+
className: s.thumb({ class: classNames?.thumb })
|
|
40
|
+
})
|
|
41
|
+
}), children !== void 0 && /* @__PURE__ */ jsxs("span", {
|
|
42
|
+
className: "flex flex-col gap-0.5",
|
|
43
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
44
|
+
"data-slot": "label",
|
|
45
|
+
className: s.label({ class: classNames?.label }),
|
|
46
|
+
children
|
|
47
|
+
}), description !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
48
|
+
"data-slot": "description",
|
|
49
|
+
className: s.description({ class: classNames?.description }),
|
|
50
|
+
children: description
|
|
51
|
+
})]
|
|
52
|
+
})]
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { Switch$1 as Switch };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=switch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.mjs","names":["Switch","RACSwitch"],"sources":["../../src/switch/switch.tsx"],"sourcesContent":["'use client'\n\nimport type { SwitchProps } from '@novi-ui/core'\nimport { Switch as RACSwitch } from 'react-aria-components'\nimport { switchStyles } from './switch.styles'\n\n/**\n * オン / オフの切り替え。\n *\n * Flatlay では**矩形のトラックに矩形のつまみ**で表示する。つまみは滑らず、\n * 左端と右端を即座に行き来する(FR-11)。形が見慣れないぶん状態が\n * 読み取りにくいため、ラベルの併記を強く推奨する。\n *\n * @example\n * <Switch isSelected={enabled} onChange={setEnabled}>\n * メール通知を受け取る\n * </Switch>\n */\nexport function Switch({\n size,\n color,\n name,\n value,\n isSelected,\n defaultSelected,\n onChange,\n isDisabled,\n isReadOnly,\n description,\n children,\n className,\n classNames,\n id,\n}: SwitchProps) {\n const s = switchStyles({ size, color })\n\n return (\n <RACSwitch\n id={id}\n name={name}\n value={value}\n isSelected={isSelected}\n defaultSelected={defaultSelected}\n onChange={onChange}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n data-slot=\"root\"\n // track / thumb 側から選択状態と押下を参照するために group を付ける\n className={`group ${s.root({ class: [className, classNames?.root] })}`}\n >\n <span data-slot=\"track\" className={s.track({ class: classNames?.track })}>\n <span data-slot=\"thumb\" className={s.thumb({ class: classNames?.thumb })} />\n </span>\n\n {children !== undefined && (\n <span className=\"flex flex-col gap-0.5\">\n <span data-slot=\"label\" className={s.label({ class: classNames?.label })}>\n {children}\n </span>\n {description !== undefined && (\n <span\n data-slot=\"description\"\n className={s.description({ class: classNames?.description })}\n >\n {description}\n </span>\n )}\n </span>\n )}\n </RACSwitch>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgBA,SAAO,EACrB,MACA,OACA,MACA,OACA,YACA,iBACA,UACA,YACA,YACA,aACA,UACA,WACA,YACA,MACc;CACd,MAAM,IAAI,aAAa;EAAE;EAAM;CAAM,CAAC;CAEtC,OACE,qBAACC,QAAD;EACM;EACE;EACC;EACK;EACK;EACP;EACE;EACA;EACZ,aAAU;EAEV,WAAW,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC;EAXrE,UAAA,CAaE,oBAAC,QAAD;GAAM,aAAU;GAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GACrE,UAAA,oBAAC,QAAD;IAAM,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;GAAI,CAAA;EACvE,CAAA,GAEL,aAAa,KAAA,KACZ,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,oBAAC,QAAD;IAAM,aAAU;IAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,YAAY,MAAM,CAAC;IACpE;GACG,CAAA,GACL,gBAAgB,KAAA,KACf,oBAAC,QAAD;IACE,aAAU;IACV,WAAW,EAAE,YAAY,EAAE,OAAO,YAAY,YAAY,CAAC;IAE1D,UAAA;GACG,CAAA,CAEJ;EAEC,CAAA,CAAA;;AAEf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { VariantMap } from "@novi-ui/core";
|
|
2
|
+
//#region src/switch/switch.styles.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Switch のスタイル定義。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })
|
|
8
|
+
*/
|
|
9
|
+
declare const switchStyles: import("tailwind-variants").TVReturnType<{
|
|
10
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
11
|
+
root: string;
|
|
12
|
+
}>;
|
|
13
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
14
|
+
track: string;
|
|
15
|
+
thumb: string;
|
|
16
|
+
label: string;
|
|
17
|
+
}>;
|
|
18
|
+
}, {
|
|
19
|
+
root: string;
|
|
20
|
+
track: string;
|
|
21
|
+
thumb: string;
|
|
22
|
+
label: string;
|
|
23
|
+
description: string;
|
|
24
|
+
}, undefined, {
|
|
25
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
26
|
+
root: string;
|
|
27
|
+
}>;
|
|
28
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
29
|
+
track: string;
|
|
30
|
+
thumb: string;
|
|
31
|
+
label: string;
|
|
32
|
+
}>;
|
|
33
|
+
}, {
|
|
34
|
+
root: string;
|
|
35
|
+
track: string;
|
|
36
|
+
thumb: string;
|
|
37
|
+
label: string;
|
|
38
|
+
description: string;
|
|
39
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
40
|
+
color: VariantMap<"default" | "primary" | "secondary" | "success" | "warning" | "danger", {
|
|
41
|
+
root: string;
|
|
42
|
+
}>;
|
|
43
|
+
size: VariantMap<"sm" | "md" | "lg", {
|
|
44
|
+
track: string;
|
|
45
|
+
thumb: string;
|
|
46
|
+
label: string;
|
|
47
|
+
}>;
|
|
48
|
+
}, {
|
|
49
|
+
root: string;
|
|
50
|
+
track: string;
|
|
51
|
+
thumb: string;
|
|
52
|
+
label: string;
|
|
53
|
+
description: string;
|
|
54
|
+
}>>;
|
|
55
|
+
type SwitchStyleProps = Parameters<typeof switchStyles>[0];
|
|
56
|
+
//#endregion
|
|
57
|
+
export { SwitchStyleProps, switchStyles };
|
|
58
|
+
//# sourceMappingURL=switch.styles.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.styles.d.mts","names":[],"sources":["../../src/switch/switch.styles.ts"],"mappings":";;;;;;;;cA2Ea,0CAAY;;IAzBkB;;;IAaD;IAAe;IAAe;;;;;;;;;;IAb7B;;;IAaD;IAAe;IAAe;;;;;;;;;;IAb7B;;;IAaD;IAAe;IAAe;;;;;;;;;KAkB5D,mBAAmB,kBAAkB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { disabledState, focusRing } from "../styles/focus-ring.mjs";
|
|
2
|
+
import { tv } from "tailwind-variants";
|
|
3
|
+
//#region src/switch/switch.styles.ts
|
|
4
|
+
/**
|
|
5
|
+
* Flatlay の Switch は**矩形のトラックに矩形のつまみ**。両テーマがピル型なのに対して
|
|
6
|
+
* ここだけ角が立つ。Radio の円が例外だったのと逆に、Switch には円を許す理由が無い。
|
|
7
|
+
*
|
|
8
|
+
* つまみは `translate` で滑らない(FR-11 で transform 全面禁止)。左右の寄せを
|
|
9
|
+
* 入れ替えるだけで、位置は**即座に**切り替わる。滑走はレールの上をモノが動く表現=
|
|
10
|
+
* 奥行きの語彙で、押し下げに transition を付けないのと同じ理由でここでも使わない。
|
|
11
|
+
*
|
|
12
|
+
* 形が見慣れないぶん ON/OFF が読み取りにくいので、**ラベルの併記を強く推奨**する。
|
|
13
|
+
*/
|
|
14
|
+
const slots = {
|
|
15
|
+
root: [
|
|
16
|
+
"inline-flex items-center gap-2",
|
|
17
|
+
"cursor-pointer",
|
|
18
|
+
disabledState
|
|
19
|
+
].join(" "),
|
|
20
|
+
track: [
|
|
21
|
+
"shrink-0 inline-flex items-center",
|
|
22
|
+
"justify-start group-data-[selected]:justify-end",
|
|
23
|
+
"rounded-[var(--novi-radius-sm)]",
|
|
24
|
+
"border border-[var(--novi-color-border-strong)]",
|
|
25
|
+
"bg-[var(--novi-color-bg)]",
|
|
26
|
+
"group-data-[selected]:bg-[var(--c)] group-data-[selected]:border-[var(--c)]",
|
|
27
|
+
"group-data-[pressed]:bg-[var(--c-fg)] group-data-[pressed]:border-[var(--c)]",
|
|
28
|
+
"transition-[background-color,border-color]",
|
|
29
|
+
"duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]",
|
|
30
|
+
focusRing
|
|
31
|
+
].join(" "),
|
|
32
|
+
thumb: [
|
|
33
|
+
"rounded-[var(--novi-radius-none)]",
|
|
34
|
+
"bg-[var(--novi-color-border-strong)]",
|
|
35
|
+
"group-data-[selected]:bg-[var(--novi-color-bg)]",
|
|
36
|
+
"group-data-[pressed]:bg-[var(--c)]",
|
|
37
|
+
"transition-[background-color]",
|
|
38
|
+
"duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]"
|
|
39
|
+
].join(" "),
|
|
40
|
+
label: "text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]",
|
|
41
|
+
description: "text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]"
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Switch のスタイル定義。
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })
|
|
48
|
+
*/
|
|
49
|
+
const switchStyles = tv({
|
|
50
|
+
slots,
|
|
51
|
+
variants: {
|
|
52
|
+
color: {
|
|
53
|
+
default: { root: "[--c:var(--novi-color-fg)] [--c-fg:var(--novi-color-bg)]" },
|
|
54
|
+
primary: { root: "[--c:var(--novi-color-primary)] [--c-fg:var(--novi-color-primary-fg)]" },
|
|
55
|
+
secondary: { root: "[--c:var(--novi-color-secondary)] [--c-fg:var(--novi-color-secondary-fg)]" },
|
|
56
|
+
success: { root: "[--c:var(--novi-color-success)] [--c-fg:var(--novi-color-success-fg)]" },
|
|
57
|
+
warning: { root: "[--c:var(--novi-color-warning)] [--c-fg:var(--novi-color-warning-fg)]" },
|
|
58
|
+
danger: { root: "[--c:var(--novi-color-danger)] [--c-fg:var(--novi-color-danger-fg)]" }
|
|
59
|
+
},
|
|
60
|
+
size: {
|
|
61
|
+
sm: {
|
|
62
|
+
track: "h-3 w-6 p-px",
|
|
63
|
+
thumb: "size-2",
|
|
64
|
+
label: "text-[length:var(--novi-text-sm)]"
|
|
65
|
+
},
|
|
66
|
+
md: {
|
|
67
|
+
track: "h-3.5 w-7 p-px",
|
|
68
|
+
thumb: "size-2.5",
|
|
69
|
+
label: "text-[length:var(--novi-text-base)]"
|
|
70
|
+
},
|
|
71
|
+
lg: {
|
|
72
|
+
track: "h-4.5 w-9 p-px",
|
|
73
|
+
thumb: "size-3.5",
|
|
74
|
+
label: "text-[length:var(--novi-text-base)]"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
defaultVariants: {
|
|
79
|
+
color: "default",
|
|
80
|
+
size: "md"
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
//#endregion
|
|
84
|
+
export { switchStyles };
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=switch.styles.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch.styles.mjs","names":[],"sources":["../../src/switch/switch.styles.ts"],"sourcesContent":["import type {\n NoviColor,\n NoviSize,\n SlotMap,\n switchRequiredSlots,\n switchSlots,\n VariantMap,\n} from '@novi-ui/core'\nimport { tv } from 'tailwind-variants'\nimport { disabledState, focusRing } from '../styles/focus-ring'\n\n/**\n * Flatlay の Switch は**矩形のトラックに矩形のつまみ**。両テーマがピル型なのに対して\n * ここだけ角が立つ。Radio の円が例外だったのと逆に、Switch には円を許す理由が無い。\n *\n * つまみは `translate` で滑らない(FR-11 で transform 全面禁止)。左右の寄せを\n * 入れ替えるだけで、位置は**即座に**切り替わる。滑走はレールの上をモノが動く表現=\n * 奥行きの語彙で、押し下げに transition を付けないのと同じ理由でここでも使わない。\n *\n * 形が見慣れないぶん ON/OFF が読み取りにくいので、**ラベルの併記を強く推奨**する。\n */\nconst slots = {\n root: ['inline-flex items-center gap-2', 'cursor-pointer', disabledState].join(' '),\n track: [\n 'shrink-0 inline-flex items-center',\n // つまみは寄せで動かす。OFF は左端、ON は右端に即座に立つ\n 'justify-start group-data-[selected]:justify-end',\n 'rounded-[var(--novi-radius-sm)]',\n 'border border-[var(--novi-color-border-strong)]',\n 'bg-[var(--novi-color-bg)]',\n 'group-data-[selected]:bg-[var(--c)] group-data-[selected]:border-[var(--c)]',\n // 押下は反転(ADR-F3)。地とつまみが入れ替わる\n 'group-data-[pressed]:bg-[var(--c-fg)] group-data-[pressed]:border-[var(--c)]',\n 'transition-[background-color,border-color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n focusRing,\n ].join(' '),\n // つまみも矩形。ON では地色で抜き、OFF では罫線と同じ色の塊にする\n thumb: [\n 'rounded-[var(--novi-radius-none)]',\n 'bg-[var(--novi-color-border-strong)]',\n 'group-data-[selected]:bg-[var(--novi-color-bg)]',\n 'group-data-[pressed]:bg-[var(--c)]',\n 'transition-[background-color]',\n 'duration-[var(--novi-duration-fast)] ease-[var(--novi-ease-standard)]',\n ].join(' '),\n label: 'text-[var(--novi-color-fg)] leading-[var(--novi-leading-body)]',\n description: 'text-[length:var(--novi-text-sm)] text-[var(--novi-color-muted)]',\n} satisfies SlotMap<typeof switchSlots, (typeof switchRequiredSlots)[number]>\n\nconst color: VariantMap<NoviColor, { root: string }> = {\n default: { root: '[--c:var(--novi-color-fg)] [--c-fg:var(--novi-color-bg)]' },\n primary: { root: '[--c:var(--novi-color-primary)] [--c-fg:var(--novi-color-primary-fg)]' },\n secondary: { root: '[--c:var(--novi-color-secondary)] [--c-fg:var(--novi-color-secondary-fg)]' },\n success: { root: '[--c:var(--novi-color-success)] [--c-fg:var(--novi-color-success-fg)]' },\n warning: { root: '[--c:var(--novi-color-warning)] [--c-fg:var(--novi-color-warning-fg)]' },\n danger: { root: '[--c:var(--novi-color-danger)] [--c-fg:var(--novi-color-danger-fg)]' },\n}\n\n/**\n * md が 28×14px。Button の高さ 28px を**横に倒した**寸法で、\n * 帳票の1行の中に置いても行が膨らまない。sm 24×12 / lg 36×18。\n */\nconst size: VariantMap<NoviSize, { track: string; thumb: string; label: string }> = {\n sm: { track: 'h-3 w-6 p-px', thumb: 'size-2', label: 'text-[length:var(--novi-text-sm)]' },\n md: { track: 'h-3.5 w-7 p-px', thumb: 'size-2.5', label: 'text-[length:var(--novi-text-base)]' },\n lg: { track: 'h-4.5 w-9 p-px', thumb: 'size-3.5', label: 'text-[length:var(--novi-text-base)]' },\n}\n\n/**\n * Switch のスタイル定義。\n *\n * @example\n * const mySwitch = tv({ extend: switchStyles, slots: { track: 'w-12' } })\n */\nexport const switchStyles = tv({\n slots,\n variants: { color, size },\n defaultVariants: { color: 'default', size: 'md' },\n})\n\nexport type SwitchStyleProps = Parameters<typeof switchStyles>[0]\n"],"mappings":";;;;;;;;;;;;;AAqBA,MAAM,QAAQ;CACZ,MAAM;EAAC;EAAkC;EAAkB;CAAa,CAAC,CAAC,KAAK,GAAG;CAClF,OAAO;EACL;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CAEV,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;CACV,OAAO;CACP,aAAa;AACf;;;;;;;AA2BA,MAAa,eAAe,GAAG;CAC7B;CACA,UAAU;EAAE;GA1BZ,SAAS,EAAE,MAAM,2DAA2D;GAC5E,SAAS,EAAE,MAAM,wEAAwE;GACzF,WAAW,EAAE,MAAM,4EAA4E;GAC/F,SAAS,EAAE,MAAM,wEAAwE;GACzF,SAAS,EAAE,MAAM,wEAAwE;GACzF,QAAQ,EAAE,MAAM,sEAAsE;EAqB1E;EAAO;GAbnB,IAAI;IAAE,OAAO;IAAgB,OAAO;IAAU,OAAO;GAAoC;GACzF,IAAI;IAAE,OAAO;IAAkB,OAAO;IAAY,OAAO;GAAsC;GAC/F,IAAI;IAAE,OAAO;IAAkB,OAAO;IAAY,OAAO;GAAsC;EAW5E;CAAK;CACxB,iBAAiB;EAAE,OAAO;EAAW,MAAM;CAAK;AAClD,CAAC"}
|