@inshorts/glint-ui 0.5.4 → 0.6.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/README.md +3 -1
- package/dist/alert.cjs +96 -0
- package/dist/alert.cjs.map +1 -0
- package/dist/alert.d.cts +29 -0
- package/dist/alert.d.ts +29 -0
- package/dist/alert.js +10 -0
- package/dist/alert.js.map +1 -0
- package/dist/autocomplete.cjs +578 -0
- package/dist/autocomplete.cjs.map +1 -0
- package/dist/autocomplete.d.cts +56 -0
- package/dist/autocomplete.d.ts +56 -0
- package/dist/autocomplete.js +11 -0
- package/dist/autocomplete.js.map +1 -0
- package/dist/badge.cjs +89 -0
- package/dist/badge.cjs.map +1 -0
- package/dist/badge.d.cts +25 -0
- package/dist/badge.d.ts +25 -0
- package/dist/badge.js +10 -0
- package/dist/badge.js.map +1 -0
- package/dist/breadcrumb.cjs +88 -0
- package/dist/breadcrumb.cjs.map +1 -0
- package/dist/breadcrumb.d.cts +14 -0
- package/dist/breadcrumb.d.ts +14 -0
- package/dist/breadcrumb.js +8 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/button.cjs +143 -0
- package/dist/button.cjs.map +1 -0
- package/dist/button.d.cts +34 -0
- package/dist/button.d.ts +34 -0
- package/dist/button.js +9 -0
- package/dist/button.js.map +1 -0
- package/dist/card.cjs +111 -0
- package/dist/card.cjs.map +1 -0
- package/dist/card.d.cts +15 -0
- package/dist/card.d.ts +15 -0
- package/dist/card.js +18 -0
- package/dist/card.js.map +1 -0
- package/dist/checkbox.cjs +66 -0
- package/dist/checkbox.cjs.map +1 -0
- package/{src/checkbox.tsx → dist/checkbox.d.cts} +5 -22
- package/dist/checkbox.d.ts +25 -0
- package/dist/checkbox.js +10 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-5MEOZHJA.js +513 -0
- package/dist/chunk-5MEOZHJA.js.map +1 -0
- package/dist/chunk-67ACNS42.js +29 -0
- package/dist/chunk-67ACNS42.js.map +1 -0
- package/dist/chunk-A6GRLKOO.js +85 -0
- package/dist/chunk-A6GRLKOO.js.map +1 -0
- package/dist/chunk-DS3QYIKL.js +90 -0
- package/dist/chunk-DS3QYIKL.js.map +1 -0
- package/dist/chunk-EWSBFU54.js +53 -0
- package/dist/chunk-EWSBFU54.js.map +1 -0
- package/dist/chunk-G4ZQUSAJ.js +38 -0
- package/dist/chunk-G4ZQUSAJ.js.map +1 -0
- package/dist/chunk-GMCUXEFI.js +67 -0
- package/dist/chunk-GMCUXEFI.js.map +1 -0
- package/dist/chunk-HBBOR43A.js +85 -0
- package/dist/chunk-HBBOR43A.js.map +1 -0
- package/dist/chunk-HCA5ODCD.js +11 -0
- package/dist/chunk-HCA5ODCD.js.map +1 -0
- package/dist/chunk-HYRJYUPI.js +26 -0
- package/dist/chunk-HYRJYUPI.js.map +1 -0
- package/dist/chunk-IRCTGJQB.js +26 -0
- package/dist/chunk-IRCTGJQB.js.map +1 -0
- package/dist/chunk-ISPICB4W.js +70 -0
- package/dist/chunk-ISPICB4W.js.map +1 -0
- package/dist/chunk-JDE5XYPT.js +30 -0
- package/dist/chunk-JDE5XYPT.js.map +1 -0
- package/dist/chunk-JSJEEKR3.js +59 -0
- package/dist/chunk-JSJEEKR3.js.map +1 -0
- package/dist/chunk-KR3BCFP7.js +85 -0
- package/dist/chunk-KR3BCFP7.js.map +1 -0
- package/dist/chunk-MLRSOTFI.js +81 -0
- package/dist/chunk-MLRSOTFI.js.map +1 -0
- package/dist/chunk-MQT5RAQV.js +202 -0
- package/dist/chunk-MQT5RAQV.js.map +1 -0
- package/dist/chunk-MUPW2TFJ.js +102 -0
- package/dist/chunk-MUPW2TFJ.js.map +1 -0
- package/dist/chunk-OUYT6SPU.js +76 -0
- package/dist/chunk-OUYT6SPU.js.map +1 -0
- package/dist/chunk-PM2VE7DJ.js +100 -0
- package/dist/chunk-PM2VE7DJ.js.map +1 -0
- package/dist/chunk-PPYR3O3L.js +44 -0
- package/dist/chunk-PPYR3O3L.js.map +1 -0
- package/dist/chunk-PUTC52SI.js +98 -0
- package/dist/chunk-PUTC52SI.js.map +1 -0
- package/dist/chunk-PWAKTEXF.js +18 -0
- package/dist/chunk-PWAKTEXF.js.map +1 -0
- package/dist/chunk-QTFWORA7.js +26 -0
- package/dist/chunk-QTFWORA7.js.map +1 -0
- package/dist/chunk-RUPL2H6V.js +49 -0
- package/dist/chunk-RUPL2H6V.js.map +1 -0
- package/dist/chunk-S7PVZAPL.js +28 -0
- package/dist/chunk-S7PVZAPL.js.map +1 -0
- package/dist/chunk-SQDV2AKJ.js +49 -0
- package/dist/chunk-SQDV2AKJ.js.map +1 -0
- package/dist/chunk-T2KXVH3O.js +297 -0
- package/dist/chunk-T2KXVH3O.js.map +1 -0
- package/dist/chunk-T4WCCHJQ.js +29 -0
- package/dist/chunk-T4WCCHJQ.js.map +1 -0
- package/dist/chunk-UC3ZIQPE.js +93 -0
- package/dist/chunk-UC3ZIQPE.js.map +1 -0
- package/dist/chunk-UE7JY7VR.js +28 -0
- package/dist/chunk-UE7JY7VR.js.map +1 -0
- package/dist/chunk-Y5WCT6XN.js +93 -0
- package/dist/chunk-Y5WCT6XN.js.map +1 -0
- package/dist/chunk-YDICVETX.js +151 -0
- package/dist/chunk-YDICVETX.js.map +1 -0
- package/dist/chunk-ZFSQVMLJ.js +126 -0
- package/dist/chunk-ZFSQVMLJ.js.map +1 -0
- package/dist/chunk-ZHATD73Y.js +46 -0
- package/dist/chunk-ZHATD73Y.js.map +1 -0
- package/dist/chunk-ZLAA4DGG.js +111 -0
- package/dist/chunk-ZLAA4DGG.js.map +1 -0
- package/dist/chunk-ZP252OJZ.js +56 -0
- package/dist/chunk-ZP252OJZ.js.map +1 -0
- package/dist/clipboard.cjs +125 -0
- package/dist/clipboard.cjs.map +1 -0
- package/dist/clipboard.d.cts +52 -0
- package/dist/clipboard.d.ts +52 -0
- package/dist/clipboard.js +23 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/collapsible.cjs +94 -0
- package/dist/collapsible.cjs.map +1 -0
- package/dist/collapsible.d.cts +21 -0
- package/dist/collapsible.d.ts +21 -0
- package/dist/collapsible.js +9 -0
- package/dist/collapsible.js.map +1 -0
- package/dist/confirm-dialog.cjs +369 -0
- package/dist/confirm-dialog.cjs.map +1 -0
- package/dist/confirm-dialog.d.cts +16 -0
- package/dist/confirm-dialog.d.ts +16 -0
- package/dist/confirm-dialog.js +13 -0
- package/dist/confirm-dialog.js.map +1 -0
- package/dist/copy-button.cjs +102 -0
- package/dist/copy-button.cjs.map +1 -0
- package/dist/copy-button.d.cts +18 -0
- package/dist/copy-button.d.ts +18 -0
- package/dist/copy-button.js +10 -0
- package/dist/copy-button.js.map +1 -0
- package/dist/data-table.cjs +140 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +81 -0
- package/dist/data-table.d.ts +81 -0
- package/dist/data-table.js +8 -0
- package/dist/data-table.js.map +1 -0
- package/dist/date-range-picker/dateRange.cjs +138 -0
- package/dist/date-range-picker/dateRange.cjs.map +1 -0
- package/dist/date-range-picker/dateRange.d.cts +57 -0
- package/dist/date-range-picker/dateRange.d.ts +57 -0
- package/dist/date-range-picker/dateRange.js +31 -0
- package/dist/date-range-picker/dateRange.js.map +1 -0
- package/dist/date-range-picker/index.cjs +375 -0
- package/dist/date-range-picker/index.cjs.map +1 -0
- package/dist/date-range-picker/index.d.cts +18 -0
- package/dist/date-range-picker/index.d.ts +18 -0
- package/dist/date-range-picker/index.js +10 -0
- package/dist/date-range-picker/index.js.map +1 -0
- package/dist/dialogLayer.cjs +121 -0
- package/dist/dialogLayer.cjs.map +1 -0
- package/dist/dialogLayer.d.cts +11 -0
- package/dist/dialogLayer.d.ts +11 -0
- package/dist/dialogLayer.js +8 -0
- package/dist/dialogLayer.js.map +1 -0
- package/dist/feature-access-gate.cjs +160 -0
- package/dist/feature-access-gate.cjs.map +1 -0
- package/dist/feature-access-gate.d.cts +14 -0
- package/dist/feature-access-gate.d.ts +14 -0
- package/dist/feature-access-gate.js +11 -0
- package/dist/feature-access-gate.js.map +1 -0
- package/dist/field.cjs +58 -0
- package/dist/field.cjs.map +1 -0
- package/dist/field.d.cts +23 -0
- package/dist/field.d.ts +23 -0
- package/dist/field.js +8 -0
- package/dist/field.js.map +1 -0
- package/dist/image-uploader.cjs +293 -0
- package/dist/image-uploader.cjs.map +1 -0
- package/dist/image-uploader.d.cts +34 -0
- package/dist/image-uploader.d.ts +34 -0
- package/dist/image-uploader.js +12 -0
- package/dist/image-uploader.js.map +1 -0
- package/dist/index.cjs +3008 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +41 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +232 -0
- package/dist/index.js.map +1 -0
- package/dist/input.cjs +58 -0
- package/dist/input.cjs.map +1 -0
- package/dist/input.d.cts +7 -0
- package/dist/input.d.ts +7 -0
- package/dist/input.js +10 -0
- package/dist/input.js.map +1 -0
- package/dist/label.cjs +67 -0
- package/dist/label.cjs.map +1 -0
- package/dist/label.d.cts +7 -0
- package/dist/label.d.ts +7 -0
- package/dist/label.js +9 -0
- package/dist/label.js.map +1 -0
- package/dist/modal.cjs +212 -0
- package/dist/modal.cjs.map +1 -0
- package/dist/modal.d.cts +39 -0
- package/dist/modal.d.ts +39 -0
- package/dist/modal.js +12 -0
- package/dist/modal.js.map +1 -0
- package/dist/page-header.cjs +78 -0
- package/dist/page-header.cjs.map +1 -0
- package/dist/page-header.d.cts +35 -0
- package/dist/page-header.d.ts +35 -0
- package/dist/page-header.js +8 -0
- package/dist/page-header.js.map +1 -0
- package/dist/pagination.cjs +237 -0
- package/dist/pagination.cjs.map +1 -0
- package/dist/pagination.d.cts +15 -0
- package/dist/pagination.d.ts +15 -0
- package/dist/pagination.js +11 -0
- package/dist/pagination.js.map +1 -0
- package/dist/panel-brand-mark.cjs +59 -0
- package/dist/panel-brand-mark.cjs.map +1 -0
- package/dist/panel-brand-mark.d.cts +13 -0
- package/dist/panel-brand-mark.d.ts +13 -0
- package/dist/panel-brand-mark.js +8 -0
- package/dist/panel-brand-mark.js.map +1 -0
- package/dist/panel-sign-in.cjs +256 -0
- package/dist/panel-sign-in.cjs.map +1 -0
- package/dist/panel-sign-in.d.cts +31 -0
- package/dist/panel-sign-in.d.ts +31 -0
- package/dist/panel-sign-in.js +14 -0
- package/dist/panel-sign-in.js.map +1 -0
- package/dist/segmented-control.cjs +122 -0
- package/dist/segmented-control.cjs.map +1 -0
- package/dist/segmented-control.d.cts +58 -0
- package/dist/segmented-control.d.ts +58 -0
- package/dist/segmented-control.js +9 -0
- package/dist/segmented-control.js.map +1 -0
- package/dist/select.cjs +648 -0
- package/dist/select.cjs.map +1 -0
- package/dist/select.d.cts +30 -0
- package/dist/select.d.ts +30 -0
- package/dist/select.js +12 -0
- package/dist/select.js.map +1 -0
- package/dist/separator.cjs +70 -0
- package/dist/separator.cjs.map +1 -0
- package/dist/separator.d.cts +13 -0
- package/dist/separator.d.ts +13 -0
- package/dist/separator.js +9 -0
- package/dist/separator.js.map +1 -0
- package/dist/side-drawer.cjs +321 -0
- package/dist/side-drawer.cjs.map +1 -0
- package/dist/side-drawer.d.cts +21 -0
- package/dist/side-drawer.d.ts +21 -0
- package/dist/side-drawer.js +13 -0
- package/dist/side-drawer.js.map +1 -0
- package/dist/spinner.cjs +57 -0
- package/dist/spinner.cjs.map +1 -0
- package/{src/spinner.tsx → dist/spinner.d.cts} +11 -22
- package/dist/spinner.d.ts +27 -0
- package/dist/spinner.js +8 -0
- package/dist/spinner.js.map +1 -0
- package/dist/spreadsheet-grid.cjs +238 -0
- package/dist/spreadsheet-grid.cjs.map +1 -0
- package/dist/spreadsheet-grid.d.cts +48 -0
- package/dist/spreadsheet-grid.d.ts +48 -0
- package/dist/spreadsheet-grid.js +8 -0
- package/dist/spreadsheet-grid.js.map +1 -0
- package/dist/state-panel.cjs +86 -0
- package/dist/state-panel.cjs.map +1 -0
- package/dist/state-panel.d.cts +23 -0
- package/dist/state-panel.d.ts +23 -0
- package/dist/state-panel.js +9 -0
- package/dist/state-panel.js.map +1 -0
- package/dist/switch.cjs +87 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.d.cts +13 -0
- package/dist/switch.d.ts +13 -0
- package/dist/switch.js +9 -0
- package/dist/switch.js.map +1 -0
- package/dist/table.cjs +139 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.d.cts +16 -0
- package/dist/table.d.ts +16 -0
- package/dist/table.js +22 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.cjs +168 -0
- package/dist/tabs.cjs.map +1 -0
- package/dist/tabs.d.cts +59 -0
- package/dist/tabs.d.ts +59 -0
- package/dist/tabs.js +11 -0
- package/dist/tabs.js.map +1 -0
- package/dist/textarea.cjs +66 -0
- package/dist/textarea.cjs.map +1 -0
- package/dist/textarea.d.cts +18 -0
- package/dist/textarea.d.ts +18 -0
- package/dist/textarea.js +10 -0
- package/dist/textarea.js.map +1 -0
- package/dist/utils.cjs +35 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +5 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/package.json +391 -14
- package/src/alert.tsx +0 -74
- package/src/autocomplete.tsx +0 -666
- package/src/badge.tsx +0 -60
- package/src/breadcrumb.tsx +0 -71
- package/src/button.tsx +0 -113
- package/src/card.tsx +0 -79
- package/src/clipboard.ts +0 -144
- package/src/collapsible.tsx +0 -63
- package/src/confirm-dialog.tsx +0 -84
- package/src/copy-button.tsx +0 -58
- package/src/data-table.tsx +0 -190
- package/src/date-range-picker/dateRange.ts +0 -142
- package/src/date-range-picker/index.tsx +0 -366
- package/src/dialogLayer.ts +0 -142
- package/src/feature-access-gate.tsx +0 -38
- package/src/field.tsx +0 -56
- package/src/image-uploader.tsx +0 -181
- package/src/index.ts +0 -37
- package/src/input.tsx +0 -16
- package/src/label.tsx +0 -23
- package/src/modal.tsx +0 -117
- package/src/page-header.tsx +0 -75
- package/src/pagination.tsx +0 -116
- package/src/panel-brand-mark.tsx +0 -32
- package/src/panel-sign-in.tsx +0 -134
- package/src/segmented-control.tsx +0 -155
- package/src/select.tsx +0 -105
- package/src/separator.tsx +0 -32
- package/src/side-drawer.tsx +0 -87
- package/src/spreadsheet-grid.tsx +0 -264
- package/src/state-panel.tsx +0 -46
- package/src/switch.tsx +0 -47
- package/src/table.tsx +0 -110
- package/src/tabs.tsx +0 -201
- package/src/textarea.tsx +0 -32
- package/src/utils.ts +0 -6
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/feature-access-gate.tsx
|
|
31
|
+
var feature_access_gate_exports = {};
|
|
32
|
+
__export(feature_access_gate_exports, {
|
|
33
|
+
FeatureAccessGate: () => FeatureAccessGate
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(feature_access_gate_exports);
|
|
36
|
+
|
|
37
|
+
// src/alert.tsx
|
|
38
|
+
var React = __toESM(require("react"), 1);
|
|
39
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
40
|
+
|
|
41
|
+
// src/utils.ts
|
|
42
|
+
var import_clsx = require("clsx");
|
|
43
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
44
|
+
function cn(...inputs) {
|
|
45
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/alert.tsx
|
|
49
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
50
|
+
var alertVariants = (0, import_class_variance_authority.cva)("rounded-lg border px-3 py-2 text-sm", {
|
|
51
|
+
variants: {
|
|
52
|
+
variant: {
|
|
53
|
+
danger: "border-destructive/30 bg-destructive/5 text-destructive",
|
|
54
|
+
warning: "border-warning/30 bg-warning/5 text-warning",
|
|
55
|
+
success: "border-success/30 bg-success/5 text-success",
|
|
56
|
+
info: "border-info/30 bg-info/5 text-info",
|
|
57
|
+
/**
|
|
58
|
+
* The quiet state of a banner that also has loud ones — "no default
|
|
59
|
+
* campaign set" next to "this is the default". Without it those callers
|
|
60
|
+
* keep a ternary of raw class strings and the shared component only
|
|
61
|
+
* covers half of what they draw.
|
|
62
|
+
*/
|
|
63
|
+
neutral: "border-border bg-muted/40 text-muted-foreground"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
defaultVariants: {
|
|
67
|
+
// Failure is what a banner almost always reports here, and defaulting to
|
|
68
|
+
// it means the noisy case cannot be forgotten.
|
|
69
|
+
variant: "danger"
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
var Alert = React.forwardRef(
|
|
73
|
+
({ className, variant, action, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
ref,
|
|
77
|
+
role: variant === "danger" || variant == null ? "alert" : "status",
|
|
78
|
+
className: cn(
|
|
79
|
+
alertVariants({ variant }),
|
|
80
|
+
action && "flex flex-wrap items-center justify-between gap-3",
|
|
81
|
+
className
|
|
82
|
+
),
|
|
83
|
+
...props,
|
|
84
|
+
children: [
|
|
85
|
+
action ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children }) : children,
|
|
86
|
+
action
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
Alert.displayName = "Alert";
|
|
92
|
+
|
|
93
|
+
// src/spinner.tsx
|
|
94
|
+
var import_lucide_react = require("lucide-react");
|
|
95
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
96
|
+
var SIZES = {
|
|
97
|
+
sm: "size-3.5",
|
|
98
|
+
md: "size-4",
|
|
99
|
+
lg: "size-5",
|
|
100
|
+
xl: "size-10 border-2"
|
|
101
|
+
};
|
|
102
|
+
function Spinner({ size = "md", className, ...props }) {
|
|
103
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
104
|
+
import_lucide_react.Loader2,
|
|
105
|
+
{
|
|
106
|
+
"aria-hidden": true,
|
|
107
|
+
className: cn("animate-spin", SIZES[size], className),
|
|
108
|
+
...props
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// src/state-panel.tsx
|
|
114
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
115
|
+
function StatePanel({
|
|
116
|
+
loading,
|
|
117
|
+
className,
|
|
118
|
+
children,
|
|
119
|
+
...props
|
|
120
|
+
}) {
|
|
121
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
122
|
+
"div",
|
|
123
|
+
{
|
|
124
|
+
role: loading ? "status" : void 0,
|
|
125
|
+
"aria-live": loading ? "polite" : void 0,
|
|
126
|
+
className: cn(
|
|
127
|
+
"border-border bg-background/80 text-muted-foreground rounded-lg border px-4 py-6 text-center text-sm",
|
|
128
|
+
loading && "flex items-center justify-center gap-2",
|
|
129
|
+
className
|
|
130
|
+
),
|
|
131
|
+
...props,
|
|
132
|
+
children: [
|
|
133
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Spinner, { size: "md" }) : null,
|
|
134
|
+
children
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// src/feature-access-gate.tsx
|
|
141
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
142
|
+
function FeatureAccessGate({
|
|
143
|
+
isLoading,
|
|
144
|
+
allowed,
|
|
145
|
+
deniedMessage,
|
|
146
|
+
children
|
|
147
|
+
}) {
|
|
148
|
+
if (isLoading) {
|
|
149
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(StatePanel, { loading: true, className: "p-6", children: "Checking permissions\u2026" });
|
|
150
|
+
}
|
|
151
|
+
if (!allowed) {
|
|
152
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Alert, { children: deniedMessage });
|
|
153
|
+
}
|
|
154
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children });
|
|
155
|
+
}
|
|
156
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
157
|
+
0 && (module.exports = {
|
|
158
|
+
FeatureAccessGate
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=feature-access-gate.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feature-access-gate.tsx","../src/alert.tsx","../src/utils.ts","../src/spinner.tsx","../src/state-panel.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { Alert } from \"./alert\";\nimport { StatePanel } from \"./state-panel\";\n\ntype FeatureAccessGateProps = {\n isLoading?: boolean;\n allowed: boolean;\n deniedMessage: React.ReactNode;\n children: React.ReactNode;\n};\n\n/**\n * Shared loading / denied shell for feature Managers (showcase, headers, …).\n */\nexport function FeatureAccessGate({\n isLoading,\n allowed,\n deniedMessage,\n children,\n}: FeatureAccessGateProps) {\n if (isLoading) {\n return (\n <StatePanel loading className=\"p-6\">\n Checking permissions…\n </StatePanel>\n );\n }\n\n if (!allowed) {\n // `Alert`, not a hand-rolled banner: this is the denial surface for\n // seventeen panels, and it was the one copy the Alert migration missed —\n // so being refused a panel announced nothing to a screen reader.\n return <Alert>{deniedMessage}</Alert>;\n }\n\n return <>{children}</>;\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"./utils\";\n\n/**\n * The inline message banner — a failed load, a warning above a form, a note.\n *\n * This was the most duplicated markup in the panel: thirty blocks across\n * twenty-eight files, spelled seven different ways. `px-3 py-2` in most places\n * and `px-4 py-3` in others, `text-rose-700` here and `text-destructive`\n * there — all meaning \"something went wrong\".\n *\n * `role` is derived from the variant rather than left to callers. An error a\n * user needs to act on should interrupt a screen reader; a note should not.\n * Almost none of the hand-rolled copies set either.\n */\nconst alertVariants = cva(\"rounded-lg border px-3 py-2 text-sm\", {\n variants: {\n variant: {\n danger: \"border-destructive/30 bg-destructive/5 text-destructive\",\n warning: \"border-warning/30 bg-warning/5 text-warning\",\n success: \"border-success/30 bg-success/5 text-success\",\n info: \"border-info/30 bg-info/5 text-info\",\n /**\n * The quiet state of a banner that also has loud ones — \"no default\n * campaign set\" next to \"this is the default\". Without it those callers\n * keep a ternary of raw class strings and the shared component only\n * covers half of what they draw.\n */\n neutral: \"border-border bg-muted/40 text-muted-foreground\",\n },\n },\n defaultVariants: {\n // Failure is what a banner almost always reports here, and defaulting to\n // it means the noisy case cannot be forgotten.\n variant: \"danger\",\n },\n});\n\nexport interface AlertProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {\n /**\n * A control belonging to the message, such as Retry. Given one, the banner\n * lays out as a row and keeps the action at its end.\n */\n action?: React.ReactNode;\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, action, children, ...props }, ref) => (\n <div\n ref={ref}\n role={variant === \"danger\" || variant == null ? \"alert\" : \"status\"}\n className={cn(\n alertVariants({ variant }),\n action && \"flex flex-wrap items-center justify-between gap-3\",\n className,\n )}\n {...props}\n >\n {/* Wrapped so the action sits opposite the text rather than being\n pushed around by whatever the caller passed as children. */}\n {action ? <span>{children}</span> : children}\n {action}\n </div>\n ),\n);\n\nAlert.displayName = \"Alert\";\n\nexport { alertVariants };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"./utils\";\n\n/**\n * The one spinner.\n *\n * There were five spellings of `animate-spin` across twelve files — `h-4 w-4`,\n * `h-5 w-5`, `size-4`, bare, and a hand-drawn ring in `ProtectedRoute` — so the\n * same \"working\" signal came out a different size depending on which panel you\n * were on.\n *\n * It is `aria-hidden` on purpose. A spinner is decoration; what a screen reader\n * needs is the surrounding control's `aria-busy` or the panel's status text,\n * and announcing \"loading\" twice is worse than once. `Button` and `StatePanel`\n * both supply that.\n */\nconst SIZES = {\n sm: \"size-3.5\",\n md: \"size-4\",\n lg: \"size-5\",\n xl: \"size-10 border-2\",\n} as const;\n\nexport interface SpinnerProps extends React.SVGProps<SVGSVGElement> {\n size?: keyof typeof SIZES;\n}\n\nexport function Spinner({ size = \"md\", className, ...props }: SpinnerProps) {\n return (\n <Loader2\n aria-hidden\n className={cn(\"animate-spin\", SIZES[size], className)}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\n\nimport { Spinner } from \"./spinner\";\nimport { cn } from \"./utils\";\n\n/**\n * The bordered block a list shows instead of rows: loading, or nothing found.\n *\n * Fourteen copies of the same\n * `border-border bg-background/80 … rounded-lg border px-4 py-6 text-center`\n * across the panels, each with its own wording — \"Loading users…\", \"Loading\n * taxonomy…\", \"Loading showcases…\". The wording is worth keeping (it says what\n * is loading), the markup is not.\n *\n * `loading` adds two things the hand-rolled versions did not have: a spinner,\n * so a slow panel does not look like an empty one, and `role=\"status\"` with\n * `aria-live=\"polite\"`, so a screen reader is told the list arrived instead of\n * silently finding rows on the next tab press.\n */\nexport interface StatePanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Shows a spinner and announces politely. */\n loading?: boolean;\n}\n\nexport function StatePanel({\n loading,\n className,\n children,\n ...props\n}: StatePanelProps) {\n return (\n <div\n role={loading ? \"status\" : undefined}\n aria-live={loading ? \"polite\" : undefined}\n className={cn(\n \"border-border bg-background/80 text-muted-foreground rounded-lg border px-4 py-6 text-center text-sm\",\n loading && \"flex items-center justify-center gap-2\",\n className,\n )}\n {...props}\n >\n {loading ? <Spinner size=\"md\" /> : null}\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAuB;AACvB,sCAAuC;;;ACDvC,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADgDI;AApCJ,IAAM,oBAAgB,qCAAI,uCAAuC;AAAA,EAC/D,UAAU;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAON,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA;AAAA;AAAA,IAGf,SAAS;AAAA,EACX;AACF,CAAC;AAaM,IAAM,QAAc;AAAA,EACzB,CAAC,EAAE,WAAW,SAAS,QAAQ,UAAU,GAAG,MAAM,GAAG,QACnD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,YAAY,YAAY,WAAW,OAAO,UAAU;AAAA,MAC1D,WAAW;AAAA,QACT,cAAc,EAAE,QAAQ,CAAC;AAAA,QACzB,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAIH;AAAA,iBAAS,4CAAC,UAAM,UAAS,IAAU;AAAA,QACnC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,MAAM,cAAc;;;AEtEpB,0BAAwB;AA8BpB,IAAAA,sBAAA;AAbJ,IAAM,QAAQ;AAAA,EACZ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAMO,SAAS,QAAQ,EAAE,OAAO,MAAM,WAAW,GAAG,MAAM,GAAiB;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAW,GAAG,gBAAgB,MAAM,IAAI,GAAG,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACNI,IAAAC,sBAAA;AAPG,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoB;AAClB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,UAAU,WAAW;AAAA,MAC3B,aAAW,UAAU,WAAW;AAAA,MAChC,WAAW;AAAA,QACT;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,kBAAU,6CAAC,WAAQ,MAAK,MAAK,IAAK;AAAA,QAClC;AAAA;AAAA;AAAA,EACH;AAEJ;;;AJtBM,IAAAC,sBAAA;AARC,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,MAAI,WAAW;AACb,WACE,6CAAC,cAAW,SAAO,MAAC,WAAU,OAAM,wCAEpC;AAAA,EAEJ;AAEA,MAAI,CAAC,SAAS;AAIZ,WAAO,6CAAC,SAAO,yBAAc;AAAA,EAC/B;AAEA,SAAO,6EAAG,UAAS;AACrB;","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type FeatureAccessGateProps = {
|
|
4
|
+
isLoading?: boolean;
|
|
5
|
+
allowed: boolean;
|
|
6
|
+
deniedMessage: React.ReactNode;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Shared loading / denied shell for feature Managers (showcase, headers, …).
|
|
11
|
+
*/
|
|
12
|
+
declare function FeatureAccessGate({ isLoading, allowed, deniedMessage, children, }: FeatureAccessGateProps): React.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { FeatureAccessGate };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type FeatureAccessGateProps = {
|
|
4
|
+
isLoading?: boolean;
|
|
5
|
+
allowed: boolean;
|
|
6
|
+
deniedMessage: React.ReactNode;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Shared loading / denied shell for feature Managers (showcase, headers, …).
|
|
11
|
+
*/
|
|
12
|
+
declare function FeatureAccessGate({ isLoading, allowed, deniedMessage, children, }: FeatureAccessGateProps): React.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { FeatureAccessGate };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FeatureAccessGate
|
|
3
|
+
} from "./chunk-S7PVZAPL.js";
|
|
4
|
+
import "./chunk-G4ZQUSAJ.js";
|
|
5
|
+
import "./chunk-ZP252OJZ.js";
|
|
6
|
+
import "./chunk-UE7JY7VR.js";
|
|
7
|
+
import "./chunk-HCA5ODCD.js";
|
|
8
|
+
export {
|
|
9
|
+
FeatureAccessGate
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=feature-access-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/field.cjs
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/field.tsx
|
|
21
|
+
var field_exports = {};
|
|
22
|
+
__export(field_exports, {
|
|
23
|
+
Field: () => Field
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(field_exports);
|
|
26
|
+
|
|
27
|
+
// src/utils.ts
|
|
28
|
+
var import_clsx = require("clsx");
|
|
29
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
30
|
+
function cn(...inputs) {
|
|
31
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/field.tsx
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
function Field({
|
|
37
|
+
label,
|
|
38
|
+
required,
|
|
39
|
+
htmlFor,
|
|
40
|
+
as = "div",
|
|
41
|
+
className,
|
|
42
|
+
children
|
|
43
|
+
}) {
|
|
44
|
+
const Wrapper = as;
|
|
45
|
+
const labelNode = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
46
|
+
label,
|
|
47
|
+
required ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-destructive ml-0.5", "aria-hidden": "true", children: "*" }) : null
|
|
48
|
+
] });
|
|
49
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Wrapper, { className: cn("space-y-1 text-sm", className), children: [
|
|
50
|
+
htmlFor && as === "div" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { htmlFor, className: "text-muted-foreground", children: labelNode }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground", children: labelNode }),
|
|
51
|
+
children
|
|
52
|
+
] });
|
|
53
|
+
}
|
|
54
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
55
|
+
0 && (module.exports = {
|
|
56
|
+
Field
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=field.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/field.tsx","../src/utils.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\ninterface FieldProps {\n label: React.ReactNode;\n required?: boolean;\n /**\n * Associates the label with a control via `htmlFor` / `id`. Prefer this for\n * native inputs rendered as siblings (not wrapped). For composite controls\n * (Autocomplete), omit and use `as=\"label\"` wrapping or an `aria-label`.\n */\n htmlFor?: string;\n /**\n * Render as a `<label>` (wraps a native control so clicking the text focuses\n * it) or a `<div>` (for composite controls like Autocomplete that manage\n * their own focus / render in a portal). Defaults to `div`.\n */\n as?: \"label\" | \"div\";\n className?: string;\n children: React.ReactNode;\n}\n\nexport function Field({\n label,\n required,\n htmlFor,\n as = \"div\",\n className,\n children,\n}: FieldProps) {\n const Wrapper = as;\n const labelNode = (\n <>\n {label}\n {required ? (\n <span className=\"text-destructive ml-0.5\" aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </>\n );\n\n return (\n <Wrapper className={cn(\"space-y-1 text-sm\", className)}>\n {htmlFor && as === \"div\" ? (\n <label htmlFor={htmlFor} className=\"text-muted-foreground\">\n {labelNode}\n </label>\n ) : (\n <span className=\"text-muted-foreground\">{labelNode}</span>\n )}\n {children}\n </Wrapper>\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;AD4BI;AAVG,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL;AAAA,EACA;AACF,GAAe;AACb,QAAM,UAAU;AAChB,QAAM,YACJ,4EACG;AAAA;AAAA,IACA,WACC,4CAAC,UAAK,WAAU,2BAA0B,eAAY,QAAO,eAE7D,IACE;AAAA,KACN;AAGF,SACE,6CAAC,WAAQ,WAAW,GAAG,qBAAqB,SAAS,GAClD;AAAA,eAAW,OAAO,QACjB,4CAAC,WAAM,SAAkB,WAAU,yBAChC,qBACH,IAEA,4CAAC,UAAK,WAAU,yBAAyB,qBAAU;AAAA,IAEpD;AAAA,KACH;AAEJ;","names":[]}
|
package/dist/field.d.cts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface FieldProps {
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Associates the label with a control via `htmlFor` / `id`. Prefer this for
|
|
8
|
+
* native inputs rendered as siblings (not wrapped). For composite controls
|
|
9
|
+
* (Autocomplete), omit and use `as="label"` wrapping or an `aria-label`.
|
|
10
|
+
*/
|
|
11
|
+
htmlFor?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Render as a `<label>` (wraps a native control so clicking the text focuses
|
|
14
|
+
* it) or a `<div>` (for composite controls like Autocomplete that manage
|
|
15
|
+
* their own focus / render in a portal). Defaults to `div`.
|
|
16
|
+
*/
|
|
17
|
+
as?: "label" | "div";
|
|
18
|
+
className?: string;
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
declare function Field({ label, required, htmlFor, as, className, children, }: FieldProps): React.JSX.Element;
|
|
22
|
+
|
|
23
|
+
export { Field };
|
package/dist/field.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface FieldProps {
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Associates the label with a control via `htmlFor` / `id`. Prefer this for
|
|
8
|
+
* native inputs rendered as siblings (not wrapped). For composite controls
|
|
9
|
+
* (Autocomplete), omit and use `as="label"` wrapping or an `aria-label`.
|
|
10
|
+
*/
|
|
11
|
+
htmlFor?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Render as a `<label>` (wraps a native control so clicking the text focuses
|
|
14
|
+
* it) or a `<div>` (for composite controls like Autocomplete that manage
|
|
15
|
+
* their own focus / render in a portal). Defaults to `div`.
|
|
16
|
+
*/
|
|
17
|
+
as?: "label" | "div";
|
|
18
|
+
className?: string;
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
declare function Field({ label, required, htmlFor, as, className, children, }: FieldProps): React.JSX.Element;
|
|
22
|
+
|
|
23
|
+
export { Field };
|
package/dist/field.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
"use client";
|
|
4
|
+
var __create = Object.create;
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
for (var name in all)
|
|
12
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
27
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
28
|
+
mod
|
|
29
|
+
));
|
|
30
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
31
|
+
|
|
32
|
+
// src/image-uploader.tsx
|
|
33
|
+
var image_uploader_exports = {};
|
|
34
|
+
__export(image_uploader_exports, {
|
|
35
|
+
ImageUploader: () => ImageUploader
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(image_uploader_exports);
|
|
38
|
+
var import_lucide_react2 = require("lucide-react");
|
|
39
|
+
var React3 = __toESM(require("react"), 1);
|
|
40
|
+
|
|
41
|
+
// src/button.tsx
|
|
42
|
+
var React = __toESM(require("react"), 1);
|
|
43
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
44
|
+
var import_react_slot = require("@radix-ui/react-slot");
|
|
45
|
+
|
|
46
|
+
// src/spinner.tsx
|
|
47
|
+
var import_lucide_react = require("lucide-react");
|
|
48
|
+
|
|
49
|
+
// src/utils.ts
|
|
50
|
+
var import_clsx = require("clsx");
|
|
51
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
52
|
+
function cn(...inputs) {
|
|
53
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/spinner.tsx
|
|
57
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
58
|
+
var SIZES = {
|
|
59
|
+
sm: "size-3.5",
|
|
60
|
+
md: "size-4",
|
|
61
|
+
lg: "size-5",
|
|
62
|
+
xl: "size-10 border-2"
|
|
63
|
+
};
|
|
64
|
+
function Spinner({ size = "md", className, ...props }) {
|
|
65
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
66
|
+
import_lucide_react.Loader2,
|
|
67
|
+
{
|
|
68
|
+
"aria-hidden": true,
|
|
69
|
+
className: cn("animate-spin", SIZES[size], className),
|
|
70
|
+
...props
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/button.tsx
|
|
76
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
77
|
+
var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
78
|
+
"inline-flex h-9 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md px-3 text-sm font-medium transition duration-200 active:scale-[0.98] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
|
|
79
|
+
{
|
|
80
|
+
variants: {
|
|
81
|
+
variant: {
|
|
82
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
83
|
+
secondary: "bg-muted text-foreground hover:bg-muted/80",
|
|
84
|
+
ghost: "hover:bg-muted",
|
|
85
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
86
|
+
outline: "border border-border bg-background hover:bg-muted"
|
|
87
|
+
},
|
|
88
|
+
size: {
|
|
89
|
+
sm: "h-8 px-2.5",
|
|
90
|
+
md: "h-9 px-3",
|
|
91
|
+
lg: "h-10 px-4",
|
|
92
|
+
icon: "h-9 w-9 px-0",
|
|
93
|
+
// Square, matching `sm`'s height — for an icon-only control sitting in
|
|
94
|
+
// a table row or beside `sm` buttons, where `icon` is a row taller.
|
|
95
|
+
"icon-sm": "h-8 w-8 px-0"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
defaultVariants: {
|
|
99
|
+
variant: "default",
|
|
100
|
+
size: "md"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
var ICON_SIZES = /* @__PURE__ */ new Set(["icon", "icon-sm"]);
|
|
105
|
+
var Button = React.forwardRef(
|
|
106
|
+
({
|
|
107
|
+
className,
|
|
108
|
+
variant,
|
|
109
|
+
size,
|
|
110
|
+
asChild = false,
|
|
111
|
+
loading,
|
|
112
|
+
disabled,
|
|
113
|
+
children,
|
|
114
|
+
...props
|
|
115
|
+
}, ref) => {
|
|
116
|
+
const Comp = asChild ? import_react_slot.Slot : "button";
|
|
117
|
+
if (asChild) {
|
|
118
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
119
|
+
Comp,
|
|
120
|
+
{
|
|
121
|
+
ref,
|
|
122
|
+
className: cn(buttonVariants({ variant, size }), className),
|
|
123
|
+
...props,
|
|
124
|
+
children
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
129
|
+
"button",
|
|
130
|
+
{
|
|
131
|
+
ref,
|
|
132
|
+
disabled: disabled || loading,
|
|
133
|
+
"aria-busy": loading || void 0,
|
|
134
|
+
className: cn(buttonVariants({ variant, size }), className),
|
|
135
|
+
...props,
|
|
136
|
+
children: [
|
|
137
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Spinner, { size: "sm" }) : null,
|
|
138
|
+
loading && size != null && ICON_SIZES.has(size) ? null : children
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
Button.displayName = "Button";
|
|
145
|
+
|
|
146
|
+
// src/input.tsx
|
|
147
|
+
var React2 = __toESM(require("react"), 1);
|
|
148
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
149
|
+
var inputClass = "h-9 w-full rounded-md border border-border bg-background px-3 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50";
|
|
150
|
+
var Input = React2.forwardRef(
|
|
151
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("input", { ref, className: cn(inputClass, className), ...props })
|
|
152
|
+
);
|
|
153
|
+
Input.displayName = "Input";
|
|
154
|
+
|
|
155
|
+
// src/image-uploader.tsx
|
|
156
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
157
|
+
function ImageUploader({
|
|
158
|
+
value = "",
|
|
159
|
+
onChange,
|
|
160
|
+
disabled,
|
|
161
|
+
label,
|
|
162
|
+
className,
|
|
163
|
+
allowUrlPaste = true,
|
|
164
|
+
accept = "image/*,.gif",
|
|
165
|
+
uploadFile,
|
|
166
|
+
uploadFromUrl
|
|
167
|
+
}) {
|
|
168
|
+
const inputRef = React3.useRef(null);
|
|
169
|
+
const [uploading, setUploading] = React3.useState(false);
|
|
170
|
+
const [error, setError] = React3.useState(null);
|
|
171
|
+
const busy = Boolean(disabled || uploading);
|
|
172
|
+
const handleFile = async (file) => {
|
|
173
|
+
if (!uploadFile) {
|
|
174
|
+
setError("File upload is not configured for this panel.");
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
setUploading(true);
|
|
178
|
+
setError(null);
|
|
179
|
+
try {
|
|
180
|
+
onChange(await uploadFile(file));
|
|
181
|
+
} catch (err) {
|
|
182
|
+
setError(err instanceof Error ? err.message : "Upload failed");
|
|
183
|
+
} finally {
|
|
184
|
+
setUploading(false);
|
|
185
|
+
if (inputRef.current) inputRef.current.value = "";
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
const handleUrl = async (imageUrl) => {
|
|
189
|
+
const trimmed = imageUrl.trim();
|
|
190
|
+
if (!trimmed) {
|
|
191
|
+
onChange("");
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (trimmed === value) return;
|
|
195
|
+
if (!uploadFromUrl || /^https?:\/\//i.test(trimmed)) {
|
|
196
|
+
setError(null);
|
|
197
|
+
onChange(trimmed);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
setUploading(true);
|
|
201
|
+
setError(null);
|
|
202
|
+
try {
|
|
203
|
+
onChange(await uploadFromUrl(trimmed));
|
|
204
|
+
} catch (err) {
|
|
205
|
+
setError(err instanceof Error ? err.message : "Upload failed");
|
|
206
|
+
} finally {
|
|
207
|
+
setUploading(false);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: cn("space-y-2", className), children: [
|
|
211
|
+
label ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "text-muted-foreground text-xs font-medium", children: label }) : null,
|
|
212
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
213
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
214
|
+
"input",
|
|
215
|
+
{
|
|
216
|
+
ref: inputRef,
|
|
217
|
+
type: "file",
|
|
218
|
+
accept,
|
|
219
|
+
className: "hidden",
|
|
220
|
+
disabled: busy,
|
|
221
|
+
onChange: (e) => {
|
|
222
|
+
const file = e.target.files?.[0];
|
|
223
|
+
if (file) void handleFile(file);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
),
|
|
227
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
228
|
+
Button,
|
|
229
|
+
{
|
|
230
|
+
type: "button",
|
|
231
|
+
variant: "outline",
|
|
232
|
+
size: "sm",
|
|
233
|
+
disabled: busy,
|
|
234
|
+
onClick: () => inputRef.current?.click(),
|
|
235
|
+
children: [
|
|
236
|
+
uploading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react2.Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react2.ImagePlus, { className: "h-4 w-4" }),
|
|
237
|
+
uploading ? "Uploading\u2026" : "Upload"
|
|
238
|
+
]
|
|
239
|
+
}
|
|
240
|
+
),
|
|
241
|
+
value ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
242
|
+
Button,
|
|
243
|
+
{
|
|
244
|
+
type: "button",
|
|
245
|
+
variant: "ghost",
|
|
246
|
+
size: "sm",
|
|
247
|
+
disabled: busy,
|
|
248
|
+
onClick: () => onChange(""),
|
|
249
|
+
"aria-label": "Clear image",
|
|
250
|
+
children: [
|
|
251
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react2.X, { className: "h-4 w-4" }),
|
|
252
|
+
"Clear"
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
) : null
|
|
256
|
+
] }),
|
|
257
|
+
allowUrlPaste ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
258
|
+
Input,
|
|
259
|
+
{
|
|
260
|
+
defaultValue: value,
|
|
261
|
+
disabled: busy,
|
|
262
|
+
placeholder: "Or paste image URL\u2026",
|
|
263
|
+
onBlur: (e) => {
|
|
264
|
+
void handleUrl(e.target.value);
|
|
265
|
+
},
|
|
266
|
+
onKeyDown: (e) => {
|
|
267
|
+
if (e.key === "Enter") {
|
|
268
|
+
e.preventDefault();
|
|
269
|
+
void handleUrl(e.target.value);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
value || "empty"
|
|
274
|
+
) : null,
|
|
275
|
+
value ? (
|
|
276
|
+
// eslint-disable-next-line @next/next/no-img-element -- CDN URLs vary
|
|
277
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
278
|
+
"img",
|
|
279
|
+
{
|
|
280
|
+
src: value,
|
|
281
|
+
alt: "",
|
|
282
|
+
className: "border-border max-h-24 rounded border bg-white object-contain p-1"
|
|
283
|
+
}
|
|
284
|
+
)
|
|
285
|
+
) : null,
|
|
286
|
+
error ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-destructive text-xs", role: "alert", children: error }) : null
|
|
287
|
+
] });
|
|
288
|
+
}
|
|
289
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
290
|
+
0 && (module.exports = {
|
|
291
|
+
ImageUploader
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=image-uploader.cjs.map
|