ss6-futuristic-component 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## 1.1.0 (2026-10-11)
6
+
7
+ ### Features
8
+
9
+ - **Header:** new HUD title bar with a glowing title panel, interlocking shortcut tabs split around the title, `left` / `right` slots for your own components, and a CSS-only drop-down page list (yellow arrow) with tiles that light up on hover. `activeUrl` marks the current tab and page; `CustomComponent` accepts e.g. Next.js `Link`. Server component, no client JS.
10
+ - **Footer:** matching bottom bar with a flipped center panel, accent corner lines, yellow slashes and centered `text`.
11
+ - **Theme:** new `--yellow` / `--yellow-hi` tokens (secondary accent) for both light and dark.
12
+
13
+ ## 1.0.1 (2026-10-08)
14
+
15
+ ### Features
16
+
17
+ - **ProgressBar:** new component with `value`/`max`, `label`, `showValue` and `primary` | `info` | `success` | `warning` | `danger` colors; chamfered glass track with glowing fill.
18
+ - **Badge:** futuristic status chip (chamfered glass, status tint, pulsing glowing dot).
19
+ - **Confirmation:** dialog rebuilt from `Card` and `Button`, bundled status icons, frosted glass backdrop.
20
+ - **ThemeToggle:** checking it switches the page to dark (pure CSS, works in server components); an explicit `data-theme` on an ancestor still wins.
21
+ - **Button:** white text on filled buttons in light mode.
22
+
23
+ ### ⚠ Behavior changes
24
+
25
+ - **Light is now the default theme** (was dark). Set `data-theme="dark"` on `<html>`, or start a `ThemeToggle` with `defaultChecked`, to keep dark.
26
+ - `Confirmation` markup changed: the old `confirmation__card` / `baloon__*` classes are gone.
27
+
5
28
  ## 1.0.0 (2026-10-08)
6
29
 
7
30
  First release of `ss6-futuristic-component`, forked from `@safestrong/ppa-component-library` 1.11.1 and redesigned with a futuristic HUD look (glass panels, chamfered corners, glowing accents, navy/cyan palette with light theme via `data-theme`).
package/dist/index.d.mts CHANGED
@@ -132,11 +132,11 @@ declare function ThemeToggle(attr: Readonly<React.InputHTMLAttributes<HTMLInputE
132
132
 
133
133
  declare function Dashboard(): React.JSX.Element;
134
134
 
135
- declare function Badge({ text, type, className, }: {
135
+ declare function Badge({ text, type, className, }: Readonly<{
136
136
  text: string;
137
137
  type: "success" | "danger" | "warning" | "info";
138
138
  className?: string;
139
- }): React.JSX.Element;
139
+ }>): React.JSX.Element;
140
140
 
141
141
  declare function Skeleton({ className }: {
142
142
  className?: string;
@@ -155,6 +155,7 @@ declare namespace Navigation {
155
155
  }) => React.JSX.Element;
156
156
  }
157
157
 
158
+ type ConfirmationType = "info" | "warning" | "danger" | "success";
158
159
  declare function Confirmation({ type, text, title, secondaryAction, secondaryLabel, mainAction, mainLabel, }: {
159
160
  mainAction: () => void;
160
161
  secondaryAction?: () => void;
@@ -162,7 +163,49 @@ declare function Confirmation({ type, text, title, secondaryAction, secondaryLab
162
163
  secondaryLabel?: string;
163
164
  title: string;
164
165
  text: string;
165
- type?: "info" | "warning" | "danger" | "success";
166
+ type?: ConfirmationType;
166
167
  }): React.JSX.Element;
167
168
 
168
- export { Badge, Button, Card, Confirmation, Dashboard, Expandable, MultiSelect, NavTabClient, Navigation, SingleSelect, Skeleton, Slider, TextInput, ThemeToggle, Toast, Tooltip };
169
+ type ProgressBar = {
170
+ value: number;
171
+ max?: number;
172
+ label?: string;
173
+ showValue?: boolean;
174
+ color?: "primary" | "info" | "success" | "warning" | "danger";
175
+ className?: string;
176
+ };
177
+ declare function ProgressBar({ value, max, label, showValue, color, className, }: Readonly<ProgressBar>): React.JSX.Element;
178
+
179
+ type HeaderLink = {
180
+ label: string;
181
+ href: string;
182
+ };
183
+ type HeaderPage = HeaderLink & {
184
+ description?: string;
185
+ icon?: IconProp;
186
+ };
187
+ type Header = {
188
+ title: string;
189
+ /** shortcut tabs; first half sits left of the title, the rest on the right */
190
+ tabs?: HeaderLink[];
191
+ /** pages for the drop-down list (the yellow arrow appears only when given) */
192
+ pages?: HeaderPage[];
193
+ activeUrl?: string;
194
+ left?: React.ReactNode;
195
+ right?: React.ReactNode;
196
+ drawerTitle?: string;
197
+ /** link component, e.g. Next.js Link; defaults to <a> */
198
+ CustomComponent?: React.ElementType;
199
+ /** id of the hidden toggle; change it if a page renders more than one Header */
200
+ menuId?: string;
201
+ className?: string;
202
+ };
203
+ declare function Header({ title, tabs, pages, activeUrl, left, right, drawerTitle, CustomComponent, menuId, className, }: Readonly<Header>): React.JSX.Element;
204
+
205
+ type Footer = {
206
+ text: React.ReactNode;
207
+ className?: string;
208
+ };
209
+ declare function Footer({ text, className }: Readonly<Footer>): React.JSX.Element;
210
+
211
+ export { Badge, Button, Card, Confirmation, Dashboard, Expandable, Footer, Header, MultiSelect, NavTabClient, Navigation, ProgressBar, SingleSelect, Skeleton, Slider, TextInput, ThemeToggle, Toast, Tooltip };
package/dist/index.d.ts CHANGED
@@ -132,11 +132,11 @@ declare function ThemeToggle(attr: Readonly<React.InputHTMLAttributes<HTMLInputE
132
132
 
133
133
  declare function Dashboard(): React.JSX.Element;
134
134
 
135
- declare function Badge({ text, type, className, }: {
135
+ declare function Badge({ text, type, className, }: Readonly<{
136
136
  text: string;
137
137
  type: "success" | "danger" | "warning" | "info";
138
138
  className?: string;
139
- }): React.JSX.Element;
139
+ }>): React.JSX.Element;
140
140
 
141
141
  declare function Skeleton({ className }: {
142
142
  className?: string;
@@ -155,6 +155,7 @@ declare namespace Navigation {
155
155
  }) => React.JSX.Element;
156
156
  }
157
157
 
158
+ type ConfirmationType = "info" | "warning" | "danger" | "success";
158
159
  declare function Confirmation({ type, text, title, secondaryAction, secondaryLabel, mainAction, mainLabel, }: {
159
160
  mainAction: () => void;
160
161
  secondaryAction?: () => void;
@@ -162,7 +163,49 @@ declare function Confirmation({ type, text, title, secondaryAction, secondaryLab
162
163
  secondaryLabel?: string;
163
164
  title: string;
164
165
  text: string;
165
- type?: "info" | "warning" | "danger" | "success";
166
+ type?: ConfirmationType;
166
167
  }): React.JSX.Element;
167
168
 
168
- export { Badge, Button, Card, Confirmation, Dashboard, Expandable, MultiSelect, NavTabClient, Navigation, SingleSelect, Skeleton, Slider, TextInput, ThemeToggle, Toast, Tooltip };
169
+ type ProgressBar = {
170
+ value: number;
171
+ max?: number;
172
+ label?: string;
173
+ showValue?: boolean;
174
+ color?: "primary" | "info" | "success" | "warning" | "danger";
175
+ className?: string;
176
+ };
177
+ declare function ProgressBar({ value, max, label, showValue, color, className, }: Readonly<ProgressBar>): React.JSX.Element;
178
+
179
+ type HeaderLink = {
180
+ label: string;
181
+ href: string;
182
+ };
183
+ type HeaderPage = HeaderLink & {
184
+ description?: string;
185
+ icon?: IconProp;
186
+ };
187
+ type Header = {
188
+ title: string;
189
+ /** shortcut tabs; first half sits left of the title, the rest on the right */
190
+ tabs?: HeaderLink[];
191
+ /** pages for the drop-down list (the yellow arrow appears only when given) */
192
+ pages?: HeaderPage[];
193
+ activeUrl?: string;
194
+ left?: React.ReactNode;
195
+ right?: React.ReactNode;
196
+ drawerTitle?: string;
197
+ /** link component, e.g. Next.js Link; defaults to <a> */
198
+ CustomComponent?: React.ElementType;
199
+ /** id of the hidden toggle; change it if a page renders more than one Header */
200
+ menuId?: string;
201
+ className?: string;
202
+ };
203
+ declare function Header({ title, tabs, pages, activeUrl, left, right, drawerTitle, CustomComponent, menuId, className, }: Readonly<Header>): React.JSX.Element;
204
+
205
+ type Footer = {
206
+ text: React.ReactNode;
207
+ className?: string;
208
+ };
209
+ declare function Footer({ text, className }: Readonly<Footer>): React.JSX.Element;
210
+
211
+ export { Badge, Button, Card, Confirmation, Dashboard, Expandable, Footer, Header, MultiSelect, NavTabClient, Navigation, ProgressBar, SingleSelect, Skeleton, Slider, TextInput, ThemeToggle, Toast, Tooltip };
package/dist/index.js CHANGED
@@ -65,9 +65,12 @@ __export(index_exports, {
65
65
  Confirmation: () => Confirmation,
66
66
  Dashboard: () => Dashboard,
67
67
  Expandable: () => Expandable,
68
+ Footer: () => Footer2,
69
+ Header: () => Header,
68
70
  MultiSelect: () => MultiSelect,
69
71
  NavTabClient: () => NavTabClient,
70
72
  Navigation: () => Navigation,
73
+ ProgressBar: () => ProgressBar,
71
74
  SingleSelect: () => SingleSelect,
72
75
  Skeleton: () => Skeleton,
73
76
  Slider: () => Slider,
@@ -431,7 +434,7 @@ var icon_success_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/200
431
434
 
432
435
  // src/components/Toast.tsx
433
436
  var import_react_fontawesome6 = require("@fortawesome/react-fontawesome");
434
- var icons = {
437
+ var statusIcons = {
435
438
  info: icon_info_default,
436
439
  warning: icon_warning_default,
437
440
  success: icon_success_default,
@@ -443,7 +446,7 @@ function Toast({
443
446
  type = "info",
444
447
  className
445
448
  }) {
446
- return /* @__PURE__ */ import_react8.default.createElement("div", { className: `toast__wrapper ft ft--${type} ${className != null ? className : ""}` }, /* @__PURE__ */ import_react8.default.createElement("span", { className: "ft__corner ft__corner--tl", "aria-hidden": "true" }), /* @__PURE__ */ import_react8.default.createElement("span", { className: "ft__corner ft__corner--tr", "aria-hidden": "true" }), /* @__PURE__ */ import_react8.default.createElement("div", { className: "ft__body" }, /* @__PURE__ */ import_react8.default.createElement("img", { src: icons[type], alt: "", className: "ft__icon" }), /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement("p", { className: "ft__title" }, title), /* @__PURE__ */ import_react8.default.createElement("p", { className: "ft__desc" }, description))), /* @__PURE__ */ import_react8.default.createElement("p", { className: "ft__bar toast-bar-animate" }));
449
+ return /* @__PURE__ */ import_react8.default.createElement("div", { className: `toast__wrapper ft ft--${type} ${className != null ? className : ""}` }, /* @__PURE__ */ import_react8.default.createElement("span", { className: "ft__corner ft__corner--tl", "aria-hidden": "true" }), /* @__PURE__ */ import_react8.default.createElement("span", { className: "ft__corner ft__corner--tr", "aria-hidden": "true" }), /* @__PURE__ */ import_react8.default.createElement("div", { className: "ft__body" }, /* @__PURE__ */ import_react8.default.createElement("img", { src: statusIcons[type], alt: "", className: "ft__icon" }), /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement("p", { className: "ft__title" }, title), /* @__PURE__ */ import_react8.default.createElement("p", { className: "ft__desc" }, description))), /* @__PURE__ */ import_react8.default.createElement("p", { className: "ft__bar toast-bar-animate" }));
447
450
  }
448
451
  var Inline = ({
449
452
  className,
@@ -451,7 +454,7 @@ var Inline = ({
451
454
  type,
452
455
  icon = void 0
453
456
  }) => {
454
- return /* @__PURE__ */ import_react8.default.createElement("div", { className: `ft-inline ft--${type} ${className != null ? className : ""}` }, icon ? /* @__PURE__ */ import_react8.default.createElement(import_react_fontawesome6.FontAwesomeIcon, { icon, className: "ft-inline__fa" }) : /* @__PURE__ */ import_react8.default.createElement("img", { src: icons[type], alt: "", className: "ft-inline__icon" }), /* @__PURE__ */ import_react8.default.createElement("p", null, text));
457
+ return /* @__PURE__ */ import_react8.default.createElement("div", { className: `ft-inline ft--${type} ${className != null ? className : ""}` }, icon ? /* @__PURE__ */ import_react8.default.createElement(import_react_fontawesome6.FontAwesomeIcon, { icon, className: "ft-inline__fa" }) : /* @__PURE__ */ import_react8.default.createElement("img", { src: statusIcons[type], alt: "", className: "ft-inline__icon" }), /* @__PURE__ */ import_react8.default.createElement("p", null, text));
455
458
  };
456
459
  Toast.Inline = Inline;
457
460
 
@@ -593,16 +596,7 @@ function Badge({
593
596
  type,
594
597
  className
595
598
  }) {
596
- return /* @__PURE__ */ import_react13.default.createElement("div", { className: "badge__wrapper" }, /* @__PURE__ */ import_react13.default.createElement(
597
- "span",
598
- {
599
- style: {
600
- background: `var(--ss6f-color-${type})`
601
- },
602
- className: `badge ${className}`
603
- },
604
- text
605
- ));
599
+ return /* @__PURE__ */ import_react13.default.createElement("div", { className: "badge__wrapper" }, /* @__PURE__ */ import_react13.default.createElement("span", { className: `fb ft--${type} ${className != null ? className : ""}` }, text));
606
600
  }
607
601
 
608
602
  // src/components/Skeleton.tsx
@@ -637,6 +631,12 @@ Navigation.URL = URLNavigation;
637
631
 
638
632
  // src/components/Confirmation.tsx
639
633
  var import_react16 = __toESM(require("react"));
634
+ var buttonColor = {
635
+ info: "info",
636
+ warning: "warn",
637
+ danger: "danger",
638
+ success: "success"
639
+ };
640
640
  function Confirmation({
641
641
  type = "warning",
642
642
  text,
@@ -646,30 +646,207 @@ function Confirmation({
646
646
  mainAction,
647
647
  mainLabel = "Ya"
648
648
  }) {
649
- return /* @__PURE__ */ import_react16.default.createElement("div", { className: "confirmation__outer" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "confirmation__card" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: wrapper }, /* @__PURE__ */ import_react16.default.createElement("div", { className: `baloon__${type} baloon` }), /* @__PURE__ */ import_react16.default.createElement("div", null, /* @__PURE__ */ import_react16.default.createElement("h3", { className: "font-semibold" }, title), /* @__PURE__ */ import_react16.default.createElement("p", { className: confirmation__text }, text))), /* @__PURE__ */ import_react16.default.createElement("div", { className: "confirmation__footer" }, secondaryAction && /* @__PURE__ */ import_react16.default.createElement(
650
- "button",
649
+ return /* @__PURE__ */ import_react16.default.createElement("div", { className: "confirmation__outer" }, /* @__PURE__ */ import_react16.default.createElement(
650
+ Card,
651
651
  {
652
- onClick: secondaryAction,
653
- type: "button",
654
- className: "cursor-pointer",
655
- style: { color: `var(--ss6f-color-${type})` }
652
+ title,
653
+ cardClass: "fc",
654
+ footer: /* @__PURE__ */ import_react16.default.createElement("div", { className: "fc__actions" }, secondaryAction && /* @__PURE__ */ import_react16.default.createElement(
655
+ Button,
656
+ {
657
+ type: "button",
658
+ btnType: "outline",
659
+ color: buttonColor[type],
660
+ label: secondaryLabel,
661
+ onClick: secondaryAction
662
+ }
663
+ ), /* @__PURE__ */ import_react16.default.createElement(
664
+ Button,
665
+ {
666
+ type: "button",
667
+ btnType: "primary",
668
+ color: buttonColor[type],
669
+ label: mainLabel,
670
+ onClick: mainAction
671
+ }
672
+ ))
656
673
  },
657
- secondaryLabel
658
- ), /* @__PURE__ */ import_react16.default.createElement(
659
- "button",
674
+ /* @__PURE__ */ import_react16.default.createElement("div", { className: "fc__content" }, /* @__PURE__ */ import_react16.default.createElement("img", { src: statusIcons[type], alt: "", className: "fc__icon" }), /* @__PURE__ */ import_react16.default.createElement("p", null, text))
675
+ ));
676
+ }
677
+
678
+ // src/components/ProgressBar.tsx
679
+ var import_react17 = __toESM(require("react"));
680
+ function ProgressBar({
681
+ value,
682
+ max = 100,
683
+ label,
684
+ showValue = true,
685
+ color = "primary",
686
+ className = ""
687
+ }) {
688
+ const percent = Math.min(100, Math.max(0, Math.round(value / max * 100)));
689
+ const colorClass = color === "primary" ? "" : `ft--${color}`;
690
+ return /* @__PURE__ */ import_react17.default.createElement("div", { className: `fp ${colorClass} ${className}` }, (label || showValue) && /* @__PURE__ */ import_react17.default.createElement("div", { className: "fp__head" }, /* @__PURE__ */ import_react17.default.createElement("span", { className: "fp__label" }, label), showValue && /* @__PURE__ */ import_react17.default.createElement("span", { className: "fp__value" }, percent, "%")), /* @__PURE__ */ import_react17.default.createElement(
691
+ "div",
660
692
  {
661
- onClick: mainAction,
662
- className: "cursor-pointer btn__primary min-w-[8rem]",
663
- style: {
664
- background: `var(--ss6f-color-${type})`,
665
- border: `1px solid var(--ss6f-color-${type})`
693
+ role: "progressbar",
694
+ "aria-label": label,
695
+ "aria-valuemin": 0,
696
+ "aria-valuemax": 100,
697
+ className: "fp__track",
698
+ "aria-valuenow": percent
699
+ },
700
+ /* @__PURE__ */ import_react17.default.createElement("div", { className: "fp__fill", style: { width: `${percent}%` } })
701
+ ));
702
+ }
703
+
704
+ // src/components/Header.tsx
705
+ var import_react18 = __toESM(require("react"));
706
+ var import_react_fontawesome10 = require("@fortawesome/react-fontawesome");
707
+ function Header({
708
+ title,
709
+ tabs = [],
710
+ pages = [],
711
+ activeUrl,
712
+ left: left2,
713
+ right: right2,
714
+ drawerTitle = "All Pages",
715
+ CustomComponent,
716
+ menuId = "ph-menu",
717
+ className = ""
718
+ }) {
719
+ const Link = CustomComponent || "a";
720
+ const current = (href) => href === activeUrl ? "page" : void 0;
721
+ const half = Math.ceil(tabs.length / 2);
722
+ const renderTabs = (list2, side) => /* @__PURE__ */ import_react18.default.createElement("nav", { className: `ph__tabs ph__tabs--${side}`, "aria-label": "Shortcuts" }, list2.map(({ label, href }) => /* @__PURE__ */ import_react18.default.createElement(
723
+ Link,
724
+ {
725
+ key: href,
726
+ href,
727
+ "aria-current": current(href),
728
+ className: `ph-tab ${side === "r" ? "ph-tab--r" : ""}`
729
+ },
730
+ label
731
+ )));
732
+ return /* @__PURE__ */ import_react18.default.createElement("header", { className: `ph ${className}` }, /* @__PURE__ */ import_react18.default.createElement(
733
+ "svg",
734
+ {
735
+ className: "ph__deco",
736
+ width: "840",
737
+ height: "64",
738
+ viewBox: "300 0 840 64",
739
+ fill: "none",
740
+ "aria-hidden": "true"
741
+ },
742
+ /* @__PURE__ */ import_react18.default.createElement("defs", null, /* @__PURE__ */ import_react18.default.createElement("linearGradient", { id: "ph-title", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "0", className: "ph__stop-panel-top" }), /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "1", className: "ph__stop-panel-bottom" })), /* @__PURE__ */ import_react18.default.createElement("linearGradient", { id: "ph-inner", x1: "0", y1: "1", x2: "0", y2: "0" }, /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "0", className: "ph__stop-accent", stopOpacity: ".32" }), /* @__PURE__ */ import_react18.default.createElement("stop", { offset: ".6", className: "ph__stop-accent", stopOpacity: "0" })), /* @__PURE__ */ import_react18.default.createElement("linearGradient", { id: "ph-fadeL", x1: "0", y1: "0", x2: "1", y2: "0" }, /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "0", className: "ph__stop-yellow", stopOpacity: "0" }), /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "1", className: "ph__stop-yellow" })), /* @__PURE__ */ import_react18.default.createElement("linearGradient", { id: "ph-fadeR", x1: "1", y1: "0", x2: "0", y2: "0" }, /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "0", className: "ph__stop-yellow", stopOpacity: "0" }), /* @__PURE__ */ import_react18.default.createElement("stop", { offset: "1", className: "ph__stop-yellow" }))),
743
+ /* @__PURE__ */ import_react18.default.createElement("path", { d: "M540 0H900L866 56H574Z", fill: "url(#ph-title)" }),
744
+ /* @__PURE__ */ import_react18.default.createElement("path", { d: "M540 0H900L866 56H574Z", fill: "url(#ph-inner)" }),
745
+ /* @__PURE__ */ import_react18.default.createElement(
746
+ "path",
747
+ {
748
+ className: "ph__deco-corners",
749
+ d: "M562 35L574.5 55H612 M878 35L865.5 55H828",
750
+ strokeWidth: "2.5",
751
+ strokeLinejoin: "round",
752
+ strokeLinecap: "round"
666
753
  }
754
+ ),
755
+ /* @__PURE__ */ import_react18.default.createElement(
756
+ "path",
757
+ {
758
+ d: "M312 40l8-14 M322 40l8-14 M332 40l8-14 M342 40l8-14 M352 40l8-14",
759
+ stroke: "url(#ph-fadeL)",
760
+ strokeWidth: "3"
761
+ }
762
+ ),
763
+ /* @__PURE__ */ import_react18.default.createElement(
764
+ "path",
765
+ {
766
+ d: "M1128 40l-8-14 M1118 40l-8-14 M1108 40l-8-14 M1098 40l-8-14 M1088 40l-8-14",
767
+ stroke: "url(#ph-fadeR)",
768
+ strokeWidth: "3"
769
+ }
770
+ )
771
+ ), /* @__PURE__ */ import_react18.default.createElement("h1", { className: "ph__title" }, title), tabs.length > 0 && renderTabs(tabs.slice(0, half), "l"), tabs.length > 1 && renderTabs(tabs.slice(half), "r"), left2 && /* @__PURE__ */ import_react18.default.createElement("div", { className: "ph__slot ph__slot--left" }, left2), right2 && /* @__PURE__ */ import_react18.default.createElement("div", { className: "ph__slot ph__slot--right" }, right2), pages.length > 0 && /* @__PURE__ */ import_react18.default.createElement(import_react18.default.Fragment, null, /* @__PURE__ */ import_react18.default.createElement(
772
+ "input",
773
+ {
774
+ id: menuId,
775
+ type: "checkbox",
776
+ className: "ph__toggle",
777
+ "aria-label": "Show all pages"
778
+ }
779
+ ), /* @__PURE__ */ import_react18.default.createElement("span", { className: "ph__arrow-glow" }, /* @__PURE__ */ import_react18.default.createElement(
780
+ "label",
781
+ {
782
+ htmlFor: menuId,
783
+ className: "ph__arrow",
784
+ "aria-hidden": "true"
785
+ }
786
+ )), /* @__PURE__ */ import_react18.default.createElement("div", { className: "ph__drawer" }, /* @__PURE__ */ import_react18.default.createElement(
787
+ "label",
788
+ {
789
+ htmlFor: menuId,
790
+ className: "ph__backdrop",
791
+ "aria-hidden": "true"
792
+ }
793
+ ), /* @__PURE__ */ import_react18.default.createElement("section", { className: "ph__panel", "aria-label": drawerTitle }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "ph__panel-head" }, /* @__PURE__ */ import_react18.default.createElement("div", null, /* @__PURE__ */ import_react18.default.createElement("span", { className: "ph__kicker" }, "// NAVIGATE"), /* @__PURE__ */ import_react18.default.createElement("h2", { className: "ph__panel-title" }, drawerTitle)), /* @__PURE__ */ import_react18.default.createElement("span", { className: "ph__count" }, String(pages.length).padStart(2, "0"), " PAGES")), /* @__PURE__ */ import_react18.default.createElement("div", { className: "ph__grid" }, pages.map(({ label, href, description, icon }) => /* @__PURE__ */ import_react18.default.createElement(
794
+ Link,
795
+ {
796
+ key: href,
797
+ href,
798
+ "aria-current": current(href),
799
+ className: "ph-page"
667
800
  },
668
- mainLabel
669
- ))));
801
+ icon && /* @__PURE__ */ import_react18.default.createElement("span", { className: "ph-page__icon" }, /* @__PURE__ */ import_react18.default.createElement(import_react_fontawesome10.FontAwesomeIcon, { icon })),
802
+ /* @__PURE__ */ import_react18.default.createElement("span", null, /* @__PURE__ */ import_react18.default.createElement("span", { className: "ph-page__name" }, label), description && /* @__PURE__ */ import_react18.default.createElement("span", { className: "ph-page__desc" }, description))
803
+ )))))));
804
+ }
805
+
806
+ // src/components/Footer.tsx
807
+ var import_react19 = __toESM(require("react"));
808
+ function Footer2({ text, className = "" }) {
809
+ return /* @__PURE__ */ import_react19.default.createElement("footer", { className: `pf ${className}` }, /* @__PURE__ */ import_react19.default.createElement(
810
+ "svg",
811
+ {
812
+ className: "pf__deco",
813
+ width: "480",
814
+ height: "40",
815
+ viewBox: "480 0 480 40",
816
+ fill: "none",
817
+ "aria-hidden": "true"
818
+ },
819
+ /* @__PURE__ */ import_react19.default.createElement("defs", null, /* @__PURE__ */ import_react19.default.createElement("linearGradient", { id: "pf-panel", x1: "0", y1: "1", x2: "0", y2: "0" }, /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "0", className: "ph__stop-panel-top" }), /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "1", className: "ph__stop-panel-bottom" })), /* @__PURE__ */ import_react19.default.createElement("linearGradient", { id: "pf-inner", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "0", className: "ph__stop-accent", stopOpacity: ".28" }), /* @__PURE__ */ import_react19.default.createElement("stop", { offset: ".6", className: "ph__stop-accent", stopOpacity: "0" })), /* @__PURE__ */ import_react19.default.createElement("linearGradient", { id: "pf-fadeL", x1: "0", y1: "0", x2: "1", y2: "0" }, /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "0", className: "ph__stop-yellow", stopOpacity: "0" }), /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "1", className: "ph__stop-yellow" })), /* @__PURE__ */ import_react19.default.createElement("linearGradient", { id: "pf-fadeR", x1: "1", y1: "0", x2: "0", y2: "0" }, /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "0", className: "ph__stop-yellow", stopOpacity: "0" }), /* @__PURE__ */ import_react19.default.createElement("stop", { offset: "1", className: "ph__stop-yellow" }))),
820
+ /* @__PURE__ */ import_react19.default.createElement("path", { d: "M560 40H880L860 8H580Z", fill: "url(#pf-panel)" }),
821
+ /* @__PURE__ */ import_react19.default.createElement("path", { d: "M560 40H880L860 8H580Z", fill: "url(#pf-inner)" }),
822
+ /* @__PURE__ */ import_react19.default.createElement(
823
+ "path",
824
+ {
825
+ className: "ph__deco-corners",
826
+ d: "M572 21L580.5 8.5H612 M868 21L859.5 8.5H828",
827
+ strokeWidth: "2.5",
828
+ strokeLinejoin: "round",
829
+ strokeLinecap: "round"
830
+ }
831
+ ),
832
+ /* @__PURE__ */ import_react19.default.createElement(
833
+ "path",
834
+ {
835
+ d: "M492 13l8 14 M502 13l8 14 M512 13l8 14 M522 13l8 14 M532 13l8 14",
836
+ stroke: "url(#pf-fadeL)",
837
+ strokeWidth: "3"
838
+ }
839
+ ),
840
+ /* @__PURE__ */ import_react19.default.createElement(
841
+ "path",
842
+ {
843
+ d: "M948 13l-8 14 M938 13l-8 14 M928 13l-8 14 M918 13l-8 14 M908 13l-8 14",
844
+ stroke: "url(#pf-fadeR)",
845
+ strokeWidth: "3"
846
+ }
847
+ )
848
+ ), /* @__PURE__ */ import_react19.default.createElement("p", { className: "pf__text" }, text));
670
849
  }
671
- var wrapper = "pt-[0.5rem] pb-[1rem] px-[1.8rem] grid items-center gap-[1.5rem]";
672
- var confirmation__text = "mt-[0.7rem] w-[90%] text-[var(--ss6f-color-text-secondary)]";
673
850
  // Annotate the CommonJS export names for ESM import in node:
674
851
  0 && (module.exports = {
675
852
  Badge,
@@ -678,9 +855,12 @@ var confirmation__text = "mt-[0.7rem] w-[90%] text-[var(--ss6f-color-text-second
678
855
  Confirmation,
679
856
  Dashboard,
680
857
  Expandable,
858
+ Footer,
859
+ Header,
681
860
  MultiSelect,
682
861
  NavTabClient,
683
862
  Navigation,
863
+ ProgressBar,
684
864
  SingleSelect,
685
865
  Skeleton,
686
866
  Slider,