@xenide-io/the-old-ui-theme 0.2.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{chunk-SHF57J7U.mjs → chunk-FDMD3IIN.mjs} +1573 -652
- package/dist/index-D1RTT2Ap.d.mts +1044 -0
- package/dist/index-D1RTT2Ap.d.ts +1044 -0
- package/dist/index.d.mts +10 -7
- package/dist/index.d.ts +10 -7
- package/dist/index.js +1705 -744
- package/dist/index.mjs +61 -1
- package/dist/tailwind-preset.js +7 -0
- package/dist/tailwind-preset.mjs +7 -0
- package/dist/ui.d.mts +3 -2
- package/dist/ui.d.ts +3 -2
- package/dist/ui.js +1584 -666
- package/dist/ui.mjs +31 -1
- package/package.json +18 -4
- package/src/app/globals.css +1005 -227
- package/src/components/icons/IconBase.tsx +20 -12
- package/src/components/icons/createIconBase.tsx +12 -7
- package/src/components/icons/icons.tsx +208 -18
- package/src/components/sections/AlertShowcase.tsx +2 -1
- package/src/components/sections/BadgeShowcase.tsx +1 -1
- package/src/components/sections/ButtonShowcase.tsx +6 -10
- package/src/components/sections/CardShowcase.tsx +22 -6
- package/src/components/sections/DropdownShowcase.tsx +4 -6
- package/src/components/sections/FilterChipsShowcase.tsx +74 -26
- package/src/components/sections/FormShowcase.tsx +2 -1
- package/src/components/sections/IconShowcase.tsx +86 -206
- package/src/components/sections/KbdShowcase.tsx +47 -21
- package/src/components/sections/ModalShowcase.tsx +7 -6
- package/src/components/sections/ProductLayoutsShowcase.tsx +138 -0
- package/src/components/sections/ProgressShowcase.tsx +50 -53
- package/src/components/sections/SwapShowcase.tsx +13 -5
- package/src/components/ui/Alert.tsx +28 -19
- package/src/components/ui/AuthLayout.tsx +58 -0
- package/src/components/ui/Badge.tsx +10 -5
- package/src/components/ui/Button.tsx +22 -12
- package/src/components/ui/ButtonChrome.tsx +1 -1
- package/src/components/ui/Calendar.tsx +6 -7
- package/src/components/ui/Card.tsx +21 -11
- package/src/components/ui/CollapsibleSection.tsx +11 -11
- package/src/components/ui/DropdownMenu.tsx +189 -65
- package/src/components/ui/FilterBar.tsx +165 -0
- package/src/components/ui/FilterChips.tsx +65 -35
- package/src/components/ui/FilterControls.tsx +30 -0
- package/src/components/ui/FormField.tsx +69 -0
- package/src/components/ui/Input.tsx +166 -140
- package/src/components/ui/Kbd.tsx +88 -13
- package/src/components/ui/Loader.tsx +96 -0
- package/src/components/ui/Modal.tsx +66 -36
- package/src/components/ui/SettingsLayout.tsx +94 -0
- package/src/components/ui/ShowcaseWrapper.tsx +4 -16
- package/src/components/ui/Stepper.tsx +5 -6
- package/src/components/ui/first-slice.test.tsx +98 -0
- package/src/components/ui/index.ts +62 -3
- package/src/components/ui/interaction-primitives.test.tsx +77 -0
- package/src/components/ui/kbd-icons.test.tsx +90 -0
- package/src/components/ui/product-patterns.test.tsx +77 -0
- package/src/styles/themes.css +411 -1
- package/tailwind-preset.ts +7 -0
- package/dist/index-CmS6hcUk.d.mts +0 -753
- package/dist/index-CmS6hcUk.d.ts +0 -753
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
__spreadValues
|
|
5
5
|
} from "./chunk-FWCSY2DS.mjs";
|
|
6
6
|
|
|
7
|
+
// src/components/ui/Button.tsx
|
|
8
|
+
import { forwardRef } from "react";
|
|
9
|
+
|
|
7
10
|
// src/components/ui/ButtonChrome.tsx
|
|
8
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
12
|
function ButtonChrome({ label, icon, sideIcon, split }) {
|
|
@@ -48,7 +51,7 @@ var shapeClass = {
|
|
|
48
51
|
square: "ph-btn-square",
|
|
49
52
|
wide: "ph-btn-wide"
|
|
50
53
|
};
|
|
51
|
-
|
|
54
|
+
var Button = forwardRef(function Button2(_a, ref) {
|
|
52
55
|
var _b = _a, {
|
|
53
56
|
variant = "secondary",
|
|
54
57
|
size = "md",
|
|
@@ -57,9 +60,12 @@ function Button(_a) {
|
|
|
57
60
|
split = false,
|
|
58
61
|
icon,
|
|
59
62
|
sideIcon,
|
|
63
|
+
loading = false,
|
|
64
|
+
loadingLabel,
|
|
60
65
|
className,
|
|
61
66
|
children,
|
|
62
|
-
type = "button"
|
|
67
|
+
type = "button",
|
|
68
|
+
disabled
|
|
63
69
|
} = _b, props = __objRest(_b, [
|
|
64
70
|
"variant",
|
|
65
71
|
"size",
|
|
@@ -68,23 +74,32 @@ function Button(_a) {
|
|
|
68
74
|
"split",
|
|
69
75
|
"icon",
|
|
70
76
|
"sideIcon",
|
|
77
|
+
"loading",
|
|
78
|
+
"loadingLabel",
|
|
71
79
|
"className",
|
|
72
80
|
"children",
|
|
73
|
-
"type"
|
|
81
|
+
"type",
|
|
82
|
+
"disabled"
|
|
74
83
|
]);
|
|
75
|
-
const usesLemonChrome =
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
84
|
+
const usesLemonChrome = !["tertiary", "ghost", "link"].includes(variant);
|
|
85
|
+
const label = loadingLabel != null ? loadingLabel : children;
|
|
86
|
+
const leadingIcon = loading ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-spinner", "aria-hidden": true }) : icon;
|
|
87
|
+
const content = usesLemonChrome ? /* @__PURE__ */ jsx2(ButtonChrome, { label, icon: leadingIcon, sideIcon, split }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
88
|
+
leadingIcon != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-icon", children: leadingIcon }) : null,
|
|
89
|
+
label != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-label", children: label }) : null,
|
|
79
90
|
split ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-split-divider", "aria-hidden": true }) : null,
|
|
80
91
|
sideIcon != null ? /* @__PURE__ */ jsx2("span", { className: "ph-btn-side-icon", children: sideIcon }) : null
|
|
81
92
|
] });
|
|
82
93
|
return /* @__PURE__ */ jsx2(
|
|
83
94
|
"button",
|
|
84
95
|
__spreadProps(__spreadValues({
|
|
96
|
+
ref,
|
|
85
97
|
type,
|
|
98
|
+
disabled: disabled || loading,
|
|
99
|
+
"aria-busy": loading || void 0,
|
|
86
100
|
className: cn(
|
|
87
101
|
"ph-btn",
|
|
102
|
+
usesLemonChrome && "ph-btn-raised",
|
|
88
103
|
outline && "ph-btn-outline",
|
|
89
104
|
variantClass[variant],
|
|
90
105
|
sizeClass[size],
|
|
@@ -96,11 +111,16 @@ function Button(_a) {
|
|
|
96
111
|
children: content
|
|
97
112
|
})
|
|
98
113
|
);
|
|
99
|
-
}
|
|
114
|
+
});
|
|
115
|
+
Button.displayName = "Button";
|
|
116
|
+
|
|
117
|
+
// src/components/ui/Alert.tsx
|
|
118
|
+
import { forwardRef as forwardRef5 } from "react";
|
|
100
119
|
|
|
101
120
|
// src/components/icons/IconBase.tsx
|
|
121
|
+
import { forwardRef as forwardRef2 } from "react";
|
|
102
122
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
103
|
-
|
|
123
|
+
var IconBase = forwardRef2(function IconBase2(_a, ref) {
|
|
104
124
|
var _b = _a, {
|
|
105
125
|
className,
|
|
106
126
|
size,
|
|
@@ -108,7 +128,12 @@ function IconBase(_a) {
|
|
|
108
128
|
viewBox = "0 0 24 24",
|
|
109
129
|
fill: fill2 = "none",
|
|
110
130
|
xmlns = "http://www.w3.org/2000/svg",
|
|
111
|
-
focusable = "false"
|
|
131
|
+
focusable = "false",
|
|
132
|
+
style,
|
|
133
|
+
role,
|
|
134
|
+
"aria-hidden": ariaHidden,
|
|
135
|
+
"aria-label": ariaLabel,
|
|
136
|
+
"aria-labelledby": ariaLabelledBy
|
|
112
137
|
} = _b, props = __objRest(_b, [
|
|
113
138
|
"className",
|
|
114
139
|
"size",
|
|
@@ -116,41 +141,55 @@ function IconBase(_a) {
|
|
|
116
141
|
"viewBox",
|
|
117
142
|
"fill",
|
|
118
143
|
"xmlns",
|
|
119
|
-
"focusable"
|
|
144
|
+
"focusable",
|
|
145
|
+
"style",
|
|
146
|
+
"role",
|
|
147
|
+
"aria-hidden",
|
|
148
|
+
"aria-label",
|
|
149
|
+
"aria-labelledby"
|
|
120
150
|
]);
|
|
121
|
-
|
|
122
|
-
const dimensionProps = size != null ? { width: size, height: size } : {};
|
|
151
|
+
const hasAccessibleName = Boolean(ariaLabel || ariaLabelledBy);
|
|
123
152
|
return /* @__PURE__ */ jsx3(
|
|
124
153
|
"svg",
|
|
125
|
-
__spreadProps(__spreadValues(
|
|
126
|
-
|
|
127
|
-
|
|
154
|
+
__spreadProps(__spreadValues({
|
|
155
|
+
ref,
|
|
156
|
+
className: cn("ph-icon", className),
|
|
128
157
|
viewBox,
|
|
129
158
|
fill: fill2,
|
|
130
159
|
xmlns,
|
|
131
160
|
focusable,
|
|
132
|
-
|
|
133
|
-
|
|
161
|
+
role: role != null ? role : hasAccessibleName ? "img" : void 0,
|
|
162
|
+
"aria-hidden": ariaHidden != null ? ariaHidden : hasAccessibleName ? void 0 : true,
|
|
163
|
+
"aria-label": ariaLabel,
|
|
164
|
+
"aria-labelledby": ariaLabelledBy,
|
|
165
|
+
style: __spreadValues({ width: size, height: size }, style)
|
|
166
|
+
}, props), {
|
|
134
167
|
children
|
|
135
168
|
})
|
|
136
169
|
);
|
|
137
|
-
}
|
|
170
|
+
});
|
|
171
|
+
IconBase.displayName = "IconBase";
|
|
138
172
|
|
|
139
173
|
// src/components/icons/createIconBase.tsx
|
|
174
|
+
import { forwardRef as forwardRef3 } from "react";
|
|
140
175
|
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
141
|
-
function createIconBase({ viewBox = "0 0 24 24", paths }) {
|
|
142
|
-
|
|
143
|
-
return /* @__PURE__ */ jsx4(IconBase, __spreadProps(__spreadValues({ viewBox }, props), { children: paths }));
|
|
144
|
-
};
|
|
176
|
+
function createIconBase({ name = "IconGlyph", viewBox = "0 0 24 24", paths }) {
|
|
177
|
+
const IconGlyph = forwardRef3(function IconGlyph2(props, ref) {
|
|
178
|
+
return /* @__PURE__ */ jsx4(IconBase, __spreadProps(__spreadValues({ ref, viewBox }, props), { children: paths }));
|
|
179
|
+
});
|
|
180
|
+
IconGlyph.displayName = name;
|
|
181
|
+
return IconGlyph;
|
|
145
182
|
}
|
|
146
|
-
function createIconBasePath(d, viewBox = "0 0 24 24") {
|
|
183
|
+
function createIconBasePath(d, viewBox = "0 0 24 24", name) {
|
|
147
184
|
return createIconBase({
|
|
185
|
+
name,
|
|
148
186
|
viewBox,
|
|
149
187
|
paths: /* @__PURE__ */ jsx4("path", { d, fill: "currentColor" })
|
|
150
188
|
});
|
|
151
189
|
}
|
|
152
190
|
|
|
153
191
|
// src/components/icons/icons.tsx
|
|
192
|
+
import { forwardRef as forwardRef4 } from "react";
|
|
154
193
|
import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
155
194
|
var fill = (d) => /* @__PURE__ */ jsx5("path", { d, fill: "currentColor" });
|
|
156
195
|
var IconAreaChart = createIconBase({
|
|
@@ -259,6 +298,12 @@ var IconErrorOutline = createIconBase({
|
|
|
259
298
|
"m11 15h2v2h-2zm0-8h2v6h-2zm.99-5c-5.52 0-9.99 4.48-9.99 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10s-4.48-10-10.01-10zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"
|
|
260
299
|
)
|
|
261
300
|
});
|
|
301
|
+
var IconInfo = createIconBase({
|
|
302
|
+
name: "IconInfo",
|
|
303
|
+
paths: fill(
|
|
304
|
+
"M11 10h2v7h-2v-7zm0-3h2v2h-2V7zm1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"
|
|
305
|
+
)
|
|
306
|
+
});
|
|
262
307
|
var IconCancel = createIconBase({
|
|
263
308
|
paths: fill(
|
|
264
309
|
"m12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10 10-4.47 10-10-4.47-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13-3.59 3.59-3.59-3.59-1.41 1.41 3.59 3.59-3.59 3.59 1.41 1.41 3.59-3.59 3.59 3.59 1.41-1.41-3.59-3.59 3.59-3.59z"
|
|
@@ -356,18 +401,158 @@ var IconToggle = createIconBasePath(
|
|
|
356
401
|
var IconRocket = createIconBasePath(
|
|
357
402
|
"M9.19 6.35c-2.04 2.29-3.44 5.58-3.57 5.89L2 10.69l4.05-4.05c.47-.47 1.15-.68 1.81-.55l1.33 1.26zm5.45 8.67l-1.33-1.26c-.66-.13-1.34.08-1.81.55L2 18.31l3.62 3.57c.31-.13 3.6-1.53 5.89-3.57 1.53-1.72 2.52-3.76 2.87-5.02zM12 2c-1.1 0-2 .9-2 2v1.09c2.84.48 5 2.94 5 5.91 0 2.97-2.16 5.43-5 5.91V20c0 1.1.9 2 2 2s2-.9 2-2v-1.09c-2.84-.48-5-2.94-5-5.91 0-2.97 2.16-5.43 5-5.91V4c0-1.1-.9-2-2-2z"
|
|
358
403
|
);
|
|
359
|
-
var IconTerminal =
|
|
404
|
+
var IconTerminal = createIconBase({
|
|
405
|
+
name: "IconTerminal",
|
|
406
|
+
paths: /* @__PURE__ */ jsx5(
|
|
407
|
+
"path",
|
|
408
|
+
{
|
|
409
|
+
d: "M3 4v16h18V4H3zm2 2h14v12H5V6zm2 2.2L10.8 12 7 15.8 8.4 17.2l5.2-5.2-5.2-5.2L7 8.2zM13 17h5v-2h-5v2z",
|
|
410
|
+
fill: "currentColor",
|
|
411
|
+
fillRule: "evenodd",
|
|
412
|
+
clipRule: "evenodd"
|
|
413
|
+
}
|
|
414
|
+
)
|
|
415
|
+
});
|
|
416
|
+
var IconOldWindow = createIconBase({
|
|
417
|
+
name: "IconOldWindow",
|
|
418
|
+
paths: /* @__PURE__ */ jsx5(
|
|
419
|
+
"path",
|
|
420
|
+
{
|
|
421
|
+
d: "M3 3v18h18V3H3zm2 7v9h14v-9H5zm1-4h2v1H6V6zm3 0h2v1H9V6z",
|
|
422
|
+
fill: "currentColor",
|
|
423
|
+
fillRule: "evenodd",
|
|
424
|
+
clipRule: "evenodd"
|
|
425
|
+
}
|
|
426
|
+
)
|
|
427
|
+
});
|
|
428
|
+
var IconCommandCursor = createIconBase({
|
|
429
|
+
name: "IconCommandCursor",
|
|
430
|
+
paths: /* @__PURE__ */ jsx5(
|
|
431
|
+
"path",
|
|
432
|
+
{
|
|
433
|
+
d: "M4 3v18h16V3H4zm2 2h12v14H6V5zm1.5 3.5L11 12l-3.5 3.5L9 17l5-5-5-5-1.5 1.5zM13 17h4v-2h-4v2z",
|
|
434
|
+
fill: "currentColor",
|
|
435
|
+
fillRule: "evenodd",
|
|
436
|
+
clipRule: "evenodd"
|
|
437
|
+
}
|
|
438
|
+
)
|
|
439
|
+
});
|
|
440
|
+
var IconDataReel = createIconBase({
|
|
441
|
+
name: "IconDataReel",
|
|
442
|
+
paths: /* @__PURE__ */ jsx5(
|
|
443
|
+
"path",
|
|
444
|
+
{
|
|
445
|
+
d: "M3 5v14h18V5H3zm2 2h14v10H5V7zm3 1a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm8 0a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM10 11h4v1.5h-4V11z",
|
|
446
|
+
fill: "currentColor",
|
|
447
|
+
fillRule: "evenodd",
|
|
448
|
+
clipRule: "evenodd"
|
|
449
|
+
}
|
|
450
|
+
)
|
|
451
|
+
});
|
|
452
|
+
var IconCodePreview = createIconBase({
|
|
453
|
+
name: "IconCodePreview",
|
|
454
|
+
paths: /* @__PURE__ */ jsx5(
|
|
455
|
+
"path",
|
|
456
|
+
{
|
|
457
|
+
d: "M3 3v15h18V3H3zm2 2h14v11H5V5zm3.5 2L5 10.5 8.5 14l1.4-1.4-2.1-2.1 2.1-2.1L8.5 7zm7 0-1.4 1.4 2.1 2.1-2.1 2.1 1.4 1.4 3.5-3.5L15.5 7zM9 20h6v2H9v-2z",
|
|
458
|
+
fill: "currentColor",
|
|
459
|
+
fillRule: "evenodd",
|
|
460
|
+
clipRule: "evenodd"
|
|
461
|
+
}
|
|
462
|
+
)
|
|
463
|
+
});
|
|
464
|
+
var IconInsightBoard = createIconBase({
|
|
465
|
+
name: "IconInsightBoard",
|
|
466
|
+
paths: /* @__PURE__ */ jsx5(
|
|
467
|
+
"path",
|
|
468
|
+
{
|
|
469
|
+
d: "M3 3v18h18V3H3zm2 2h14v3H5V5zm0 5h6v9H5v-9zm8 0h6v4h-6v-4zm0 6h6v3h-6v-3zM6 6h2v1H6V6zm3 0h2v1H9V6z",
|
|
470
|
+
fill: "currentColor",
|
|
471
|
+
fillRule: "evenodd",
|
|
472
|
+
clipRule: "evenodd"
|
|
473
|
+
}
|
|
474
|
+
)
|
|
475
|
+
});
|
|
476
|
+
var IconEventStream = createIconBase({
|
|
477
|
+
name: "IconEventStream",
|
|
478
|
+
paths: /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
479
|
+
/* @__PURE__ */ jsx5("path", { d: "M5 4h2v16H5V4z", fill: "currentColor", opacity: "0.45" }),
|
|
480
|
+
fill("M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 8a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm5-6h10v2H11V5zm0 8h7v2h-7v-2zm0 5h10v2H11v-2z")
|
|
481
|
+
] })
|
|
482
|
+
});
|
|
483
|
+
var IconFeatureGate = createIconBase({
|
|
484
|
+
name: "IconFeatureGate",
|
|
485
|
+
paths: /* @__PURE__ */ jsx5(
|
|
486
|
+
"path",
|
|
487
|
+
{
|
|
488
|
+
d: "M4 3h2v18H4V3zm3 2h12l-3 4 3 4H7V5zm4 1-2.2 4H12l-1 4 4.2-5H12l1-3h-2z",
|
|
489
|
+
fill: "currentColor",
|
|
490
|
+
fillRule: "evenodd",
|
|
491
|
+
clipRule: "evenodd"
|
|
492
|
+
}
|
|
493
|
+
)
|
|
494
|
+
});
|
|
495
|
+
var IconReplayFrame = createIconBase({
|
|
496
|
+
name: "IconReplayFrame",
|
|
497
|
+
paths: /* @__PURE__ */ jsx5(
|
|
498
|
+
"path",
|
|
499
|
+
{
|
|
500
|
+
d: "M3 3v18h18V3H3zm2 2h14v11H5V5zm5 2v7l6-3.5L10 7zm-5 11h9v1H5v-1zm11 0h3v1h-3v-1z",
|
|
501
|
+
fill: "currentColor",
|
|
502
|
+
fillRule: "evenodd",
|
|
503
|
+
clipRule: "evenodd"
|
|
504
|
+
}
|
|
505
|
+
)
|
|
506
|
+
});
|
|
507
|
+
var IconQueryStack = createIconBase({
|
|
508
|
+
name: "IconQueryStack",
|
|
509
|
+
paths: fill(
|
|
510
|
+
"M4 5c0-1.66 3.58-3 8-3s8 1.34 8 3-3.58 3-8 3-8-1.34-8-3zm0 3v3c0 1.66 3.58 3 8 3 .7 0 1.38-.04 2-.12V11.8c-.64.13-1.31.2-2 .2-4.42 0-8-1.34-8-3zm0 6v3c0 1.66 3.58 3 8 3 .7 0 1.38-.04 2-.12v-2.08c-.64.13-1.31.2-2 .2-4.42 0-8-1.34-8-3zm12-1 5 4-5 4v-3h-4v-2h4v-3z"
|
|
511
|
+
)
|
|
512
|
+
});
|
|
513
|
+
var IconExperimentSplit = createIconBase({
|
|
514
|
+
name: "IconExperimentSplit",
|
|
515
|
+
paths: fill(
|
|
516
|
+
"M5 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm14 0a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM5 15a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm1-6h2c0 2.2 1.8 4 4 4h2.17A3 3 0 0 1 19 11v2a3 3 0 0 1-4.83-2H12a6 6 0 0 1-6-6v4zm0 4a6 6 0 0 0 6-6h2a8 8 0 0 1-8 8v-2z"
|
|
517
|
+
)
|
|
518
|
+
});
|
|
519
|
+
var IconSurveyCard = createIconBase({
|
|
520
|
+
name: "IconSurveyCard",
|
|
521
|
+
paths: /* @__PURE__ */ jsx5(
|
|
522
|
+
"path",
|
|
523
|
+
{
|
|
524
|
+
d: "M3 3v18h18V3H3zm2 2h14v14H5V5zm2 2h7v2H7V7zm0 4h4v2H7v-2zm7-.4-2.5 2.5-1-1-1.4 1.4 2.4 2.4 3.9-3.9-1.4-1.4zM7 16h10v1H7v-1z",
|
|
525
|
+
fill: "currentColor",
|
|
526
|
+
fillRule: "evenodd",
|
|
527
|
+
clipRule: "evenodd"
|
|
528
|
+
}
|
|
529
|
+
)
|
|
530
|
+
});
|
|
531
|
+
var OLD_UI_ICONS = {
|
|
532
|
+
oldWindow: IconOldWindow,
|
|
533
|
+
commandCursor: IconCommandCursor,
|
|
534
|
+
dataReel: IconDataReel,
|
|
535
|
+
codePreview: IconCodePreview,
|
|
536
|
+
insightBoard: IconInsightBoard,
|
|
537
|
+
eventStream: IconEventStream,
|
|
538
|
+
featureGate: IconFeatureGate,
|
|
539
|
+
replayFrame: IconReplayFrame,
|
|
540
|
+
queryStack: IconQueryStack,
|
|
541
|
+
experimentSplit: IconExperimentSplit,
|
|
542
|
+
surveyCard: IconSurveyCard
|
|
543
|
+
};
|
|
360
544
|
var IconActivity = createIconBasePath(
|
|
361
545
|
"M22 12h-4l-3 9L9 3l-3 9H2v2h6.76l2.24-6.72L15 15l2.24-6.72L19 14h3v-2z"
|
|
362
546
|
);
|
|
363
547
|
var IconFlask = createIconBasePath(
|
|
364
548
|
"M19.8 18.4L14 10.67V6.5l1.35-1.35c.39-.39.39-1.02 0-1.41L14.65 2.7a.9959.9959 0 0 0-1.41 0L9.35 6.54c-.39.39-.39 1.02 0 1.41L10.7 9.3v4.17L4.2 18.4C3.53 19.07 4.04 20.25 5 20.25h14c.96 0 1.47-1.18.8-1.85zM6.91 18.25l5.09-5.09 5.09 5.09H6.91z"
|
|
365
549
|
);
|
|
366
|
-
|
|
550
|
+
var IconSpinner = forwardRef4(function IconSpinner2(_a, ref) {
|
|
367
551
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
368
|
-
return /* @__PURE__ */ jsx5(IconSync, __spreadValues({ className: cn("ph-icon-spin", className) }, props));
|
|
369
|
-
}
|
|
370
|
-
|
|
552
|
+
return /* @__PURE__ */ jsx5(IconSync, __spreadValues({ ref, className: cn("ph-icon-spin", className) }, props));
|
|
553
|
+
});
|
|
554
|
+
IconSpinner.displayName = "IconSpinner";
|
|
555
|
+
var CANONICAL_ICONS = {
|
|
371
556
|
activity: IconActivity,
|
|
372
557
|
areaChart: IconAreaChart,
|
|
373
558
|
arrowDown: IconArrowDown,
|
|
@@ -382,74 +567,100 @@ var PH_ICONS = {
|
|
|
382
567
|
chevronDown: IconChevronDown,
|
|
383
568
|
chevronLeft: IconChevronLeft,
|
|
384
569
|
chevronRight: IconChevronRight,
|
|
385
|
-
|
|
570
|
+
clipboardEdit: IconClipboardEdit,
|
|
386
571
|
close: IconClose,
|
|
572
|
+
codePreview: IconCodePreview,
|
|
387
573
|
cohort: IconCohort,
|
|
574
|
+
commandCursor: IconCommandCursor,
|
|
388
575
|
copy: IconCopy,
|
|
389
576
|
cumulativeChart: IconCumulativeChart,
|
|
577
|
+
dataReel: IconDataReel,
|
|
390
578
|
database: IconDatabase,
|
|
391
579
|
download: IconDownload,
|
|
392
580
|
edit: IconEdit,
|
|
393
581
|
errorOutline: IconErrorOutline,
|
|
582
|
+
eventStream: IconEventStream,
|
|
394
583
|
exclamation: IconExclamation,
|
|
584
|
+
experimentSplit: IconExperimentSplit,
|
|
585
|
+
featureGate: IconFeatureGate,
|
|
395
586
|
flag: IconFlag,
|
|
396
587
|
flare: IconFlare,
|
|
397
588
|
flask: IconFlask,
|
|
398
589
|
gift: IconGift,
|
|
399
|
-
|
|
590
|
+
gridView: IconGridView,
|
|
400
591
|
handClick: IconHandClick,
|
|
401
592
|
home: IconHome,
|
|
402
|
-
info:
|
|
593
|
+
info: IconInfo,
|
|
594
|
+
insightBoard: IconInsightBoard,
|
|
403
595
|
layers: IconLayers,
|
|
404
|
-
|
|
596
|
+
listView: IconListView,
|
|
405
597
|
logout: IconLogout,
|
|
406
598
|
mail: IconMail,
|
|
407
599
|
moon: IconMoon,
|
|
600
|
+
oldWindow: IconOldWindow,
|
|
408
601
|
panelRight: IconPanelRight,
|
|
409
602
|
person: IconPerson,
|
|
410
|
-
|
|
603
|
+
playCircle: IconPlayCircle,
|
|
411
604
|
plus: IconPlus,
|
|
412
605
|
premium: IconPremium,
|
|
413
606
|
queryEditor: IconQueryEditor,
|
|
607
|
+
queryStack: IconQueryStack,
|
|
414
608
|
radar: IconRadar,
|
|
415
609
|
recording: IconRecording,
|
|
610
|
+
replayFrame: IconReplayFrame,
|
|
416
611
|
robot: IconRobot,
|
|
417
612
|
rocket: IconRocket,
|
|
418
613
|
save: IconSave,
|
|
419
614
|
search: IconSearch,
|
|
420
615
|
selectEvents: IconSelectEvents,
|
|
421
|
-
settings: IconTuning,
|
|
422
616
|
shoppingCart: IconShoppingCart,
|
|
423
617
|
spinner: IconSpinner,
|
|
424
618
|
star: IconStar,
|
|
425
619
|
subArrowRight: IconSubArrowRight,
|
|
426
620
|
sun: IconSun,
|
|
621
|
+
surveyCard: IconSurveyCard,
|
|
427
622
|
surveys: IconSurveys,
|
|
428
623
|
sync: IconSync,
|
|
429
624
|
tableChart: IconTableChart,
|
|
430
625
|
terminal: IconTerminal,
|
|
431
626
|
toggle: IconToggle,
|
|
432
627
|
trash: IconTrash,
|
|
433
|
-
|
|
628
|
+
tuning: IconTuning,
|
|
434
629
|
upload: IconUpload,
|
|
435
630
|
volume: IconVolume,
|
|
436
|
-
volumeOff: IconVolumeOff
|
|
631
|
+
volumeOff: IconVolumeOff
|
|
632
|
+
};
|
|
633
|
+
var PH_ICON_ALIASES = {
|
|
634
|
+
clipboard: IconClipboardEdit,
|
|
635
|
+
grid: IconGridView,
|
|
636
|
+
list: IconListView,
|
|
637
|
+
play: IconPlayCircle,
|
|
638
|
+
settings: IconTuning,
|
|
639
|
+
trendingUp: IconArrowUp,
|
|
437
640
|
warning: IconExclamation,
|
|
438
641
|
xCircle: IconCancel
|
|
439
642
|
};
|
|
440
|
-
|
|
643
|
+
var PH_ICONS = __spreadValues(__spreadValues({}, CANONICAL_ICONS), PH_ICON_ALIASES);
|
|
644
|
+
for (const [name, Icon] of Object.entries(CANONICAL_ICONS)) {
|
|
645
|
+
const namedIcon = Icon;
|
|
646
|
+
if (!namedIcon.displayName || namedIcon.displayName === "IconGlyph") {
|
|
647
|
+
namedIcon.displayName = `Icon${name[0].toUpperCase()}${name.slice(1)}`;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
var IconByName = forwardRef4(function IconByName2(_a, ref) {
|
|
441
651
|
var _b = _a, { name } = _b, props = __objRest(_b, ["name"]);
|
|
442
652
|
const Icon = PH_ICONS[name];
|
|
443
|
-
return /* @__PURE__ */ jsx5(Icon, __spreadValues({}, props));
|
|
444
|
-
}
|
|
653
|
+
return /* @__PURE__ */ jsx5(Icon, __spreadValues({ ref }, props));
|
|
654
|
+
});
|
|
655
|
+
IconByName.displayName = "IconByName";
|
|
445
656
|
|
|
446
657
|
// src/components/ui/Alert.tsx
|
|
447
658
|
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
448
659
|
var statusConfig = {
|
|
449
|
-
info: { icon:
|
|
450
|
-
success: { icon: IconCheckCircle
|
|
451
|
-
warning: { icon: IconExclamation
|
|
452
|
-
danger: { icon: IconCancel
|
|
660
|
+
info: { icon: IconInfo },
|
|
661
|
+
success: { icon: IconCheckCircle },
|
|
662
|
+
warning: { icon: IconExclamation },
|
|
663
|
+
danger: { icon: IconCancel }
|
|
453
664
|
};
|
|
454
665
|
var statusClassMap = {
|
|
455
666
|
info: "ph-alert-info",
|
|
@@ -457,25 +668,43 @@ var statusClassMap = {
|
|
|
457
668
|
warning: "ph-alert-warning",
|
|
458
669
|
danger: "ph-alert-danger"
|
|
459
670
|
};
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
671
|
+
var Alert = forwardRef5(function Alert2(_a, ref) {
|
|
672
|
+
var _b = _a, {
|
|
673
|
+
status = "info",
|
|
674
|
+
title,
|
|
675
|
+
description,
|
|
676
|
+
icon,
|
|
677
|
+
children,
|
|
678
|
+
className,
|
|
679
|
+
onDismiss,
|
|
680
|
+
live,
|
|
681
|
+
dismissLabel = "Dismiss notification",
|
|
682
|
+
role
|
|
683
|
+
} = _b, props = __objRest(_b, [
|
|
684
|
+
"status",
|
|
685
|
+
"title",
|
|
686
|
+
"description",
|
|
687
|
+
"icon",
|
|
688
|
+
"children",
|
|
689
|
+
"className",
|
|
690
|
+
"onDismiss",
|
|
691
|
+
"live",
|
|
692
|
+
"dismissLabel",
|
|
693
|
+
"role"
|
|
694
|
+
]);
|
|
469
695
|
const config = statusConfig[status];
|
|
470
696
|
const Icon = config.icon;
|
|
471
697
|
return /* @__PURE__ */ jsxs4(
|
|
472
698
|
"div",
|
|
473
|
-
{
|
|
474
|
-
|
|
475
|
-
|
|
699
|
+
__spreadProps(__spreadValues({
|
|
700
|
+
ref,
|
|
701
|
+
role: role != null ? role : live === "assertive" ? "alert" : live === "polite" ? "status" : void 0,
|
|
702
|
+
"aria-live": live,
|
|
703
|
+
className: cn("ph-alert", statusClassMap[status], className)
|
|
704
|
+
}, props), {
|
|
476
705
|
children: [
|
|
477
|
-
icon != null ? icon : /* @__PURE__ */ jsx6(Icon, { className:
|
|
478
|
-
/* @__PURE__ */ jsxs4("div", { className: "flex-1", children: [
|
|
706
|
+
icon != null ? icon : /* @__PURE__ */ jsx6(Icon, { className: "ph-alert-icon mt-0.5 h-5 w-5 shrink-0", "aria-hidden": true }),
|
|
707
|
+
/* @__PURE__ */ jsxs4("div", { className: "min-w-0 flex-1", children: [
|
|
479
708
|
title && /* @__PURE__ */ jsx6("p", { className: "font-semibold", children: title }),
|
|
480
709
|
description && /* @__PURE__ */ jsx6("p", { className: "mt-1 text-sm text-ph-subtle", children: description }),
|
|
481
710
|
children
|
|
@@ -485,17 +714,19 @@ function Alert({
|
|
|
485
714
|
{
|
|
486
715
|
type: "button",
|
|
487
716
|
onClick: onDismiss,
|
|
488
|
-
className: "
|
|
489
|
-
"aria-label":
|
|
490
|
-
children: /* @__PURE__ */ jsx6(
|
|
717
|
+
className: "ph-alert-dismiss",
|
|
718
|
+
"aria-label": dismissLabel,
|
|
719
|
+
children: /* @__PURE__ */ jsx6(IconClose, { className: "h-4 w-4", "aria-hidden": true })
|
|
491
720
|
}
|
|
492
721
|
)
|
|
493
722
|
]
|
|
494
|
-
}
|
|
723
|
+
})
|
|
495
724
|
);
|
|
496
|
-
}
|
|
725
|
+
});
|
|
726
|
+
Alert.displayName = "Alert";
|
|
497
727
|
|
|
498
728
|
// src/components/ui/Badge.tsx
|
|
729
|
+
import { forwardRef as forwardRef6 } from "react";
|
|
499
730
|
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
500
731
|
var variantMap = {
|
|
501
732
|
brand: "ph-badge-brand",
|
|
@@ -510,66 +741,95 @@ var sizeMap = {
|
|
|
510
741
|
sm: "text-[10px] px-1.5 py-0.5",
|
|
511
742
|
md: ""
|
|
512
743
|
};
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
744
|
+
var Badge = forwardRef6(function Badge2(_a, ref) {
|
|
745
|
+
var _b = _a, {
|
|
746
|
+
variant = "neutral",
|
|
747
|
+
size = "md",
|
|
748
|
+
children,
|
|
749
|
+
className
|
|
750
|
+
} = _b, props = __objRest(_b, [
|
|
751
|
+
"variant",
|
|
752
|
+
"size",
|
|
753
|
+
"children",
|
|
754
|
+
"className"
|
|
755
|
+
]);
|
|
519
756
|
return /* @__PURE__ */ jsx7(
|
|
520
757
|
"span",
|
|
521
|
-
{
|
|
758
|
+
__spreadProps(__spreadValues({
|
|
759
|
+
ref,
|
|
522
760
|
className: cn(
|
|
523
761
|
"ph-badge",
|
|
524
762
|
variantMap[variant],
|
|
525
763
|
sizeMap[size],
|
|
526
764
|
className
|
|
527
|
-
)
|
|
765
|
+
)
|
|
766
|
+
}, props), {
|
|
528
767
|
children
|
|
529
|
-
}
|
|
768
|
+
})
|
|
530
769
|
);
|
|
531
|
-
}
|
|
770
|
+
});
|
|
771
|
+
Badge.displayName = "Badge";
|
|
532
772
|
|
|
533
773
|
// src/components/ui/Card.tsx
|
|
774
|
+
import { forwardRef as forwardRef7 } from "react";
|
|
534
775
|
import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
535
776
|
var variantMap2 = {
|
|
536
|
-
default: "
|
|
537
|
-
outlined: "border-2 border-ph-border
|
|
538
|
-
elevated: "
|
|
539
|
-
highlighted: "
|
|
777
|
+
default: "",
|
|
778
|
+
outlined: "border-2 border-ph-border",
|
|
779
|
+
elevated: "ph-card-elevated",
|
|
780
|
+
highlighted: "ph-card-highlighted"
|
|
540
781
|
};
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
782
|
+
var Card = forwardRef7(function Card2(_a, ref) {
|
|
783
|
+
var _b = _a, {
|
|
784
|
+
children,
|
|
785
|
+
title,
|
|
786
|
+
description,
|
|
787
|
+
actions,
|
|
788
|
+
footer,
|
|
789
|
+
media,
|
|
790
|
+
variant = "default",
|
|
791
|
+
className,
|
|
792
|
+
bodyClassName,
|
|
793
|
+
interactive = false,
|
|
794
|
+
titleAs: Title2 = "h3"
|
|
795
|
+
} = _b, props = __objRest(_b, [
|
|
796
|
+
"children",
|
|
797
|
+
"title",
|
|
798
|
+
"description",
|
|
799
|
+
"actions",
|
|
800
|
+
"footer",
|
|
801
|
+
"media",
|
|
802
|
+
"variant",
|
|
803
|
+
"className",
|
|
804
|
+
"bodyClassName",
|
|
805
|
+
"interactive",
|
|
806
|
+
"titleAs"
|
|
807
|
+
]);
|
|
552
808
|
return /* @__PURE__ */ jsxs5(
|
|
553
809
|
"div",
|
|
554
|
-
{
|
|
810
|
+
__spreadProps(__spreadValues({
|
|
811
|
+
ref,
|
|
555
812
|
className: cn(
|
|
556
813
|
"ph-card",
|
|
557
814
|
variantMap2[variant],
|
|
815
|
+
interactive && "ph-card-interactive",
|
|
558
816
|
className
|
|
559
|
-
)
|
|
817
|
+
)
|
|
818
|
+
}, props), {
|
|
560
819
|
children: [
|
|
561
|
-
media && /* @__PURE__ */ jsx8("div", { className: "-
|
|
820
|
+
media && /* @__PURE__ */ jsx8("div", { className: "ph-card-media", children: media }),
|
|
562
821
|
/* @__PURE__ */ jsxs5("div", { className: cn("ph-card-body", bodyClassName), children: [
|
|
563
|
-
title && /* @__PURE__ */ jsx8(
|
|
822
|
+
title && /* @__PURE__ */ jsx8(Title2, { className: "ph-card-title", children: title }),
|
|
564
823
|
description && /* @__PURE__ */ jsx8("p", { className: "text-sm text-ph-subtle", children: description }),
|
|
565
824
|
children,
|
|
566
825
|
actions && /* @__PURE__ */ jsx8("div", { className: "ph-card-actions", children: actions })
|
|
567
826
|
] }),
|
|
568
827
|
footer && /* @__PURE__ */ jsx8("div", { className: "border-t border-ph-border px-6 py-4 text-xs text-ph-subtle", children: footer })
|
|
569
828
|
]
|
|
570
|
-
}
|
|
829
|
+
})
|
|
571
830
|
);
|
|
572
|
-
}
|
|
831
|
+
});
|
|
832
|
+
Card.displayName = "Card";
|
|
573
833
|
|
|
574
834
|
// src/components/ui/Drawer.tsx
|
|
575
835
|
import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
@@ -619,22 +879,270 @@ function Drawer({
|
|
|
619
879
|
}
|
|
620
880
|
|
|
621
881
|
// src/components/ui/Kbd.tsx
|
|
622
|
-
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
882
|
+
import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
883
|
+
var platformLabels = {
|
|
884
|
+
text: {
|
|
885
|
+
command: "Command",
|
|
886
|
+
cmd: "Command",
|
|
887
|
+
option: "Option",
|
|
888
|
+
alt: "Alt",
|
|
889
|
+
control: "Control",
|
|
890
|
+
ctrl: "Control",
|
|
891
|
+
shift: "Shift"
|
|
892
|
+
},
|
|
893
|
+
mac: {
|
|
894
|
+
command: "\u2318",
|
|
895
|
+
cmd: "\u2318",
|
|
896
|
+
option: "\u2325",
|
|
897
|
+
alt: "\u2325",
|
|
898
|
+
control: "\u2303",
|
|
899
|
+
ctrl: "\u2303",
|
|
900
|
+
shift: "\u21E7"
|
|
901
|
+
},
|
|
902
|
+
windows: {
|
|
903
|
+
command: "Win",
|
|
904
|
+
cmd: "Win",
|
|
905
|
+
option: "Alt",
|
|
906
|
+
alt: "Alt",
|
|
907
|
+
control: "Ctrl",
|
|
908
|
+
ctrl: "Ctrl",
|
|
909
|
+
shift: "Shift"
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
var spokenLabels = {
|
|
913
|
+
"\u2318": "Command",
|
|
914
|
+
"\u2325": "Option",
|
|
915
|
+
"\u2303": "Control",
|
|
916
|
+
"\u21E7": "Shift",
|
|
917
|
+
"\u21B5": "Enter",
|
|
918
|
+
"\u23CE": "Enter",
|
|
919
|
+
"\u232B": "Backspace",
|
|
920
|
+
"\u238B": "Escape"
|
|
921
|
+
};
|
|
623
922
|
function Kbd(_a) {
|
|
624
|
-
var _b = _a, {
|
|
923
|
+
var _b = _a, {
|
|
924
|
+
variant = "shortcut",
|
|
925
|
+
keys,
|
|
926
|
+
platform = "text",
|
|
927
|
+
separator,
|
|
928
|
+
children,
|
|
929
|
+
className,
|
|
930
|
+
"aria-label": ariaLabel
|
|
931
|
+
} = _b, props = __objRest(_b, [
|
|
932
|
+
"variant",
|
|
933
|
+
"keys",
|
|
934
|
+
"platform",
|
|
935
|
+
"separator",
|
|
936
|
+
"children",
|
|
937
|
+
"className",
|
|
938
|
+
"aria-label"
|
|
939
|
+
]);
|
|
625
940
|
if (variant === "token") {
|
|
626
|
-
return /* @__PURE__ */ jsx10("code", __spreadProps(__spreadValues({ className: cn("ph-
|
|
941
|
+
return /* @__PURE__ */ jsx10("code", __spreadProps(__spreadValues({ className: cn("ph-code-token ph-kbd", className), "aria-label": ariaLabel }, props), { children }));
|
|
942
|
+
}
|
|
943
|
+
const sourceKeys = (keys == null ? void 0 : keys.length) ? keys : children != null ? [children] : [];
|
|
944
|
+
const displayKeys = sourceKeys.map((key) => formatKey(key, platform));
|
|
945
|
+
const accessibleLabel = ariaLabel != null ? ariaLabel : getShortcutLabel(displayKeys);
|
|
946
|
+
if (variant === "key") {
|
|
947
|
+
return /* @__PURE__ */ jsx10("kbd", __spreadProps(__spreadValues({ className: cn("ph-keycap", className), "aria-label": accessibleLabel }, props), { children: displayKeys[0] }));
|
|
627
948
|
}
|
|
628
|
-
|
|
629
|
-
|
|
949
|
+
return /* @__PURE__ */ jsx10("kbd", __spreadProps(__spreadValues({ className: cn("ph-shortcut-group ph-keycap", className), "aria-label": accessibleLabel }, props), { children: displayKeys.map((key, index) => /* @__PURE__ */ jsxs7("span", { className: "contents", children: [
|
|
950
|
+
index > 0 && separator != null ? /* @__PURE__ */ jsx10("span", { className: "ph-shortcut-separator", "aria-hidden": "true", children: separator }) : null,
|
|
951
|
+
/* @__PURE__ */ jsx10("span", { className: "ph-shortcut-key", "aria-hidden": accessibleLabel ? true : void 0, children: key })
|
|
952
|
+
] }, index)) }));
|
|
953
|
+
}
|
|
954
|
+
function formatKey(key, platform) {
|
|
955
|
+
var _a;
|
|
956
|
+
if (typeof key !== "string") return key;
|
|
957
|
+
return (_a = platformLabels[platform][key.toLowerCase()]) != null ? _a : key;
|
|
958
|
+
}
|
|
959
|
+
function getShortcutLabel(keys) {
|
|
960
|
+
const labels = keys.map((key) => {
|
|
961
|
+
var _a;
|
|
962
|
+
if (typeof key !== "string" && typeof key !== "number") return null;
|
|
963
|
+
const value = String(key);
|
|
964
|
+
return (_a = spokenLabels[value]) != null ? _a : value;
|
|
965
|
+
});
|
|
966
|
+
return labels.every((label) => label != null) ? labels.join(" + ") : void 0;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// src/components/ui/Loader.tsx
|
|
970
|
+
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
971
|
+
var loaderSizeClass = {
|
|
972
|
+
sm: "ph-loader-sm",
|
|
973
|
+
md: "ph-loader-md",
|
|
974
|
+
lg: "ph-loader-lg"
|
|
975
|
+
};
|
|
976
|
+
var skeletonShapeClass = {
|
|
977
|
+
title: "ph-skeleton-title",
|
|
978
|
+
text: "ph-skeleton-text",
|
|
979
|
+
"short-text": "ph-skeleton-text-short",
|
|
980
|
+
avatar: "ph-skeleton-avatar",
|
|
981
|
+
button: "ph-skeleton-button",
|
|
982
|
+
block: "ph-skeleton-block"
|
|
983
|
+
};
|
|
984
|
+
function Loader(_a) {
|
|
985
|
+
var _b = _a, {
|
|
986
|
+
variant = "spinner",
|
|
987
|
+
size = "md",
|
|
988
|
+
label = "Loading",
|
|
989
|
+
className
|
|
990
|
+
} = _b, props = __objRest(_b, [
|
|
991
|
+
"variant",
|
|
992
|
+
"size",
|
|
993
|
+
"label",
|
|
994
|
+
"className"
|
|
995
|
+
]);
|
|
996
|
+
return /* @__PURE__ */ jsxs8(
|
|
997
|
+
"span",
|
|
998
|
+
__spreadProps(__spreadValues({
|
|
999
|
+
role: "status",
|
|
1000
|
+
"aria-label": label,
|
|
1001
|
+
className: cn("ph-loader", loaderSizeClass[size], className)
|
|
1002
|
+
}, props), {
|
|
1003
|
+
children: [
|
|
1004
|
+
variant === "spinner" ? /* @__PURE__ */ jsx11("span", { className: "ph-loading", "aria-hidden": true }) : null,
|
|
1005
|
+
variant === "dots" ? /* @__PURE__ */ jsxs8("span", { className: "ph-loading-dots", "aria-hidden": true, children: [
|
|
1006
|
+
/* @__PURE__ */ jsx11("span", {}),
|
|
1007
|
+
/* @__PURE__ */ jsx11("span", {}),
|
|
1008
|
+
/* @__PURE__ */ jsx11("span", {})
|
|
1009
|
+
] }) : null,
|
|
1010
|
+
variant === "pulse" ? /* @__PURE__ */ jsx11("span", { className: "ph-loading-pulse", "aria-hidden": true }) : null
|
|
1011
|
+
]
|
|
1012
|
+
})
|
|
1013
|
+
);
|
|
1014
|
+
}
|
|
1015
|
+
function Skeleton(_a) {
|
|
1016
|
+
var _b = _a, { shape = "text", className } = _b, props = __objRest(_b, ["shape", "className"]);
|
|
1017
|
+
return /* @__PURE__ */ jsx11(
|
|
1018
|
+
"span",
|
|
1019
|
+
__spreadValues({
|
|
1020
|
+
className: cn("ph-skeleton", skeletonShapeClass[shape], className),
|
|
1021
|
+
"aria-hidden": "true"
|
|
1022
|
+
}, props)
|
|
1023
|
+
);
|
|
1024
|
+
}
|
|
1025
|
+
function LoadingState(_a) {
|
|
1026
|
+
var _b = _a, {
|
|
1027
|
+
label = "Loading",
|
|
1028
|
+
title = "Loading",
|
|
1029
|
+
description,
|
|
1030
|
+
variant = "spinner",
|
|
1031
|
+
size = "lg",
|
|
1032
|
+
className
|
|
1033
|
+
} = _b, props = __objRest(_b, [
|
|
1034
|
+
"label",
|
|
1035
|
+
"title",
|
|
1036
|
+
"description",
|
|
1037
|
+
"variant",
|
|
1038
|
+
"size",
|
|
1039
|
+
"className"
|
|
1040
|
+
]);
|
|
1041
|
+
return /* @__PURE__ */ jsxs8("div", __spreadProps(__spreadValues({ className: cn("ph-loading-state", className), role: "status", "aria-label": label }, props), { children: [
|
|
1042
|
+
/* @__PURE__ */ jsx11(Loader, { variant, size, label, "aria-hidden": "true" }),
|
|
1043
|
+
/* @__PURE__ */ jsxs8("div", { className: "ph-loading-state__copy", children: [
|
|
1044
|
+
/* @__PURE__ */ jsx11("strong", { children: title }),
|
|
1045
|
+
description ? /* @__PURE__ */ jsx11("span", { children: description }) : null
|
|
1046
|
+
] })
|
|
1047
|
+
] }));
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// src/components/ui/AuthLayout.tsx
|
|
1051
|
+
import { useId } from "react";
|
|
1052
|
+
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1053
|
+
function AuthLayout(_a) {
|
|
1054
|
+
var _b = _a, { brand, footer, aside, children, className } = _b, props = __objRest(_b, ["brand", "footer", "aside", "children", "className"]);
|
|
1055
|
+
return /* @__PURE__ */ jsxs9("div", __spreadProps(__spreadValues({ className: cn("ph-auth-layout", aside != null && "ph-auth-layout--split", className) }, props), { children: [
|
|
1056
|
+
aside ? /* @__PURE__ */ jsx12("aside", { className: "ph-auth-layout__aside", children: aside }) : null,
|
|
1057
|
+
/* @__PURE__ */ jsx12("div", { className: "ph-auth-layout__main", children: /* @__PURE__ */ jsxs9("div", { className: "ph-auth-layout__column", children: [
|
|
1058
|
+
brand ? /* @__PURE__ */ jsx12("div", { className: "ph-auth-layout__brand", children: brand }) : null,
|
|
1059
|
+
children,
|
|
1060
|
+
footer ? /* @__PURE__ */ jsx12("footer", { className: "ph-auth-layout__footer", children: footer }) : null
|
|
1061
|
+
] }) })
|
|
1062
|
+
] }));
|
|
1063
|
+
}
|
|
1064
|
+
function AuthCard(_a) {
|
|
1065
|
+
var _b = _a, { title, description, footer, children, className } = _b, props = __objRest(_b, ["title", "description", "footer", "children", "className"]);
|
|
1066
|
+
const titleId = useId();
|
|
1067
|
+
return /* @__PURE__ */ jsxs9("section", __spreadProps(__spreadValues({ className: cn("ph-auth-card", className), "aria-labelledby": titleId }, props), { children: [
|
|
1068
|
+
/* @__PURE__ */ jsxs9("header", { className: "ph-auth-card__header", children: [
|
|
1069
|
+
/* @__PURE__ */ jsx12("h1", { id: titleId, children: title }),
|
|
1070
|
+
description ? /* @__PURE__ */ jsx12("p", { children: description }) : null
|
|
1071
|
+
] }),
|
|
1072
|
+
/* @__PURE__ */ jsx12("div", { className: "ph-auth-card__body", children }),
|
|
1073
|
+
footer ? /* @__PURE__ */ jsx12("footer", { className: "ph-auth-card__footer", children: footer }) : null
|
|
1074
|
+
] }));
|
|
1075
|
+
}
|
|
1076
|
+
function AuthDivider(_a) {
|
|
1077
|
+
var _b = _a, { children = "or continue with", className } = _b, props = __objRest(_b, ["children", "className"]);
|
|
1078
|
+
return /* @__PURE__ */ jsx12("div", __spreadProps(__spreadValues({ className: cn("ph-auth-divider", className) }, props), { children: /* @__PURE__ */ jsx12("span", { children }) }));
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
// src/components/ui/SettingsLayout.tsx
|
|
1082
|
+
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1083
|
+
function SettingsNav(_a) {
|
|
1084
|
+
var _b = _a, { groups, className } = _b, props = __objRest(_b, ["groups", "className"]);
|
|
1085
|
+
return /* @__PURE__ */ jsx13("div", __spreadProps(__spreadValues({ className: cn("ph-settings-nav", className) }, props), { children: groups.map((group, index) => /* @__PURE__ */ jsxs10("div", { className: "ph-settings-nav__group", children: [
|
|
1086
|
+
/* @__PURE__ */ jsx13("h3", { children: group.label }),
|
|
1087
|
+
/* @__PURE__ */ jsx13("div", { className: "ph-settings-nav__items", children: group.items.map((item) => /* @__PURE__ */ jsxs10(
|
|
1088
|
+
"a",
|
|
1089
|
+
{
|
|
1090
|
+
href: item.href,
|
|
1091
|
+
className: cn("ph-settings-nav__item", item.active && "ph-settings-nav__item--active"),
|
|
1092
|
+
"aria-current": item.active ? "page" : void 0,
|
|
1093
|
+
children: [
|
|
1094
|
+
item.icon ? /* @__PURE__ */ jsx13("span", { className: "ph-settings-nav__icon", children: item.icon }) : null,
|
|
1095
|
+
/* @__PURE__ */ jsx13("span", { children: item.label }),
|
|
1096
|
+
item.badge ? /* @__PURE__ */ jsx13("span", { className: "ph-settings-nav__badge", children: item.badge }) : null
|
|
1097
|
+
]
|
|
1098
|
+
},
|
|
1099
|
+
item.id
|
|
1100
|
+
)) })
|
|
1101
|
+
] }, index)) }));
|
|
630
1102
|
}
|
|
631
|
-
function
|
|
632
|
-
|
|
633
|
-
|
|
1103
|
+
function SettingsLayout(_a) {
|
|
1104
|
+
var _b = _a, {
|
|
1105
|
+
title,
|
|
1106
|
+
description,
|
|
1107
|
+
actions,
|
|
1108
|
+
navigation,
|
|
1109
|
+
navigationLabel = "Settings",
|
|
1110
|
+
children,
|
|
1111
|
+
className
|
|
1112
|
+
} = _b, props = __objRest(_b, [
|
|
1113
|
+
"title",
|
|
1114
|
+
"description",
|
|
1115
|
+
"actions",
|
|
1116
|
+
"navigation",
|
|
1117
|
+
"navigationLabel",
|
|
1118
|
+
"children",
|
|
1119
|
+
"className"
|
|
1120
|
+
]);
|
|
1121
|
+
return /* @__PURE__ */ jsxs10("section", __spreadProps(__spreadValues({ className: cn("ph-settings-layout", className) }, props), { children: [
|
|
1122
|
+
/* @__PURE__ */ jsxs10("header", { className: "ph-settings-layout__header", children: [
|
|
1123
|
+
/* @__PURE__ */ jsxs10("div", { children: [
|
|
1124
|
+
/* @__PURE__ */ jsx13("h2", { children: title }),
|
|
1125
|
+
description ? /* @__PURE__ */ jsx13("p", { children: description }) : null
|
|
1126
|
+
] }),
|
|
1127
|
+
actions ? /* @__PURE__ */ jsx13("div", { className: "ph-settings-layout__actions", children: actions }) : null
|
|
1128
|
+
] }),
|
|
1129
|
+
/* @__PURE__ */ jsxs10("details", { className: "ph-settings-layout__mobile-nav", children: [
|
|
1130
|
+
/* @__PURE__ */ jsxs10("summary", { children: [
|
|
1131
|
+
/* @__PURE__ */ jsx13(IconTuning, { className: "h-4 w-4", "aria-hidden": true }),
|
|
1132
|
+
"Settings menu"
|
|
1133
|
+
] }),
|
|
1134
|
+
/* @__PURE__ */ jsx13("nav", { "aria-label": navigationLabel, children: navigation })
|
|
1135
|
+
] }),
|
|
1136
|
+
/* @__PURE__ */ jsxs10("div", { className: "ph-settings-layout__grid", children: [
|
|
1137
|
+
/* @__PURE__ */ jsx13("aside", { className: "ph-settings-layout__sidebar", children: /* @__PURE__ */ jsx13("nav", { "aria-label": navigationLabel, children: navigation }) }),
|
|
1138
|
+
/* @__PURE__ */ jsx13("div", { className: "ph-settings-layout__content", children })
|
|
1139
|
+
] })
|
|
1140
|
+
] }));
|
|
634
1141
|
}
|
|
635
1142
|
|
|
636
1143
|
// src/components/ui/DropdownMenu.tsx
|
|
637
|
-
import
|
|
1144
|
+
import * as DropdownPrimitive from "@radix-ui/react-dropdown-menu";
|
|
1145
|
+
import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
638
1146
|
var sizeClass2 = {
|
|
639
1147
|
xs: "ph-btn-xs",
|
|
640
1148
|
sm: "ph-btn-sm",
|
|
@@ -646,40 +1154,95 @@ var variantClass2 = {
|
|
|
646
1154
|
secondary: "ph-btn-secondary",
|
|
647
1155
|
accent: "ph-btn-accent"
|
|
648
1156
|
};
|
|
649
|
-
function
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
1157
|
+
function DropdownContent({
|
|
1158
|
+
children,
|
|
1159
|
+
align = "start",
|
|
1160
|
+
side = "bottom",
|
|
1161
|
+
sideOffset = 7,
|
|
1162
|
+
alignOffset = 0,
|
|
1163
|
+
collisionPadding = 8,
|
|
1164
|
+
avoidCollisions = true,
|
|
1165
|
+
panelClassName
|
|
1166
|
+
}) {
|
|
1167
|
+
return /* @__PURE__ */ jsx14(DropdownPrimitive.Portal, { children: /* @__PURE__ */ jsxs11(
|
|
1168
|
+
DropdownPrimitive.Content,
|
|
1169
|
+
{
|
|
1170
|
+
className: cn("ph-dropdown-panel", panelClassName),
|
|
1171
|
+
align,
|
|
1172
|
+
side,
|
|
1173
|
+
sideOffset,
|
|
1174
|
+
alignOffset,
|
|
1175
|
+
collisionPadding,
|
|
1176
|
+
avoidCollisions,
|
|
1177
|
+
sticky: "partial",
|
|
1178
|
+
children: [
|
|
1179
|
+
children,
|
|
1180
|
+
/* @__PURE__ */ jsx14(DropdownPrimitive.Arrow, { className: "ph-dropdown-arrow", width: 12, height: 6 })
|
|
1181
|
+
]
|
|
1182
|
+
}
|
|
1183
|
+
) });
|
|
655
1184
|
}
|
|
656
1185
|
function DropdownMenu(_a) {
|
|
657
1186
|
var _b = _a, {
|
|
658
1187
|
trigger,
|
|
659
1188
|
children,
|
|
660
|
-
align
|
|
1189
|
+
align,
|
|
1190
|
+
side,
|
|
1191
|
+
sideOffset,
|
|
1192
|
+
alignOffset,
|
|
1193
|
+
collisionPadding,
|
|
1194
|
+
avoidCollisions,
|
|
661
1195
|
className,
|
|
662
1196
|
panelClassName,
|
|
663
|
-
"aria-label": ariaLabel
|
|
1197
|
+
"aria-label": ariaLabel,
|
|
1198
|
+
open,
|
|
1199
|
+
defaultOpen,
|
|
1200
|
+
onOpenChange,
|
|
1201
|
+
modal = false,
|
|
1202
|
+
disabled
|
|
664
1203
|
} = _b, props = __objRest(_b, [
|
|
665
1204
|
"trigger",
|
|
666
1205
|
"children",
|
|
667
1206
|
"align",
|
|
1207
|
+
"side",
|
|
1208
|
+
"sideOffset",
|
|
1209
|
+
"alignOffset",
|
|
1210
|
+
"collisionPadding",
|
|
1211
|
+
"avoidCollisions",
|
|
668
1212
|
"className",
|
|
669
1213
|
"panelClassName",
|
|
670
|
-
"aria-label"
|
|
1214
|
+
"aria-label",
|
|
1215
|
+
"open",
|
|
1216
|
+
"defaultOpen",
|
|
1217
|
+
"onOpenChange",
|
|
1218
|
+
"modal",
|
|
1219
|
+
"disabled"
|
|
671
1220
|
]);
|
|
672
|
-
return /* @__PURE__ */
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
1221
|
+
return /* @__PURE__ */ jsx14("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ jsxs11(
|
|
1222
|
+
DropdownPrimitive.Root,
|
|
1223
|
+
{
|
|
1224
|
+
open,
|
|
1225
|
+
defaultOpen,
|
|
1226
|
+
onOpenChange,
|
|
1227
|
+
modal,
|
|
1228
|
+
children: [
|
|
1229
|
+
/* @__PURE__ */ jsx14(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx14("button", { type: "button", className: "ph-dropdown-trigger", "aria-label": ariaLabel, children: trigger }) }),
|
|
1230
|
+
/* @__PURE__ */ jsx14(
|
|
1231
|
+
DropdownContent,
|
|
1232
|
+
{
|
|
1233
|
+
align,
|
|
1234
|
+
side,
|
|
1235
|
+
sideOffset,
|
|
1236
|
+
alignOffset,
|
|
1237
|
+
collisionPadding,
|
|
1238
|
+
avoidCollisions,
|
|
1239
|
+
panelClassName,
|
|
1240
|
+
children
|
|
1241
|
+
}
|
|
1242
|
+
)
|
|
1243
|
+
]
|
|
1244
|
+
}
|
|
1245
|
+
) }));
|
|
683
1246
|
}
|
|
684
1247
|
function DropdownButton(_a) {
|
|
685
1248
|
var _b = _a, {
|
|
@@ -691,10 +1254,20 @@ function DropdownButton(_a) {
|
|
|
691
1254
|
icon,
|
|
692
1255
|
sideIcon,
|
|
693
1256
|
children,
|
|
694
|
-
align
|
|
1257
|
+
align,
|
|
1258
|
+
side,
|
|
1259
|
+
sideOffset,
|
|
1260
|
+
alignOffset,
|
|
1261
|
+
collisionPadding,
|
|
1262
|
+
avoidCollisions,
|
|
695
1263
|
className,
|
|
696
1264
|
panelClassName,
|
|
697
|
-
"aria-label": ariaLabel
|
|
1265
|
+
"aria-label": ariaLabel,
|
|
1266
|
+
open,
|
|
1267
|
+
defaultOpen,
|
|
1268
|
+
onOpenChange,
|
|
1269
|
+
modal = false,
|
|
1270
|
+
disabled
|
|
698
1271
|
} = _b, props = __objRest(_b, [
|
|
699
1272
|
"label",
|
|
700
1273
|
"variant",
|
|
@@ -705,55 +1278,154 @@ function DropdownButton(_a) {
|
|
|
705
1278
|
"sideIcon",
|
|
706
1279
|
"children",
|
|
707
1280
|
"align",
|
|
1281
|
+
"side",
|
|
1282
|
+
"sideOffset",
|
|
1283
|
+
"alignOffset",
|
|
1284
|
+
"collisionPadding",
|
|
1285
|
+
"avoidCollisions",
|
|
708
1286
|
"className",
|
|
709
1287
|
"panelClassName",
|
|
710
|
-
"aria-label"
|
|
1288
|
+
"aria-label",
|
|
1289
|
+
"open",
|
|
1290
|
+
"defaultOpen",
|
|
1291
|
+
"onOpenChange",
|
|
1292
|
+
"modal",
|
|
1293
|
+
"disabled"
|
|
711
1294
|
]);
|
|
712
|
-
const
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
1295
|
+
const trailing = sideIcon != null ? sideIcon : /* @__PURE__ */ jsx14(IconChevronDown, { className: "h-4 w-4", "aria-hidden": true });
|
|
1296
|
+
return /* @__PURE__ */ jsx14("div", __spreadProps(__spreadValues({ className: cn("ph-dropdown", className) }, props), { children: /* @__PURE__ */ jsxs11(
|
|
1297
|
+
DropdownPrimitive.Root,
|
|
1298
|
+
{
|
|
1299
|
+
open,
|
|
1300
|
+
defaultOpen,
|
|
1301
|
+
onOpenChange,
|
|
1302
|
+
modal,
|
|
1303
|
+
children: [
|
|
1304
|
+
/* @__PURE__ */ jsx14(DropdownPrimitive.Trigger, { asChild: true, disabled, children: /* @__PURE__ */ jsx14(
|
|
1305
|
+
"button",
|
|
1306
|
+
{
|
|
1307
|
+
type: "button",
|
|
1308
|
+
disabled,
|
|
1309
|
+
className: cn(
|
|
1310
|
+
"ph-btn ph-btn-raised ph-dropdown-button",
|
|
1311
|
+
variantClass2[variant],
|
|
1312
|
+
outline && "ph-btn-outline",
|
|
1313
|
+
sizeClass2[size],
|
|
1314
|
+
split && "ph-btn-split"
|
|
1315
|
+
),
|
|
1316
|
+
"aria-label": ariaLabel,
|
|
1317
|
+
children: /* @__PURE__ */ jsx14(ButtonChrome, { label, icon, sideIcon: trailing, split })
|
|
1318
|
+
}
|
|
1319
|
+
) }),
|
|
1320
|
+
/* @__PURE__ */ jsx14(
|
|
1321
|
+
DropdownContent,
|
|
1322
|
+
{
|
|
1323
|
+
align,
|
|
1324
|
+
side,
|
|
1325
|
+
sideOffset,
|
|
1326
|
+
alignOffset,
|
|
1327
|
+
collisionPadding,
|
|
1328
|
+
avoidCollisions,
|
|
1329
|
+
panelClassName,
|
|
1330
|
+
children
|
|
1331
|
+
}
|
|
1332
|
+
)
|
|
1333
|
+
]
|
|
1334
|
+
}
|
|
1335
|
+
) }));
|
|
736
1336
|
}
|
|
737
1337
|
function DropdownItem(_a) {
|
|
1338
|
+
var _b = _a, { className, children, disabled } = _b, props = __objRest(_b, ["className", "children", "disabled"]);
|
|
1339
|
+
return /* @__PURE__ */ jsx14(DropdownPrimitive.Item, { asChild: true, disabled, children: /* @__PURE__ */ jsx14(
|
|
1340
|
+
"button",
|
|
1341
|
+
__spreadProps(__spreadValues({
|
|
1342
|
+
type: "button",
|
|
1343
|
+
disabled,
|
|
1344
|
+
className: cn("ph-dropdown-item w-full text-left", className)
|
|
1345
|
+
}, props), {
|
|
1346
|
+
children
|
|
1347
|
+
})
|
|
1348
|
+
) });
|
|
1349
|
+
}
|
|
1350
|
+
function DropdownRadioGroup(props) {
|
|
1351
|
+
return /* @__PURE__ */ jsx14(DropdownPrimitive.RadioGroup, __spreadValues({}, props));
|
|
1352
|
+
}
|
|
1353
|
+
function DropdownRadioItem(_a) {
|
|
1354
|
+
var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
|
|
1355
|
+
return /* @__PURE__ */ jsxs11(DropdownPrimitive.RadioItem, __spreadProps(__spreadValues({ className: cn("ph-dropdown-item ph-dropdown-radio-item", className) }, props), { children: [
|
|
1356
|
+
/* @__PURE__ */ jsx14("span", { className: "ph-dropdown-item-indicator", "aria-hidden": true, children: /* @__PURE__ */ jsx14(DropdownPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx14(IconCheck, { className: "h-3.5 w-3.5" }) }) }),
|
|
1357
|
+
/* @__PURE__ */ jsx14("span", { children })
|
|
1358
|
+
] }));
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
// src/components/ui/Input.tsx
|
|
1362
|
+
import { forwardRef as forwardRef8, useId as useId3 } from "react";
|
|
1363
|
+
|
|
1364
|
+
// src/components/ui/FormField.tsx
|
|
1365
|
+
import { useId as useId2 } from "react";
|
|
1366
|
+
import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1367
|
+
function FormField(_a) {
|
|
738
1368
|
var _b = _a, {
|
|
739
|
-
|
|
740
|
-
|
|
1369
|
+
controlId,
|
|
1370
|
+
label,
|
|
1371
|
+
hideLabel = false,
|
|
1372
|
+
helperText,
|
|
1373
|
+
error,
|
|
1374
|
+
required = false,
|
|
1375
|
+
disabled = false,
|
|
1376
|
+
children,
|
|
1377
|
+
className
|
|
741
1378
|
} = _b, props = __objRest(_b, [
|
|
742
|
-
"
|
|
743
|
-
"
|
|
1379
|
+
"controlId",
|
|
1380
|
+
"label",
|
|
1381
|
+
"hideLabel",
|
|
1382
|
+
"helperText",
|
|
1383
|
+
"error",
|
|
1384
|
+
"required",
|
|
1385
|
+
"disabled",
|
|
1386
|
+
"children",
|
|
1387
|
+
"className"
|
|
744
1388
|
]);
|
|
745
|
-
|
|
1389
|
+
const generatedId = useId2();
|
|
1390
|
+
const id = controlId != null ? controlId : generatedId;
|
|
1391
|
+
const descriptionId = helperText && !error ? `${id}-description` : void 0;
|
|
1392
|
+
const errorId = error ? `${id}-error` : void 0;
|
|
1393
|
+
const controlProps = {
|
|
1394
|
+
id,
|
|
1395
|
+
"aria-describedby": descriptionId,
|
|
1396
|
+
"aria-errormessage": errorId,
|
|
1397
|
+
"aria-invalid": error ? true : void 0
|
|
1398
|
+
};
|
|
1399
|
+
return /* @__PURE__ */ jsxs12("div", __spreadProps(__spreadValues({ className: cn("ph-field", className) }, props), { children: [
|
|
1400
|
+
label ? /* @__PURE__ */ jsxs12(
|
|
1401
|
+
"label",
|
|
1402
|
+
{
|
|
1403
|
+
htmlFor: id,
|
|
1404
|
+
className: cn("ph-label", hideLabel && "sr-only", disabled && "opacity-50"),
|
|
1405
|
+
children: [
|
|
1406
|
+
label,
|
|
1407
|
+
required ? /* @__PURE__ */ jsx15("span", { "aria-hidden": "true", children: " *" }) : null
|
|
1408
|
+
]
|
|
1409
|
+
}
|
|
1410
|
+
) : null,
|
|
1411
|
+
typeof children === "function" ? children(controlProps) : children,
|
|
1412
|
+
descriptionId ? /* @__PURE__ */ jsx15("p", { id: descriptionId, className: "mt-1 text-xs text-ph-subtle", children: helperText }) : null,
|
|
1413
|
+
errorId ? /* @__PURE__ */ jsx15("p", { id: errorId, className: "mt-1 text-xs font-medium text-ph-danger", children: error }) : null
|
|
1414
|
+
] }));
|
|
746
1415
|
}
|
|
747
1416
|
|
|
748
1417
|
// src/components/ui/Input.tsx
|
|
749
|
-
import {
|
|
750
|
-
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1418
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
751
1419
|
var sizeMap3 = {
|
|
752
1420
|
sm: "ph-input-sm",
|
|
753
1421
|
md: "",
|
|
754
1422
|
lg: "ph-input-lg"
|
|
755
1423
|
};
|
|
756
|
-
function
|
|
1424
|
+
function joinIds(...ids) {
|
|
1425
|
+
const value = ids.filter(Boolean).join(" ");
|
|
1426
|
+
return value || void 0;
|
|
1427
|
+
}
|
|
1428
|
+
var Input = forwardRef8(function Input2(_a, ref) {
|
|
757
1429
|
var _b = _a, {
|
|
758
1430
|
id: idProp,
|
|
759
1431
|
label,
|
|
@@ -763,57 +1435,60 @@ function Input(_a) {
|
|
|
763
1435
|
size = "md",
|
|
764
1436
|
variant = "default",
|
|
765
1437
|
className,
|
|
766
|
-
wrapperClassName,
|
|
767
|
-
disabled
|
|
768
|
-
|
|
769
|
-
"
|
|
770
|
-
|
|
771
|
-
"
|
|
772
|
-
"
|
|
773
|
-
"
|
|
774
|
-
"
|
|
775
|
-
"
|
|
776
|
-
"
|
|
777
|
-
"
|
|
778
|
-
"
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
}
|
|
816
|
-
|
|
1438
|
+
wrapperClassName,
|
|
1439
|
+
disabled,
|
|
1440
|
+
required,
|
|
1441
|
+
"aria-describedby": ariaDescribedBy
|
|
1442
|
+
} = _b, props = __objRest(_b, [
|
|
1443
|
+
"id",
|
|
1444
|
+
"label",
|
|
1445
|
+
"hideLabel",
|
|
1446
|
+
"error",
|
|
1447
|
+
"helperText",
|
|
1448
|
+
"size",
|
|
1449
|
+
"variant",
|
|
1450
|
+
"className",
|
|
1451
|
+
"wrapperClassName",
|
|
1452
|
+
"disabled",
|
|
1453
|
+
"required",
|
|
1454
|
+
"aria-describedby"
|
|
1455
|
+
]);
|
|
1456
|
+
const autoId = useId3();
|
|
1457
|
+
const id = idProp != null ? idProp : autoId;
|
|
1458
|
+
const hasError = Boolean(error);
|
|
1459
|
+
return /* @__PURE__ */ jsx16(
|
|
1460
|
+
FormField,
|
|
1461
|
+
{
|
|
1462
|
+
controlId: id,
|
|
1463
|
+
label,
|
|
1464
|
+
hideLabel,
|
|
1465
|
+
helperText,
|
|
1466
|
+
error,
|
|
1467
|
+
required,
|
|
1468
|
+
disabled,
|
|
1469
|
+
className: wrapperClassName,
|
|
1470
|
+
children: (fieldProps) => /* @__PURE__ */ jsx16(
|
|
1471
|
+
"input",
|
|
1472
|
+
__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
|
|
1473
|
+
ref,
|
|
1474
|
+
disabled,
|
|
1475
|
+
required,
|
|
1476
|
+
"aria-describedby": joinIds(ariaDescribedBy, fieldProps["aria-describedby"]),
|
|
1477
|
+
className: cn(
|
|
1478
|
+
"ph-input w-full",
|
|
1479
|
+
sizeMap3[size],
|
|
1480
|
+
variant === "ghost" && "ph-input-ghost",
|
|
1481
|
+
hasError && "ph-input-error",
|
|
1482
|
+
disabled && "cursor-not-allowed opacity-60",
|
|
1483
|
+
className
|
|
1484
|
+
)
|
|
1485
|
+
}), props)
|
|
1486
|
+
)
|
|
1487
|
+
}
|
|
1488
|
+
);
|
|
1489
|
+
});
|
|
1490
|
+
Input.displayName = "Input";
|
|
1491
|
+
var Select = forwardRef8(function Select2(_a, ref) {
|
|
817
1492
|
var _b = _a, {
|
|
818
1493
|
id: idProp,
|
|
819
1494
|
label,
|
|
@@ -824,7 +1499,9 @@ function Select(_a) {
|
|
|
824
1499
|
className,
|
|
825
1500
|
wrapperClassName,
|
|
826
1501
|
disabled,
|
|
827
|
-
children
|
|
1502
|
+
children,
|
|
1503
|
+
required,
|
|
1504
|
+
"aria-describedby": ariaDescribedBy
|
|
828
1505
|
} = _b, props = __objRest(_b, [
|
|
829
1506
|
"id",
|
|
830
1507
|
"label",
|
|
@@ -835,42 +1512,34 @@ function Select(_a) {
|
|
|
835
1512
|
"className",
|
|
836
1513
|
"wrapperClassName",
|
|
837
1514
|
"disabled",
|
|
838
|
-
"children"
|
|
1515
|
+
"children",
|
|
1516
|
+
"required",
|
|
1517
|
+
"aria-describedby"
|
|
839
1518
|
]);
|
|
840
|
-
const autoId =
|
|
1519
|
+
const autoId = useId3();
|
|
841
1520
|
const id = idProp != null ? idProp : autoId;
|
|
842
1521
|
const hasError = Boolean(error);
|
|
843
|
-
return /* @__PURE__ */
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
)
|
|
865
|
-
}, props), {
|
|
866
|
-
children
|
|
867
|
-
})
|
|
868
|
-
),
|
|
869
|
-
helperText && !hasError && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs text-ph-subtle", children: helperText }),
|
|
870
|
-
error && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs font-medium text-ph-danger", children: error })
|
|
871
|
-
] });
|
|
872
|
-
}
|
|
873
|
-
function Textarea(_a) {
|
|
1522
|
+
return /* @__PURE__ */ jsx16(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ jsx16(
|
|
1523
|
+
"select",
|
|
1524
|
+
__spreadProps(__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
|
|
1525
|
+
ref,
|
|
1526
|
+
disabled,
|
|
1527
|
+
required,
|
|
1528
|
+
"aria-describedby": joinIds(ariaDescribedBy, fieldProps["aria-describedby"]),
|
|
1529
|
+
className: cn(
|
|
1530
|
+
"ph-select w-full",
|
|
1531
|
+
sizeMap3[size],
|
|
1532
|
+
hasError && "ph-input-error",
|
|
1533
|
+
disabled && "cursor-not-allowed opacity-60",
|
|
1534
|
+
className
|
|
1535
|
+
)
|
|
1536
|
+
}), props), {
|
|
1537
|
+
children
|
|
1538
|
+
})
|
|
1539
|
+
) });
|
|
1540
|
+
});
|
|
1541
|
+
Select.displayName = "Select";
|
|
1542
|
+
var Textarea = forwardRef8(function Textarea2(_a, ref) {
|
|
874
1543
|
var _b = _a, {
|
|
875
1544
|
id: idProp,
|
|
876
1545
|
label,
|
|
@@ -880,7 +1549,9 @@ function Textarea(_a) {
|
|
|
880
1549
|
size = "md",
|
|
881
1550
|
className,
|
|
882
1551
|
wrapperClassName,
|
|
883
|
-
disabled
|
|
1552
|
+
disabled,
|
|
1553
|
+
required,
|
|
1554
|
+
"aria-describedby": ariaDescribedBy
|
|
884
1555
|
} = _b, props = __objRest(_b, [
|
|
885
1556
|
"id",
|
|
886
1557
|
"label",
|
|
@@ -890,40 +1561,32 @@ function Textarea(_a) {
|
|
|
890
1561
|
"size",
|
|
891
1562
|
"className",
|
|
892
1563
|
"wrapperClassName",
|
|
893
|
-
"disabled"
|
|
1564
|
+
"disabled",
|
|
1565
|
+
"required",
|
|
1566
|
+
"aria-describedby"
|
|
894
1567
|
]);
|
|
895
|
-
const autoId =
|
|
1568
|
+
const autoId = useId3();
|
|
896
1569
|
const id = idProp != null ? idProp : autoId;
|
|
897
1570
|
const hasError = Boolean(error);
|
|
898
|
-
return /* @__PURE__ */
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
disabled && "cursor-not-allowed opacity-60",
|
|
918
|
-
className
|
|
919
|
-
)
|
|
920
|
-
}, props)
|
|
921
|
-
),
|
|
922
|
-
helperText && !hasError && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs text-ph-subtle", children: helperText }),
|
|
923
|
-
error && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs font-medium text-ph-danger", children: error })
|
|
924
|
-
] });
|
|
925
|
-
}
|
|
926
|
-
function Checkbox(_a) {
|
|
1571
|
+
return /* @__PURE__ */ jsx16(FormField, { controlId: id, label, hideLabel, helperText, error, required, disabled, className: wrapperClassName, children: (fieldProps) => /* @__PURE__ */ jsx16(
|
|
1572
|
+
"textarea",
|
|
1573
|
+
__spreadValues(__spreadProps(__spreadValues({}, fieldProps), {
|
|
1574
|
+
ref,
|
|
1575
|
+
disabled,
|
|
1576
|
+
required,
|
|
1577
|
+
"aria-describedby": joinIds(ariaDescribedBy, fieldProps["aria-describedby"]),
|
|
1578
|
+
className: cn(
|
|
1579
|
+
"ph-textarea w-full",
|
|
1580
|
+
sizeMap3[size],
|
|
1581
|
+
hasError && "ph-input-error",
|
|
1582
|
+
disabled && "cursor-not-allowed opacity-60",
|
|
1583
|
+
className
|
|
1584
|
+
)
|
|
1585
|
+
}), props)
|
|
1586
|
+
) });
|
|
1587
|
+
});
|
|
1588
|
+
Textarea.displayName = "Textarea";
|
|
1589
|
+
var Checkbox = forwardRef8(function Checkbox2(_a, ref) {
|
|
927
1590
|
var _b = _a, {
|
|
928
1591
|
id: idProp,
|
|
929
1592
|
label,
|
|
@@ -931,7 +1594,8 @@ function Checkbox(_a) {
|
|
|
931
1594
|
helperText,
|
|
932
1595
|
className,
|
|
933
1596
|
wrapperClassName,
|
|
934
|
-
disabled
|
|
1597
|
+
disabled,
|
|
1598
|
+
"aria-describedby": ariaDescribedBy
|
|
935
1599
|
} = _b, props = __objRest(_b, [
|
|
936
1600
|
"id",
|
|
937
1601
|
"label",
|
|
@@ -939,33 +1603,45 @@ function Checkbox(_a) {
|
|
|
939
1603
|
"helperText",
|
|
940
1604
|
"className",
|
|
941
1605
|
"wrapperClassName",
|
|
942
|
-
"disabled"
|
|
1606
|
+
"disabled",
|
|
1607
|
+
"aria-describedby"
|
|
943
1608
|
]);
|
|
944
|
-
const autoId =
|
|
1609
|
+
const autoId = useId3();
|
|
945
1610
|
const id = idProp != null ? idProp : autoId;
|
|
946
1611
|
const hasError = Boolean(error);
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
"
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
1612
|
+
const descriptionId = helperText && !hasError ? `${id}-description` : void 0;
|
|
1613
|
+
const errorId = error ? `${id}-error` : void 0;
|
|
1614
|
+
return /* @__PURE__ */ jsxs13("div", { className: cn("ph-control-row", wrapperClassName), children: [
|
|
1615
|
+
/* @__PURE__ */ jsxs13("span", { className: "ph-checkbox-wrap", children: [
|
|
1616
|
+
/* @__PURE__ */ jsx16(
|
|
1617
|
+
"input",
|
|
1618
|
+
__spreadValues({
|
|
1619
|
+
ref,
|
|
1620
|
+
id,
|
|
1621
|
+
type: "checkbox",
|
|
1622
|
+
disabled,
|
|
1623
|
+
"aria-invalid": hasError || void 0,
|
|
1624
|
+
"aria-describedby": joinIds(ariaDescribedBy, descriptionId),
|
|
1625
|
+
"aria-errormessage": errorId,
|
|
1626
|
+
className: cn(
|
|
1627
|
+
"ph-checkbox",
|
|
1628
|
+
hasError && "border-ph-danger",
|
|
1629
|
+
disabled && "cursor-not-allowed opacity-60",
|
|
1630
|
+
className
|
|
1631
|
+
)
|
|
1632
|
+
}, props)
|
|
1633
|
+
),
|
|
1634
|
+
/* @__PURE__ */ jsx16(IconCheck, { className: "ph-checkbox-icon", "aria-hidden": true })
|
|
1635
|
+
] }),
|
|
1636
|
+
/* @__PURE__ */ jsxs13("div", { className: "ph-control-copy", children: [
|
|
1637
|
+
/* @__PURE__ */ jsx16("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label }),
|
|
1638
|
+
descriptionId ? /* @__PURE__ */ jsx16("p", { id: descriptionId, className: "text-xs text-ph-subtle", children: helperText }) : null,
|
|
1639
|
+
errorId ? /* @__PURE__ */ jsx16("p", { id: errorId, className: "text-xs font-medium text-ph-danger", children: error }) : null
|
|
1640
|
+
] })
|
|
966
1641
|
] });
|
|
967
|
-
}
|
|
968
|
-
|
|
1642
|
+
});
|
|
1643
|
+
Checkbox.displayName = "Checkbox";
|
|
1644
|
+
var Radio = forwardRef8(function Radio2(_a, ref) {
|
|
969
1645
|
var _b = _a, {
|
|
970
1646
|
id: idProp,
|
|
971
1647
|
label,
|
|
@@ -979,22 +1655,24 @@ function Radio(_a) {
|
|
|
979
1655
|
"wrapperClassName",
|
|
980
1656
|
"disabled"
|
|
981
1657
|
]);
|
|
982
|
-
const autoId =
|
|
1658
|
+
const autoId = useId3();
|
|
983
1659
|
const id = idProp != null ? idProp : autoId;
|
|
984
|
-
return /* @__PURE__ */
|
|
985
|
-
/* @__PURE__ */
|
|
1660
|
+
return /* @__PURE__ */ jsxs13("div", { className: cn("ph-control-row", wrapperClassName, disabled && "opacity-60"), children: [
|
|
1661
|
+
/* @__PURE__ */ jsx16(
|
|
986
1662
|
"input",
|
|
987
1663
|
__spreadValues({
|
|
1664
|
+
ref,
|
|
988
1665
|
id,
|
|
989
1666
|
type: "radio",
|
|
990
1667
|
disabled,
|
|
991
1668
|
className: cn("ph-radio", disabled && "cursor-not-allowed", className)
|
|
992
1669
|
}, props)
|
|
993
1670
|
),
|
|
994
|
-
/* @__PURE__ */
|
|
1671
|
+
/* @__PURE__ */ jsx16("label", { htmlFor: id, className: cn("cursor-pointer", disabled && "opacity-60"), children: label })
|
|
995
1672
|
] });
|
|
996
|
-
}
|
|
997
|
-
|
|
1673
|
+
});
|
|
1674
|
+
Radio.displayName = "Radio";
|
|
1675
|
+
var Toggle = forwardRef8(function Toggle2(_a, ref) {
|
|
998
1676
|
var _b = _a, {
|
|
999
1677
|
id: idProp,
|
|
1000
1678
|
label,
|
|
@@ -1008,13 +1686,14 @@ function Toggle(_a) {
|
|
|
1008
1686
|
"wrapperClassName",
|
|
1009
1687
|
"disabled"
|
|
1010
1688
|
]);
|
|
1011
|
-
const autoId =
|
|
1689
|
+
const autoId = useId3();
|
|
1012
1690
|
const id = idProp != null ? idProp : autoId;
|
|
1013
|
-
return /* @__PURE__ */
|
|
1014
|
-
/* @__PURE__ */
|
|
1015
|
-
/* @__PURE__ */
|
|
1691
|
+
return /* @__PURE__ */ jsxs13("label", { className: cn("ph-control-row-between", wrapperClassName, disabled && "opacity-60"), children: [
|
|
1692
|
+
/* @__PURE__ */ jsx16("span", { className: disabled ? "opacity-60" : void 0, children: label }),
|
|
1693
|
+
/* @__PURE__ */ jsx16(
|
|
1016
1694
|
"input",
|
|
1017
1695
|
__spreadValues({
|
|
1696
|
+
ref,
|
|
1018
1697
|
id,
|
|
1019
1698
|
type: "checkbox",
|
|
1020
1699
|
role: "switch",
|
|
@@ -1023,9 +1702,11 @@ function Toggle(_a) {
|
|
|
1023
1702
|
}, props)
|
|
1024
1703
|
)
|
|
1025
1704
|
] });
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1705
|
+
});
|
|
1706
|
+
Toggle.displayName = "Toggle";
|
|
1707
|
+
var Range = forwardRef8(function Range2(_a, ref) {
|
|
1028
1708
|
var _b = _a, {
|
|
1709
|
+
id: idProp,
|
|
1029
1710
|
label,
|
|
1030
1711
|
minLabel,
|
|
1031
1712
|
maxLabel,
|
|
@@ -1033,6 +1714,7 @@ function Range(_a) {
|
|
|
1033
1714
|
wrapperClassName,
|
|
1034
1715
|
className
|
|
1035
1716
|
} = _b, props = __objRest(_b, [
|
|
1717
|
+
"id",
|
|
1036
1718
|
"label",
|
|
1037
1719
|
"minLabel",
|
|
1038
1720
|
"maxLabel",
|
|
@@ -1040,35 +1722,55 @@ function Range(_a) {
|
|
|
1040
1722
|
"wrapperClassName",
|
|
1041
1723
|
"className"
|
|
1042
1724
|
]);
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
/* @__PURE__ */
|
|
1725
|
+
const autoId = useId3();
|
|
1726
|
+
const id = idProp != null ? idProp : autoId;
|
|
1727
|
+
return /* @__PURE__ */ jsxs13("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
1728
|
+
label && /* @__PURE__ */ jsx16("label", { htmlFor: id, className: "ph-label", children: label }),
|
|
1729
|
+
/* @__PURE__ */ jsx16("input", __spreadValues({ ref, id, type: "range", className: cn("ph-range", className) }, props)),
|
|
1730
|
+
(minLabel || valueLabel || maxLabel) && /* @__PURE__ */ jsxs13("div", { className: "flex justify-between text-xs text-ph-mutedtext", children: [
|
|
1731
|
+
/* @__PURE__ */ jsx16("span", { children: minLabel }),
|
|
1732
|
+
/* @__PURE__ */ jsx16("span", { children: valueLabel }),
|
|
1733
|
+
/* @__PURE__ */ jsx16("span", { children: maxLabel })
|
|
1050
1734
|
] })
|
|
1051
1735
|
] });
|
|
1052
|
-
}
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1736
|
+
});
|
|
1737
|
+
Range.displayName = "Range";
|
|
1738
|
+
var FileUpload = forwardRef8(function FileUpload2(_a, ref) {
|
|
1739
|
+
var _b = _a, {
|
|
1740
|
+
id: idProp,
|
|
1741
|
+
label,
|
|
1742
|
+
prompt = "Drop file or browse",
|
|
1743
|
+
wrapperClassName,
|
|
1744
|
+
className
|
|
1745
|
+
} = _b, props = __objRest(_b, [
|
|
1746
|
+
"id",
|
|
1747
|
+
"label",
|
|
1748
|
+
"prompt",
|
|
1749
|
+
"wrapperClassName",
|
|
1750
|
+
"className"
|
|
1751
|
+
]);
|
|
1752
|
+
const autoId = useId3();
|
|
1753
|
+
const id = idProp != null ? idProp : autoId;
|
|
1754
|
+
return /* @__PURE__ */ jsxs13("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
1755
|
+
label && /* @__PURE__ */ jsx16("label", { htmlFor: id, className: "ph-label", children: label }),
|
|
1756
|
+
/* @__PURE__ */ jsxs13("label", { htmlFor: id, className: "ph-file-upload", children: [
|
|
1757
|
+
/* @__PURE__ */ jsx16("input", __spreadValues({ ref, id, type: "file", className: cn("sr-only", className) }, props)),
|
|
1059
1758
|
prompt
|
|
1060
1759
|
] })
|
|
1061
1760
|
] });
|
|
1062
|
-
}
|
|
1761
|
+
});
|
|
1762
|
+
FileUpload.displayName = "FileUpload";
|
|
1063
1763
|
|
|
1064
1764
|
// src/components/ui/Modal.tsx
|
|
1065
|
-
import
|
|
1765
|
+
import * as Dialog from "@radix-ui/react-dialog";
|
|
1766
|
+
import { useRef } from "react";
|
|
1767
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1066
1768
|
var sizeMap4 = {
|
|
1067
1769
|
sm: "max-w-sm",
|
|
1068
1770
|
md: "max-w-lg",
|
|
1069
1771
|
lg: "max-w-2xl",
|
|
1070
1772
|
xl: "max-w-4xl",
|
|
1071
|
-
full: "max-w-
|
|
1773
|
+
full: "max-w-none"
|
|
1072
1774
|
};
|
|
1073
1775
|
function Modal({
|
|
1074
1776
|
open = false,
|
|
@@ -1079,50 +1781,67 @@ function Modal({
|
|
|
1079
1781
|
footer,
|
|
1080
1782
|
size = "md",
|
|
1081
1783
|
className,
|
|
1082
|
-
showCloseButton = true
|
|
1784
|
+
showCloseButton = true,
|
|
1785
|
+
closeOnOutsideClick = true,
|
|
1786
|
+
closeOnEscape = true,
|
|
1787
|
+
"aria-label": ariaLabel
|
|
1083
1788
|
}) {
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1789
|
+
const canDismiss = Boolean(onClose);
|
|
1790
|
+
const restoreFocusRef = useRef(null);
|
|
1791
|
+
return /* @__PURE__ */ jsx17(
|
|
1792
|
+
Dialog.Root,
|
|
1087
1793
|
{
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
className
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1794
|
+
open,
|
|
1795
|
+
onOpenChange: (nextOpen) => {
|
|
1796
|
+
if (!nextOpen) onClose == null ? void 0 : onClose();
|
|
1797
|
+
},
|
|
1798
|
+
children: /* @__PURE__ */ jsxs14(Dialog.Portal, { children: [
|
|
1799
|
+
/* @__PURE__ */ jsx17(Dialog.Overlay, { className: "ph-modal-overlay" }),
|
|
1800
|
+
/* @__PURE__ */ jsxs14(
|
|
1801
|
+
Dialog.Content,
|
|
1802
|
+
__spreadProps(__spreadValues({
|
|
1803
|
+
className: cn("ph-modal-panel", sizeMap4[size], className),
|
|
1804
|
+
"aria-label": ariaLabel
|
|
1805
|
+
}, description ? {} : { "aria-describedby": void 0 }), {
|
|
1806
|
+
onOpenAutoFocus: () => {
|
|
1807
|
+
restoreFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
1808
|
+
},
|
|
1809
|
+
onCloseAutoFocus: (event) => {
|
|
1810
|
+
var _a;
|
|
1811
|
+
event.preventDefault();
|
|
1812
|
+
(_a = restoreFocusRef.current) == null ? void 0 : _a.focus();
|
|
1813
|
+
},
|
|
1814
|
+
onEscapeKeyDown: (event) => {
|
|
1815
|
+
if (!canDismiss || !closeOnEscape) event.preventDefault();
|
|
1816
|
+
},
|
|
1817
|
+
onPointerDownOutside: (event) => {
|
|
1818
|
+
if (!canDismiss || !closeOnOutsideClick) event.preventDefault();
|
|
1819
|
+
},
|
|
1820
|
+
children: [
|
|
1821
|
+
title ? null : /* @__PURE__ */ jsx17(Dialog.Title, { className: "sr-only", children: ariaLabel != null ? ariaLabel : "Dialog" }),
|
|
1822
|
+
title || description || showCloseButton && canDismiss ? /* @__PURE__ */ jsxs14("header", { className: "ph-modal-header", children: [
|
|
1823
|
+
/* @__PURE__ */ jsxs14("div", { className: "min-w-0", children: [
|
|
1824
|
+
title ? /* @__PURE__ */ jsx17(Dialog.Title, { className: "text-lg font-bold text-ph-ink", children: title }) : null,
|
|
1825
|
+
description ? /* @__PURE__ */ jsx17(Dialog.Description, { className: "mt-1 text-sm text-ph-subtle", children: description }) : null
|
|
1826
|
+
] }),
|
|
1827
|
+
showCloseButton && canDismiss ? /* @__PURE__ */ jsx17(Dialog.Close, { asChild: true, children: /* @__PURE__ */ jsx17("button", { type: "button", className: "ph-modal-close", "aria-label": "Close dialog", children: /* @__PURE__ */ jsx17(IconClose, { className: "h-5 w-5", "aria-hidden": true }) }) }) : null
|
|
1828
|
+
] }) : null,
|
|
1829
|
+
/* @__PURE__ */ jsx17("div", { className: "ph-modal-body", children }),
|
|
1830
|
+
footer ? /* @__PURE__ */ jsx17("div", { className: "ph-modal-footer", children: footer }) : null
|
|
1831
|
+
]
|
|
1832
|
+
})
|
|
1833
|
+
)
|
|
1834
|
+
] })
|
|
1116
1835
|
}
|
|
1117
|
-
)
|
|
1836
|
+
);
|
|
1118
1837
|
}
|
|
1119
1838
|
|
|
1120
1839
|
// src/components/ui/Navigation.tsx
|
|
1121
|
-
import { jsx as
|
|
1840
|
+
import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
1122
1841
|
function Breadcrumbs({ items, label = "Breadcrumb", className }) {
|
|
1123
|
-
return /* @__PURE__ */
|
|
1124
|
-
index > 0 ? /* @__PURE__ */
|
|
1125
|
-
item.current || !item.href ? /* @__PURE__ */
|
|
1842
|
+
return /* @__PURE__ */ jsx18("nav", { "aria-label": label, className: cn("ph-breadcrumbs", className), children: items.map((item, index) => /* @__PURE__ */ jsxs15("span", { className: "contents", children: [
|
|
1843
|
+
index > 0 ? /* @__PURE__ */ jsx18("span", { className: "ph-breadcrumb-sep", "aria-hidden": "true", children: "/" }) : null,
|
|
1844
|
+
item.current || !item.href ? /* @__PURE__ */ jsx18("span", { className: "ph-breadcrumb-current", "aria-current": item.current ? "page" : void 0, children: item.label }) : /* @__PURE__ */ jsx18("a", { href: item.href, className: "ph-breadcrumb-link", children: item.label })
|
|
1126
1845
|
] }, `${item.label}-${index}`)) });
|
|
1127
1846
|
}
|
|
1128
1847
|
function Pagination({
|
|
@@ -1135,8 +1854,8 @@ function Pagination({
|
|
|
1135
1854
|
}) {
|
|
1136
1855
|
const pages = compact ? [Math.max(1, page - 1), page, Math.min(totalPages, page + 1)] : [1, 2, 3, totalPages];
|
|
1137
1856
|
const uniquePages = Array.from(new Set(pages)).filter((n) => n >= 1 && n <= totalPages);
|
|
1138
|
-
return /* @__PURE__ */
|
|
1139
|
-
/* @__PURE__ */
|
|
1857
|
+
return /* @__PURE__ */ jsxs15("nav", { "aria-label": label, className: cn("ph-pagination", className), children: [
|
|
1858
|
+
/* @__PURE__ */ jsx18(
|
|
1140
1859
|
"button",
|
|
1141
1860
|
{
|
|
1142
1861
|
type: "button",
|
|
@@ -1144,12 +1863,12 @@ function Pagination({
|
|
|
1144
1863
|
disabled: page <= 1,
|
|
1145
1864
|
"aria-label": "Previous page",
|
|
1146
1865
|
onClick: () => onPageChange == null ? void 0 : onPageChange(page - 1),
|
|
1147
|
-
children: /* @__PURE__ */
|
|
1866
|
+
children: /* @__PURE__ */ jsx18(IconChevronLeft, { className: "mx-auto h-4 w-4", "aria-hidden": true })
|
|
1148
1867
|
}
|
|
1149
1868
|
),
|
|
1150
|
-
uniquePages.map((pageNumber, index) => /* @__PURE__ */
|
|
1151
|
-
!compact && index === uniquePages.length - 1 && pageNumber > 4 ? /* @__PURE__ */
|
|
1152
|
-
/* @__PURE__ */
|
|
1869
|
+
uniquePages.map((pageNumber, index) => /* @__PURE__ */ jsxs15("span", { className: "contents", children: [
|
|
1870
|
+
!compact && index === uniquePages.length - 1 && pageNumber > 4 ? /* @__PURE__ */ jsx18("span", { className: "ph-pagination-ellipsis", "aria-hidden": "true", children: "..." }) : null,
|
|
1871
|
+
/* @__PURE__ */ jsx18(
|
|
1153
1872
|
"button",
|
|
1154
1873
|
{
|
|
1155
1874
|
type: "button",
|
|
@@ -1160,7 +1879,7 @@ function Pagination({
|
|
|
1160
1879
|
}
|
|
1161
1880
|
)
|
|
1162
1881
|
] }, pageNumber)),
|
|
1163
|
-
/* @__PURE__ */
|
|
1882
|
+
/* @__PURE__ */ jsx18(
|
|
1164
1883
|
"button",
|
|
1165
1884
|
{
|
|
1166
1885
|
type: "button",
|
|
@@ -1168,25 +1887,25 @@ function Pagination({
|
|
|
1168
1887
|
disabled: page >= totalPages,
|
|
1169
1888
|
"aria-label": "Next page",
|
|
1170
1889
|
onClick: () => onPageChange == null ? void 0 : onPageChange(page + 1),
|
|
1171
|
-
children: /* @__PURE__ */
|
|
1890
|
+
children: /* @__PURE__ */ jsx18(IconChevronRight, { className: "mx-auto h-4 w-4", "aria-hidden": true })
|
|
1172
1891
|
}
|
|
1173
1892
|
)
|
|
1174
1893
|
] });
|
|
1175
1894
|
}
|
|
1176
1895
|
|
|
1177
1896
|
// src/components/ui/Panel.tsx
|
|
1178
|
-
import { jsx as
|
|
1897
|
+
import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1179
1898
|
function Panel(_a) {
|
|
1180
1899
|
var _b = _a, { title, description, children, className } = _b, props = __objRest(_b, ["title", "description", "children", "className"]);
|
|
1181
|
-
return /* @__PURE__ */
|
|
1182
|
-
title && /* @__PURE__ */
|
|
1183
|
-
description && /* @__PURE__ */
|
|
1900
|
+
return /* @__PURE__ */ jsxs16("div", __spreadProps(__spreadValues({ className: cn("ph-panel", className) }, props), { children: [
|
|
1901
|
+
title && /* @__PURE__ */ jsx19("h3", { className: "text-sm font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
|
|
1902
|
+
description && /* @__PURE__ */ jsx19("p", { className: "text-sm text-ph-subtle", children: description }),
|
|
1184
1903
|
children
|
|
1185
1904
|
] }));
|
|
1186
1905
|
}
|
|
1187
1906
|
|
|
1188
1907
|
// src/components/ui/Rating.tsx
|
|
1189
|
-
import { jsx as
|
|
1908
|
+
import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
1190
1909
|
function Rating(_a) {
|
|
1191
1910
|
var _b = _a, {
|
|
1192
1911
|
label,
|
|
@@ -1206,9 +1925,9 @@ function Rating(_a) {
|
|
|
1206
1925
|
"wrapperClassName"
|
|
1207
1926
|
]);
|
|
1208
1927
|
const stars = Array.from({ length: max }, (_, index) => index + 1);
|
|
1209
|
-
return /* @__PURE__ */
|
|
1210
|
-
label && /* @__PURE__ */
|
|
1211
|
-
/* @__PURE__ */
|
|
1928
|
+
return /* @__PURE__ */ jsxs17("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
1929
|
+
label && /* @__PURE__ */ jsx20("span", { className: "ph-label", children: label }),
|
|
1930
|
+
/* @__PURE__ */ jsx20(
|
|
1212
1931
|
"div",
|
|
1213
1932
|
__spreadProps(__spreadValues({
|
|
1214
1933
|
className: cn("ph-rating flex", className),
|
|
@@ -1218,7 +1937,7 @@ function Rating(_a) {
|
|
|
1218
1937
|
children: stars.map((star) => {
|
|
1219
1938
|
const active = star <= value;
|
|
1220
1939
|
if (readOnly) {
|
|
1221
|
-
return /* @__PURE__ */
|
|
1940
|
+
return /* @__PURE__ */ jsx20(
|
|
1222
1941
|
IconStar,
|
|
1223
1942
|
{
|
|
1224
1943
|
className: cn("h-6 w-6", active ? "text-amber-500" : "text-ph-border"),
|
|
@@ -1227,7 +1946,7 @@ function Rating(_a) {
|
|
|
1227
1946
|
star
|
|
1228
1947
|
);
|
|
1229
1948
|
}
|
|
1230
|
-
return /* @__PURE__ */
|
|
1949
|
+
return /* @__PURE__ */ jsx20(
|
|
1231
1950
|
"button",
|
|
1232
1951
|
{
|
|
1233
1952
|
type: "button",
|
|
@@ -1236,7 +1955,7 @@ function Rating(_a) {
|
|
|
1236
1955
|
"aria-checked": active,
|
|
1237
1956
|
"aria-label": `${star} out of ${max}`,
|
|
1238
1957
|
onClick: () => onChange == null ? void 0 : onChange(star),
|
|
1239
|
-
children: /* @__PURE__ */
|
|
1958
|
+
children: /* @__PURE__ */ jsx20(IconStar, { className: cn("h-6 w-6", active ? "text-amber-500" : "text-ph-border") })
|
|
1240
1959
|
},
|
|
1241
1960
|
star
|
|
1242
1961
|
);
|
|
@@ -1247,8 +1966,8 @@ function Rating(_a) {
|
|
|
1247
1966
|
}
|
|
1248
1967
|
|
|
1249
1968
|
// src/components/ui/SearchInput.tsx
|
|
1250
|
-
import { useId as
|
|
1251
|
-
import { jsx as
|
|
1969
|
+
import { useId as useId4 } from "react";
|
|
1970
|
+
import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1252
1971
|
function SearchInput(_a) {
|
|
1253
1972
|
var _b = _a, {
|
|
1254
1973
|
id: idProp,
|
|
@@ -1269,12 +1988,12 @@ function SearchInput(_a) {
|
|
|
1269
1988
|
"wrapperClassName",
|
|
1270
1989
|
"placeholder"
|
|
1271
1990
|
]);
|
|
1272
|
-
const autoId =
|
|
1991
|
+
const autoId = useId4();
|
|
1273
1992
|
const id = idProp != null ? idProp : autoId;
|
|
1274
|
-
return /* @__PURE__ */
|
|
1275
|
-
/* @__PURE__ */
|
|
1276
|
-
/* @__PURE__ */
|
|
1277
|
-
shortcut != null ? /* @__PURE__ */
|
|
1993
|
+
return /* @__PURE__ */ jsxs18("div", { className: cn("relative", wrapperClassName), children: [
|
|
1994
|
+
/* @__PURE__ */ jsx21("label", { htmlFor: id, className: hideLabel ? "sr-only" : "ph-label mb-1.5 block", children: label }),
|
|
1995
|
+
/* @__PURE__ */ jsxs18("div", { className: "relative", children: [
|
|
1996
|
+
shortcut != null ? /* @__PURE__ */ jsx21(
|
|
1278
1997
|
"span",
|
|
1279
1998
|
{
|
|
1280
1999
|
className: "ph-shortcut pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2 text-xs",
|
|
@@ -1282,7 +2001,7 @@ function SearchInput(_a) {
|
|
|
1282
2001
|
children: shortcut
|
|
1283
2002
|
}
|
|
1284
2003
|
) : null,
|
|
1285
|
-
/* @__PURE__ */
|
|
2004
|
+
/* @__PURE__ */ jsx21(
|
|
1286
2005
|
"input",
|
|
1287
2006
|
__spreadValues({
|
|
1288
2007
|
id,
|
|
@@ -1316,12 +2035,12 @@ function SearchGroup(_a) {
|
|
|
1316
2035
|
"wrapperClassName",
|
|
1317
2036
|
"className"
|
|
1318
2037
|
]);
|
|
1319
|
-
const autoId =
|
|
2038
|
+
const autoId = useId4();
|
|
1320
2039
|
const id = idProp != null ? idProp : autoId;
|
|
1321
|
-
return /* @__PURE__ */
|
|
1322
|
-
/* @__PURE__ */
|
|
1323
|
-
/* @__PURE__ */
|
|
1324
|
-
/* @__PURE__ */
|
|
2040
|
+
return /* @__PURE__ */ jsxs18("div", { className: cn("ph-field", wrapperClassName), children: [
|
|
2041
|
+
/* @__PURE__ */ jsx21("label", { htmlFor: id, className: "ph-label", children: label }),
|
|
2042
|
+
/* @__PURE__ */ jsxs18("div", { className: "ph-search-group flex w-full max-w-lg min-h-[2.3125rem] items-stretch divide-x divide-ph-border", children: [
|
|
2043
|
+
/* @__PURE__ */ jsx21(
|
|
1325
2044
|
"input",
|
|
1326
2045
|
__spreadValues({
|
|
1327
2046
|
id,
|
|
@@ -1330,12 +2049,12 @@ function SearchGroup(_a) {
|
|
|
1330
2049
|
className: cn("ph-input ph-input-group-field min-w-0 flex-1", className)
|
|
1331
2050
|
}, props)
|
|
1332
2051
|
),
|
|
1333
|
-
/* @__PURE__ */
|
|
2052
|
+
/* @__PURE__ */ jsx21(
|
|
1334
2053
|
Button,
|
|
1335
2054
|
{
|
|
1336
2055
|
type: "submit",
|
|
1337
2056
|
variant: "primary",
|
|
1338
|
-
icon: /* @__PURE__ */
|
|
2057
|
+
icon: /* @__PURE__ */ jsx21(IconSearch, { className: "h-4 w-4", "aria-hidden": true }),
|
|
1339
2058
|
className: "ph-search-group__submit",
|
|
1340
2059
|
"aria-label": submitLabel
|
|
1341
2060
|
}
|
|
@@ -1345,7 +2064,7 @@ function SearchGroup(_a) {
|
|
|
1345
2064
|
}
|
|
1346
2065
|
|
|
1347
2066
|
// src/components/ui/Table.tsx
|
|
1348
|
-
import { jsx as
|
|
2067
|
+
import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1349
2068
|
function Table({
|
|
1350
2069
|
data,
|
|
1351
2070
|
columns,
|
|
@@ -1356,15 +2075,15 @@ function Table({
|
|
|
1356
2075
|
className,
|
|
1357
2076
|
caption
|
|
1358
2077
|
}) {
|
|
1359
|
-
return /* @__PURE__ */
|
|
1360
|
-
caption && /* @__PURE__ */
|
|
1361
|
-
/* @__PURE__ */
|
|
1362
|
-
/* @__PURE__ */
|
|
2078
|
+
return /* @__PURE__ */ jsx22("div", { className: cn("ph-table-wrap", compact && "ph-table-compact", className), children: /* @__PURE__ */ jsxs19("table", { className: cn("ph-table", zebra && "ph-table-zebra", ribbon && "ph-table--ribbon"), children: [
|
|
2079
|
+
caption && /* @__PURE__ */ jsx22("caption", { className: "sr-only", children: caption }),
|
|
2080
|
+
/* @__PURE__ */ jsx22("thead", { children: /* @__PURE__ */ jsx22("tr", { children: columns.map((col) => /* @__PURE__ */ jsx22("th", { className: col.className, children: col.header }, col.key)) }) }),
|
|
2081
|
+
/* @__PURE__ */ jsx22("tbody", { children: data.map((row, i) => /* @__PURE__ */ jsx22("tr", { style: getRowStyle == null ? void 0 : getRowStyle(row), children: columns.map((col) => /* @__PURE__ */ jsx22("td", { className: col.className, children: col.cell(row) }, col.key)) }, i)) })
|
|
1363
2082
|
] }) });
|
|
1364
2083
|
}
|
|
1365
2084
|
|
|
1366
2085
|
// src/components/ui/Stat.tsx
|
|
1367
|
-
import { jsx as
|
|
2086
|
+
import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1368
2087
|
var toneMap = {
|
|
1369
2088
|
default: "text-ph-ink",
|
|
1370
2089
|
brand: "text-ph-brand",
|
|
@@ -1381,16 +2100,16 @@ var statMap = {
|
|
|
1381
2100
|
};
|
|
1382
2101
|
function Stat(_a) {
|
|
1383
2102
|
var _b = _a, { icon, label, value, footer, tone = "default", className } = _b, props = __objRest(_b, ["icon", "label", "value", "footer", "tone", "className"]);
|
|
1384
|
-
return /* @__PURE__ */
|
|
1385
|
-
icon && /* @__PURE__ */
|
|
1386
|
-
/* @__PURE__ */
|
|
1387
|
-
/* @__PURE__ */
|
|
1388
|
-
footer && /* @__PURE__ */
|
|
2103
|
+
return /* @__PURE__ */ jsxs20("article", __spreadProps(__spreadValues({ className: cn("ph-stat", statMap[tone], className) }, props), { children: [
|
|
2104
|
+
icon && /* @__PURE__ */ jsx23("div", { className: cn("mb-2 h-7 w-7", toneMap[tone]), children: icon }),
|
|
2105
|
+
/* @__PURE__ */ jsx23("div", { className: cn("ph-stat-label", tone === "warning" && toneMap[tone]), children: label }),
|
|
2106
|
+
/* @__PURE__ */ jsx23("div", { className: cn("ph-stat-val", toneMap[tone]), children: value }),
|
|
2107
|
+
footer && /* @__PURE__ */ jsx23("p", { className: "text-xs text-ph-subtle", children: footer })
|
|
1389
2108
|
] }));
|
|
1390
2109
|
}
|
|
1391
2110
|
|
|
1392
2111
|
// src/components/ui/Toast.tsx
|
|
1393
|
-
import { jsx as
|
|
2112
|
+
import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1394
2113
|
var statusConfig2 = {
|
|
1395
2114
|
info: { icon: IconErrorOutline, color: "text-ph-info", bg: "ph-toast-info" },
|
|
1396
2115
|
success: { icon: IconCheckCircle, color: "text-ph-success", bg: "ph-toast-success" },
|
|
@@ -1406,33 +2125,33 @@ function Toast({
|
|
|
1406
2125
|
}) {
|
|
1407
2126
|
const config = statusConfig2[status];
|
|
1408
2127
|
const Icon = config.icon;
|
|
1409
|
-
return /* @__PURE__ */
|
|
1410
|
-
/* @__PURE__ */
|
|
1411
|
-
/* @__PURE__ */
|
|
1412
|
-
/* @__PURE__ */
|
|
1413
|
-
description && /* @__PURE__ */
|
|
2128
|
+
return /* @__PURE__ */ jsxs21("div", { className: cn("ph-toast", config.bg, className), children: [
|
|
2129
|
+
/* @__PURE__ */ jsx24(Icon, { className: cn("mt-0.5 h-5 w-5 shrink-0", config.color), "aria-hidden": true }),
|
|
2130
|
+
/* @__PURE__ */ jsxs21("div", { className: "pr-8", children: [
|
|
2131
|
+
/* @__PURE__ */ jsx24("div", { className: "font-semibold", children: title }),
|
|
2132
|
+
description && /* @__PURE__ */ jsx24("p", { className: "mt-1 text-xs text-ph-subtle", children: description })
|
|
1414
2133
|
] }),
|
|
1415
|
-
onDismiss && /* @__PURE__ */
|
|
2134
|
+
onDismiss && /* @__PURE__ */ jsx24(
|
|
1416
2135
|
"button",
|
|
1417
2136
|
{
|
|
1418
2137
|
type: "button",
|
|
1419
2138
|
"aria-label": `Dismiss ${title}`,
|
|
1420
2139
|
className: "absolute right-2 top-2 ph-btn ph-btn-ghost ph-btn-xs ph-btn-circle",
|
|
1421
2140
|
onClick: onDismiss,
|
|
1422
|
-
children: /* @__PURE__ */
|
|
2141
|
+
children: /* @__PURE__ */ jsx24(IconClose, { className: "h-4 w-4" })
|
|
1423
2142
|
}
|
|
1424
2143
|
)
|
|
1425
2144
|
] });
|
|
1426
2145
|
}
|
|
1427
2146
|
function ToastStack({ children, className }) {
|
|
1428
|
-
return /* @__PURE__ */
|
|
2147
|
+
return /* @__PURE__ */ jsx24("div", { className: cn("ph-toast-stack", className), children });
|
|
1429
2148
|
}
|
|
1430
2149
|
|
|
1431
2150
|
// src/components/ui/Tabs.tsx
|
|
1432
|
-
import { jsx as
|
|
2151
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
1433
2152
|
function Tabs({ items, value, onChange, variant = "pill", className }) {
|
|
1434
2153
|
if (variant === "underline") {
|
|
1435
|
-
return /* @__PURE__ */
|
|
2154
|
+
return /* @__PURE__ */ jsx25("div", { className: cn("flex gap-6 border-b border-ph-border", className), children: items.map((item) => /* @__PURE__ */ jsx25(
|
|
1436
2155
|
"button",
|
|
1437
2156
|
{
|
|
1438
2157
|
type: "button",
|
|
@@ -1446,7 +2165,7 @@ function Tabs({ items, value, onChange, variant = "pill", className }) {
|
|
|
1446
2165
|
item.value
|
|
1447
2166
|
)) });
|
|
1448
2167
|
}
|
|
1449
|
-
return /* @__PURE__ */
|
|
2168
|
+
return /* @__PURE__ */ jsx25("div", { className: cn("ph-tabs-row inline-flex", className), children: items.map((item) => /* @__PURE__ */ jsx25(
|
|
1450
2169
|
"button",
|
|
1451
2170
|
{
|
|
1452
2171
|
type: "button",
|
|
@@ -1645,6 +2364,34 @@ var THEMES = [
|
|
|
1645
2364
|
description: "Notion dark mode \u2014 dark charcoal canvas with blue accent and clean typography.",
|
|
1646
2365
|
colorScheme: "dark",
|
|
1647
2366
|
group: "Productivity"
|
|
2367
|
+
},
|
|
2368
|
+
{
|
|
2369
|
+
id: "deepsea-light",
|
|
2370
|
+
name: "Tokyo Night Day",
|
|
2371
|
+
description: "Tokyo Night Day \u2014 soft bluish greys with vivid blue and purple accents.",
|
|
2372
|
+
colorScheme: "light",
|
|
2373
|
+
group: "Tokyo Night"
|
|
2374
|
+
},
|
|
2375
|
+
{
|
|
2376
|
+
id: "deepsea-dark",
|
|
2377
|
+
name: "Tokyo Night",
|
|
2378
|
+
description: "Tokyo Night \u2014 #1a1b26 base with signature blue, cyan, and purple.",
|
|
2379
|
+
colorScheme: "dark",
|
|
2380
|
+
group: "Tokyo Night"
|
|
2381
|
+
},
|
|
2382
|
+
{
|
|
2383
|
+
id: "kraken-light",
|
|
2384
|
+
name: "Kraken Light",
|
|
2385
|
+
description: "Medium-inspired warm paper, editorial black actions, and classic publication yellow.",
|
|
2386
|
+
colorScheme: "light",
|
|
2387
|
+
group: "Kraken"
|
|
2388
|
+
},
|
|
2389
|
+
{
|
|
2390
|
+
id: "kraken-dark",
|
|
2391
|
+
name: "Kraken Dark",
|
|
2392
|
+
description: "Medium-inspired night reading canvas with white actions and classic publication yellow.",
|
|
2393
|
+
colorScheme: "dark",
|
|
2394
|
+
group: "Kraken"
|
|
1648
2395
|
}
|
|
1649
2396
|
];
|
|
1650
2397
|
var THEME_GROUPS = Array.from(new Set(THEMES.map((theme) => theme.group)));
|
|
@@ -1690,17 +2437,17 @@ function ThemeDomSync() {
|
|
|
1690
2437
|
|
|
1691
2438
|
// src/components/ui/ThemeManager.tsx
|
|
1692
2439
|
import { useLayoutEffect as useLayoutEffect2 } from "react";
|
|
1693
|
-
import { Fragment as
|
|
2440
|
+
import { Fragment as Fragment4, jsx as jsx26 } from "react/jsx-runtime";
|
|
1694
2441
|
function ThemeManager({ children }) {
|
|
1695
2442
|
useLayoutEffect2(() => {
|
|
1696
2443
|
persistTheme(readStoredTheme());
|
|
1697
2444
|
}, []);
|
|
1698
|
-
return /* @__PURE__ */
|
|
2445
|
+
return /* @__PURE__ */ jsx26(Fragment4, { children });
|
|
1699
2446
|
}
|
|
1700
2447
|
|
|
1701
2448
|
// src/components/ui/ThemeSwitcher.tsx
|
|
1702
2449
|
import { useEffect, useState } from "react";
|
|
1703
|
-
import { jsx as
|
|
2450
|
+
import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1704
2451
|
function ThemeSwitcher({ className }) {
|
|
1705
2452
|
const [themeId, setThemeId] = useState("hedgehog-light");
|
|
1706
2453
|
useEffect(() => {
|
|
@@ -1708,9 +2455,9 @@ function ThemeSwitcher({ className }) {
|
|
|
1708
2455
|
persistTheme(id);
|
|
1709
2456
|
setThemeId(id);
|
|
1710
2457
|
}, []);
|
|
1711
|
-
return /* @__PURE__ */
|
|
1712
|
-
/* @__PURE__ */
|
|
1713
|
-
/* @__PURE__ */
|
|
2458
|
+
return /* @__PURE__ */ jsxs22("label", { className: cn("flex min-w-0 items-center gap-2", className), children: [
|
|
2459
|
+
/* @__PURE__ */ jsx27("span", { className: "shrink-0 text-xs font-medium text-ph-mutedtext sm:text-sm", children: "Theme" }),
|
|
2460
|
+
/* @__PURE__ */ jsx27(
|
|
1714
2461
|
"select",
|
|
1715
2462
|
{
|
|
1716
2463
|
className: "ph-select max-w-[11rem] !min-h-[2rem] py-1 pl-2.5 pr-8 text-xs sm:max-w-[14rem] sm:text-sm",
|
|
@@ -1721,7 +2468,7 @@ function ThemeSwitcher({ className }) {
|
|
|
1721
2468
|
persistTheme(next);
|
|
1722
2469
|
setThemeId(next);
|
|
1723
2470
|
},
|
|
1724
|
-
children: THEME_GROUPS.map((group) => /* @__PURE__ */
|
|
2471
|
+
children: THEME_GROUPS.map((group) => /* @__PURE__ */ jsx27("optgroup", { label: group, children: THEMES.filter((theme) => theme.group === group).map((theme) => /* @__PURE__ */ jsx27("option", { value: theme.id, children: theme.name }, theme.id)) }, group))
|
|
1725
2472
|
}
|
|
1726
2473
|
)
|
|
1727
2474
|
] });
|
|
@@ -1729,7 +2476,7 @@ function ThemeSwitcher({ className }) {
|
|
|
1729
2476
|
|
|
1730
2477
|
// src/components/ui/Accordion.tsx
|
|
1731
2478
|
import { useState as useState2 } from "react";
|
|
1732
|
-
import { jsx as
|
|
2479
|
+
import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1733
2480
|
function Accordion({
|
|
1734
2481
|
items,
|
|
1735
2482
|
allowMultiple = false,
|
|
@@ -1751,18 +2498,18 @@ function Accordion({
|
|
|
1751
2498
|
return next;
|
|
1752
2499
|
});
|
|
1753
2500
|
};
|
|
1754
|
-
return /* @__PURE__ */
|
|
2501
|
+
return /* @__PURE__ */ jsx28("div", { className: cn("divide-y divide-ph-border rounded-xl border border-ph-border bg-ph-surface", className), children: items.map((item) => {
|
|
1755
2502
|
const isOpen = openItems.has(item.id);
|
|
1756
|
-
return /* @__PURE__ */
|
|
1757
|
-
/* @__PURE__ */
|
|
2503
|
+
return /* @__PURE__ */ jsxs23("div", { className: "first:rounded-t-xl last:rounded-b-xl", children: [
|
|
2504
|
+
/* @__PURE__ */ jsxs23(
|
|
1758
2505
|
"button",
|
|
1759
2506
|
{
|
|
1760
2507
|
type: "button",
|
|
1761
2508
|
onClick: () => toggleItem(item.id),
|
|
1762
2509
|
className: "flex w-full items-center justify-between px-5 py-4 text-left transition hover:bg-ph-muted",
|
|
1763
2510
|
children: [
|
|
1764
|
-
/* @__PURE__ */
|
|
1765
|
-
/* @__PURE__ */
|
|
2511
|
+
/* @__PURE__ */ jsx28("span", { className: "font-semibold text-ph-ink", children: item.title }),
|
|
2512
|
+
/* @__PURE__ */ jsx28(
|
|
1766
2513
|
IconChevronDown,
|
|
1767
2514
|
{
|
|
1768
2515
|
className: cn(
|
|
@@ -1774,14 +2521,14 @@ function Accordion({
|
|
|
1774
2521
|
]
|
|
1775
2522
|
}
|
|
1776
2523
|
),
|
|
1777
|
-
/* @__PURE__ */
|
|
2524
|
+
/* @__PURE__ */ jsx28(
|
|
1778
2525
|
"div",
|
|
1779
2526
|
{
|
|
1780
2527
|
className: cn(
|
|
1781
2528
|
"grid transition-all duration-200",
|
|
1782
2529
|
isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
|
|
1783
2530
|
),
|
|
1784
|
-
children: /* @__PURE__ */
|
|
2531
|
+
children: /* @__PURE__ */ jsx28("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsx28("div", { className: "px-5 pb-4 text-ph-subtle", children: item.content }) })
|
|
1785
2532
|
}
|
|
1786
2533
|
)
|
|
1787
2534
|
] }, item.id);
|
|
@@ -1789,30 +2536,30 @@ function Accordion({
|
|
|
1789
2536
|
}
|
|
1790
2537
|
|
|
1791
2538
|
// src/components/ui/Stepper.tsx
|
|
1792
|
-
import { jsx as
|
|
2539
|
+
import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1793
2540
|
function Stepper({ steps, currentStep, className }) {
|
|
1794
|
-
return /* @__PURE__ */
|
|
2541
|
+
return /* @__PURE__ */ jsx29("div", { className: cn("flex items-start gap-2", className), children: steps.map((step, index) => {
|
|
1795
2542
|
const isCompleted = index < currentStep;
|
|
1796
2543
|
const isCurrent = index === currentStep;
|
|
1797
2544
|
const isPending = index > currentStep;
|
|
1798
2545
|
const isError = step.status === "error";
|
|
1799
|
-
return /* @__PURE__ */
|
|
1800
|
-
/* @__PURE__ */
|
|
1801
|
-
/* @__PURE__ */
|
|
2546
|
+
return /* @__PURE__ */ jsxs24("div", { className: "flex flex-1 items-start gap-2", children: [
|
|
2547
|
+
/* @__PURE__ */ jsxs24("div", { className: "flex flex-1 flex-col items-center", children: [
|
|
2548
|
+
/* @__PURE__ */ jsx29(
|
|
1802
2549
|
"div",
|
|
1803
2550
|
{
|
|
1804
2551
|
className: cn(
|
|
1805
2552
|
"flex h-9 w-9 items-center justify-center rounded-full text-sm font-bold transition-colors",
|
|
1806
|
-
isCompleted && "bg-ph-success text-
|
|
1807
|
-
isCurrent && !isError && "bg-ph-brand text-
|
|
1808
|
-
isCurrent && isError && "bg-ph-danger text-
|
|
2553
|
+
isCompleted && "bg-ph-success text-[var(--ph-on-success)]",
|
|
2554
|
+
isCurrent && !isError && "bg-ph-brand text-[var(--ph-on-accent)] ring-4 ring-ph-brand/20",
|
|
2555
|
+
isCurrent && isError && "bg-ph-danger text-[var(--ph-on-danger)]",
|
|
1809
2556
|
isPending && "bg-ph-muted text-ph-mutedtext"
|
|
1810
2557
|
),
|
|
1811
|
-
children: isCompleted ? /* @__PURE__ */
|
|
2558
|
+
children: isCompleted ? /* @__PURE__ */ jsx29(IconCheck, { className: "h-5 w-5", "aria-hidden": true }) : index + 1
|
|
1812
2559
|
}
|
|
1813
2560
|
),
|
|
1814
|
-
/* @__PURE__ */
|
|
1815
|
-
/* @__PURE__ */
|
|
2561
|
+
/* @__PURE__ */ jsxs24("div", { className: "mt-2 text-center", children: [
|
|
2562
|
+
/* @__PURE__ */ jsx29(
|
|
1816
2563
|
"p",
|
|
1817
2564
|
{
|
|
1818
2565
|
className: cn(
|
|
@@ -1823,10 +2570,10 @@ function Stepper({ steps, currentStep, className }) {
|
|
|
1823
2570
|
children: step.label
|
|
1824
2571
|
}
|
|
1825
2572
|
),
|
|
1826
|
-
step.description && /* @__PURE__ */
|
|
2573
|
+
step.description && /* @__PURE__ */ jsx29("p", { className: "mt-0.5 text-xs text-ph-mutedtext", children: step.description })
|
|
1827
2574
|
] })
|
|
1828
2575
|
] }),
|
|
1829
|
-
index < steps.length - 1 && /* @__PURE__ */
|
|
2576
|
+
index < steps.length - 1 && /* @__PURE__ */ jsx29(
|
|
1830
2577
|
"div",
|
|
1831
2578
|
{
|
|
1832
2579
|
className: cn(
|
|
@@ -1840,16 +2587,16 @@ function Stepper({ steps, currentStep, className }) {
|
|
|
1840
2587
|
}
|
|
1841
2588
|
|
|
1842
2589
|
// src/components/ui/SegmentedControl.tsx
|
|
1843
|
-
import { jsx as
|
|
2590
|
+
import { jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1844
2591
|
function SegmentedControl({ options, value, onChange, className }) {
|
|
1845
|
-
return /* @__PURE__ */
|
|
2592
|
+
return /* @__PURE__ */ jsx30(
|
|
1846
2593
|
"div",
|
|
1847
2594
|
{
|
|
1848
2595
|
className: cn(
|
|
1849
2596
|
"inline-flex rounded-lg bg-ph-muted p-1",
|
|
1850
2597
|
className
|
|
1851
2598
|
),
|
|
1852
|
-
children: options.map((option) => /* @__PURE__ */
|
|
2599
|
+
children: options.map((option) => /* @__PURE__ */ jsxs25(
|
|
1853
2600
|
"button",
|
|
1854
2601
|
{
|
|
1855
2602
|
type: "button",
|
|
@@ -1859,7 +2606,7 @@ function SegmentedControl({ options, value, onChange, className }) {
|
|
|
1859
2606
|
value === option.value ? "bg-ph-surface text-ph-ink shadow-ph" : "text-ph-subtle hover:text-ph-ink"
|
|
1860
2607
|
),
|
|
1861
2608
|
children: [
|
|
1862
|
-
option.icon && /* @__PURE__ */
|
|
2609
|
+
option.icon && /* @__PURE__ */ jsx30("span", { className: "h-4 w-4", children: option.icon }),
|
|
1863
2610
|
option.label
|
|
1864
2611
|
]
|
|
1865
2612
|
},
|
|
@@ -1870,8 +2617,8 @@ function SegmentedControl({ options, value, onChange, className }) {
|
|
|
1870
2617
|
}
|
|
1871
2618
|
|
|
1872
2619
|
// src/components/ui/CommandPalette.tsx
|
|
1873
|
-
import { useState as useState3, useEffect as useEffect2, useRef } from "react";
|
|
1874
|
-
import { jsx as
|
|
2620
|
+
import { useState as useState3, useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
2621
|
+
import { jsx as jsx31, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
1875
2622
|
function CommandPalette({
|
|
1876
2623
|
items,
|
|
1877
2624
|
isOpen,
|
|
@@ -1881,7 +2628,7 @@ function CommandPalette({
|
|
|
1881
2628
|
}) {
|
|
1882
2629
|
const [query, setQuery] = useState3("");
|
|
1883
2630
|
const [selectedIndex, setSelectedIndex] = useState3(0);
|
|
1884
|
-
const inputRef =
|
|
2631
|
+
const inputRef = useRef2(null);
|
|
1885
2632
|
const filtered = items.filter(
|
|
1886
2633
|
(item) => item.label.toLowerCase().includes(query.toLowerCase())
|
|
1887
2634
|
);
|
|
@@ -1920,7 +2667,7 @@ function CommandPalette({
|
|
|
1920
2667
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
1921
2668
|
}, [isOpen, filtered, selectedIndex, onClose]);
|
|
1922
2669
|
if (!isOpen) return null;
|
|
1923
|
-
return /* @__PURE__ */
|
|
2670
|
+
return /* @__PURE__ */ jsx31("div", { className: "fixed inset-0 z-50 flex items-start justify-center bg-black/40 pt-[20vh] backdrop-blur-sm", children: /* @__PURE__ */ jsxs26(
|
|
1924
2671
|
"div",
|
|
1925
2672
|
{
|
|
1926
2673
|
className: cn(
|
|
@@ -1928,9 +2675,9 @@ function CommandPalette({
|
|
|
1928
2675
|
className
|
|
1929
2676
|
),
|
|
1930
2677
|
children: [
|
|
1931
|
-
/* @__PURE__ */
|
|
1932
|
-
/* @__PURE__ */
|
|
1933
|
-
/* @__PURE__ */
|
|
2678
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-3 border-b border-ph-border px-4 py-3", children: [
|
|
2679
|
+
/* @__PURE__ */ jsx31(IconSearch, { className: "h-5 w-5 text-ph-mutedtext" }),
|
|
2680
|
+
/* @__PURE__ */ jsx31(
|
|
1934
2681
|
"input",
|
|
1935
2682
|
{
|
|
1936
2683
|
ref: inputRef,
|
|
@@ -1944,9 +2691,9 @@ function CommandPalette({
|
|
|
1944
2691
|
className: "flex-1 bg-transparent text-ph-ink outline-none placeholder:text-ph-mutedtext"
|
|
1945
2692
|
}
|
|
1946
2693
|
),
|
|
1947
|
-
/* @__PURE__ */
|
|
2694
|
+
/* @__PURE__ */ jsx31("kbd", { className: "rounded border border-ph-border bg-ph-muted px-1.5 py-0.5 text-xs text-ph-mutedtext", children: "ESC" })
|
|
1948
2695
|
] }),
|
|
1949
|
-
/* @__PURE__ */
|
|
2696
|
+
/* @__PURE__ */ jsx31("div", { className: "max-h-[50vh] overflow-y-auto py-2", children: filtered.length === 0 ? /* @__PURE__ */ jsx31("div", { className: "px-4 py-8 text-center text-sm text-ph-mutedtext", children: "No results found." }) : filtered.map((item, index) => /* @__PURE__ */ jsxs26(
|
|
1950
2697
|
"button",
|
|
1951
2698
|
{
|
|
1952
2699
|
type: "button",
|
|
@@ -1960,9 +2707,9 @@ function CommandPalette({
|
|
|
1960
2707
|
index === selectedIndex ? "bg-ph-muted text-ph-ink" : "text-ph-subtle"
|
|
1961
2708
|
),
|
|
1962
2709
|
children: [
|
|
1963
|
-
item.icon && /* @__PURE__ */
|
|
1964
|
-
/* @__PURE__ */
|
|
1965
|
-
item.shortcut && /* @__PURE__ */
|
|
2710
|
+
item.icon && /* @__PURE__ */ jsx31("span", { className: "h-5 w-5", children: item.icon }),
|
|
2711
|
+
/* @__PURE__ */ jsx31("span", { className: "flex-1", children: item.label }),
|
|
2712
|
+
item.shortcut && /* @__PURE__ */ jsx31("kbd", { className: "rounded border border-ph-border bg-ph-surface px-1.5 py-0.5 text-xs text-ph-mutedtext", children: item.shortcut })
|
|
1966
2713
|
]
|
|
1967
2714
|
},
|
|
1968
2715
|
item.id
|
|
@@ -1974,7 +2721,7 @@ function CommandPalette({
|
|
|
1974
2721
|
|
|
1975
2722
|
// src/components/ui/Calendar.tsx
|
|
1976
2723
|
import { useState as useState4 } from "react";
|
|
1977
|
-
import { jsx as
|
|
2724
|
+
import { jsx as jsx32, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
1978
2725
|
function Calendar({ value, onChange, className }) {
|
|
1979
2726
|
const [currentMonth, setCurrentMonth] = useState4(value || /* @__PURE__ */ new Date());
|
|
1980
2727
|
const today = /* @__PURE__ */ new Date();
|
|
@@ -2016,42 +2763,44 @@ function Calendar({ value, onChange, className }) {
|
|
|
2016
2763
|
for (let i = 1; i <= daysInMonth; i++) {
|
|
2017
2764
|
days.push(i);
|
|
2018
2765
|
}
|
|
2019
|
-
return /* @__PURE__ */
|
|
2020
|
-
/* @__PURE__ */
|
|
2021
|
-
/* @__PURE__ */
|
|
2766
|
+
return /* @__PURE__ */ jsxs27("div", { className: cn("w-[280px] rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", className), children: [
|
|
2767
|
+
/* @__PURE__ */ jsxs27("div", { className: "mb-4 flex items-center justify-between", children: [
|
|
2768
|
+
/* @__PURE__ */ jsx32(
|
|
2022
2769
|
"button",
|
|
2023
2770
|
{
|
|
2024
2771
|
type: "button",
|
|
2025
2772
|
onClick: prevMonth,
|
|
2773
|
+
"aria-label": "Previous month",
|
|
2026
2774
|
className: "rounded-lg p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink",
|
|
2027
|
-
children: /* @__PURE__ */
|
|
2775
|
+
children: /* @__PURE__ */ jsx32(IconChevronLeft, { className: "h-5 w-5", "aria-hidden": true })
|
|
2028
2776
|
}
|
|
2029
2777
|
),
|
|
2030
|
-
/* @__PURE__ */
|
|
2778
|
+
/* @__PURE__ */ jsxs27("span", { className: "text-sm font-semibold text-ph-ink", children: [
|
|
2031
2779
|
monthNames[month],
|
|
2032
2780
|
" ",
|
|
2033
2781
|
year
|
|
2034
2782
|
] }),
|
|
2035
|
-
/* @__PURE__ */
|
|
2783
|
+
/* @__PURE__ */ jsx32(
|
|
2036
2784
|
"button",
|
|
2037
2785
|
{
|
|
2038
2786
|
type: "button",
|
|
2039
2787
|
onClick: nextMonth,
|
|
2788
|
+
"aria-label": "Next month",
|
|
2040
2789
|
className: "rounded-lg p-1 text-ph-subtle transition hover:bg-ph-muted hover:text-ph-ink",
|
|
2041
|
-
children: /* @__PURE__ */
|
|
2790
|
+
children: /* @__PURE__ */ jsx32(IconChevronRight, { className: "h-5 w-5", "aria-hidden": true })
|
|
2042
2791
|
}
|
|
2043
2792
|
)
|
|
2044
2793
|
] }),
|
|
2045
|
-
/* @__PURE__ */
|
|
2046
|
-
weekDays.map((day) => /* @__PURE__ */
|
|
2047
|
-
days.map((day, index) => /* @__PURE__ */
|
|
2794
|
+
/* @__PURE__ */ jsxs27("div", { className: "grid grid-cols-7 gap-1", children: [
|
|
2795
|
+
weekDays.map((day) => /* @__PURE__ */ jsx32("div", { className: "py-1 text-center text-xs font-medium text-ph-mutedtext", children: day }, day)),
|
|
2796
|
+
days.map((day, index) => /* @__PURE__ */ jsx32("div", { className: "aspect-square", children: day && /* @__PURE__ */ jsx32(
|
|
2048
2797
|
"button",
|
|
2049
2798
|
{
|
|
2050
2799
|
type: "button",
|
|
2051
2800
|
onClick: () => handleSelect(day),
|
|
2052
2801
|
className: cn(
|
|
2053
2802
|
"flex h-full w-full items-center justify-center rounded-lg text-sm transition-colors",
|
|
2054
|
-
isSelected(day) ? "bg-ph-brand font-semibold text-
|
|
2803
|
+
isSelected(day) ? "bg-ph-brand font-semibold text-[var(--ph-on-accent)] shadow-ph" : isToday(day) ? "bg-ph-muted font-semibold text-ph-brand ring-1 ring-ph-brand/30" : "text-ph-ink hover:bg-ph-muted"
|
|
2055
2804
|
),
|
|
2056
2805
|
children: day
|
|
2057
2806
|
}
|
|
@@ -2062,10 +2811,10 @@ function Calendar({ value, onChange, className }) {
|
|
|
2062
2811
|
|
|
2063
2812
|
// src/components/ui/HoverCard.tsx
|
|
2064
2813
|
import { useState as useState5 } from "react";
|
|
2065
|
-
import { jsx as
|
|
2814
|
+
import { jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2066
2815
|
function HoverCard({ trigger, children, className }) {
|
|
2067
2816
|
const [isVisible, setIsVisible] = useState5(false);
|
|
2068
|
-
return /* @__PURE__ */
|
|
2817
|
+
return /* @__PURE__ */ jsxs28(
|
|
2069
2818
|
"div",
|
|
2070
2819
|
{
|
|
2071
2820
|
className: "relative inline-block",
|
|
@@ -2073,7 +2822,7 @@ function HoverCard({ trigger, children, className }) {
|
|
|
2073
2822
|
onMouseLeave: () => setIsVisible(false),
|
|
2074
2823
|
children: [
|
|
2075
2824
|
trigger,
|
|
2076
|
-
/* @__PURE__ */
|
|
2825
|
+
/* @__PURE__ */ jsxs28(
|
|
2077
2826
|
"div",
|
|
2078
2827
|
{
|
|
2079
2828
|
className: cn(
|
|
@@ -2082,8 +2831,8 @@ function HoverCard({ trigger, children, className }) {
|
|
|
2082
2831
|
className
|
|
2083
2832
|
),
|
|
2084
2833
|
children: [
|
|
2085
|
-
/* @__PURE__ */
|
|
2086
|
-
/* @__PURE__ */
|
|
2834
|
+
/* @__PURE__ */ jsx33("div", { className: "absolute -top-1.5 left-1/2 h-3 w-3 -translate-x-1/2 rotate-45 border-l border-t border-ph-border bg-ph-surface" }),
|
|
2835
|
+
/* @__PURE__ */ jsx33("div", { className: "relative", children })
|
|
2087
2836
|
]
|
|
2088
2837
|
}
|
|
2089
2838
|
)
|
|
@@ -2093,9 +2842,9 @@ function HoverCard({ trigger, children, className }) {
|
|
|
2093
2842
|
}
|
|
2094
2843
|
|
|
2095
2844
|
// src/components/ui/EmptyState.tsx
|
|
2096
|
-
import { jsx as
|
|
2845
|
+
import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2097
2846
|
function EmptyState({ icon, title, description, action, className }) {
|
|
2098
|
-
return /* @__PURE__ */
|
|
2847
|
+
return /* @__PURE__ */ jsxs29(
|
|
2099
2848
|
"div",
|
|
2100
2849
|
{
|
|
2101
2850
|
className: cn(
|
|
@@ -2103,49 +2852,208 @@ function EmptyState({ icon, title, description, action, className }) {
|
|
|
2103
2852
|
className
|
|
2104
2853
|
),
|
|
2105
2854
|
children: [
|
|
2106
|
-
icon && /* @__PURE__ */
|
|
2107
|
-
/* @__PURE__ */
|
|
2108
|
-
description && /* @__PURE__ */
|
|
2109
|
-
action && /* @__PURE__ */
|
|
2855
|
+
icon && /* @__PURE__ */ jsx34("div", { className: "mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-ph-muted text-ph-mutedtext", children: icon }),
|
|
2856
|
+
/* @__PURE__ */ jsx34("h3", { className: "text-base font-semibold text-ph-ink", children: title }),
|
|
2857
|
+
description && /* @__PURE__ */ jsx34("p", { className: "mt-1 max-w-sm text-sm text-ph-subtle", children: description }),
|
|
2858
|
+
action && /* @__PURE__ */ jsx34("div", { className: "mt-4", children: action })
|
|
2110
2859
|
]
|
|
2111
2860
|
}
|
|
2112
2861
|
);
|
|
2113
2862
|
}
|
|
2114
2863
|
|
|
2115
2864
|
// src/components/ui/FilterChips.tsx
|
|
2116
|
-
import { jsx as
|
|
2117
|
-
function FilterChips({
|
|
2118
|
-
|
|
2119
|
-
|
|
2865
|
+
import { Fragment as Fragment5, jsx as jsx35, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2866
|
+
function FilterChips({
|
|
2867
|
+
chips,
|
|
2868
|
+
onToggle,
|
|
2869
|
+
onRemove,
|
|
2870
|
+
className,
|
|
2871
|
+
"aria-label": ariaLabel = "Applied filters"
|
|
2872
|
+
}) {
|
|
2873
|
+
return /* @__PURE__ */ jsx35("div", { className: cn("ph-filter-chips", className), role: "group", "aria-label": ariaLabel, children: chips.map((chip) => {
|
|
2874
|
+
var _a;
|
|
2875
|
+
const label = (_a = chip.removeLabel) != null ? _a : getChipText(chip);
|
|
2876
|
+
const content = /* @__PURE__ */ jsxs30(Fragment5, { children: [
|
|
2877
|
+
/* @__PURE__ */ jsx35("span", { className: "ph-filter-chip__label", children: chip.label }),
|
|
2878
|
+
chip.value != null ? /* @__PURE__ */ jsx35("span", { className: "ph-filter-chip__value", children: chip.value }) : null
|
|
2879
|
+
] });
|
|
2880
|
+
return /* @__PURE__ */ jsxs30(
|
|
2881
|
+
"span",
|
|
2882
|
+
{
|
|
2883
|
+
className: cn("ph-filter-chip", chip.active && "ph-filter-chip--active"),
|
|
2884
|
+
"data-state": chip.active ? "on" : "off",
|
|
2885
|
+
children: [
|
|
2886
|
+
onToggle ? /* @__PURE__ */ jsx35(
|
|
2887
|
+
"button",
|
|
2888
|
+
{
|
|
2889
|
+
type: "button",
|
|
2890
|
+
className: "ph-filter-chip__main",
|
|
2891
|
+
"aria-pressed": Boolean(chip.active),
|
|
2892
|
+
onClick: () => onToggle(chip.id),
|
|
2893
|
+
children: content
|
|
2894
|
+
}
|
|
2895
|
+
) : /* @__PURE__ */ jsx35("span", { className: "ph-filter-chip__main", children: content }),
|
|
2896
|
+
chip.active && onRemove ? /* @__PURE__ */ jsx35(
|
|
2897
|
+
"button",
|
|
2898
|
+
{
|
|
2899
|
+
type: "button",
|
|
2900
|
+
className: "ph-filter-chip__remove",
|
|
2901
|
+
"aria-label": `Remove ${label} filter`,
|
|
2902
|
+
onClick: () => onRemove(chip.id),
|
|
2903
|
+
children: /* @__PURE__ */ jsx35(IconClose, { className: "h-3 w-3", "aria-hidden": true })
|
|
2904
|
+
}
|
|
2905
|
+
) : null
|
|
2906
|
+
]
|
|
2907
|
+
},
|
|
2908
|
+
chip.id
|
|
2909
|
+
);
|
|
2910
|
+
}) });
|
|
2911
|
+
}
|
|
2912
|
+
function getChipText(chip) {
|
|
2913
|
+
const label = typeof chip.label === "string" || typeof chip.label === "number" ? String(chip.label) : chip.id;
|
|
2914
|
+
const value = typeof chip.value === "string" || typeof chip.value === "number" ? String(chip.value) : null;
|
|
2915
|
+
return value ? `${label}: ${value}` : label;
|
|
2916
|
+
}
|
|
2917
|
+
|
|
2918
|
+
// src/components/ui/FilterBar.tsx
|
|
2919
|
+
import { jsx as jsx36, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2920
|
+
function FilterBar(_a) {
|
|
2921
|
+
var _b = _a, {
|
|
2922
|
+
children,
|
|
2923
|
+
label = "Filters and sorting",
|
|
2924
|
+
onClear,
|
|
2925
|
+
clearLabel = "Clear all",
|
|
2926
|
+
resultCount,
|
|
2927
|
+
className
|
|
2928
|
+
} = _b, props = __objRest(_b, [
|
|
2929
|
+
"children",
|
|
2930
|
+
"label",
|
|
2931
|
+
"onClear",
|
|
2932
|
+
"clearLabel",
|
|
2933
|
+
"resultCount",
|
|
2934
|
+
"className"
|
|
2935
|
+
]);
|
|
2936
|
+
return /* @__PURE__ */ jsxs31("div", __spreadProps(__spreadValues({ className: cn("ph-filter-bar", className) }, props), { children: [
|
|
2937
|
+
/* @__PURE__ */ jsxs31("div", { className: "ph-filter-bar__controls", role: "group", "aria-label": label, children: [
|
|
2938
|
+
children,
|
|
2939
|
+
onClear ? /* @__PURE__ */ jsx36("button", { type: "button", className: "ph-filter-bar__clear", onClick: onClear, children: clearLabel }) : null
|
|
2940
|
+
] }),
|
|
2941
|
+
resultCount != null ? /* @__PURE__ */ jsx36("output", { className: "ph-filter-bar__results", "aria-live": "polite", children: resultCount }) : null
|
|
2942
|
+
] }));
|
|
2943
|
+
}
|
|
2944
|
+
function FilterMenu({
|
|
2945
|
+
label,
|
|
2946
|
+
value,
|
|
2947
|
+
options,
|
|
2948
|
+
onValueChange,
|
|
2949
|
+
placeholder = "Any",
|
|
2950
|
+
align = "start",
|
|
2951
|
+
disabled,
|
|
2952
|
+
className
|
|
2953
|
+
}) {
|
|
2954
|
+
var _a;
|
|
2955
|
+
const selected = options.find((option) => option.value === value);
|
|
2956
|
+
const displayValue = (_a = selected == null ? void 0 : selected.label) != null ? _a : placeholder;
|
|
2957
|
+
const accessibleValue = selected ? getOptionText(selected) : String(placeholder);
|
|
2958
|
+
return /* @__PURE__ */ jsx36(
|
|
2959
|
+
DropdownMenu,
|
|
2120
2960
|
{
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2961
|
+
"aria-label": `${label}: ${accessibleValue}`,
|
|
2962
|
+
align,
|
|
2963
|
+
disabled,
|
|
2964
|
+
className,
|
|
2965
|
+
trigger: /* @__PURE__ */ jsxs31("span", { className: cn("ph-filter-menu-trigger", selected && "ph-filter-menu-trigger--active"), children: [
|
|
2966
|
+
/* @__PURE__ */ jsx36(IconTuning, { className: "h-3.5 w-3.5", "aria-hidden": true }),
|
|
2967
|
+
/* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__label", children: label }),
|
|
2968
|
+
/* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__value", children: displayValue })
|
|
2969
|
+
] }),
|
|
2970
|
+
children: /* @__PURE__ */ jsx36(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ jsx36(
|
|
2971
|
+
DropdownRadioItem,
|
|
2972
|
+
{
|
|
2973
|
+
value: option.value,
|
|
2974
|
+
textValue: getOptionText(option),
|
|
2975
|
+
disabled: option.disabled,
|
|
2976
|
+
children: option.label
|
|
2977
|
+
},
|
|
2978
|
+
option.value
|
|
2979
|
+
)) })
|
|
2980
|
+
}
|
|
2981
|
+
);
|
|
2982
|
+
}
|
|
2983
|
+
function SortMenu({
|
|
2984
|
+
label,
|
|
2985
|
+
value,
|
|
2986
|
+
options,
|
|
2987
|
+
onValueChange,
|
|
2988
|
+
direction = "descending",
|
|
2989
|
+
align = "end",
|
|
2990
|
+
disabled,
|
|
2991
|
+
className
|
|
2992
|
+
}) {
|
|
2993
|
+
const selected = options.find((option) => option.value === value);
|
|
2994
|
+
return /* @__PURE__ */ jsx36(
|
|
2995
|
+
DropdownMenu,
|
|
2996
|
+
{
|
|
2997
|
+
"aria-label": `${label}: ${selected ? getOptionText(selected) : "Choose sort order"}`,
|
|
2998
|
+
align,
|
|
2999
|
+
disabled,
|
|
3000
|
+
className,
|
|
3001
|
+
trigger: /* @__PURE__ */ jsxs31("span", { className: "ph-filter-menu-trigger ph-sort-menu-trigger", children: [
|
|
3002
|
+
/* @__PURE__ */ jsx36(
|
|
3003
|
+
IconArrowDown,
|
|
2131
3004
|
{
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
onRemove(chip.id);
|
|
2135
|
-
},
|
|
2136
|
-
className: "ml-0.5 flex h-4 w-4 cursor-pointer items-center justify-center rounded-full hover:bg-white/20",
|
|
2137
|
-
children: /* @__PURE__ */ jsx31(IconClose, { className: "h-3 w-3" })
|
|
3005
|
+
className: cn("h-3.5 w-3.5", direction === "ascending" && "rotate-180"),
|
|
3006
|
+
"aria-hidden": true
|
|
2138
3007
|
}
|
|
2139
|
-
)
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
3008
|
+
),
|
|
3009
|
+
/* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__label", children: label }),
|
|
3010
|
+
selected ? /* @__PURE__ */ jsx36("span", { className: "ph-filter-menu-trigger__value", children: selected.label }) : null
|
|
3011
|
+
] }),
|
|
3012
|
+
children: /* @__PURE__ */ jsx36(DropdownRadioGroup, { value, onValueChange, children: options.map((option) => /* @__PURE__ */ jsx36(
|
|
3013
|
+
DropdownRadioItem,
|
|
3014
|
+
{
|
|
3015
|
+
value: option.value,
|
|
3016
|
+
textValue: getOptionText(option),
|
|
3017
|
+
disabled: option.disabled,
|
|
3018
|
+
children: option.label
|
|
3019
|
+
},
|
|
3020
|
+
option.value
|
|
3021
|
+
)) })
|
|
3022
|
+
}
|
|
3023
|
+
);
|
|
3024
|
+
}
|
|
3025
|
+
function getOptionText(option) {
|
|
3026
|
+
if (option.textValue) return option.textValue;
|
|
3027
|
+
if (typeof option.label === "string" || typeof option.label === "number") return String(option.label);
|
|
3028
|
+
return option.value;
|
|
3029
|
+
}
|
|
3030
|
+
|
|
3031
|
+
// src/components/ui/FilterControls.tsx
|
|
3032
|
+
import { jsx as jsx37, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
3033
|
+
function FilterControls(_a) {
|
|
3034
|
+
var _b = _a, {
|
|
3035
|
+
children,
|
|
3036
|
+
barProps,
|
|
3037
|
+
chipsProps,
|
|
3038
|
+
emptyState,
|
|
3039
|
+
className
|
|
3040
|
+
} = _b, props = __objRest(_b, [
|
|
3041
|
+
"children",
|
|
3042
|
+
"barProps",
|
|
3043
|
+
"chipsProps",
|
|
3044
|
+
"emptyState",
|
|
3045
|
+
"className"
|
|
3046
|
+
]);
|
|
3047
|
+
const hasChips = Boolean(chipsProps == null ? void 0 : chipsProps.chips.length);
|
|
3048
|
+
return /* @__PURE__ */ jsxs32("div", __spreadProps(__spreadValues({ className: cn("ph-filter-controls", className) }, props), { children: [
|
|
3049
|
+
/* @__PURE__ */ jsx37(FilterBar, __spreadProps(__spreadValues({}, barProps), { children })),
|
|
3050
|
+
hasChips && chipsProps ? /* @__PURE__ */ jsx37(FilterChips, __spreadValues({}, chipsProps)) : emptyState != null ? emptyState : null
|
|
3051
|
+
] }));
|
|
2144
3052
|
}
|
|
2145
3053
|
|
|
2146
3054
|
// src/components/ui/CodeBlock.tsx
|
|
2147
3055
|
import { useState as useState6 } from "react";
|
|
2148
|
-
import { jsx as
|
|
3056
|
+
import { jsx as jsx38, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2149
3057
|
function CodeBlock({ code, language = "tsx", filename, className }) {
|
|
2150
3058
|
const [copied, setCopied] = useState6(false);
|
|
2151
3059
|
const handleCopy = async () => {
|
|
@@ -2153,17 +3061,17 @@ function CodeBlock({ code, language = "tsx", filename, className }) {
|
|
|
2153
3061
|
setCopied(true);
|
|
2154
3062
|
setTimeout(() => setCopied(false), 2e3);
|
|
2155
3063
|
};
|
|
2156
|
-
return /* @__PURE__ */
|
|
2157
|
-
(filename || language) && /* @__PURE__ */
|
|
2158
|
-
/* @__PURE__ */
|
|
2159
|
-
/* @__PURE__ */
|
|
2160
|
-
/* @__PURE__ */
|
|
2161
|
-
/* @__PURE__ */
|
|
2162
|
-
/* @__PURE__ */
|
|
3064
|
+
return /* @__PURE__ */ jsxs33("div", { className: cn("overflow-hidden rounded-lg border border-ph-border bg-[#1a1a2e]", className), children: [
|
|
3065
|
+
(filename || language) && /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between border-b border-white/10 px-4 py-2", children: [
|
|
3066
|
+
/* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-2", children: [
|
|
3067
|
+
/* @__PURE__ */ jsxs33("div", { className: "flex gap-1.5", children: [
|
|
3068
|
+
/* @__PURE__ */ jsx38("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
|
|
3069
|
+
/* @__PURE__ */ jsx38("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
|
|
3070
|
+
/* @__PURE__ */ jsx38("div", { className: "h-3 w-3 rounded-full bg-emerald-400" })
|
|
2163
3071
|
] }),
|
|
2164
|
-
filename && /* @__PURE__ */
|
|
3072
|
+
filename && /* @__PURE__ */ jsx38("span", { className: "ml-2 text-xs text-white/60", children: filename })
|
|
2165
3073
|
] }),
|
|
2166
|
-
/* @__PURE__ */
|
|
3074
|
+
/* @__PURE__ */ jsx38(
|
|
2167
3075
|
"button",
|
|
2168
3076
|
{
|
|
2169
3077
|
type: "button",
|
|
@@ -2173,35 +3081,35 @@ function CodeBlock({ code, language = "tsx", filename, className }) {
|
|
|
2173
3081
|
}
|
|
2174
3082
|
)
|
|
2175
3083
|
] }),
|
|
2176
|
-
/* @__PURE__ */
|
|
3084
|
+
/* @__PURE__ */ jsx38("pre", { className: "overflow-x-auto p-4 text-sm leading-relaxed", children: /* @__PURE__ */ jsx38("code", { className: "font-mono text-[#e4e4e7]", children: code }) })
|
|
2177
3085
|
] });
|
|
2178
3086
|
}
|
|
2179
3087
|
|
|
2180
3088
|
// src/components/ui/ComponentDocs.tsx
|
|
2181
|
-
import { jsx as
|
|
3089
|
+
import { jsx as jsx39, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2182
3090
|
function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false, className }) {
|
|
2183
|
-
return /* @__PURE__ */
|
|
2184
|
-
/* @__PURE__ */
|
|
2185
|
-
/* @__PURE__ */
|
|
2186
|
-
/* @__PURE__ */
|
|
2187
|
-
/* @__PURE__ */
|
|
2188
|
-
/* @__PURE__ */
|
|
3091
|
+
return /* @__PURE__ */ jsxs34("details", { className: cn("ph-panel group overflow-hidden p-0", className), open: defaultOpen, children: [
|
|
3092
|
+
/* @__PURE__ */ jsxs34("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-4 border-b border-ph-border px-4 py-3 transition hover:bg-ph-muted/60 [&::-webkit-details-marker]:hidden", children: [
|
|
3093
|
+
/* @__PURE__ */ jsx39("h3", { className: "text-xs font-semibold uppercase tracking-wider text-ph-mutedtext", children: title }),
|
|
3094
|
+
/* @__PURE__ */ jsxs34("span", { className: "rounded-full border border-ph-border bg-ph-surface px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-ph-mutedtext transition group-open:bg-ph-brand group-open:text-white", children: [
|
|
3095
|
+
/* @__PURE__ */ jsx39("span", { className: "group-open:hidden", children: "Show" }),
|
|
3096
|
+
/* @__PURE__ */ jsx39("span", { className: "hidden group-open:inline", children: "Hide" })
|
|
2189
3097
|
] })
|
|
2190
3098
|
] }),
|
|
2191
|
-
/* @__PURE__ */
|
|
2192
|
-
/* @__PURE__ */
|
|
2193
|
-
/* @__PURE__ */
|
|
2194
|
-
/* @__PURE__ */
|
|
2195
|
-
/* @__PURE__ */
|
|
2196
|
-
/* @__PURE__ */
|
|
3099
|
+
/* @__PURE__ */ jsx39("div", { className: "overflow-x-auto border-t border-ph-border", children: /* @__PURE__ */ jsxs34("table", { className: "w-full text-left text-sm", children: [
|
|
3100
|
+
/* @__PURE__ */ jsx39("thead", { className: "bg-ph-muted text-xs uppercase tracking-wider text-ph-mutedtext", children: /* @__PURE__ */ jsxs34("tr", { children: [
|
|
3101
|
+
/* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Prop" }),
|
|
3102
|
+
/* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Type" }),
|
|
3103
|
+
/* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Default" }),
|
|
3104
|
+
/* @__PURE__ */ jsx39("th", { className: "px-4 py-2 font-semibold", children: "Use" })
|
|
2197
3105
|
] }) }),
|
|
2198
|
-
/* @__PURE__ */
|
|
3106
|
+
/* @__PURE__ */ jsx39("tbody", { className: "divide-y divide-ph-border", children: rows.map((row) => {
|
|
2199
3107
|
var _a;
|
|
2200
|
-
return /* @__PURE__ */
|
|
2201
|
-
/* @__PURE__ */
|
|
2202
|
-
/* @__PURE__ */
|
|
2203
|
-
/* @__PURE__ */
|
|
2204
|
-
/* @__PURE__ */
|
|
3108
|
+
return /* @__PURE__ */ jsxs34("tr", { children: [
|
|
3109
|
+
/* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-ink", children: row.name }),
|
|
3110
|
+
/* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: row.type }),
|
|
3111
|
+
/* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top font-mono text-xs text-ph-subtle", children: (_a = row.defaultValue) != null ? _a : "-" }),
|
|
3112
|
+
/* @__PURE__ */ jsx39("td", { className: "px-4 py-3 align-top text-ph-subtle", children: row.description })
|
|
2205
3113
|
] }, row.name);
|
|
2206
3114
|
}) })
|
|
2207
3115
|
] }) })
|
|
@@ -2210,7 +3118,7 @@ function ComponentDocs({ title = "Props & variants", rows, defaultOpen = false,
|
|
|
2210
3118
|
|
|
2211
3119
|
// src/components/ui/ShowcaseWrapper.tsx
|
|
2212
3120
|
import { useState as useState7 } from "react";
|
|
2213
|
-
import { jsx as
|
|
3121
|
+
import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2214
3122
|
function ShowcaseWrapper({
|
|
2215
3123
|
id,
|
|
2216
3124
|
title,
|
|
@@ -2224,47 +3132,30 @@ function ShowcaseWrapper({
|
|
|
2224
3132
|
var _a;
|
|
2225
3133
|
const [showCode, setShowCode] = useState7(false);
|
|
2226
3134
|
const fallbackId = (_a = titleIdMap[title]) != null ? _a : title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
2227
|
-
return /* @__PURE__ */
|
|
2228
|
-
/* @__PURE__ */
|
|
2229
|
-
/* @__PURE__ */
|
|
2230
|
-
/* @__PURE__ */
|
|
2231
|
-
/* @__PURE__ */
|
|
3135
|
+
return /* @__PURE__ */ jsxs35("section", { id: id != null ? id : fallbackId, className: cn("scroll-mt-20", className), children: [
|
|
3136
|
+
/* @__PURE__ */ jsxs35("div", { className: "ph-h2-rule mb-8", children: [
|
|
3137
|
+
/* @__PURE__ */ jsxs35("div", { className: "flex items-center gap-1.5", children: [
|
|
3138
|
+
/* @__PURE__ */ jsx40("h2", { children: title }),
|
|
3139
|
+
/* @__PURE__ */ jsx40(
|
|
2232
3140
|
"button",
|
|
2233
3141
|
{
|
|
2234
3142
|
type: "button",
|
|
2235
3143
|
onClick: () => setShowCode(!showCode),
|
|
2236
3144
|
className: cn(
|
|
2237
3145
|
"flex h-10 w-10 items-center justify-center rounded-full border transition-all",
|
|
2238
|
-
showCode ? "border-ph-brand bg-ph-brand text-
|
|
3146
|
+
showCode ? "border-ph-brand bg-ph-brand text-[var(--ph-on-accent)] shadow-lg shadow-ph-brand/25" : "border-ph-border bg-ph-surface text-ph-subtle hover:border-ph-brand hover:text-ph-brand"
|
|
2239
3147
|
),
|
|
2240
3148
|
title: showCode ? "Hide code" : "Show code",
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
{
|
|
2244
|
-
className: "h-5 w-5",
|
|
2245
|
-
viewBox: "0 0 24 24",
|
|
2246
|
-
fill: "none",
|
|
2247
|
-
stroke: "currentColor",
|
|
2248
|
-
strokeWidth: "2",
|
|
2249
|
-
strokeLinecap: "round",
|
|
2250
|
-
strokeLinejoin: "round",
|
|
2251
|
-
children: [
|
|
2252
|
-
/* @__PURE__ */ jsx34("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", ry: "2" }),
|
|
2253
|
-
/* @__PURE__ */ jsx34("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
|
|
2254
|
-
/* @__PURE__ */ jsx34("line", { x1: "12", y1: "17", x2: "12", y2: "21" }),
|
|
2255
|
-
/* @__PURE__ */ jsx34("line", { x1: "6", y1: "8", x2: "6", y2: "8" }),
|
|
2256
|
-
/* @__PURE__ */ jsx34("line", { x1: "10", y1: "8", x2: "10", y2: "8" })
|
|
2257
|
-
]
|
|
2258
|
-
}
|
|
2259
|
-
)
|
|
3149
|
+
"aria-label": showCode ? "Hide code" : "Show code",
|
|
3150
|
+
children: /* @__PURE__ */ jsx40(IconCodePreview, { className: "h-5 w-5", "aria-hidden": true })
|
|
2260
3151
|
}
|
|
2261
3152
|
)
|
|
2262
3153
|
] }),
|
|
2263
|
-
/* @__PURE__ */
|
|
3154
|
+
/* @__PURE__ */ jsx40("hr", {})
|
|
2264
3155
|
] }),
|
|
2265
|
-
description && /* @__PURE__ */
|
|
2266
|
-
docs && /* @__PURE__ */
|
|
2267
|
-
/* @__PURE__ */
|
|
3156
|
+
description && /* @__PURE__ */ jsx40("p", { className: "mb-6 text-sm text-ph-subtle", children: description }),
|
|
3157
|
+
docs && /* @__PURE__ */ jsx40("div", { className: "mb-6", children: docs }),
|
|
3158
|
+
/* @__PURE__ */ jsxs35(
|
|
2268
3159
|
"div",
|
|
2269
3160
|
{
|
|
2270
3161
|
className: cn(
|
|
@@ -2272,15 +3163,15 @@ function ShowcaseWrapper({
|
|
|
2272
3163
|
showCode ? "lg:grid lg:grid-cols-[1fr,minmax(360px,420px)]" : "block"
|
|
2273
3164
|
),
|
|
2274
3165
|
children: [
|
|
2275
|
-
/* @__PURE__ */
|
|
2276
|
-
/* @__PURE__ */
|
|
3166
|
+
/* @__PURE__ */ jsx40("div", { className: cn("min-w-0", showCode && "lg:pr-2"), children }),
|
|
3167
|
+
/* @__PURE__ */ jsx40(
|
|
2277
3168
|
"div",
|
|
2278
3169
|
{
|
|
2279
3170
|
className: cn(
|
|
2280
3171
|
"transition-all duration-300",
|
|
2281
3172
|
showCode ? "block opacity-100" : "hidden opacity-0 lg:hidden"
|
|
2282
3173
|
),
|
|
2283
|
-
children: /* @__PURE__ */
|
|
3174
|
+
children: /* @__PURE__ */ jsx40("div", { className: "sticky top-20", children: /* @__PURE__ */ jsx40(CodeBlock, { code, filename }) })
|
|
2284
3175
|
}
|
|
2285
3176
|
)
|
|
2286
3177
|
]
|
|
@@ -2329,41 +3220,41 @@ var titleIdMap = {
|
|
|
2329
3220
|
};
|
|
2330
3221
|
|
|
2331
3222
|
// src/components/ui/CollapsibleSection.tsx
|
|
2332
|
-
import { useState as useState8 } from "react";
|
|
2333
|
-
import { jsx as
|
|
3223
|
+
import { useId as useId5, useState as useState8 } from "react";
|
|
3224
|
+
import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2334
3225
|
function CollapsibleSection({ title, children, defaultOpen = true, id }) {
|
|
2335
3226
|
const [isOpen, setIsOpen] = useState8(defaultOpen);
|
|
2336
|
-
|
|
2337
|
-
|
|
3227
|
+
const generatedId = useId5();
|
|
3228
|
+
const contentId = `${id != null ? id : generatedId}-content`;
|
|
3229
|
+
return /* @__PURE__ */ jsxs36("section", { id, className: "scroll-mt-20", children: [
|
|
3230
|
+
/* @__PURE__ */ jsxs36(
|
|
2338
3231
|
"button",
|
|
2339
3232
|
{
|
|
2340
3233
|
type: "button",
|
|
2341
3234
|
onClick: () => setIsOpen(!isOpen),
|
|
3235
|
+
"aria-expanded": isOpen,
|
|
3236
|
+
"aria-controls": contentId,
|
|
2342
3237
|
className: "mb-6 flex w-full items-center justify-between rounded-lg border border-ph-border bg-ph-muted px-5 py-4 text-left transition hover:bg-ph-muted/80",
|
|
2343
3238
|
children: [
|
|
2344
|
-
/* @__PURE__ */
|
|
2345
|
-
/* @__PURE__ */
|
|
2346
|
-
|
|
3239
|
+
/* @__PURE__ */ jsx41("span", { className: "text-lg font-bold text-ph-ink", children: title }),
|
|
3240
|
+
/* @__PURE__ */ jsx41(
|
|
3241
|
+
IconChevronDown,
|
|
2347
3242
|
{
|
|
2348
3243
|
className: cn(
|
|
2349
3244
|
"h-5 w-5 text-ph-subtle transition-transform duration-200",
|
|
2350
3245
|
isOpen && "rotate-180"
|
|
2351
3246
|
),
|
|
2352
|
-
|
|
2353
|
-
fill: "none",
|
|
2354
|
-
stroke: "currentColor",
|
|
2355
|
-
strokeWidth: "2",
|
|
2356
|
-
strokeLinecap: "round",
|
|
2357
|
-
strokeLinejoin: "round",
|
|
2358
|
-
children: /* @__PURE__ */ jsx35("path", { d: "M6 9l6 6 6-6" })
|
|
3247
|
+
"aria-hidden": true
|
|
2359
3248
|
}
|
|
2360
3249
|
)
|
|
2361
3250
|
]
|
|
2362
3251
|
}
|
|
2363
3252
|
),
|
|
2364
|
-
/* @__PURE__ */
|
|
3253
|
+
/* @__PURE__ */ jsx41(
|
|
2365
3254
|
"div",
|
|
2366
3255
|
{
|
|
3256
|
+
id: contentId,
|
|
3257
|
+
"aria-hidden": !isOpen,
|
|
2367
3258
|
className: cn(
|
|
2368
3259
|
"overflow-hidden transition-all duration-300",
|
|
2369
3260
|
isOpen ? "max-h-[50000px] opacity-100" : "max-h-0 opacity-0"
|
|
@@ -2375,7 +3266,7 @@ function CollapsibleSection({ title, children, defaultOpen = true, id }) {
|
|
|
2375
3266
|
}
|
|
2376
3267
|
|
|
2377
3268
|
// src/components/ui/Typography.tsx
|
|
2378
|
-
import { jsx as
|
|
3269
|
+
import { jsx as jsx42 } from "react/jsx-runtime";
|
|
2379
3270
|
var toneMap2 = {
|
|
2380
3271
|
default: "text-ph-ink",
|
|
2381
3272
|
muted: "text-ph-mutedtext",
|
|
@@ -2404,47 +3295,47 @@ function Display({
|
|
|
2404
3295
|
truncate,
|
|
2405
3296
|
className
|
|
2406
3297
|
}) {
|
|
2407
|
-
return /* @__PURE__ */
|
|
3298
|
+
return /* @__PURE__ */ jsx42("h1", { className: textClass("text-4xl font-extrabold tracking-tight md:text-5xl", tone, weight, truncate, className), children });
|
|
2408
3299
|
}
|
|
2409
3300
|
function H1({ children, tone = "default", weight, truncate, className }) {
|
|
2410
|
-
return /* @__PURE__ */
|
|
3301
|
+
return /* @__PURE__ */ jsx42("h1", { className: textClass("text-3xl font-bold tracking-tight md:text-4xl", tone, weight, truncate, className), children });
|
|
2411
3302
|
}
|
|
2412
3303
|
function H2({ children, tone = "default", weight, truncate, className }) {
|
|
2413
|
-
return /* @__PURE__ */
|
|
3304
|
+
return /* @__PURE__ */ jsx42("h2", { className: textClass("text-2xl font-bold tracking-tight", tone, weight, truncate, className), children });
|
|
2414
3305
|
}
|
|
2415
3306
|
function H3({ children, tone = "default", weight, truncate, className }) {
|
|
2416
|
-
return /* @__PURE__ */
|
|
3307
|
+
return /* @__PURE__ */ jsx42("h3", { className: textClass("text-xl font-semibold", tone, weight, truncate, className), children });
|
|
2417
3308
|
}
|
|
2418
3309
|
function H4({ children, tone = "default", weight, truncate, className }) {
|
|
2419
|
-
return /* @__PURE__ */
|
|
3310
|
+
return /* @__PURE__ */ jsx42("h4", { className: textClass("text-lg font-semibold", tone, weight, truncate, className), children });
|
|
2420
3311
|
}
|
|
2421
3312
|
function H5({ children, tone = "default", weight, truncate, className }) {
|
|
2422
|
-
return /* @__PURE__ */
|
|
3313
|
+
return /* @__PURE__ */ jsx42("h5", { className: textClass("text-base font-semibold", tone, weight, truncate, className), children });
|
|
2423
3314
|
}
|
|
2424
3315
|
function P({ children, tone = "default", weight, truncate, className }) {
|
|
2425
|
-
return /* @__PURE__ */
|
|
3316
|
+
return /* @__PURE__ */ jsx42("p", { className: textClass("text-base leading-relaxed", tone, weight, truncate, className), children });
|
|
2426
3317
|
}
|
|
2427
3318
|
function Small({ children, tone = "default", weight, truncate, className }) {
|
|
2428
|
-
return /* @__PURE__ */
|
|
3319
|
+
return /* @__PURE__ */ jsx42("span", { className: textClass("text-sm leading-relaxed", tone, weight, truncate, className), children });
|
|
2429
3320
|
}
|
|
2430
3321
|
function Caption({ children, tone = "muted", weight, truncate, className }) {
|
|
2431
|
-
return /* @__PURE__ */
|
|
3322
|
+
return /* @__PURE__ */ jsx42("span", { className: textClass("text-[11px] font-medium uppercase tracking-wider", tone, weight, truncate, className), children });
|
|
2432
3323
|
}
|
|
2433
3324
|
function Overline({ children, tone = "muted", weight, truncate, className }) {
|
|
2434
|
-
return /* @__PURE__ */
|
|
3325
|
+
return /* @__PURE__ */ jsx42("span", { className: textClass("text-[10px] font-bold uppercase tracking-[0.15em]", tone, weight, truncate, className), children });
|
|
2435
3326
|
}
|
|
2436
3327
|
function Lead({ children, tone = "subtle", weight, truncate, className }) {
|
|
2437
|
-
return /* @__PURE__ */
|
|
3328
|
+
return /* @__PURE__ */ jsx42("p", { className: textClass("text-lg leading-relaxed", tone, weight, truncate, className), children });
|
|
2438
3329
|
}
|
|
2439
3330
|
function Mono({ children, tone = "default", weight, truncate, className }) {
|
|
2440
|
-
return /* @__PURE__ */
|
|
3331
|
+
return /* @__PURE__ */ jsx42("code", { className: textClass("text-sm font-mono leading-relaxed", tone, weight, truncate, className), children });
|
|
2441
3332
|
}
|
|
2442
3333
|
function Label({ children, tone = "default", weight, truncate, className }) {
|
|
2443
|
-
return /* @__PURE__ */
|
|
3334
|
+
return /* @__PURE__ */ jsx42("label", { className: textClass("text-sm font-medium", tone, weight, truncate, className), children });
|
|
2444
3335
|
}
|
|
2445
3336
|
|
|
2446
3337
|
// src/components/ui/Avatar.tsx
|
|
2447
|
-
import { jsx as
|
|
3338
|
+
import { jsx as jsx43, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2448
3339
|
var sizeMap5 = {
|
|
2449
3340
|
xs: "h-8 w-8 text-[10px]",
|
|
2450
3341
|
sm: "h-10 w-10 text-xs",
|
|
@@ -2476,8 +3367,8 @@ function Avatar(_a) {
|
|
|
2476
3367
|
"badge",
|
|
2477
3368
|
"className"
|
|
2478
3369
|
]);
|
|
2479
|
-
return /* @__PURE__ */
|
|
2480
|
-
/* @__PURE__ */
|
|
3370
|
+
return /* @__PURE__ */ jsxs37("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex shrink-0", className) }, props), { children: [
|
|
3371
|
+
/* @__PURE__ */ jsx43(
|
|
2481
3372
|
"div",
|
|
2482
3373
|
{
|
|
2483
3374
|
className: cn(
|
|
@@ -2488,7 +3379,7 @@ function Avatar(_a) {
|
|
|
2488
3379
|
children: icon || label
|
|
2489
3380
|
}
|
|
2490
3381
|
),
|
|
2491
|
-
status && /* @__PURE__ */
|
|
3382
|
+
status && /* @__PURE__ */ jsx43(
|
|
2492
3383
|
"span",
|
|
2493
3384
|
{
|
|
2494
3385
|
className: cn(
|
|
@@ -2497,7 +3388,7 @@ function Avatar(_a) {
|
|
|
2497
3388
|
)
|
|
2498
3389
|
}
|
|
2499
3390
|
),
|
|
2500
|
-
badge && /* @__PURE__ */
|
|
3391
|
+
badge && /* @__PURE__ */ jsx43("span", { className: "absolute -bottom-1 -right-1 flex min-w-[22px] items-center justify-center rounded-full bg-ph-brand px-1.5 py-px text-[10px] font-bold text-white", children: badge })
|
|
2501
3392
|
] }));
|
|
2502
3393
|
}
|
|
2503
3394
|
function AvatarGroup(_a) {
|
|
@@ -2505,9 +3396,9 @@ function AvatarGroup(_a) {
|
|
|
2505
3396
|
const items = Array.isArray(children) ? children : [children];
|
|
2506
3397
|
const visible = max ? items.slice(0, max) : items;
|
|
2507
3398
|
const remaining = max ? items.length - max : 0;
|
|
2508
|
-
return /* @__PURE__ */
|
|
3399
|
+
return /* @__PURE__ */ jsxs37("div", __spreadProps(__spreadValues({ className: cn("-space-x-3 flex rtl:space-x-reverse", className) }, props), { children: [
|
|
2509
3400
|
visible,
|
|
2510
|
-
remaining > 0 && /* @__PURE__ */
|
|
3401
|
+
remaining > 0 && /* @__PURE__ */ jsx43(
|
|
2511
3402
|
Avatar,
|
|
2512
3403
|
{
|
|
2513
3404
|
label: `+${remaining}`,
|
|
@@ -2519,7 +3410,7 @@ function AvatarGroup(_a) {
|
|
|
2519
3410
|
}
|
|
2520
3411
|
|
|
2521
3412
|
// src/components/ui/Progress.tsx
|
|
2522
|
-
import { jsx as
|
|
3413
|
+
import { jsx as jsx44, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2523
3414
|
var sizeMap6 = {
|
|
2524
3415
|
sm: "h-1",
|
|
2525
3416
|
md: "h-2",
|
|
@@ -2544,15 +3435,15 @@ function Progress(_a) {
|
|
|
2544
3435
|
"className"
|
|
2545
3436
|
]);
|
|
2546
3437
|
const percentage = Math.min(100, Math.max(0, value / max * 100));
|
|
2547
|
-
return /* @__PURE__ */
|
|
2548
|
-
(label || showPercentage) && /* @__PURE__ */
|
|
2549
|
-
label && /* @__PURE__ */
|
|
2550
|
-
showPercentage && /* @__PURE__ */
|
|
3438
|
+
return /* @__PURE__ */ jsxs38("div", __spreadProps(__spreadValues({ className: cn("w-full", className) }, props), { children: [
|
|
3439
|
+
(label || showPercentage) && /* @__PURE__ */ jsxs38("div", { className: "mb-1.5 flex justify-between text-sm text-ph-subtle", children: [
|
|
3440
|
+
label && /* @__PURE__ */ jsx44("span", { children: label }),
|
|
3441
|
+
showPercentage && /* @__PURE__ */ jsxs38("span", { className: "tabular-nums", children: [
|
|
2551
3442
|
Math.round(percentage),
|
|
2552
3443
|
"%"
|
|
2553
3444
|
] })
|
|
2554
3445
|
] }),
|
|
2555
|
-
/* @__PURE__ */
|
|
3446
|
+
/* @__PURE__ */ jsx44("div", { className: cn("ph-progress", sizeMap6[size]), children: /* @__PURE__ */ jsx44(
|
|
2556
3447
|
"div",
|
|
2557
3448
|
{
|
|
2558
3449
|
className: cn("ph-progress-bar", color),
|
|
@@ -2567,7 +3458,7 @@ function Progress(_a) {
|
|
|
2567
3458
|
}
|
|
2568
3459
|
|
|
2569
3460
|
// src/components/ui/ChatBubble.tsx
|
|
2570
|
-
import { jsx as
|
|
3461
|
+
import { jsx as jsx45, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
2571
3462
|
function ChatBubble(_a) {
|
|
2572
3463
|
var _b = _a, {
|
|
2573
3464
|
children,
|
|
@@ -2587,7 +3478,7 @@ function ChatBubble(_a) {
|
|
|
2587
3478
|
"className"
|
|
2588
3479
|
]);
|
|
2589
3480
|
const isSelf = variant === "self";
|
|
2590
|
-
return /* @__PURE__ */
|
|
3481
|
+
return /* @__PURE__ */ jsxs39(
|
|
2591
3482
|
"div",
|
|
2592
3483
|
__spreadProps(__spreadValues({
|
|
2593
3484
|
className: cn(
|
|
@@ -2597,9 +3488,9 @@ function ChatBubble(_a) {
|
|
|
2597
3488
|
)
|
|
2598
3489
|
}, props), {
|
|
2599
3490
|
children: [
|
|
2600
|
-
avatar && /* @__PURE__ */
|
|
2601
|
-
/* @__PURE__ */
|
|
2602
|
-
(name || time) && /* @__PURE__ */
|
|
3491
|
+
avatar && /* @__PURE__ */ jsx45("div", { className: "shrink-0", children: avatar }),
|
|
3492
|
+
/* @__PURE__ */ jsxs39("div", { className: cn("min-w-0 flex-1", isSelf && "text-right"), children: [
|
|
3493
|
+
(name || time) && /* @__PURE__ */ jsxs39(
|
|
2603
3494
|
"header",
|
|
2604
3495
|
{
|
|
2605
3496
|
className: cn(
|
|
@@ -2607,12 +3498,12 @@ function ChatBubble(_a) {
|
|
|
2607
3498
|
isSelf && "flex-row-reverse justify-end"
|
|
2608
3499
|
),
|
|
2609
3500
|
children: [
|
|
2610
|
-
name && /* @__PURE__ */
|
|
2611
|
-
time && /* @__PURE__ */
|
|
3501
|
+
name && /* @__PURE__ */ jsx45("span", { className: "font-semibold text-ph-ink", children: name }),
|
|
3502
|
+
time && /* @__PURE__ */ jsx45("span", { children: time })
|
|
2612
3503
|
]
|
|
2613
3504
|
}
|
|
2614
3505
|
),
|
|
2615
|
-
/* @__PURE__ */
|
|
3506
|
+
/* @__PURE__ */ jsx45(
|
|
2616
3507
|
"div",
|
|
2617
3508
|
{
|
|
2618
3509
|
className: cn(
|
|
@@ -2622,7 +3513,7 @@ function ChatBubble(_a) {
|
|
|
2622
3513
|
children
|
|
2623
3514
|
}
|
|
2624
3515
|
),
|
|
2625
|
-
footer && /* @__PURE__ */
|
|
3516
|
+
footer && /* @__PURE__ */ jsx45("footer", { className: "mt-2 text-[11px] text-ph-mutedtext", children: footer })
|
|
2626
3517
|
] })
|
|
2627
3518
|
]
|
|
2628
3519
|
})
|
|
@@ -2630,7 +3521,7 @@ function ChatBubble(_a) {
|
|
|
2630
3521
|
}
|
|
2631
3522
|
|
|
2632
3523
|
// src/components/ui/Terminal.tsx
|
|
2633
|
-
import { Fragment as Fragment6, jsx as
|
|
3524
|
+
import { Fragment as Fragment6, jsx as jsx46, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
2634
3525
|
function Terminal(_a) {
|
|
2635
3526
|
var _b = _a, {
|
|
2636
3527
|
title = "sandbox",
|
|
@@ -2643,7 +3534,7 @@ function Terminal(_a) {
|
|
|
2643
3534
|
"children",
|
|
2644
3535
|
"className"
|
|
2645
3536
|
]);
|
|
2646
|
-
return /* @__PURE__ */
|
|
3537
|
+
return /* @__PURE__ */ jsxs40(
|
|
2647
3538
|
"div",
|
|
2648
3539
|
__spreadProps(__spreadValues({
|
|
2649
3540
|
className: cn(
|
|
@@ -2652,18 +3543,18 @@ function Terminal(_a) {
|
|
|
2652
3543
|
)
|
|
2653
3544
|
}, props), {
|
|
2654
3545
|
children: [
|
|
2655
|
-
/* @__PURE__ */
|
|
2656
|
-
/* @__PURE__ */
|
|
2657
|
-
/* @__PURE__ */
|
|
2658
|
-
/* @__PURE__ */
|
|
2659
|
-
title && /* @__PURE__ */
|
|
3546
|
+
/* @__PURE__ */ jsxs40("header", { className: "flex items-center gap-2 border-b border-ph-border bg-ph-muted px-4 py-3", children: [
|
|
3547
|
+
/* @__PURE__ */ jsx46("div", { className: "h-3 w-3 rounded-full bg-red-400" }),
|
|
3548
|
+
/* @__PURE__ */ jsx46("div", { className: "h-3 w-3 rounded-full bg-amber-400" }),
|
|
3549
|
+
/* @__PURE__ */ jsx46("div", { className: "h-3 w-3 rounded-full bg-emerald-400" }),
|
|
3550
|
+
title && /* @__PURE__ */ jsx46("span", { className: "text-xs font-medium text-ph-mutedtext", children: title })
|
|
2660
3551
|
] }),
|
|
2661
|
-
/* @__PURE__ */
|
|
3552
|
+
/* @__PURE__ */ jsx46("div", { className: "ph-code rounded-none border-x-0 border-b-0 text-[13px] leading-relaxed", children: children || /* @__PURE__ */ jsx46(Fragment6, { children: lines == null ? void 0 : lines.map((line, i) => {
|
|
2662
3553
|
const text = typeof line === "string" ? line : line.text;
|
|
2663
3554
|
const color = typeof line === "string" ? void 0 : line.color;
|
|
2664
|
-
return /* @__PURE__ */
|
|
2665
|
-
/* @__PURE__ */
|
|
2666
|
-
i < lines.length - 1 && /* @__PURE__ */
|
|
3555
|
+
return /* @__PURE__ */ jsxs40("span", { children: [
|
|
3556
|
+
/* @__PURE__ */ jsx46("span", { className: color || "text-neutral-600", children: text }),
|
|
3557
|
+
i < lines.length - 1 && /* @__PURE__ */ jsx46("br", {})
|
|
2667
3558
|
] }, i);
|
|
2668
3559
|
}) }) })
|
|
2669
3560
|
]
|
|
@@ -2672,7 +3563,7 @@ function Terminal(_a) {
|
|
|
2672
3563
|
}
|
|
2673
3564
|
|
|
2674
3565
|
// src/components/ui/Indicator.tsx
|
|
2675
|
-
import { jsx as
|
|
3566
|
+
import { jsx as jsx47, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
2676
3567
|
var positionMap = {
|
|
2677
3568
|
"top-right": "-right-[2px] -top-[2px]",
|
|
2678
3569
|
"top-left": "-left-[2px] -top-[2px]",
|
|
@@ -2695,8 +3586,8 @@ function Indicator(_a) {
|
|
|
2695
3586
|
"dot",
|
|
2696
3587
|
"className"
|
|
2697
3588
|
]);
|
|
2698
|
-
return /* @__PURE__ */
|
|
2699
|
-
dot ? /* @__PURE__ */
|
|
3589
|
+
return /* @__PURE__ */ jsxs41("div", __spreadProps(__spreadValues({ className: cn("relative inline-flex items-center justify-center", className) }, props), { children: [
|
|
3590
|
+
dot ? /* @__PURE__ */ jsx47(
|
|
2700
3591
|
"span",
|
|
2701
3592
|
{
|
|
2702
3593
|
className: cn(
|
|
@@ -2705,7 +3596,7 @@ function Indicator(_a) {
|
|
|
2705
3596
|
positionMap[position]
|
|
2706
3597
|
)
|
|
2707
3598
|
}
|
|
2708
|
-
) : badge != null ? /* @__PURE__ */
|
|
3599
|
+
) : badge != null ? /* @__PURE__ */ jsx47(
|
|
2709
3600
|
"span",
|
|
2710
3601
|
{
|
|
2711
3602
|
className: cn(
|
|
@@ -2721,7 +3612,7 @@ function Indicator(_a) {
|
|
|
2721
3612
|
}
|
|
2722
3613
|
|
|
2723
3614
|
// src/components/ui/Timeline.tsx
|
|
2724
|
-
import { jsx as
|
|
3615
|
+
import { jsx as jsx48, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
2725
3616
|
function Timeline(_a) {
|
|
2726
3617
|
var _b = _a, {
|
|
2727
3618
|
events,
|
|
@@ -2732,15 +3623,15 @@ function Timeline(_a) {
|
|
|
2732
3623
|
"alternate",
|
|
2733
3624
|
"className"
|
|
2734
3625
|
]);
|
|
2735
|
-
return /* @__PURE__ */
|
|
3626
|
+
return /* @__PURE__ */ jsx48(
|
|
2736
3627
|
"ol",
|
|
2737
3628
|
__spreadProps(__spreadValues({
|
|
2738
3629
|
className: cn("relative space-y-8", className)
|
|
2739
3630
|
}, props), {
|
|
2740
3631
|
children: events.map((event, idx) => {
|
|
2741
3632
|
const align = alternate && idx % 2 !== 0 ? "lg:flex-row-reverse" : "";
|
|
2742
|
-
return /* @__PURE__ */
|
|
2743
|
-
/* @__PURE__ */
|
|
3633
|
+
return /* @__PURE__ */ jsxs42("li", { className: cn("relative flex gap-6", align), children: [
|
|
3634
|
+
/* @__PURE__ */ jsx48(
|
|
2744
3635
|
"div",
|
|
2745
3636
|
{
|
|
2746
3637
|
className: cn(
|
|
@@ -2750,12 +3641,12 @@ function Timeline(_a) {
|
|
|
2750
3641
|
children: event.icon
|
|
2751
3642
|
}
|
|
2752
3643
|
),
|
|
2753
|
-
/* @__PURE__ */
|
|
2754
|
-
/* @__PURE__ */
|
|
2755
|
-
/* @__PURE__ */
|
|
2756
|
-
event.time && /* @__PURE__ */
|
|
3644
|
+
/* @__PURE__ */ jsxs42("article", { className: "flex-1 rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph", children: [
|
|
3645
|
+
/* @__PURE__ */ jsxs42("div", { className: "flex flex-wrap items-baseline gap-3", children: [
|
|
3646
|
+
/* @__PURE__ */ jsx48("h4", { className: "text-base font-semibold text-ph-ink", children: event.title }),
|
|
3647
|
+
event.time && /* @__PURE__ */ jsx48("time", { className: "text-[11px] font-semibold uppercase tracking-wide text-ph-mutedtext", children: event.time })
|
|
2757
3648
|
] }),
|
|
2758
|
-
event.description && /* @__PURE__ */
|
|
3649
|
+
event.description && /* @__PURE__ */ jsx48("p", { className: "mt-2 text-sm text-ph-subtle", children: event.description })
|
|
2759
3650
|
] })
|
|
2760
3651
|
] }, event.id);
|
|
2761
3652
|
})
|
|
@@ -2791,6 +3682,7 @@ export {
|
|
|
2791
3682
|
IconRobot,
|
|
2792
3683
|
IconExclamation,
|
|
2793
3684
|
IconErrorOutline,
|
|
3685
|
+
IconInfo,
|
|
2794
3686
|
IconCancel,
|
|
2795
3687
|
IconCheckCircle,
|
|
2796
3688
|
IconArrowUp,
|
|
@@ -2831,9 +3723,23 @@ export {
|
|
|
2831
3723
|
IconToggle,
|
|
2832
3724
|
IconRocket,
|
|
2833
3725
|
IconTerminal,
|
|
3726
|
+
IconOldWindow,
|
|
3727
|
+
IconCommandCursor,
|
|
3728
|
+
IconDataReel,
|
|
3729
|
+
IconCodePreview,
|
|
3730
|
+
IconInsightBoard,
|
|
3731
|
+
IconEventStream,
|
|
3732
|
+
IconFeatureGate,
|
|
3733
|
+
IconReplayFrame,
|
|
3734
|
+
IconQueryStack,
|
|
3735
|
+
IconExperimentSplit,
|
|
3736
|
+
IconSurveyCard,
|
|
3737
|
+
OLD_UI_ICONS,
|
|
2834
3738
|
IconActivity,
|
|
2835
3739
|
IconFlask,
|
|
2836
3740
|
IconSpinner,
|
|
3741
|
+
CANONICAL_ICONS,
|
|
3742
|
+
PH_ICON_ALIASES,
|
|
2837
3743
|
PH_ICONS,
|
|
2838
3744
|
IconByName,
|
|
2839
3745
|
Alert,
|
|
@@ -2841,9 +3747,20 @@ export {
|
|
|
2841
3747
|
Card,
|
|
2842
3748
|
Drawer,
|
|
2843
3749
|
Kbd,
|
|
3750
|
+
Loader,
|
|
3751
|
+
Skeleton,
|
|
3752
|
+
LoadingState,
|
|
3753
|
+
AuthLayout,
|
|
3754
|
+
AuthCard,
|
|
3755
|
+
AuthDivider,
|
|
3756
|
+
SettingsNav,
|
|
3757
|
+
SettingsLayout,
|
|
2844
3758
|
DropdownMenu,
|
|
2845
3759
|
DropdownButton,
|
|
2846
3760
|
DropdownItem,
|
|
3761
|
+
DropdownRadioGroup,
|
|
3762
|
+
DropdownRadioItem,
|
|
3763
|
+
FormField,
|
|
2847
3764
|
Input,
|
|
2848
3765
|
Select,
|
|
2849
3766
|
Textarea,
|
|
@@ -2883,6 +3800,10 @@ export {
|
|
|
2883
3800
|
HoverCard,
|
|
2884
3801
|
EmptyState,
|
|
2885
3802
|
FilterChips,
|
|
3803
|
+
FilterBar,
|
|
3804
|
+
FilterMenu,
|
|
3805
|
+
SortMenu,
|
|
3806
|
+
FilterControls,
|
|
2886
3807
|
CodeBlock,
|
|
2887
3808
|
ComponentDocs,
|
|
2888
3809
|
ShowcaseWrapper,
|