@kodffe/ui 0.0.0-stage → 0.10.1
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/dist/_virtual/_rolldown/runtime.js +11 -0
- package/dist/accordion/accordion.d.ts +44 -0
- package/dist/accordion/accordion.js +84 -0
- package/dist/accordion/accordion.js.map +1 -0
- package/dist/alert/alert.d.ts +17 -0
- package/dist/alert/alert.js +59 -0
- package/dist/alert/alert.js.map +1 -0
- package/dist/app-shell/app-footer.d.ts +29 -0
- package/dist/app-shell/app-footer.js +39 -0
- package/dist/app-shell/app-footer.js.map +1 -0
- package/dist/app-shell/app-shell-context.d.ts +10 -0
- package/dist/app-shell/app-shell-context.js +12 -0
- package/dist/app-shell/app-shell-context.js.map +1 -0
- package/dist/app-shell/app-shell.d.ts +42 -0
- package/dist/app-shell/app-shell.js +191 -0
- package/dist/app-shell/app-shell.js.map +1 -0
- package/dist/app-shell/floating-actions.d.ts +19 -0
- package/dist/app-shell/floating-actions.js +59 -0
- package/dist/app-shell/floating-actions.js.map +1 -0
- package/dist/app-shell/workspace-switcher.d.ts +25 -0
- package/dist/app-shell/workspace-switcher.js +82 -0
- package/dist/app-shell/workspace-switcher.js.map +1 -0
- package/dist/badge/badge.d.ts +19 -0
- package/dist/badge/badge.js +59 -0
- package/dist/badge/badge.js.map +1 -0
- package/dist/banner/banner.d.ts +22 -0
- package/dist/banner/banner.js +80 -0
- package/dist/banner/banner.js.map +1 -0
- package/dist/breadcrumbs/breadcrumbs.d.ts +18 -0
- package/dist/breadcrumbs/breadcrumbs.js +45 -0
- package/dist/breadcrumbs/breadcrumbs.js.map +1 -0
- package/dist/button/button.d.ts +38 -0
- package/dist/button/button.js +83 -0
- package/dist/button/button.js.map +1 -0
- package/dist/card/card.d.ts +159 -0
- package/dist/card/card.js +390 -0
- package/dist/card/card.js.map +1 -0
- package/dist/card/insight-card.d.ts +19 -0
- package/dist/card/insight-card.js +51 -0
- package/dist/card/insight-card.js.map +1 -0
- package/dist/card/integration-card.d.ts +19 -0
- package/dist/card/integration-card.js +70 -0
- package/dist/card/integration-card.js.map +1 -0
- package/dist/charts/charts.d.ts +75 -0
- package/dist/charts/charts.js +453 -0
- package/dist/charts/charts.js.map +1 -0
- package/dist/choice/choice.d.ts +39 -0
- package/dist/choice/choice.js +143 -0
- package/dist/choice/choice.js.map +1 -0
- package/dist/combobox/combobox.d.ts +46 -0
- package/dist/combobox/combobox.js +196 -0
- package/dist/combobox/combobox.js.map +1 -0
- package/dist/command-palette/command-palette.d.ts +35 -0
- package/dist/command-palette/command-palette.js +164 -0
- package/dist/command-palette/command-palette.js.map +1 -0
- package/dist/confirm-dialog/confirm-dialog.d.ts +37 -0
- package/dist/confirm-dialog/confirm-dialog.js +106 -0
- package/dist/confirm-dialog/confirm-dialog.js.map +1 -0
- package/dist/content/assistant.d.ts +86 -0
- package/dist/content/assistant.js +213 -0
- package/dist/content/assistant.js.map +1 -0
- package/dist/content/content.d.ts +45 -0
- package/dist/content/content.js +136 -0
- package/dist/content/content.js.map +1 -0
- package/dist/data-display/avatar-sizes.d.ts +8 -0
- package/dist/data-display/avatar-sizes.js +12 -0
- package/dist/data-display/avatar-sizes.js.map +1 -0
- package/dist/data-display/avatar.d.ts +21 -0
- package/dist/data-display/avatar.js +53 -0
- package/dist/data-display/avatar.js.map +1 -0
- package/dist/data-display/chip.d.ts +20 -0
- package/dist/data-display/chip.js +64 -0
- package/dist/data-display/chip.js.map +1 -0
- package/dist/data-display/code-block.d.ts +14 -0
- package/dist/data-display/code-block.js +50 -0
- package/dist/data-display/code-block.js.map +1 -0
- package/dist/data-display/data-display.d.ts +73 -0
- package/dist/data-display/data-display.js +227 -0
- package/dist/data-display/data-display.js.map +1 -0
- package/dist/data-display/insights.d.ts +120 -0
- package/dist/data-display/insights.js +220 -0
- package/dist/data-display/insights.js.map +1 -0
- package/dist/data-table/cells.d.ts +86 -0
- package/dist/data-table/cells.js +163 -0
- package/dist/data-table/cells.js.map +1 -0
- package/dist/data-table/data-table.d.ts +112 -0
- package/dist/data-table/data-table.js +558 -0
- package/dist/data-table/data-table.js.map +1 -0
- package/dist/date-picker/date-picker.d.ts +61 -0
- package/dist/date-picker/date-picker.js +309 -0
- package/dist/date-picker/date-picker.js.map +1 -0
- package/dist/drawer/drawer.d.ts +32 -0
- package/dist/drawer/drawer.js +72 -0
- package/dist/drawer/drawer.js.map +1 -0
- package/dist/empty-state/empty-state.d.ts +25 -0
- package/dist/empty-state/empty-state.js +78 -0
- package/dist/empty-state/empty-state.js.map +1 -0
- package/dist/error-state/error-state.d.ts +19 -0
- package/dist/error-state/error-state.js +56 -0
- package/dist/error-state/error-state.js.map +1 -0
- package/dist/event-calendar/calendar-logic.test.d.ts +1 -0
- package/dist/event-calendar/dates.d.ts +35 -0
- package/dist/event-calendar/dates.js +55 -0
- package/dist/event-calendar/dates.js.map +1 -0
- package/dist/event-calendar/event-calendar.d.ts +125 -0
- package/dist/event-calendar/event-calendar.js +795 -0
- package/dist/event-calendar/event-calendar.js.map +1 -0
- package/dist/event-calendar/event-details.d.ts +50 -0
- package/dist/event-calendar/event-details.js +124 -0
- package/dist/event-calendar/event-details.js.map +1 -0
- package/dist/event-calendar/layout.d.ts +48 -0
- package/dist/event-calendar/layout.js +55 -0
- package/dist/event-calendar/layout.js.map +1 -0
- package/dist/file-upload/file-upload.d.ts +70 -0
- package/dist/file-upload/file-upload.js +307 -0
- package/dist/file-upload/file-upload.js.map +1 -0
- package/dist/filters/filters.d.ts +48 -0
- package/dist/filters/filters.js +103 -0
- package/dist/filters/filters.js.map +1 -0
- package/dist/form-field/form-field.d.ts +39 -0
- package/dist/form-field/form-field.js +88 -0
- package/dist/form-field/form-field.js.map +1 -0
- package/dist/hover-card/hover-card.d.ts +15 -0
- package/dist/hover-card/hover-card.js +27 -0
- package/dist/hover-card/hover-card.js.map +1 -0
- package/dist/hover-card/person-hover-card.d.ts +26 -0
- package/dist/hover-card/person-hover-card.js +85 -0
- package/dist/hover-card/person-hover-card.js.map +1 -0
- package/dist/icon/icon-tile.d.ts +20 -0
- package/dist/icon/icon-tile.js +55 -0
- package/dist/icon/icon-tile.js.map +1 -0
- package/dist/icon/icon.d.ts +14 -0
- package/dist/icon/icon.js +28 -0
- package/dist/icon/icon.js.map +1 -0
- package/dist/icon/icons.generated.d.ts +358 -0
- package/dist/icon/icons.generated.js +362 -0
- package/dist/icon/icons.generated.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +88 -0
- package/dist/input/extra-inputs.d.ts +122 -0
- package/dist/input/extra-inputs.js +351 -0
- package/dist/input/extra-inputs.js.map +1 -0
- package/dist/input/field-styles.d.ts +5 -0
- package/dist/input/field-styles.js +14 -0
- package/dist/input/field-styles.js.map +1 -0
- package/dist/input/input.d.ts +50 -0
- package/dist/input/input.js +107 -0
- package/dist/input/input.js.map +1 -0
- package/dist/layout/layout.d.ts +41 -0
- package/dist/layout/layout.js +90 -0
- package/dist/layout/layout.js.map +1 -0
- package/dist/lib/control-styles.d.ts +9 -0
- package/dist/lib/control-styles.js +16 -0
- package/dist/lib/control-styles.js.map +1 -0
- package/dist/lib/cx.d.ts +2 -0
- package/dist/lib/cx.js +8 -0
- package/dist/lib/cx.js.map +1 -0
- package/dist/lib/glyphs.d.ts +13 -0
- package/dist/lib/glyphs.js +67 -0
- package/dist/lib/glyphs.js.map +1 -0
- package/dist/lib/segmented-styles.d.ts +8 -0
- package/dist/lib/segmented-styles.js +12 -0
- package/dist/lib/segmented-styles.js.map +1 -0
- package/dist/lib/select-on-arrow.d.ts +7 -0
- package/dist/lib/select-on-arrow.js +21 -0
- package/dist/lib/select-on-arrow.js.map +1 -0
- package/dist/lib/skip-link.d.ts +5 -0
- package/dist/lib/skip-link.js +13 -0
- package/dist/lib/skip-link.js.map +1 -0
- package/dist/lib/use-media-query.d.ts +4 -0
- package/dist/lib/use-media-query.js +15 -0
- package/dist/lib/use-media-query.js.map +1 -0
- package/dist/lists/lists.d.ts +76 -0
- package/dist/lists/lists.js +133 -0
- package/dist/lists/lists.js.map +1 -0
- package/dist/locale-switch/locale-switch.d.ts +29 -0
- package/dist/locale-switch/locale-switch.js +62 -0
- package/dist/locale-switch/locale-switch.js.map +1 -0
- package/dist/logo/logo.d.ts +31 -0
- package/dist/logo/logo.js +157 -0
- package/dist/logo/logo.js.map +1 -0
- package/dist/logo/product-logo.d.ts +19 -0
- package/dist/logo/product-logo.js +46 -0
- package/dist/logo/product-logo.js.map +1 -0
- package/dist/marketing/marketing.d.ts +176 -0
- package/dist/marketing/marketing.js +451 -0
- package/dist/marketing/marketing.js.map +1 -0
- package/dist/marketing/newsletter-form.d.ts +21 -0
- package/dist/marketing/newsletter-form.js +100 -0
- package/dist/marketing/newsletter-form.js.map +1 -0
- package/dist/mascot/mascot.d.ts +28 -0
- package/dist/mascot/mascot.js +28 -0
- package/dist/mascot/mascot.js.map +1 -0
- package/dist/mascot/mascots.generated.d.ts +284 -0
- package/dist/mascot/mascots.generated.js +287 -0
- package/dist/mascot/mascots.generated.js.map +1 -0
- package/dist/master-detail/master-detail.d.ts +30 -0
- package/dist/master-detail/master-detail.js +71 -0
- package/dist/master-detail/master-detail.js.map +1 -0
- package/dist/menu/account-menu.d.ts +44 -0
- package/dist/menu/account-menu.js +78 -0
- package/dist/menu/account-menu.js.map +1 -0
- package/dist/menu/context-menu.d.ts +31 -0
- package/dist/menu/context-menu.js +111 -0
- package/dist/menu/context-menu.js.map +1 -0
- package/dist/menu/dropdown-menu.d.ts +49 -0
- package/dist/menu/dropdown-menu.js +152 -0
- package/dist/menu/dropdown-menu.js.map +1 -0
- package/dist/menu/menu-styles.d.ts +8 -0
- package/dist/menu/menu-styles.js +6 -0
- package/dist/menu/menu-styles.js.map +1 -0
- package/dist/menu/menubar.d.ts +31 -0
- package/dist/menu/menubar.js +125 -0
- package/dist/menu/menubar.js.map +1 -0
- package/dist/modal/modal.d.ts +34 -0
- package/dist/modal/modal.js +58 -0
- package/dist/modal/modal.js.map +1 -0
- package/dist/notification-center/notification-center.d.ts +51 -0
- package/dist/notification-center/notification-center.js +244 -0
- package/dist/notification-center/notification-center.js.map +1 -0
- package/dist/otp-input/otp-input.d.ts +23 -0
- package/dist/otp-input/otp-input.js +61 -0
- package/dist/otp-input/otp-input.js.map +1 -0
- package/dist/overlay/overlay.d.ts +53 -0
- package/dist/overlay/overlay.js +103 -0
- package/dist/overlay/overlay.js.map +1 -0
- package/dist/page-header/page-header.d.ts +55 -0
- package/dist/page-header/page-header.js +114 -0
- package/dist/page-header/page-header.js.map +1 -0
- package/dist/page-header/record-headers.d.ts +51 -0
- package/dist/page-header/record-headers.js +134 -0
- package/dist/page-header/record-headers.js.map +1 -0
- package/dist/page-header/section-header.d.ts +21 -0
- package/dist/page-header/section-header.js +44 -0
- package/dist/page-header/section-header.js.map +1 -0
- package/dist/page-navigation/page-navigation.d.ts +59 -0
- package/dist/page-navigation/page-navigation.js +136 -0
- package/dist/page-navigation/page-navigation.js.map +1 -0
- package/dist/pagination/pagination.d.ts +28 -0
- package/dist/pagination/pagination.js +102 -0
- package/dist/pagination/pagination.js.map +1 -0
- package/dist/phone-input/phone-input.d.ts +34 -0
- package/dist/phone-input/phone-input.js +171 -0
- package/dist/phone-input/phone-input.js.map +1 -0
- package/dist/popover/popover.d.ts +23 -0
- package/dist/popover/popover.js +40 -0
- package/dist/popover/popover.js.map +1 -0
- package/dist/progress/progress.d.ts +21 -0
- package/dist/progress/progress.js +49 -0
- package/dist/progress/progress.js.map +1 -0
- package/dist/segmented-control/segmented-control.d.ts +32 -0
- package/dist/segmented-control/segmented-control.js +29 -0
- package/dist/segmented-control/segmented-control.js.map +1 -0
- package/dist/select/select.d.ts +48 -0
- package/dist/select/select.js +136 -0
- package/dist/select/select.js.map +1 -0
- package/dist/settings/permission-matrix.d.ts +29 -0
- package/dist/settings/permission-matrix.js +101 -0
- package/dist/settings/permission-matrix.js.map +1 -0
- package/dist/settings/settings-row.d.ts +32 -0
- package/dist/settings/settings-row.js +63 -0
- package/dist/settings/settings-row.js.map +1 -0
- package/dist/side-nav/side-nav.d.ts +36 -0
- package/dist/side-nav/side-nav.js +123 -0
- package/dist/side-nav/side-nav.js.map +1 -0
- package/dist/site-header/site-header.d.ts +32 -0
- package/dist/site-header/site-header.js +99 -0
- package/dist/site-header/site-header.js.map +1 -0
- package/dist/skeleton/skeleton.d.ts +16 -0
- package/dist/skeleton/skeleton.js +19 -0
- package/dist/skeleton/skeleton.js.map +1 -0
- package/dist/slider/slider.d.ts +15 -0
- package/dist/slider/slider.js +48 -0
- package/dist/slider/slider.js.map +1 -0
- package/dist/spinner/spinner.d.ts +15 -0
- package/dist/spinner/spinner.js +42 -0
- package/dist/spinner/spinner.js.map +1 -0
- package/dist/stepper/step-dots.d.ts +16 -0
- package/dist/stepper/step-dots.js +26 -0
- package/dist/stepper/step-dots.js.map +1 -0
- package/dist/stepper/stepper.d.ts +26 -0
- package/dist/stepper/stepper.js +113 -0
- package/dist/stepper/stepper.js.map +1 -0
- package/dist/tabs/tabs.d.ts +31 -0
- package/dist/tabs/tabs.js +66 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/templates/app-templates.d.ts +126 -0
- package/dist/templates/app-templates.js +153 -0
- package/dist/templates/app-templates.js.map +1 -0
- package/dist/templates/site-templates.d.ts +49 -0
- package/dist/templates/site-templates.js +110 -0
- package/dist/templates/site-templates.js.map +1 -0
- package/dist/toast/toast-store.d.ts +54 -0
- package/dist/toast/toast-store.js +49 -0
- package/dist/toast/toast-store.js.map +1 -0
- package/dist/toast/toaster.d.ts +15 -0
- package/dist/toast/toaster.js +124 -0
- package/dist/toast/toaster.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +29 -0
- package/dist/tooltip/tooltip.js +54 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/package.json +88 -3
- package/styles.css +521 -0
- package/README.md +0 -3
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../lib/cx.js";
|
|
3
|
+
import { Icon as t } from "../icon/icon.js";
|
|
4
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
5
|
+
import { createContext as i, useContext as a, useId as o } from "react";
|
|
6
|
+
//#region src/form-field/form-field.tsx
|
|
7
|
+
var s = i(null), c = () => a(s);
|
|
8
|
+
function l({ label: i, hint: a, error: c, required: l = !1, disabled: u = !1, optionalLabel: d, hideLabel: f, labelAction: p, id: m, className: h, children: g, ..._ }) {
|
|
9
|
+
let v = o(), y = m ?? `kf-field-${v}`, b = a ? `${y}-hint` : void 0, x = c ? `${y}-error` : void 0, S = [b, x].filter(Boolean).join(" ") || void 0;
|
|
10
|
+
return /* @__PURE__ */ n(s.Provider, {
|
|
11
|
+
value: {
|
|
12
|
+
id: y,
|
|
13
|
+
describedBy: S,
|
|
14
|
+
invalid: !!c,
|
|
15
|
+
required: l,
|
|
16
|
+
disabled: u
|
|
17
|
+
},
|
|
18
|
+
children: /* @__PURE__ */ r("div", {
|
|
19
|
+
className: e("grid gap-1.5 font-sans", u && "opacity-60", h),
|
|
20
|
+
..._,
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ r("div", {
|
|
23
|
+
className: e("flex items-baseline justify-between gap-3", f && "sr-only"),
|
|
24
|
+
children: [/* @__PURE__ */ r("label", {
|
|
25
|
+
id: `${y}-label`,
|
|
26
|
+
htmlFor: y,
|
|
27
|
+
className: "text-sm font-semibold text-fg",
|
|
28
|
+
children: [
|
|
29
|
+
i,
|
|
30
|
+
l && !d && /* @__PURE__ */ n("span", {
|
|
31
|
+
"aria-hidden": "true",
|
|
32
|
+
className: "ml-0.5 text-danger-fg",
|
|
33
|
+
children: "*"
|
|
34
|
+
}),
|
|
35
|
+
d && !l && /* @__PURE__ */ r("span", {
|
|
36
|
+
className: "ml-1 font-normal text-fg-muted",
|
|
37
|
+
children: [
|
|
38
|
+
"(",
|
|
39
|
+
d,
|
|
40
|
+
")"
|
|
41
|
+
]
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
}), p && /* @__PURE__ */ n("span", {
|
|
45
|
+
className: "text-sm",
|
|
46
|
+
children: p
|
|
47
|
+
})]
|
|
48
|
+
}),
|
|
49
|
+
a && /* @__PURE__ */ n("p", {
|
|
50
|
+
id: b,
|
|
51
|
+
className: "m-0 -mt-0.5 text-sm text-fg-muted",
|
|
52
|
+
children: a
|
|
53
|
+
}),
|
|
54
|
+
g,
|
|
55
|
+
c && /* @__PURE__ */ r("p", {
|
|
56
|
+
id: x,
|
|
57
|
+
className: "m-0 flex items-start gap-1.5 text-sm font-medium text-danger-fg",
|
|
58
|
+
children: [/* @__PURE__ */ n(t, {
|
|
59
|
+
name: "error",
|
|
60
|
+
size: 18,
|
|
61
|
+
className: "mt-px shrink-0 text-danger-icon"
|
|
62
|
+
}), c]
|
|
63
|
+
})
|
|
64
|
+
]
|
|
65
|
+
})
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function u({ legend: t, description: i, className: a, children: o, ...s }) {
|
|
69
|
+
return /* @__PURE__ */ r("fieldset", {
|
|
70
|
+
className: e("m-0 grid min-w-0 gap-4 border-0 p-0 font-sans", a),
|
|
71
|
+
...s,
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ n("legend", {
|
|
74
|
+
className: "mb-1 p-0 font-display text-lg font-bold text-fg",
|
|
75
|
+
children: t
|
|
76
|
+
}),
|
|
77
|
+
i && /* @__PURE__ */ n("p", {
|
|
78
|
+
className: "m-0 -mt-3 text-sm text-fg-muted",
|
|
79
|
+
children: i
|
|
80
|
+
}),
|
|
81
|
+
o
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { u as Fieldset, l as FormField, c as useFormField };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=form-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-field.js","names":["FieldContext","createContext","useFormField","useContext","FormField","idProp","rest","auto","useId","id","hintId","hint","errorId","error","describedBy","cx","disabled","className","hideLabel","label","required","optionalLabel","labelAction","children","Icon","Fieldset","legend","description"],"sources":["../../src/form-field/form-field.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, useId, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../lib/cx';\nimport { Icon } from '../icon/icon';\n\nexport interface FormFieldState {\n id: string;\n /** ids for `aria-describedby` (hint and error). */\n describedBy?: string;\n invalid: boolean;\n required: boolean;\n disabled: boolean;\n}\n\nconst FieldContext = createContext<FormFieldState | null>(null);\n\n/** Read the surrounding FormField (inputs use it to wire id, aria-describedby, aria-invalid). */\nexport const useFormField = () => useContext(FieldContext);\n\nexport interface FormFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n label: ReactNode;\n /** Help text under the label. */\n hint?: ReactNode;\n /** Error message; marks the control `aria-invalid`. Say how to fix it (\"Enter a work email\"). */\n error?: ReactNode;\n required?: boolean;\n disabled?: boolean;\n /** Shows \"(optional)\" after the label instead of marking required fields. */\n optionalLabel?: string;\n /** Visually hide the label (it stays for screen readers). */\n hideLabel?: boolean;\n /** Extra content on the label row (e.g. \"Forgot password?\" link). */\n labelAction?: ReactNode;\n /** Override the generated id. */\n id?: string;\n children: ReactNode;\n}\n\n/**\n * Wraps a single control with its label, help and error. Every Kodffe input reads the field\n * context, so ids and ARIA are wired automatically.\n */\nexport function FormField({\n label,\n hint,\n error,\n required = false,\n disabled = false,\n optionalLabel,\n hideLabel,\n labelAction,\n id: idProp,\n className,\n children,\n ...rest\n}: FormFieldProps) {\n const auto = useId();\n const id = idProp ?? `kf-field-${auto}`;\n const hintId = hint ? `${id}-hint` : undefined;\n const errorId = error ? `${id}-error` : undefined;\n const describedBy = [hintId, errorId].filter(Boolean).join(' ') || undefined;\n return (\n <FieldContext.Provider value={{ id, describedBy, invalid: !!error, required, disabled }}>\n <div className={cx('grid gap-1.5 font-sans', disabled && 'opacity-60', className)} {...rest}>\n <div className={cx('flex items-baseline justify-between gap-3', hideLabel && 'sr-only')}>\n <label id={`${id}-label`} htmlFor={id} className=\"text-sm font-semibold text-fg\">\n {label}\n {required && !optionalLabel && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-danger-fg\">\n *\n </span>\n )}\n {optionalLabel && !required && <span className=\"ml-1 font-normal text-fg-muted\">({optionalLabel})</span>}\n </label>\n {labelAction && <span className=\"text-sm\">{labelAction}</span>}\n </div>\n {hint && (\n <p id={hintId} className=\"m-0 -mt-0.5 text-sm text-fg-muted\">\n {hint}\n </p>\n )}\n {children}\n {error && (\n <p id={errorId} className=\"m-0 flex items-start gap-1.5 text-sm font-medium text-danger-fg\">\n <Icon name=\"error\" size={18} className=\"mt-px shrink-0 text-danger-icon\" />\n {error}\n </p>\n )}\n </div>\n </FieldContext.Provider>\n );\n}\n\n/** Groups related fields (address, billing) with a legend. */\nexport function Fieldset({\n legend,\n description,\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLFieldSetElement> & { legend: ReactNode; description?: ReactNode }) {\n return (\n <fieldset className={cx('m-0 grid min-w-0 gap-4 border-0 p-0 font-sans', className)} {...rest}>\n <legend className=\"mb-1 p-0 font-display text-lg font-bold text-fg\">{legend}</legend>\n {description && <p className=\"m-0 -mt-3 text-sm text-fg-muted\">{description}</p>}\n {children}\n </fieldset>\n );\n}\n"],"mappings":";;;;;;AAeA,IAAMA,IAAeC,EAAqC,IAAI,GAGjDC,UAAqBC,EAAWH,CAAY;AAyBzD,SAAgBI,EAAU,EACxB,UACA,SACA,UACA,cAAW,IACX,cAAW,IACX,kBACA,cACA,gBACA,IAAIC,GACJ,cACA,aACA,GAAGC,KACc;CACjB,IAAMC,IAAOC,EAAM,GACbC,IAAKJ,KAAU,YAAYE,KAC3BG,IAASC,IAAO,GAAGF,EAAG,SAAS,KAAA,GAC/BG,IAAUC,IAAQ,GAAGJ,EAAG,UAAU,KAAA,GAClCK,IAAc,CAACJ,GAAQE,CAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACnE,OACE,kBAACZ,EAAa,UAAd;EAAuB,OAAO;GAAE;GAAI;GAAa,SAAS,CAAC,CAACa;GAAO;GAAU;EAAS;EACpF,UAAA,kBAAC,OAAD;GAAK,WAAWE,EAAG,0BAA0BC,KAAY,cAAcC,CAAS;GAAG,GAAIX;GAAvF,UAAA;IACE,kBAAC,OAAD;KAAK,WAAWS,EAAG,6CAA6CG,KAAa,SAAS;KAAtF,UAAA,CACE,kBAAC,SAAD;MAAO,IAAI,GAAGT,EAAG;MAAS,SAASA;MAAI,WAAU;MAAjD,UAAA;OACGU;OACAC,KAAY,CAACC,KACZ,kBAAC,QAAD;QAAM,eAAY;QAAO,WAAU;QAAwB,UAAA;OAErD,CAAA;OAEPA,KAAiB,CAACD,KAAY,kBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA;SAAiD;SAAEC;SAAc;QAAO;;MAClG;KACN,CAAA,GAAAC,KAAe,kBAAC,QAAD;MAAM,WAAU;MAAW,UAAAA;KAAkB,CAAA,CAC1D;;IACJX,KACC,kBAAC,KAAD;KAAG,IAAID;KAAQ,WAAU;KACtB,UAAAC;IACA,CAAA;IAEJY;IACAV,KACC,kBAAC,KAAD;KAAG,IAAID;KAAS,WAAU;KAA1B,UAAA,CACE,kBAACY,GAAD;MAAM,MAAK;MAAQ,MAAM;MAAI,WAAU;KAAmC,CAAA,GACzEX,CACA;;GAEF;;CACgB,CAAA;AAE3B;AAGA,SAAgBY,EAAS,EACvB,WACA,gBACA,cACA,aACA,GAAGnB,KACoF;CACvF,OACE,kBAAC,YAAD;EAAU,WAAWS,EAAG,iDAAiDE,CAAS;EAAG,GAAIX;EAAzF,UAAA;GACE,kBAAC,UAAD;IAAQ,WAAU;IAAmD,UAAAoB;GAAe,CAAA;GACnFC,KAAe,kBAAC,KAAD;IAAG,WAAU;IAAmC,UAAAA;GAAe,CAAA;GAC9EJ;EACO;;AAEd"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as RadixHoverCard from '@radix-ui/react-hover-card';
|
|
2
|
+
import type { ComponentPropsWithoutRef } from 'react';
|
|
3
|
+
export interface HoverCardProps extends ComponentPropsWithoutRef<typeof RadixHoverCard.Root> {
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Preview of a linked resource (person, company, workflow) on hover or keyboard focus.
|
|
7
|
+
* Sighted mouse users only: the trigger must be a link that leads to the same information.
|
|
8
|
+
*/
|
|
9
|
+
export declare function HoverCard({ openDelay, closeDelay, ...rest }: HoverCardProps): import("react").JSX.Element;
|
|
10
|
+
/** The link that opens the card. Use `asChild` with an `<a>`. */
|
|
11
|
+
export declare const HoverCardTrigger: import("react").ForwardRefExoticComponent<RadixHoverCard.HoverCardTriggerProps & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
12
|
+
export interface HoverCardContentProps extends ComponentPropsWithoutRef<typeof RadixHoverCard.Content> {
|
|
13
|
+
size?: 'sm' | 'md';
|
|
14
|
+
}
|
|
15
|
+
export declare function HoverCardContent({ size, side, sideOffset, collisionPadding, className, ...rest }: HoverCardContentProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../lib/cx.js";
|
|
3
|
+
import { floatingSurface as t } from "../popover/popover.js";
|
|
4
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
5
|
+
import * as r from "@radix-ui/react-hover-card";
|
|
6
|
+
//#region src/hover-card/hover-card.tsx
|
|
7
|
+
function i({ openDelay: e = 500, closeDelay: t = 200, ...i }) {
|
|
8
|
+
return /* @__PURE__ */ n(r.Root, {
|
|
9
|
+
openDelay: e,
|
|
10
|
+
closeDelay: t,
|
|
11
|
+
...i
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
var a = r.Trigger;
|
|
15
|
+
function o({ size: i = "md", side: a = "bottom", sideOffset: o = 8, collisionPadding: s = 16, className: c, ...l }) {
|
|
16
|
+
return /* @__PURE__ */ n(r.Portal, { children: /* @__PURE__ */ n(r.Content, {
|
|
17
|
+
side: a,
|
|
18
|
+
sideOffset: o,
|
|
19
|
+
collisionPadding: s,
|
|
20
|
+
className: e("kf-hovercard p-4 text-sm", t, i === "sm" ? "w-64" : "w-80", c),
|
|
21
|
+
...l
|
|
22
|
+
}) });
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { i as HoverCard, o as HoverCardContent, a as HoverCardTrigger };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=hover-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover-card.js","names":["RadixHoverCard","HoverCard","rest","HoverCardTrigger","HoverCardContent","cx","floatingSurface","size","className"],"sources":["../../src/hover-card/hover-card.tsx"],"sourcesContent":["'use client';\n\nimport * as RadixHoverCard from '@radix-ui/react-hover-card';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cx } from '../lib/cx';\nimport { floatingSurface } from '../popover/popover';\n\nexport interface HoverCardProps extends ComponentPropsWithoutRef<typeof RadixHoverCard.Root> {}\n\n/**\n * Preview of a linked resource (person, company, workflow) on hover or keyboard focus.\n * Sighted mouse users only: the trigger must be a link that leads to the same information.\n */\nexport function HoverCard({ openDelay = 500, closeDelay = 200, ...rest }: HoverCardProps) {\n return <RadixHoverCard.Root openDelay={openDelay} closeDelay={closeDelay} {...rest} />;\n}\n\n/** The link that opens the card. Use `asChild` with an `<a>`. */\nexport const HoverCardTrigger = RadixHoverCard.Trigger;\n\nexport interface HoverCardContentProps extends ComponentPropsWithoutRef<typeof RadixHoverCard.Content> {\n size?: 'sm' | 'md';\n}\n\nexport function HoverCardContent({ size = 'md', side = 'bottom', sideOffset = 8, collisionPadding = 16, className, ...rest }: HoverCardContentProps) {\n return (\n <RadixHoverCard.Portal>\n <RadixHoverCard.Content\n side={side}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={cx('kf-hovercard p-4 text-sm', floatingSurface, size === 'sm' ? 'w-64' : 'w-80', className)}\n {...rest}\n />\n </RadixHoverCard.Portal>\n );\n}\n"],"mappings":";;;;;;AAaA,SAAgBC,EAAU,EAAE,eAAY,KAAK,gBAAa,KAAK,GAAGC,KAAwB;CACxF,OAAO,kBAACF,EAAe,MAAhB;EAAgC;EAAuB;EAAY,GAAIE;CAAO,CAAA;AACvF;AAGA,IAAaC,IAAmBH,EAAe;AAM/C,SAAgBI,EAAiB,EAAE,UAAO,MAAM,UAAO,UAAU,gBAAa,GAAG,sBAAmB,IAAI,cAAW,GAAGF,KAA+B;CACnJ,OACE,kBAACF,EAAe,QAAhB,EAAA,UACE,kBAACA,EAAe,SAAhB;EACQ;EACM;EACM;EAClB,WAAWK,EAAG,4BAA4BC,GAAiBC,MAAS,OAAO,SAAS,QAAQC,CAAS;EACrG,GAAIN;CACL,CAAA,EACoB,CAAA;AAE3B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface PersonHoverCardProps {
|
|
3
|
+
/** The trigger: usually the person's name as a link. */
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
name: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
avatarSrc?: string;
|
|
8
|
+
statusColor?: string;
|
|
9
|
+
statusLabel?: string;
|
|
10
|
+
/** "Clocked in 08:02" */
|
|
11
|
+
clockIn?: string;
|
|
12
|
+
/** Pre-formatted local time ("10:42 in Quito"). */
|
|
13
|
+
localTime?: string;
|
|
14
|
+
/** Next events ("Time off · Nov 20–22"). */
|
|
15
|
+
upcoming?: string[];
|
|
16
|
+
profileHref?: string;
|
|
17
|
+
labels?: {
|
|
18
|
+
upcoming?: string;
|
|
19
|
+
profile?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A person's card on hover or focus in people lists: avatar with status, name, title, clock-in, local time,
|
|
24
|
+
* upcoming events and "View profile". The trigger must be focusable (a link).
|
|
25
|
+
*/
|
|
26
|
+
export declare function PersonHoverCard({ children, name, title, avatarSrc, statusColor, statusLabel, clockIn, localTime, upcoming, profileHref, labels, }: PersonHoverCardProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Icon as e } from "../icon/icon.js";
|
|
3
|
+
import { HoverCard as t, HoverCardContent as n, HoverCardTrigger as r } from "./hover-card.js";
|
|
4
|
+
import { Avatar as i } from "../data-display/avatar.js";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import "react";
|
|
7
|
+
//#region src/hover-card/person-hover-card.tsx
|
|
8
|
+
function s({ children: s, name: c, title: l, avatarSrc: u, statusColor: d, statusLabel: f, clockIn: p, localTime: m, upcoming: h = [], profileHref: g, labels: _ = {} }) {
|
|
9
|
+
return /* @__PURE__ */ o(t, {
|
|
10
|
+
openDelay: 400,
|
|
11
|
+
children: [/* @__PURE__ */ a(r, {
|
|
12
|
+
asChild: !0,
|
|
13
|
+
children: s
|
|
14
|
+
}), /* @__PURE__ */ o(n, {
|
|
15
|
+
className: "grid gap-3",
|
|
16
|
+
children: [
|
|
17
|
+
/* @__PURE__ */ o("div", {
|
|
18
|
+
className: "flex items-center gap-3",
|
|
19
|
+
children: [/* @__PURE__ */ a(i, {
|
|
20
|
+
name: c,
|
|
21
|
+
src: u,
|
|
22
|
+
size: "lg",
|
|
23
|
+
statusColor: d,
|
|
24
|
+
statusLabel: f
|
|
25
|
+
}), /* @__PURE__ */ o("div", {
|
|
26
|
+
className: "grid min-w-0",
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ a("p", {
|
|
29
|
+
className: "m-0 truncate font-semibold text-fg",
|
|
30
|
+
children: c
|
|
31
|
+
}),
|
|
32
|
+
l && /* @__PURE__ */ a("p", {
|
|
33
|
+
className: "m-0 truncate text-xs text-fg-muted",
|
|
34
|
+
children: l
|
|
35
|
+
}),
|
|
36
|
+
f && /* @__PURE__ */ o("p", {
|
|
37
|
+
className: "m-0 mt-1 inline-flex items-center gap-1.5 text-xs font-medium text-fg",
|
|
38
|
+
children: [/* @__PURE__ */ a("span", {
|
|
39
|
+
"aria-hidden": "true",
|
|
40
|
+
className: "size-2 rounded-full",
|
|
41
|
+
style: { background: d }
|
|
42
|
+
}), f]
|
|
43
|
+
})
|
|
44
|
+
]
|
|
45
|
+
})]
|
|
46
|
+
}),
|
|
47
|
+
(p || m) && /* @__PURE__ */ o("div", {
|
|
48
|
+
className: "flex flex-wrap gap-x-4 gap-y-1 text-xs text-fg-muted",
|
|
49
|
+
children: [p && /* @__PURE__ */ o("span", {
|
|
50
|
+
className: "inline-flex items-center gap-1",
|
|
51
|
+
children: [/* @__PURE__ */ a(e, {
|
|
52
|
+
name: "time",
|
|
53
|
+
size: 14
|
|
54
|
+
}), p]
|
|
55
|
+
}), m && /* @__PURE__ */ o("span", {
|
|
56
|
+
className: "inline-flex items-center gap-1",
|
|
57
|
+
children: [/* @__PURE__ */ a(e, {
|
|
58
|
+
name: "c-location",
|
|
59
|
+
size: 14
|
|
60
|
+
}), m]
|
|
61
|
+
})]
|
|
62
|
+
}),
|
|
63
|
+
h.length > 0 && /* @__PURE__ */ o("div", {
|
|
64
|
+
className: "grid gap-1 border-t border-border pt-3",
|
|
65
|
+
children: [/* @__PURE__ */ a("p", {
|
|
66
|
+
className: "m-0 text-xs font-semibold tracking-wide text-fg-muted uppercase",
|
|
67
|
+
children: _.upcoming ?? "Upcoming"
|
|
68
|
+
}), /* @__PURE__ */ a("ul", {
|
|
69
|
+
className: "m-0 grid list-none gap-0.5 p-0 text-sm text-fg",
|
|
70
|
+
children: h.map((e) => /* @__PURE__ */ a("li", { children: e }, e))
|
|
71
|
+
})]
|
|
72
|
+
}),
|
|
73
|
+
g && /* @__PURE__ */ o("a", {
|
|
74
|
+
href: g,
|
|
75
|
+
className: "text-sm font-semibold text-link no-underline hover:underline",
|
|
76
|
+
children: [_.profile ?? "View profile", " →"]
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
})]
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { s as PersonHoverCard };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=person-hover-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-hover-card.js","names":["PersonHoverCard","HoverCard","HoverCardTrigger","HoverCardContent","Avatar","avatarSrc","name","title","statusLabel","statusColor","clockIn","localTime","Icon","upcoming","labels","u","profileHref"],"sources":["../../src/hover-card/person-hover-card.tsx"],"sourcesContent":["'use client';\nimport { type ReactNode } from 'react';\nimport { Icon } from '../icon/icon';\nimport { Avatar } from '../data-display/avatar';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '../hover-card/hover-card';\n\n/* ---------------- PersonHoverCard ---------------- */\n\nexport interface PersonHoverCardProps {\n /** The trigger: usually the person's name as a link. */\n children: ReactNode;\n name: string;\n title?: string;\n avatarSrc?: string;\n statusColor?: string;\n statusLabel?: string;\n /** \"Clocked in 08:02\" */\n clockIn?: string;\n /** Pre-formatted local time (\"10:42 in Quito\"). */\n localTime?: string;\n /** Next events (\"Time off · Nov 20–22\"). */\n upcoming?: string[];\n profileHref?: string;\n labels?: { upcoming?: string; profile?: string };\n}\n\n/**\n * A person's card on hover or focus in people lists: avatar with status, name, title, clock-in, local time,\n * upcoming events and \"View profile\". The trigger must be focusable (a link).\n */\nexport function PersonHoverCard({\n children,\n name,\n title,\n avatarSrc,\n statusColor,\n statusLabel,\n clockIn,\n localTime,\n upcoming = [],\n profileHref,\n labels = {},\n}: PersonHoverCardProps) {\n return (\n <HoverCard openDelay={400}>\n <HoverCardTrigger asChild>{children}</HoverCardTrigger>\n <HoverCardContent className=\"grid gap-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar name={name} src={avatarSrc} size=\"lg\" statusColor={statusColor} statusLabel={statusLabel} />\n <div className=\"grid min-w-0\">\n <p className=\"m-0 truncate font-semibold text-fg\">{name}</p>\n {title && <p className=\"m-0 truncate text-xs text-fg-muted\">{title}</p>}\n {statusLabel && (\n <p className=\"m-0 mt-1 inline-flex items-center gap-1.5 text-xs font-medium text-fg\">\n <span aria-hidden=\"true\" className=\"size-2 rounded-full\" style={{ background: statusColor }} />\n {statusLabel}\n </p>\n )}\n </div>\n </div>\n {(clockIn || localTime) && (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 text-xs text-fg-muted\">\n {clockIn && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon name=\"time\" size={14} />\n {clockIn}\n </span>\n )}\n {localTime && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon name=\"c-location\" size={14} />\n {localTime}\n </span>\n )}\n </div>\n )}\n {upcoming.length > 0 && (\n <div className=\"grid gap-1 border-t border-border pt-3\">\n <p className=\"m-0 text-xs font-semibold tracking-wide text-fg-muted uppercase\">\n {labels.upcoming ?? 'Upcoming'}\n </p>\n <ul className=\"m-0 grid list-none gap-0.5 p-0 text-sm text-fg\">\n {upcoming.map((u) => (\n <li key={u}>{u}</li>\n ))}\n </ul>\n </div>\n )}\n {profileHref && (\n <a href={profileHref} className=\"text-sm font-semibold text-link no-underline hover:underline\">\n {labels.profile ?? 'View profile'} →\n </a>\n )}\n </HoverCardContent>\n </HoverCard>\n );\n}\n"],"mappings":";;;;;;;AA8BA,SAAgBA,EAAgB,EAC9B,aACA,SACA,UACA,cACA,gBACA,gBACA,YACA,cACA,cAAW,CAAC,GACZ,gBACA,YAAS,CAAC,KACa;CACvB,OACE,kBAACC,GAAD;EAAW,WAAW;EAAtB,UAAA,CACE,kBAACC,GAAD;GAAkB,SAAA;GAAS;EAA2B,CAAA,GACtD,kBAACC,GAAD;GAAkB,WAAU;GAA5B,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACC,GAAD;MAAc;MAAM,KAAKC;MAAW,MAAK;MAAkB;MAA0B;KAAc,CAAA,GACnG,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,kBAAC,KAAD;QAAG,WAAU;QAAsC,UAAAC;OAAQ,CAAA;OAC1DC,KAAS,kBAAC,KAAD;QAAG,WAAU;QAAsC,UAAAA;OAAS,CAAA;OACrEC,KACC,kBAAC,KAAD;QAAG,WAAU;QAAb,UAAA,CACE,kBAAC,QAAD;SAAM,eAAY;SAAO,WAAU;SAAsB,OAAO,EAAE,YAAYC,EAAY;QAAI,CAAA,GAC7FD,CACA;;MAEF;KACF,CAAA,CAAA;;KACHE,KAAWC,MACX,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACGD,KACC,kBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACE,kBAACE,GAAD;OAAM,MAAK;OAAO,MAAM;MAAK,CAAA,GAC5BF,CACG;KAEP,CAAA,GAAAC,KACC,kBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CACE,kBAACC,GAAD;OAAM,MAAK;OAAa,MAAM;MAAK,CAAA,GAClCD,CACG;KAEL,CAAA,CAAA;;IAENE,EAAS,SAAS,KACjB,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;MACV,UAAAC,EAAO,YAAY;KACnB,CAAA,GACH,kBAAC,MAAD;MAAI,WAAU;MACX,UAAAD,EAAS,KAAK,MACb,kBAAC,MAAD,EAAA,UAAaE,EAAM,GAAVA,CAAU,CACpB;KACC,CAAA,CACD;;IAENC,KACC,kBAAC,KAAD;KAAG,MAAMA;KAAa,WAAU;KAAhC,UAAA,CACGF,EAAO,WAAW,gBAAe,IACjC;;GAEW;EACT,CAAA,CAAA;;AAEf"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type IconName } from './icon';
|
|
2
|
+
export type IconTileSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
3
|
+
export type IconTileTone = 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'neutral' | 'muted' | 'outline' | 'inverse';
|
|
4
|
+
export interface IconTileProps {
|
|
5
|
+
icon: IconName;
|
|
6
|
+
size?: IconTileSize;
|
|
7
|
+
tone?: IconTileTone;
|
|
8
|
+
/**
|
|
9
|
+
* A category color (`var(--kf-category-N)`) instead of a tone: `solid` fills the tile and the icon is white;
|
|
10
|
+
* `soft` tints the tile and colors the icon.
|
|
11
|
+
*/
|
|
12
|
+
color?: string;
|
|
13
|
+
colorStyle?: 'solid' | 'soft';
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The square icon tile used across the library (section and page headers, settings rows, lists, cards, records).
|
|
18
|
+
* Always decorative: the text next to it carries the meaning.
|
|
19
|
+
*/
|
|
20
|
+
export declare function IconTile({ icon, size, tone, color, colorStyle, className, }: IconTileProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { cx as e } from "../lib/cx.js";
|
|
2
|
+
import { Icon as t } from "./icon.js";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
//#region src/icon/icon-tile.tsx
|
|
5
|
+
var r = {
|
|
6
|
+
xs: {
|
|
7
|
+
box: "size-7 rounded-sm",
|
|
8
|
+
icon: 16
|
|
9
|
+
},
|
|
10
|
+
sm: {
|
|
11
|
+
box: "size-9 rounded-sm",
|
|
12
|
+
icon: 18
|
|
13
|
+
},
|
|
14
|
+
md: {
|
|
15
|
+
box: "size-10 rounded-sm",
|
|
16
|
+
icon: 20
|
|
17
|
+
},
|
|
18
|
+
lg: {
|
|
19
|
+
box: "size-12 rounded-md",
|
|
20
|
+
icon: 24
|
|
21
|
+
},
|
|
22
|
+
xl: {
|
|
23
|
+
box: "size-16 rounded-lg",
|
|
24
|
+
icon: 30
|
|
25
|
+
}
|
|
26
|
+
}, i = {
|
|
27
|
+
primary: "bg-info-surface text-primary",
|
|
28
|
+
accent: "bg-accent/15 text-fg",
|
|
29
|
+
success: "bg-success-surface text-success-icon",
|
|
30
|
+
warning: "bg-warning-surface text-warning-icon",
|
|
31
|
+
danger: "bg-danger-surface text-danger-icon",
|
|
32
|
+
neutral: "bg-surface-muted text-fg-muted",
|
|
33
|
+
muted: "bg-surface-muted text-primary",
|
|
34
|
+
outline: "border border-border bg-bg text-fg",
|
|
35
|
+
inverse: "bg-white/12 text-white"
|
|
36
|
+
};
|
|
37
|
+
function a({ icon: a, size: o = "md", tone: s = "primary", color: c, colorStyle: l = "solid", className: u }) {
|
|
38
|
+
let d = r[o];
|
|
39
|
+
return /* @__PURE__ */ n("span", {
|
|
40
|
+
"aria-hidden": "true",
|
|
41
|
+
className: e("grid shrink-0 place-items-center", d.box, c ? l === "solid" && "text-white" : i[s], u),
|
|
42
|
+
style: c ? l === "solid" ? { background: c } : {
|
|
43
|
+
background: `color-mix(in oklab, ${c}, transparent 82%)`,
|
|
44
|
+
color: c
|
|
45
|
+
} : void 0,
|
|
46
|
+
children: /* @__PURE__ */ n(t, {
|
|
47
|
+
name: a,
|
|
48
|
+
size: d.icon
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { a as IconTile };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=icon-tile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-tile.js","names":["SIZES","TONES","IconTile","s","size","cx","color","colorStyle","tone","className","Icon","icon"],"sources":["../../src/icon/icon-tile.tsx"],"sourcesContent":["import { cx } from '../lib/cx';\nimport { Icon, type IconName } from './icon';\n\nexport type IconTileSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type IconTileTone =\n 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'neutral' | 'muted' | 'outline' | 'inverse';\n\n/** 28 / 36 / 40 / 48 / 64 px tiles with 16 / 18 / 20 / 24 / 30 px icons. */\nconst SIZES: Record<IconTileSize, { box: string; icon: number }> = {\n xs: { box: 'size-7 rounded-sm', icon: 16 },\n sm: { box: 'size-9 rounded-sm', icon: 18 },\n md: { box: 'size-10 rounded-sm', icon: 20 },\n lg: { box: 'size-12 rounded-md', icon: 24 },\n xl: { box: 'size-16 rounded-lg', icon: 30 },\n};\n\nconst TONES: Record<IconTileTone, string> = {\n primary: 'bg-info-surface text-primary',\n accent: 'bg-accent/15 text-fg',\n success: 'bg-success-surface text-success-icon',\n warning: 'bg-warning-surface text-warning-icon',\n danger: 'bg-danger-surface text-danger-icon',\n neutral: 'bg-surface-muted text-fg-muted',\n muted: 'bg-surface-muted text-primary',\n outline: 'border border-border bg-bg text-fg',\n // On brand bands (PageHeader, selected rows): white on a translucent white.\n inverse: 'bg-white/12 text-white',\n};\n\nexport interface IconTileProps {\n icon: IconName;\n size?: IconTileSize;\n tone?: IconTileTone;\n /**\n * A category color (`var(--kf-category-N)`) instead of a tone: `solid` fills the tile and the icon is white;\n * `soft` tints the tile and colors the icon.\n */\n color?: string;\n colorStyle?: 'solid' | 'soft';\n className?: string;\n}\n\n/**\n * The square icon tile used across the library (section and page headers, settings rows, lists, cards, records).\n * Always decorative: the text next to it carries the meaning.\n */\nexport function IconTile({\n icon,\n size = 'md',\n tone = 'primary',\n color,\n colorStyle = 'solid',\n className,\n}: IconTileProps) {\n const s = SIZES[size];\n return (\n <span\n aria-hidden=\"true\"\n className={cx(\n 'grid shrink-0 place-items-center',\n s.box,\n color ? colorStyle === 'solid' && 'text-white' : TONES[tone],\n className,\n )}\n style={\n color\n ? colorStyle === 'solid'\n ? { background: color }\n : { background: `color-mix(in oklab, ${color}, transparent 82%)`, color }\n : undefined\n }\n >\n <Icon name={icon} size={s.icon} />\n </span>\n );\n}\n"],"mappings":";;;;AAQA,IAAMA,IAA6D;CACjE,IAAI;EAAE,KAAK;EAAqB,MAAM;CAAG;CACzC,IAAI;EAAE,KAAK;EAAqB,MAAM;CAAG;CACzC,IAAI;EAAE,KAAK;EAAsB,MAAM;CAAG;CAC1C,IAAI;EAAE,KAAK;EAAsB,MAAM;CAAG;CAC1C,IAAI;EAAE,KAAK;EAAsB,MAAM;CAAG;AAC5C,GAEMC,IAAsC;CAC1C,SAAS;CACT,QAAQ;CACR,SAAS;CACT,SAAS;CACT,QAAQ;CACR,SAAS;CACT,OAAO;CACP,SAAS;CAET,SAAS;AACX;AAmBA,SAAgBC,EAAS,EACvB,SACA,UAAO,MACP,UAAO,WACP,UACA,gBAAa,SACb,gBACgB;CAChB,IAAMC,IAAIH,EAAMI;CAChB,OACE,kBAAC,QAAD;EACE,eAAY;EACZ,WAAWC,EACT,oCACAF,EAAE,KACFG,IAAQC,MAAe,WAAW,eAAeN,EAAMO,IACvDC,CACF;EACA,OACEH,IACIC,MAAe,UACb,EAAE,YAAYD,EAAM,IACpB;GAAE,YAAY,uBAAuBA,EAAM;GAAqB;EAAM,IACxE,KAAA;EAGN,UAAA,kBAACI,GAAD;GAAM,MAAMC;GAAM,MAAMR,EAAE;EAAO,CAAA;CAC7B,CAAA;AAEV"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SVGProps } from 'react';
|
|
2
|
+
import { type IconName } from './icons.generated';
|
|
3
|
+
export type { IconName };
|
|
4
|
+
export declare const iconNames: IconName[];
|
|
5
|
+
export interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {
|
|
6
|
+
/** Static icon from the Kodffe set: actions (`accept`), interface (`home`), contact (`c-email`), brands (`b-github`). */
|
|
7
|
+
name: IconName;
|
|
8
|
+
/** Height in px or any CSS length. Width follows the icon's proportions. Defaults to 1em. */
|
|
9
|
+
size?: number | string;
|
|
10
|
+
/** Accessible name. Omit when the icon sits next to visible text (it is then hidden from screen readers). */
|
|
11
|
+
title?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Kodffe static icon. Inherits the text color (`currentColor`) and works from 16 px. Animated mascots are `Mascot`. */
|
|
14
|
+
export declare function Icon({ name, size, title, className, style, ...rest }: IconProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { cx as e } from "../lib/cx.js";
|
|
2
|
+
import { ICONS as t } from "./icons.generated.js";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
//#region src/icon/icon.tsx
|
|
5
|
+
var r = Object.keys(t);
|
|
6
|
+
function i({ name: r, size: i = "1em", title: a, className: o, style: s, ...c }) {
|
|
7
|
+
let l = t[r], u = a ? {
|
|
8
|
+
role: "img",
|
|
9
|
+
"aria-label": a
|
|
10
|
+
} : { "aria-hidden": !0 };
|
|
11
|
+
return /* @__PURE__ */ n("svg", {
|
|
12
|
+
viewBox: l.viewBox,
|
|
13
|
+
className: e("inline-block shrink-0 overflow-visible", o),
|
|
14
|
+
style: {
|
|
15
|
+
height: i,
|
|
16
|
+
width: "auto",
|
|
17
|
+
...s
|
|
18
|
+
},
|
|
19
|
+
focusable: "false",
|
|
20
|
+
...u,
|
|
21
|
+
...c,
|
|
22
|
+
dangerouslySetInnerHTML: { __html: l.body }
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { i as Icon, r as iconNames };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","names":["iconNames","ICONS","Icon","rest","icon","name","a11y","title","cx","className","size","style"],"sources":["../../src/icon/icon.tsx"],"sourcesContent":["import type { SVGProps } from 'react';\nimport { cx } from '../lib/cx';\nimport { ICONS, type IconName } from './icons.generated';\n\nexport type { IconName };\nexport const iconNames = Object.keys(ICONS) as IconName[];\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {\n /** Static icon from the Kodffe set: actions (`accept`), interface (`home`), contact (`c-email`), brands (`b-github`). */\n name: IconName;\n /** Height in px or any CSS length. Width follows the icon's proportions. Defaults to 1em. */\n size?: number | string;\n /** Accessible name. Omit when the icon sits next to visible text (it is then hidden from screen readers). */\n title?: string;\n}\n\n/** Kodffe static icon. Inherits the text color (`currentColor`) and works from 16 px. Animated mascots are `Mascot`. */\nexport function Icon({ name, size = '1em', title, className, style, ...rest }: IconProps) {\n const icon = ICONS[name];\n const a11y = title ? { role: 'img', 'aria-label': title } : { 'aria-hidden': true as const };\n return (\n <svg\n viewBox={icon.viewBox}\n className={cx('inline-block shrink-0 overflow-visible', className)}\n style={{ height: size, width: 'auto', ...style }}\n focusable=\"false\"\n {...a11y}\n {...rest}\n dangerouslySetInnerHTML={{ __html: icon.body }}\n />\n );\n}\n"],"mappings":";;;;AAKA,IAAaA,IAAY,OAAO,KAAKC,CAAK;AAY1C,SAAgBC,EAAK,EAAE,SAAM,UAAO,OAAO,UAAO,cAAW,UAAO,GAAGC,KAAmB;CACxF,IAAMC,IAAOH,EAAMI,IACbC,IAAOC,IAAQ;EAAE,MAAM;EAAO,cAAcA;CAAM,IAAI,EAAE,eAAe,GAAc;CAC3F,OACE,kBAAC,OAAD;EACE,SAASH,EAAK;EACd,WAAWI,EAAG,0CAA0CC,CAAS;EACjE,OAAO;GAAE,QAAQC;GAAM,OAAO;GAAQ,GAAGC;EAAM;EAC/C,WAAU;EACV,GAAIL;EACJ,GAAIH;EACJ,yBAAyB,EAAE,QAAQC,EAAK,KAAK;CAC9C,CAAA;AAEL"}
|