@krizaka/ui 2.0.0-beta.2 → 2.0.0-beta.3
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 +30 -0
- package/dist/alert.d.ts +2 -0
- package/dist/alert.js.map +1 -1
- package/dist/avatar.d.ts +5 -0
- package/dist/avatar.js.map +1 -1
- package/dist/badge.d.ts +12 -0
- package/dist/badge.js.map +1 -1
- package/dist/{button-G5qY4qSY.d.ts → button-8La7l0V4.d.ts} +15 -0
- package/dist/button.d.ts +19 -0
- package/dist/button.js.map +1 -1
- package/dist/card.d.ts +24 -1
- package/dist/card.js.map +1 -1
- package/dist/chip.d.ts +23 -0
- package/dist/chip.js.map +1 -1
- package/dist/{chunk-5FRYKFTO.js → chunk-3X5MVH54.js} +2 -2
- package/dist/chunk-3X5MVH54.js.map +1 -0
- package/dist/{chunk-QRG5RYEI.js → chunk-ZUD4U22H.js} +1 -1
- package/dist/chunk-ZUD4U22H.js.map +1 -0
- package/dist/command.d.ts +4 -1
- package/dist/command.js +2 -2
- package/dist/command.js.map +1 -1
- package/dist/confirm-button.d.ts +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/countdown.d.ts +3 -0
- package/dist/countdown.js.map +1 -1
- package/dist/{dialog-DGBY2grk.d.ts → dialog-GQ4Nvuyf.d.ts} +10 -0
- package/dist/dialog.d.ts +9 -1
- package/dist/dialog.js +2 -2
- package/dist/dialog.js.map +1 -1
- package/dist/dropdown-menu.d.ts +1 -0
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/empty-state.d.ts +2 -0
- package/dist/empty-state.js.map +1 -1
- package/dist/kbd.d.ts +7 -1
- package/dist/kbd.js.map +1 -1
- package/dist/page-header.d.ts +2 -0
- package/dist/page-header.js.map +1 -1
- package/dist/progress.d.ts +5 -0
- package/dist/progress.js.map +1 -1
- package/dist/skeleton.d.ts +7 -1
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.d.ts +2 -0
- package/dist/slider.js.map +1 -1
- package/dist/spinner.d.ts +5 -0
- package/dist/spinner.js.map +1 -1
- package/dist/stat.d.ts +2 -0
- package/dist/stat.js.map +1 -1
- package/dist/switch.d.ts +7 -3
- package/dist/switch.js.map +1 -1
- package/dist/tabs.d.ts +4 -1
- package/dist/tabs.js.map +1 -1
- package/dist/theme.d.ts +10 -2
- package/dist/theme.js +4 -2
- package/dist/theme.js.map +1 -1
- package/dist/tooltip.d.ts +3 -0
- package/dist/tooltip.js.map +1 -1
- package/package.json +14 -3
- package/registry/alert.json +59 -0
- package/registry/avatar.json +114 -0
- package/registry/badge.json +59 -0
- package/registry/button.json +115 -0
- package/registry/card.json +154 -0
- package/registry/checkbox.json +46 -0
- package/registry/chip.json +164 -0
- package/registry/cn.json +21 -0
- package/registry/command.json +162 -0
- package/registry/confirm-button.json +104 -0
- package/registry/countdown.json +84 -0
- package/registry/demos/alert.d.ts +5 -0
- package/registry/demos/alert.js +12 -0
- package/registry/demos/alert.tsx +15 -0
- package/registry/demos/avatar.d.ts +5 -0
- package/registry/demos/avatar.js +14 -0
- package/registry/demos/avatar.tsx +13 -0
- package/registry/demos/badge.d.ts +5 -0
- package/registry/demos/badge.js +11 -0
- package/registry/demos/badge.tsx +5 -0
- package/registry/demos/button.d.ts +5 -0
- package/registry/demos/button.js +11 -0
- package/registry/demos/button.tsx +5 -0
- package/registry/demos/card.d.ts +5 -0
- package/registry/demos/card.js +30 -0
- package/registry/demos/card.tsx +37 -0
- package/registry/demos/checkbox.d.ts +5 -0
- package/registry/demos/checkbox.js +11 -0
- package/registry/demos/checkbox.tsx +5 -0
- package/registry/demos/chip.d.ts +5 -0
- package/registry/demos/chip.js +15 -0
- package/registry/demos/chip.tsx +11 -0
- package/registry/demos/cn.d.ts +7 -0
- package/registry/demos/cn.js +17 -0
- package/registry/demos/cn.tsx +9 -0
- package/registry/demos/command.d.ts +5 -0
- package/registry/demos/command.js +32 -0
- package/registry/demos/command.tsx +28 -0
- package/registry/demos/confirm-button.d.ts +5 -0
- package/registry/demos/confirm-button.js +12 -0
- package/registry/demos/confirm-button.tsx +13 -0
- package/registry/demos/countdown.d.ts +5 -0
- package/registry/demos/countdown.js +13 -0
- package/registry/demos/countdown.tsx +10 -0
- package/registry/demos/dialog.d.ts +7 -0
- package/registry/demos/dialog.js +29 -0
- package/registry/demos/dialog.tsx +31 -0
- package/registry/demos/dropdown-menu.d.ts +7 -0
- package/registry/demos/dropdown-menu.js +36 -0
- package/registry/demos/dropdown-menu.tsx +27 -0
- package/registry/demos/empty-state.d.ts +5 -0
- package/registry/demos/empty-state.js +15 -0
- package/registry/demos/empty-state.tsx +12 -0
- package/registry/demos/field.d.ts +5 -0
- package/registry/demos/field.js +15 -0
- package/registry/demos/field.tsx +11 -0
- package/registry/demos/kbd.d.ts +5 -0
- package/registry/demos/kbd.js +11 -0
- package/registry/demos/kbd.tsx +5 -0
- package/registry/demos/page-header.d.ts +5 -0
- package/registry/demos/page-header.js +11 -0
- package/registry/demos/page-header.tsx +5 -0
- package/registry/demos/popover.d.ts +7 -0
- package/registry/demos/popover.js +25 -0
- package/registry/demos/popover.tsx +31 -0
- package/registry/demos/progress.d.ts +5 -0
- package/registry/demos/progress.js +11 -0
- package/registry/demos/progress.tsx +5 -0
- package/registry/demos/radio-group.d.ts +5 -0
- package/registry/demos/radio-group.js +16 -0
- package/registry/demos/radio-group.tsx +14 -0
- package/registry/demos/separator.d.ts +5 -0
- package/registry/demos/separator.js +15 -0
- package/registry/demos/separator.tsx +11 -0
- package/registry/demos/skeleton.d.ts +5 -0
- package/registry/demos/skeleton.js +20 -0
- package/registry/demos/skeleton.tsx +16 -0
- package/registry/demos/slider.d.ts +5 -0
- package/registry/demos/slider.js +11 -0
- package/registry/demos/slider.tsx +5 -0
- package/registry/demos/slot.d.ts +5 -0
- package/registry/demos/slot.js +14 -0
- package/registry/demos/slot.tsx +13 -0
- package/registry/demos/spinner.d.ts +5 -0
- package/registry/demos/spinner.js +11 -0
- package/registry/demos/spinner.tsx +5 -0
- package/registry/demos/stat.d.ts +5 -0
- package/registry/demos/stat.js +11 -0
- package/registry/demos/stat.tsx +5 -0
- package/registry/demos/switch.d.ts +5 -0
- package/registry/demos/switch.js +11 -0
- package/registry/demos/switch.tsx +5 -0
- package/registry/demos/tabs.d.ts +5 -0
- package/registry/demos/tabs.js +22 -0
- package/registry/demos/tabs.tsx +28 -0
- package/registry/demos/theme.d.ts +5 -0
- package/registry/demos/theme.js +11 -0
- package/registry/demos/theme.tsx +9 -0
- package/registry/demos/toast.d.ts +8 -0
- package/registry/demos/toast.js +29 -0
- package/registry/demos/toast.tsx +31 -0
- package/registry/demos/tooltip.d.ts +7 -0
- package/registry/demos/tooltip.js +15 -0
- package/registry/demos/tooltip.tsx +15 -0
- package/registry/dialog.json +218 -0
- package/registry/dropdown-menu.json +63 -0
- package/registry/empty-state.json +59 -0
- package/registry/field.json +66 -0
- package/registry/index.json +320 -0
- package/registry/kbd.json +38 -0
- package/registry/page-header.json +66 -0
- package/registry/popover.json +44 -0
- package/registry/progress.json +80 -0
- package/registry/radio-group.json +64 -0
- package/registry/separator.json +25 -0
- package/registry/skeleton.json +38 -0
- package/registry/slider.json +95 -0
- package/registry/slot.json +31 -0
- package/registry/spinner.json +45 -0
- package/registry/stat.json +66 -0
- package/registry/switch.json +53 -0
- package/registry/tabs.json +44 -0
- package/registry/theme.json +78 -0
- package/registry/toast.json +54 -0
- package/registry/tooltip.json +91 -0
- package/dist/chunk-5FRYKFTO.js.map +0 -1
- package/dist/chunk-QRG5RYEI.js.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "field",
|
|
3
|
+
"type": "primitive",
|
|
4
|
+
"description": "`Field.Root/Label/Hint/Error`, `Input`, `Textarea`, `Select`. Server-safe.",
|
|
5
|
+
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": "field/field.tsx",
|
|
8
|
+
"content": "// Server-safe. The label ↔ control wiring is HTML (htmlFor / id, aria-describedby): no context.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { cn } from \"../cn\";\n\nexport const field = tv({\n slots: {\n root: \"flex flex-col gap-1.5\",\n label: \"text-xs font-semibold text-fg-secondary\",\n control:\n \"flex h-11 w-full rounded-lg border border-border-default bg-surface-2 px-3 text-sm text-fg placeholder:text-fg-muted \" +\n \"transition-[border-color,box-shadow] focus-visible:border-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-danger aria-invalid:ring-danger/30\",\n hint: \"text-xs text-fg-secondary\",\n // The danger token is too light for small text on a light surface: the message is a text role, the dot says danger.\n error: \"flex items-center gap-1.5 text-xs font-medium text-fg before:h-1.5 before:w-1.5 before:shrink-0 before:rounded-full before:bg-danger\",\n selectWrap: \"relative flex w-full\",\n chevron: \"pointer-events-none absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-fg-secondary\",\n },\n});\nconst s = field();\n\nexport const Field = {\n Root: ({ className, ...props }: React.ComponentProps<\"div\">) => <div className={s.root({ className })} {...props} />,\n Label: ({ className, ...props }: React.ComponentProps<\"label\">) => <label className={s.label({ className })} {...props} />,\n Hint: ({ className, ...props }: React.ComponentProps<\"p\">) => <p className={s.hint({ className })} {...props} />,\n Error: ({ className, ...props }: React.ComponentProps<\"p\">) => <p role=\"alert\" className={s.error({ className })} {...props} />,\n};\n\ntype ControlProps = {\n /** Marks the control invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby). */\n invalid?: boolean;\n};\n\nconst invalidProps = (invalid?: boolean) => (invalid ? { \"aria-invalid\": true as const, \"data-invalid\": \"\" } : {});\n\nexport function Input({ invalid, className, ...props }: React.ComponentProps<\"input\"> & ControlProps) {\n return <input {...invalidProps(invalid)} className={s.control({ className })} {...props} />;\n}\n\nexport function Textarea({ invalid, className, ...props }: React.ComponentProps<\"textarea\"> & ControlProps) {\n return <textarea {...invalidProps(invalid)} className={s.control({ className: cn(\"h-auto min-h-24 py-2\", className) })} {...props} />;\n}\n\n/** A native <select>, styled like the other controls (the platform's menu: accessible and right on phones). */\nexport function Select({ invalid, className, ...props }: React.ComponentProps<\"select\"> & ControlProps) {\n return (\n <span className={s.selectWrap()}>\n <select {...invalidProps(invalid)} className={s.control({ className: cn(\"appearance-none pr-9\", className) })} {...props} />\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden className={s.chevron()}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </span>\n );\n}\n"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "field/index.ts",
|
|
12
|
+
"content": "/** @krizaka/ui/field — `Field.Root/Label/Hint/Error`, `Input`, `Textarea`, `Select`. Server-safe. */\nexport { Field, field, Input, Select, Textarea } from \"./field\";\n"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"dependencies": [
|
|
16
|
+
"tailwind-variants@^3.3.1"
|
|
17
|
+
],
|
|
18
|
+
"registryDependencies": [
|
|
19
|
+
"cn"
|
|
20
|
+
],
|
|
21
|
+
"demo": {
|
|
22
|
+
"path": "demos/field.tsx",
|
|
23
|
+
"content": "import { Field, Input } from \"@krizaka/ui/field\";\n\nexport default function FieldDemo() {\n return (\n <Field.Root>\n <Field.Label htmlFor=\"email\">Email</Field.Label>\n <Input id=\"email\" type=\"email\" aria-describedby=\"email-hint\" placeholder=\"you@example.com\" />\n <Field.Hint id=\"email-hint\">We never share it.</Field.Hint>\n </Field.Root>\n );\n}\n"
|
|
24
|
+
},
|
|
25
|
+
"props": [
|
|
26
|
+
{
|
|
27
|
+
"component": "Input",
|
|
28
|
+
"description": "",
|
|
29
|
+
"props": [
|
|
30
|
+
{
|
|
31
|
+
"name": "invalid",
|
|
32
|
+
"type": "boolean",
|
|
33
|
+
"default": null,
|
|
34
|
+
"description": "Marks the control invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby).",
|
|
35
|
+
"required": false
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"component": "Select",
|
|
41
|
+
"description": "A native <select>, styled like the other controls (the platform's menu: accessible and right on phones).",
|
|
42
|
+
"props": [
|
|
43
|
+
{
|
|
44
|
+
"name": "invalid",
|
|
45
|
+
"type": "boolean",
|
|
46
|
+
"default": null,
|
|
47
|
+
"description": "Marks the control invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby).",
|
|
48
|
+
"required": false
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"component": "Textarea",
|
|
54
|
+
"description": "",
|
|
55
|
+
"props": [
|
|
56
|
+
{
|
|
57
|
+
"name": "invalid",
|
|
58
|
+
"type": "boolean",
|
|
59
|
+
"default": null,
|
|
60
|
+
"description": "Marks the control invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby).",
|
|
61
|
+
"required": false
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@krizaka/ui",
|
|
3
|
+
"version": "2.0.0-beta.3",
|
|
4
|
+
"items": [
|
|
5
|
+
{
|
|
6
|
+
"name": "alert",
|
|
7
|
+
"type": "primitive",
|
|
8
|
+
"description": "`Alert`, `alertVariants`. Server-safe.",
|
|
9
|
+
"dependencies": [
|
|
10
|
+
"tailwind-variants@^3.3.1"
|
|
11
|
+
],
|
|
12
|
+
"registryDependencies": []
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "avatar",
|
|
16
|
+
"type": "primitive",
|
|
17
|
+
"description": "`Avatar`, `Avatar.Group`. Client (\"use client\").",
|
|
18
|
+
"dependencies": [
|
|
19
|
+
"radix-ui@^1.7.0",
|
|
20
|
+
"tailwind-variants@^3.3.1"
|
|
21
|
+
],
|
|
22
|
+
"registryDependencies": []
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "badge",
|
|
26
|
+
"type": "primitive",
|
|
27
|
+
"description": "`Badge`, `badgeVariants`. Server-safe.",
|
|
28
|
+
"dependencies": [
|
|
29
|
+
"tailwind-variants@^3.3.1"
|
|
30
|
+
],
|
|
31
|
+
"registryDependencies": []
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "button",
|
|
35
|
+
"type": "primitive",
|
|
36
|
+
"description": "`Button`, `IconButton`, `buttonVariants`. Server-safe.",
|
|
37
|
+
"dependencies": [
|
|
38
|
+
"radix-ui@^1.7.0",
|
|
39
|
+
"tailwind-variants@^3.3.1"
|
|
40
|
+
],
|
|
41
|
+
"registryDependencies": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "card",
|
|
45
|
+
"type": "primitive",
|
|
46
|
+
"description": "`Card.*`, `card` (the slots). Server-safe.",
|
|
47
|
+
"dependencies": [
|
|
48
|
+
"radix-ui@^1.7.0",
|
|
49
|
+
"tailwind-variants@^3.3.1"
|
|
50
|
+
],
|
|
51
|
+
"registryDependencies": [
|
|
52
|
+
"cn"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "checkbox",
|
|
57
|
+
"type": "primitive",
|
|
58
|
+
"description": "`Checkbox` (checked · unchecked · indeterminate), `checkbox` (the slots). Client (\"use client\").",
|
|
59
|
+
"dependencies": [
|
|
60
|
+
"radix-ui@^1.7.0",
|
|
61
|
+
"tailwind-variants@^3.3.1"
|
|
62
|
+
],
|
|
63
|
+
"registryDependencies": []
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "chip",
|
|
67
|
+
"type": "primitive",
|
|
68
|
+
"description": "`Chip` (selectable, removable), `Chip.Group` (single · multiple), `chip` (the slots). Client (\"use client\").",
|
|
69
|
+
"dependencies": [
|
|
70
|
+
"radix-ui@^1.7.0",
|
|
71
|
+
"tailwind-variants@^3.3.1"
|
|
72
|
+
],
|
|
73
|
+
"registryDependencies": []
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"name": "cn",
|
|
77
|
+
"type": "primitive",
|
|
78
|
+
"description": "Merges Tailwind classes: the last one wins — a product's `className` overrides the primitive's. The merge engine is tailwind-merge as tailwind-variants ships it (the one `tv` uses), so the platform carries a single copy of it. tailwind-variants bundles that engine since 3.3 (it never imports the `tailwind-merge` package, an optional peer): hence `tailwind-variants ^3.3.1` and no `tailwind-merge` dependency — `scripts/consumer.mjs` checks it on a clean install of the packed package.",
|
|
79
|
+
"dependencies": [
|
|
80
|
+
"clsx@^2.1.1",
|
|
81
|
+
"tailwind-variants@^3.3.1"
|
|
82
|
+
],
|
|
83
|
+
"registryDependencies": []
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "command",
|
|
87
|
+
"type": "primitive",
|
|
88
|
+
"description": "`Command.*` (cmdk) and `CommandDialog`, `command` (the slots). Client (\"use client\").",
|
|
89
|
+
"dependencies": [
|
|
90
|
+
"cmdk@^1.1.1",
|
|
91
|
+
"radix-ui@^1.7.0",
|
|
92
|
+
"tailwind-variants@^3.3.1"
|
|
93
|
+
],
|
|
94
|
+
"registryDependencies": [
|
|
95
|
+
"cn",
|
|
96
|
+
"dialog"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "confirm-button",
|
|
101
|
+
"type": "primitive",
|
|
102
|
+
"description": "`ConfirmButton` (two steps: arm, then confirm). Client (\"use client\").",
|
|
103
|
+
"dependencies": [
|
|
104
|
+
"radix-ui@^1.7.0"
|
|
105
|
+
],
|
|
106
|
+
"registryDependencies": [
|
|
107
|
+
"button",
|
|
108
|
+
"cn"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "countdown",
|
|
113
|
+
"type": "primitive",
|
|
114
|
+
"description": "`Countdown`, `useCountdown`, `splitDuration`. Client (\"use client\").",
|
|
115
|
+
"dependencies": [
|
|
116
|
+
"tailwind-variants@^3.3.1"
|
|
117
|
+
],
|
|
118
|
+
"registryDependencies": []
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "dialog",
|
|
122
|
+
"type": "primitive",
|
|
123
|
+
"description": "`Dialog.*`, `Sheet`, `AlertDialog`, `dialog` (the slots). Client (\"use client\").",
|
|
124
|
+
"dependencies": [
|
|
125
|
+
"radix-ui@^1.7.0",
|
|
126
|
+
"tailwind-variants@^3.3.1"
|
|
127
|
+
],
|
|
128
|
+
"registryDependencies": [
|
|
129
|
+
"button"
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "dropdown-menu",
|
|
134
|
+
"type": "primitive",
|
|
135
|
+
"description": "`DropdownMenu.*`, `menu` (the slots). Client (\"use client\").",
|
|
136
|
+
"dependencies": [
|
|
137
|
+
"radix-ui@^1.7.0",
|
|
138
|
+
"tailwind-variants@^3.3.1"
|
|
139
|
+
],
|
|
140
|
+
"registryDependencies": [
|
|
141
|
+
"cn"
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "empty-state",
|
|
146
|
+
"type": "primitive",
|
|
147
|
+
"description": "`EmptyState`. Server-safe.",
|
|
148
|
+
"dependencies": [
|
|
149
|
+
"tailwind-variants@^3.3.1"
|
|
150
|
+
],
|
|
151
|
+
"registryDependencies": []
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "field",
|
|
155
|
+
"type": "primitive",
|
|
156
|
+
"description": "`Field.Root/Label/Hint/Error`, `Input`, `Textarea`, `Select`. Server-safe.",
|
|
157
|
+
"dependencies": [
|
|
158
|
+
"tailwind-variants@^3.3.1"
|
|
159
|
+
],
|
|
160
|
+
"registryDependencies": [
|
|
161
|
+
"cn"
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"name": "kbd",
|
|
166
|
+
"type": "primitive",
|
|
167
|
+
"description": "`Kbd`, `kbdVariants`. Server-safe.",
|
|
168
|
+
"dependencies": [
|
|
169
|
+
"tailwind-variants@^3.3.1"
|
|
170
|
+
],
|
|
171
|
+
"registryDependencies": []
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "page-header",
|
|
175
|
+
"type": "primitive",
|
|
176
|
+
"description": "`PageHeader`, `pageHeader` (the slots). Server-safe.",
|
|
177
|
+
"dependencies": [
|
|
178
|
+
"tailwind-variants@^3.3.1"
|
|
179
|
+
],
|
|
180
|
+
"registryDependencies": []
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"name": "popover",
|
|
184
|
+
"type": "primitive",
|
|
185
|
+
"description": "`Popover.*`. Client (\"use client\").",
|
|
186
|
+
"dependencies": [
|
|
187
|
+
"radix-ui@^1.7.0"
|
|
188
|
+
],
|
|
189
|
+
"registryDependencies": [
|
|
190
|
+
"cn"
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"name": "progress",
|
|
195
|
+
"type": "primitive",
|
|
196
|
+
"description": "`Progress` (bar · ring, indeterminate), `progress` (the slots). Server-safe.",
|
|
197
|
+
"dependencies": [
|
|
198
|
+
"tailwind-variants@^3.3.1"
|
|
199
|
+
],
|
|
200
|
+
"registryDependencies": []
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"name": "radio-group",
|
|
204
|
+
"type": "primitive",
|
|
205
|
+
"description": "`RadioGroup.Root/Item/Card`, `radioGroup` (the slots). Client (\"use client\").",
|
|
206
|
+
"dependencies": [
|
|
207
|
+
"radix-ui@^1.7.0",
|
|
208
|
+
"tailwind-variants@^3.3.1"
|
|
209
|
+
],
|
|
210
|
+
"registryDependencies": []
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"name": "separator",
|
|
214
|
+
"type": "primitive",
|
|
215
|
+
"description": "`Separator`, `separatorVariants` (Radix). Server-safe.",
|
|
216
|
+
"dependencies": [
|
|
217
|
+
"radix-ui@^1.7.0",
|
|
218
|
+
"tailwind-variants@^3.3.1"
|
|
219
|
+
],
|
|
220
|
+
"registryDependencies": []
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"name": "skeleton",
|
|
224
|
+
"type": "primitive",
|
|
225
|
+
"description": "`Skeleton`, `skeletonVariants`. Server-safe.",
|
|
226
|
+
"dependencies": [
|
|
227
|
+
"tailwind-variants@^3.3.1"
|
|
228
|
+
],
|
|
229
|
+
"registryDependencies": []
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"name": "slider",
|
|
233
|
+
"type": "primitive",
|
|
234
|
+
"description": "`Slider` (one value or a range), `slider` (the slots). Client (\"use client\").",
|
|
235
|
+
"dependencies": [
|
|
236
|
+
"radix-ui@^1.7.0",
|
|
237
|
+
"tailwind-variants@^3.3.1"
|
|
238
|
+
],
|
|
239
|
+
"registryDependencies": []
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"name": "slot",
|
|
243
|
+
"type": "primitive",
|
|
244
|
+
"description": "`Slot` (what `asChild` renders) and `VisuallyHidden` (a name for assistive technology only), from Radix.",
|
|
245
|
+
"dependencies": [
|
|
246
|
+
"radix-ui@^1.7.0"
|
|
247
|
+
],
|
|
248
|
+
"registryDependencies": []
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"name": "spinner",
|
|
252
|
+
"type": "primitive",
|
|
253
|
+
"description": "`Spinner`, `spinnerVariants`. Server-safe.",
|
|
254
|
+
"dependencies": [
|
|
255
|
+
"tailwind-variants@^3.3.1"
|
|
256
|
+
],
|
|
257
|
+
"registryDependencies": []
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"name": "stat",
|
|
261
|
+
"type": "primitive",
|
|
262
|
+
"description": "`Stat`, `stat` (the slots). Server-safe.",
|
|
263
|
+
"dependencies": [
|
|
264
|
+
"tailwind-variants@^3.3.1"
|
|
265
|
+
],
|
|
266
|
+
"registryDependencies": []
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"name": "switch",
|
|
270
|
+
"type": "primitive",
|
|
271
|
+
"description": "`Switch`, `switchVariants`. Client (\"use client\").",
|
|
272
|
+
"dependencies": [
|
|
273
|
+
"radix-ui@^1.7.0",
|
|
274
|
+
"tailwind-variants@^3.3.1"
|
|
275
|
+
],
|
|
276
|
+
"registryDependencies": []
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"name": "tabs",
|
|
280
|
+
"type": "primitive",
|
|
281
|
+
"description": "`Tabs.Root/List/Trigger/Content` (variant underline · segmented · pills), `tabs` (the slots). Client (\"use client\").",
|
|
282
|
+
"dependencies": [
|
|
283
|
+
"radix-ui@^1.7.0",
|
|
284
|
+
"tailwind-variants@^3.3.1"
|
|
285
|
+
],
|
|
286
|
+
"registryDependencies": []
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"name": "theme",
|
|
290
|
+
"type": "primitive",
|
|
291
|
+
"description": "`ThemeScript`, `ThemeProvider`, `useTheme`, `ThemeToggle`. Client (\"use client\").",
|
|
292
|
+
"dependencies": [],
|
|
293
|
+
"registryDependencies": [
|
|
294
|
+
"button"
|
|
295
|
+
]
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"name": "toast",
|
|
299
|
+
"type": "primitive",
|
|
300
|
+
"description": "`Toaster` (sonner, styled by roles), `toast`. Client (\"use client\").",
|
|
301
|
+
"dependencies": [
|
|
302
|
+
"sonner@^2.0.8"
|
|
303
|
+
],
|
|
304
|
+
"registryDependencies": [
|
|
305
|
+
"cn"
|
|
306
|
+
]
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"name": "tooltip",
|
|
310
|
+
"type": "primitive",
|
|
311
|
+
"description": "`Tooltip`, `TooltipProvider`. Client (\"use client\").",
|
|
312
|
+
"dependencies": [
|
|
313
|
+
"radix-ui@^1.7.0"
|
|
314
|
+
],
|
|
315
|
+
"registryDependencies": [
|
|
316
|
+
"cn"
|
|
317
|
+
]
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kbd",
|
|
3
|
+
"type": "primitive",
|
|
4
|
+
"description": "`Kbd`, `kbdVariants`. Server-safe.",
|
|
5
|
+
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": "kbd/index.ts",
|
|
8
|
+
"content": "/** @krizaka/ui/kbd — `Kbd`, `kbdVariants`. Server-safe. */\nexport { Kbd, type KbdProps, kbdVariants } from \"./kbd\";\n"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "kbd/kbd.tsx",
|
|
12
|
+
"content": "// Server-safe. A key, or a shortcut of several (`<Kbd>⌘</Kbd><Kbd>K</Kbd>`).\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const kbdVariants = tv({\n base:\n \"inline-flex shrink-0 items-center justify-center rounded-md border border-border-default border-b-2 bg-surface-2 \" +\n \"font-mono font-semibold text-fg-secondary\",\n variants: { size: { sm: \"h-5 min-w-5 px-1 text-[10px]\", md: \"h-6 min-w-6 px-1.5 text-xs\" } },\n defaultVariants: { size: \"md\" },\n});\n\nexport type KbdProps = React.ComponentProps<\"kbd\"> & {\n /**\n * sm · md.\n * @default \"md\"\n */\n size?: VariantProps<typeof kbdVariants>[\"size\"];\n};\n\nexport function Kbd({ size, className, ...props }: KbdProps) {\n return <kbd className={kbdVariants({ size, className })} {...props} />;\n}\n"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"dependencies": [
|
|
16
|
+
"tailwind-variants@^3.3.1"
|
|
17
|
+
],
|
|
18
|
+
"registryDependencies": [],
|
|
19
|
+
"demo": {
|
|
20
|
+
"path": "demos/kbd.tsx",
|
|
21
|
+
"content": "import { Kbd } from \"@krizaka/ui/kbd\";\n\nexport default function KbdDemo() {\n return <Kbd>Esc</Kbd>;\n}\n"
|
|
22
|
+
},
|
|
23
|
+
"props": [
|
|
24
|
+
{
|
|
25
|
+
"component": "Kbd",
|
|
26
|
+
"description": "",
|
|
27
|
+
"props": [
|
|
28
|
+
{
|
|
29
|
+
"name": "size",
|
|
30
|
+
"type": "\"sm\" | \"md\"",
|
|
31
|
+
"default": "md",
|
|
32
|
+
"description": "sm · md.",
|
|
33
|
+
"required": false
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "page-header",
|
|
3
|
+
"type": "primitive",
|
|
4
|
+
"description": "`PageHeader`, `pageHeader` (the slots). Server-safe.",
|
|
5
|
+
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": "page-header/index.ts",
|
|
8
|
+
"content": "/** @krizaka/ui/page-header — `PageHeader`, `pageHeader` (the slots). Server-safe. */\nexport { PageHeader, pageHeader, type PageHeaderProps } from \"./page-header\";\n"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "page-header/page-header.tsx",
|
|
12
|
+
"content": "// Server-safe. The top of a page: an optional breadcrumb, the title (h1), a description and the page's actions.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const pageHeader = tv({\n slots: {\n root: \"flex flex-col gap-3 border-b border-border-subtle pb-6\",\n breadcrumb: \"text-xs text-fg-secondary\",\n row: \"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between\",\n text: \"flex min-w-0 flex-col gap-1.5\",\n title: \"font-display text-2xl font-black tracking-tight text-fg sm:text-3xl\",\n description: \"max-w-2xl text-sm text-fg-secondary\",\n actions: \"flex shrink-0 flex-wrap items-center gap-2\",\n },\n});\nconst s = pageHeader();\n\nexport type PageHeaderProps = Omit<React.ComponentProps<\"div\">, \"title\"> & {\n /** The title of the page (an `h1`, or `as=\"h2\"`). */\n title: React.ReactNode;\n /** A sentence under the title. */\n description?: React.ReactNode;\n /** The page's actions: Buttons, a DropdownMenu. */\n actions?: React.ReactNode;\n /** A breadcrumb (the product's own <nav aria-label>), shown above the title. */\n breadcrumb?: React.ReactNode;\n /** The heading level of the title: `h1` for a page, `h2` for a section that looks like one. */\n as?: \"h1\" | \"h2\";\n};\n\nexport function PageHeader({ title, description, actions, breadcrumb, as: Heading = \"h1\", className, ...props }: PageHeaderProps) {\n return (\n <div className={s.root({ className })} {...props}>\n {breadcrumb && <div className={s.breadcrumb()}>{breadcrumb}</div>}\n <div className={s.row()}>\n <div className={s.text()}>\n <Heading className={s.title()}>{title}</Heading>\n {description && <p className={s.description()}>{description}</p>}\n </div>\n {actions && <div className={s.actions()}>{actions}</div>}\n </div>\n </div>\n );\n}\n"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"dependencies": [
|
|
16
|
+
"tailwind-variants@^3.3.1"
|
|
17
|
+
],
|
|
18
|
+
"registryDependencies": [],
|
|
19
|
+
"demo": {
|
|
20
|
+
"path": "demos/page-header.tsx",
|
|
21
|
+
"content": "import { PageHeader } from \"@krizaka/ui/page-header\";\n\nexport default function PageHeaderDemo() {\n return <PageHeader title=\"Payouts\" description=\"Your earnings are paid every Monday to the account on file.\" />;\n}\n"
|
|
22
|
+
},
|
|
23
|
+
"props": [
|
|
24
|
+
{
|
|
25
|
+
"component": "PageHeader",
|
|
26
|
+
"description": "",
|
|
27
|
+
"props": [
|
|
28
|
+
{
|
|
29
|
+
"name": "title",
|
|
30
|
+
"type": "ReactNode",
|
|
31
|
+
"default": null,
|
|
32
|
+
"description": "The title of the page (an `h1`, or `as=\"h2\"`).",
|
|
33
|
+
"required": true
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "actions",
|
|
37
|
+
"type": "ReactNode",
|
|
38
|
+
"default": null,
|
|
39
|
+
"description": "The page's actions: Buttons, a DropdownMenu.",
|
|
40
|
+
"required": false
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "as",
|
|
44
|
+
"type": "\"h1\" | \"h2\"",
|
|
45
|
+
"default": "h1",
|
|
46
|
+
"description": "The heading level of the title: `h1` for a page, `h2` for a section that looks like one.",
|
|
47
|
+
"required": false
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "breadcrumb",
|
|
51
|
+
"type": "ReactNode",
|
|
52
|
+
"default": null,
|
|
53
|
+
"description": "A breadcrumb (the product's own <nav aria-label>), shown above the title.",
|
|
54
|
+
"required": false
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "description",
|
|
58
|
+
"type": "ReactNode",
|
|
59
|
+
"default": null,
|
|
60
|
+
"description": "A sentence under the title.",
|
|
61
|
+
"required": false
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "popover",
|
|
3
|
+
"type": "primitive",
|
|
4
|
+
"description": "`Popover.*`. Client (\"use client\").",
|
|
5
|
+
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": "floating.ts",
|
|
8
|
+
"content": "// The one surface of everything that floats next to its trigger (popover, menu, tooltip): a raised surface, a border,\n// the large shadow and the `kz-pop` entrance from the side Radix measured (`--radix-*-transform-origin`).\nexport const floating =\n \"kz-pop z-50 rounded-lg border border-border-default bg-surface-2 text-fg shadow-lg outline-hidden\";\n"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "popover/index.ts",
|
|
12
|
+
"content": "/** @krizaka/ui/popover — `Popover.*`. Client (\"use client\"). */\nexport { Popover, PopoverContent, type PopoverContentProps } from \"./popover\";\n"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"path": "popover/popover.tsx",
|
|
16
|
+
"content": "// Client (a portal). Radix places the content, traps nothing, closes on Escape and on an outside click, and returns\n// the focus to the trigger.\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { floating } from \"../floating\";\n\nexport type PopoverContentProps = React.ComponentProps<typeof PopoverPrimitive.Content> & {\n /** The element the portal renders into (default: document.body). */\n container?: HTMLElement | null;\n};\n\nexport function PopoverContent({ sideOffset = 8, collisionPadding = 8, container, className, ...props }: PopoverContentProps) {\n return (\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={cn(floating, \"w-72 max-w-(--radix-popover-content-available-width) p-4 origin-(--radix-popover-content-transform-origin)\", className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\n/** `Popover.Root/Trigger/Anchor/Content/Close`. `open`/`defaultOpen` + `onOpenChange`. */\nexport const Popover = {\n Root: PopoverPrimitive.Root,\n Trigger: PopoverPrimitive.Trigger,\n Anchor: PopoverPrimitive.Anchor,\n Close: PopoverPrimitive.Close,\n Content: PopoverContent,\n};\n"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"dependencies": [
|
|
20
|
+
"radix-ui@^1.7.0"
|
|
21
|
+
],
|
|
22
|
+
"registryDependencies": [
|
|
23
|
+
"cn"
|
|
24
|
+
],
|
|
25
|
+
"demo": {
|
|
26
|
+
"path": "demos/popover.tsx",
|
|
27
|
+
"content": "import { Button } from \"@krizaka/ui/button\";\nimport { Field, Input } from \"@krizaka/ui/field\";\nimport { Popover } from \"@krizaka/ui/popover\";\n\nexport default function PopoverDemo({ defaultOpen = false }: { defaultOpen?: boolean }) {\n return (\n <Popover.Root defaultOpen={defaultOpen}>\n <Popover.Trigger asChild>\n <Button variant=\"outline\">Set a goal</Button>\n </Popover.Trigger>\n <Popover.Content aria-label=\"Set a goal\" align=\"center\">\n <div className=\"flex flex-col gap-3\">\n <Field.Root>\n <Field.Label htmlFor=\"goal-amount\">Amount</Field.Label>\n <Input id=\"goal-amount\" defaultValue=\"250\" />\n </Field.Root>\n <div className=\"flex justify-end gap-2\">\n <Popover.Close asChild>\n <Button size=\"sm\" variant=\"ghost\">\n Cancel\n </Button>\n </Popover.Close>\n <Button size=\"sm\" variant=\"primary\">\n Save\n </Button>\n </div>\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n}\n"
|
|
28
|
+
},
|
|
29
|
+
"props": [
|
|
30
|
+
{
|
|
31
|
+
"component": "PopoverContent",
|
|
32
|
+
"description": "",
|
|
33
|
+
"props": [
|
|
34
|
+
{
|
|
35
|
+
"name": "container",
|
|
36
|
+
"type": "HTMLElement | null",
|
|
37
|
+
"default": null,
|
|
38
|
+
"description": "The element the portal renders into (default: document.body).",
|
|
39
|
+
"required": false
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "progress",
|
|
3
|
+
"type": "primitive",
|
|
4
|
+
"description": "`Progress` (bar · ring, indeterminate), `progress` (the slots). Server-safe.",
|
|
5
|
+
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": "progress/index.ts",
|
|
8
|
+
"content": "/** @krizaka/ui/progress — `Progress` (bar · ring, indeterminate), `progress` (the slots). Server-safe. */\nexport { Progress, progress, type ProgressProps, type ProgressVariants } from \"./progress\";\n"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "progress/progress.tsx",
|
|
12
|
+
"content": "// Server-safe: no hook, no context. role=\"progressbar\" with aria-valuenow / aria-valuemax (none when indeterminate),\n// named by `label`. A bar or a ring; the ring can hold content in its centre (an amount, a percentage).\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const progress = tv({\n slots: {\n root: \"relative\",\n track: \"\",\n indicator: \"\",\n center: \"absolute inset-0 flex flex-col items-center justify-center text-center\",\n },\n variants: {\n variant: {\n bar: {\n root: \"w-full overflow-hidden rounded-full bg-surface-3\",\n indicator:\n \"kz-progress h-full rounded-full bg-linear-to-r from-accent to-accent-2 transition-[width] duration-500 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:w-2/5\",\n },\n ring: {\n root: \"inline-flex shrink-0 items-center justify-center\",\n track: \"stroke-border-default\",\n indicator:\n \"stroke-accent transition-[stroke-dashoffset] duration-1000 motion-reduce:transition-none \" +\n \"data-[state=indeterminate]:origin-center data-[state=indeterminate]:animate-spin motion-reduce:data-[state=indeterminate]:animate-none\",\n },\n },\n size: { sm: {}, md: {}, lg: {} },\n },\n compoundVariants: [\n { variant: \"bar\", size: \"sm\", class: { root: \"h-1\" } },\n { variant: \"bar\", size: \"md\", class: { root: \"h-2\" } },\n { variant: \"bar\", size: \"lg\", class: { root: \"h-3\" } },\n { variant: \"ring\", size: \"sm\", class: { root: \"h-10 w-10\" } },\n { variant: \"ring\", size: \"md\", class: { root: \"h-20 w-20\" } },\n { variant: \"ring\", size: \"lg\", class: { root: \"h-36 w-36\" } },\n ],\n defaultVariants: { variant: \"bar\", size: \"md\" },\n});\n\nexport type ProgressVariants = VariantProps<typeof progress>;\n\nexport type ProgressProps = Omit<React.ComponentProps<\"div\">, \"children\"> &\n ProgressVariants & {\n /** bar · ring (a ring holds its `children` in the centre). */\n variant?: ProgressVariants[\"variant\"];\n /** sm · md · lg: the bar's thickness, the ring's diameter. */\n size?: ProgressVariants[\"size\"];\n /** How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length). */\n value?: number | null;\n /** The value that means complete. */\n max?: number;\n /** The accessible name — passed translated (\"Upload\", \"Raised towards the goal\"). */\n label: string;\n /** The value in words for assistive technology (\"$420 of $1,000\") — default: the percentage. */\n valueText?: string;\n /** A ring's centre: an amount, a percentage, an icon. */\n children?: React.ReactNode;\n };\n\nconst STROKE = { sm: 12, md: 9, lg: 7 } as const;\n\n/** A progress bar or ring: `value` / `max`, indeterminate without a value. State: `data-state` (loading · complete · indeterminate). */\nexport function Progress({ variant = \"bar\", size = \"md\", value, max = 100, label, valueText, className, children, ...props }: ProgressProps) {\n const s = progress({ variant, size });\n const known = typeof value === \"number\" && Number.isFinite(value);\n const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;\n const percent = Math.round(ratio * 100);\n const state = !known ? \"indeterminate\" : ratio >= 1 ? \"complete\" : \"loading\";\n const aria = {\n role: \"progressbar\" as const,\n \"aria-label\": label,\n \"aria-valuemin\": known ? 0 : undefined,\n \"aria-valuemax\": known ? max : undefined,\n \"aria-valuenow\": known ? Math.min(max, Math.max(0, value)) : undefined,\n \"aria-valuetext\": known ? (valueText ?? `${percent}%`) : valueText,\n \"data-state\": state,\n \"data-value\": known ? value : undefined,\n \"data-variant\": variant,\n };\n if (variant === \"ring\") {\n const stroke = STROKE[size];\n const r = 50 - stroke / 2;\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <svg viewBox=\"0 0 100 100\" className=\"h-full w-full -rotate-90\" aria-hidden>\n <circle cx=\"50\" cy=\"50\" r={r} fill=\"none\" strokeWidth={stroke} className={s.track()} />\n <circle\n cx=\"50\"\n cy=\"50\"\n r={r}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n pathLength={100}\n strokeDasharray={100}\n strokeDashoffset={known ? 100 - percent : 75}\n data-state={state}\n className={s.indicator()}\n />\n </svg>\n {children !== undefined && <div className={s.center()}>{children}</div>}\n </div>\n );\n }\n return (\n <div {...aria} className={s.root({ className })} {...props}>\n <div data-state={state} className={s.indicator()} style={known ? { width: `${ratio * 100}%` } : undefined} />\n </div>\n );\n}\n"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"dependencies": [
|
|
16
|
+
"tailwind-variants@^3.3.1"
|
|
17
|
+
],
|
|
18
|
+
"registryDependencies": [],
|
|
19
|
+
"demo": {
|
|
20
|
+
"path": "demos/progress.tsx",
|
|
21
|
+
"content": "import { Progress } from \"@krizaka/ui/progress\";\n\nexport default function ProgressDemo() {\n return <Progress label=\"Upload\" value={64} />;\n}\n"
|
|
22
|
+
},
|
|
23
|
+
"props": [
|
|
24
|
+
{
|
|
25
|
+
"component": "Progress",
|
|
26
|
+
"description": "A progress bar or ring: `value` / `max`, indeterminate without a value. State: `data-state` (loading · complete · indeterminate).",
|
|
27
|
+
"props": [
|
|
28
|
+
{
|
|
29
|
+
"name": "label",
|
|
30
|
+
"type": "string",
|
|
31
|
+
"default": null,
|
|
32
|
+
"description": "The accessible name — passed translated (\"Upload\", \"Raised towards the goal\").",
|
|
33
|
+
"required": true
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "children",
|
|
37
|
+
"type": "ReactNode",
|
|
38
|
+
"default": null,
|
|
39
|
+
"description": "A ring's centre: an amount, a percentage, an icon.",
|
|
40
|
+
"required": false
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "max",
|
|
44
|
+
"type": "number",
|
|
45
|
+
"default": "100",
|
|
46
|
+
"description": "The value that means complete.",
|
|
47
|
+
"required": false
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "size",
|
|
51
|
+
"type": "\"sm\" | \"md\" | \"lg\"",
|
|
52
|
+
"default": "md",
|
|
53
|
+
"description": "sm · md · lg: the bar's thickness, the ring's diameter.",
|
|
54
|
+
"required": false
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "value",
|
|
58
|
+
"type": "number | null",
|
|
59
|
+
"default": null,
|
|
60
|
+
"description": "How far, between 0 and `max`. `null` or absent: indeterminate (a wait of unknown length).",
|
|
61
|
+
"required": false
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "valueText",
|
|
65
|
+
"type": "string",
|
|
66
|
+
"default": null,
|
|
67
|
+
"description": "The value in words for assistive technology (\"$420 of $1,000\") — default: the percentage.",
|
|
68
|
+
"required": false
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "variant",
|
|
72
|
+
"type": "\"bar\" | \"ring\"",
|
|
73
|
+
"default": "bar",
|
|
74
|
+
"description": "bar · ring (a ring holds its `children` in the centre).",
|
|
75
|
+
"required": false
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|