@pglevy/sailwind 0.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.
Files changed (146) hide show
  1. package/README.md +219 -0
  2. package/dist/components/Button/ButtonArrayLayout.d.ts +37 -0
  3. package/dist/components/Button/ButtonArrayLayout.d.ts.map +1 -0
  4. package/dist/components/Button/ButtonArrayLayout.js +42 -0
  5. package/dist/components/Button/ButtonWidget.d.ts +75 -0
  6. package/dist/components/Button/ButtonWidget.d.ts.map +1 -0
  7. package/dist/components/Button/ButtonWidget.js +101 -0
  8. package/dist/components/Button/index.d.ts +5 -0
  9. package/dist/components/Button/index.d.ts.map +1 -0
  10. package/dist/components/Card/CardLayout.d.ts +55 -0
  11. package/dist/components/Card/CardLayout.d.ts.map +1 -0
  12. package/dist/components/Card/CardLayout.js +139 -0
  13. package/dist/components/Card/index.d.ts +3 -0
  14. package/dist/components/Card/index.d.ts.map +1 -0
  15. package/dist/components/Checkbox/CheckboxField.d.ts +65 -0
  16. package/dist/components/Checkbox/CheckboxField.d.ts.map +1 -0
  17. package/dist/components/Checkbox/CheckboxField.js +136 -0
  18. package/dist/components/Checkbox/index.d.ts +3 -0
  19. package/dist/components/Checkbox/index.d.ts.map +1 -0
  20. package/dist/components/Dialog/DialogField.d.ts +51 -0
  21. package/dist/components/Dialog/DialogField.d.ts.map +1 -0
  22. package/dist/components/Dialog/DialogField.js +113 -0
  23. package/dist/components/Dialog/index.d.ts +3 -0
  24. package/dist/components/Dialog/index.d.ts.map +1 -0
  25. package/dist/components/Dropdown/DropdownField.d.ts +87 -0
  26. package/dist/components/Dropdown/DropdownField.d.ts.map +1 -0
  27. package/dist/components/Dropdown/DropdownField.js +7 -0
  28. package/dist/components/Dropdown/DropdownFieldBase.d.ts +54 -0
  29. package/dist/components/Dropdown/DropdownFieldBase.d.ts.map +1 -0
  30. package/dist/components/Dropdown/DropdownFieldBase.js +183 -0
  31. package/dist/components/Dropdown/MultipleDropdownField.d.ts +85 -0
  32. package/dist/components/Dropdown/MultipleDropdownField.d.ts.map +1 -0
  33. package/dist/components/Dropdown/MultipleDropdownField.js +7 -0
  34. package/dist/components/Dropdown/index.d.ts +5 -0
  35. package/dist/components/Dropdown/index.d.ts.map +1 -0
  36. package/dist/components/Heading/HeadingField.d.ts +48 -0
  37. package/dist/components/Heading/HeadingField.d.ts.map +1 -0
  38. package/dist/components/Heading/HeadingField.js +103 -0
  39. package/dist/components/Heading/index.d.ts +3 -0
  40. package/dist/components/Heading/index.d.ts.map +1 -0
  41. package/dist/components/Image/DocumentImage.d.ts +20 -0
  42. package/dist/components/Image/DocumentImage.d.ts.map +1 -0
  43. package/dist/components/Image/ImageField.d.ts +42 -0
  44. package/dist/components/Image/ImageField.d.ts.map +1 -0
  45. package/dist/components/Image/ImageField.js +159 -0
  46. package/dist/components/Image/UserImage.d.ts +49 -0
  47. package/dist/components/Image/UserImage.d.ts.map +1 -0
  48. package/dist/components/Image/index.d.ts +5 -0
  49. package/dist/components/Image/index.d.ts.map +1 -0
  50. package/dist/components/MessageBanner/MessageBanner.d.ts +33 -0
  51. package/dist/components/MessageBanner/MessageBanner.d.ts.map +1 -0
  52. package/dist/components/MessageBanner/MessageBanner.js +97 -0
  53. package/dist/components/MessageBanner/index.d.ts +2 -0
  54. package/dist/components/MessageBanner/index.d.ts.map +1 -0
  55. package/dist/components/Milestone/MilestoneField.d.ts +50 -0
  56. package/dist/components/Milestone/MilestoneField.d.ts.map +1 -0
  57. package/dist/components/Milestone/MilestoneField.js +206 -0
  58. package/dist/components/Milestone/index.d.ts +3 -0
  59. package/dist/components/Milestone/index.d.ts.map +1 -0
  60. package/dist/components/ProgressBar/ProgressBar.d.ts +32 -0
  61. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -0
  62. package/dist/components/ProgressBar/ProgressBar.js +117 -0
  63. package/dist/components/ProgressBar/index.d.ts +2 -0
  64. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  65. package/dist/components/RadioButton/RadioButtonField.d.ts +63 -0
  66. package/dist/components/RadioButton/RadioButtonField.d.ts.map +1 -0
  67. package/dist/components/RadioButton/RadioButtonField.js +128 -0
  68. package/dist/components/RadioButton/index.d.ts +3 -0
  69. package/dist/components/RadioButton/index.d.ts.map +1 -0
  70. package/dist/components/RichText/Icon.d.ts +28 -0
  71. package/dist/components/RichText/Icon.d.ts.map +1 -0
  72. package/dist/components/RichText/Icon.js +94 -0
  73. package/dist/components/RichText/RichTextDisplayField.d.ts +36 -0
  74. package/dist/components/RichText/RichTextDisplayField.d.ts.map +1 -0
  75. package/dist/components/RichText/RichTextDisplayField.js +79 -0
  76. package/dist/components/RichText/TextItem.d.ts +27 -0
  77. package/dist/components/RichText/TextItem.d.ts.map +1 -0
  78. package/dist/components/RichText/TextItem.js +58 -0
  79. package/dist/components/RichText/index.d.ts +7 -0
  80. package/dist/components/RichText/index.d.ts.map +1 -0
  81. package/dist/components/Slider/SliderField.d.ts +63 -0
  82. package/dist/components/Slider/SliderField.d.ts.map +1 -0
  83. package/dist/components/Slider/SliderField.js +164 -0
  84. package/dist/components/Slider/index.d.ts +3 -0
  85. package/dist/components/Slider/index.d.ts.map +1 -0
  86. package/dist/components/Stamp/StampField.d.ts +48 -0
  87. package/dist/components/Stamp/StampField.d.ts.map +1 -0
  88. package/dist/components/Stamp/StampField.js +173 -0
  89. package/dist/components/Stamp/index.d.ts +3 -0
  90. package/dist/components/Stamp/index.d.ts.map +1 -0
  91. package/dist/components/Switch/SwitchField.d.ts +49 -0
  92. package/dist/components/Switch/SwitchField.d.ts.map +1 -0
  93. package/dist/components/Switch/SwitchField.js +106 -0
  94. package/dist/components/Switch/index.d.ts +3 -0
  95. package/dist/components/Switch/index.d.ts.map +1 -0
  96. package/dist/components/TableOfContents.d.ts +2 -0
  97. package/dist/components/TableOfContents.d.ts.map +1 -0
  98. package/dist/components/TableOfContents.js +142 -0
  99. package/dist/components/Tabs/TabsField.d.ts +50 -0
  100. package/dist/components/Tabs/TabsField.d.ts.map +1 -0
  101. package/dist/components/Tabs/TabsField.js +96 -0
  102. package/dist/components/Tabs/index.d.ts +3 -0
  103. package/dist/components/Tabs/index.d.ts.map +1 -0
  104. package/dist/components/Tag/TagField.d.ts +52 -0
  105. package/dist/components/Tag/TagField.d.ts.map +1 -0
  106. package/dist/components/Tag/TagField.js +125 -0
  107. package/dist/components/Tag/TagItem.d.ts +26 -0
  108. package/dist/components/Tag/TagItem.d.ts.map +1 -0
  109. package/dist/components/Tag/TagItem.js +4 -0
  110. package/dist/components/Tag/index.d.ts +5 -0
  111. package/dist/components/Tag/index.d.ts.map +1 -0
  112. package/dist/components/TextField/TextField.d.ts +88 -0
  113. package/dist/components/TextField/TextField.d.ts.map +1 -0
  114. package/dist/components/TextField/TextField.js +113 -0
  115. package/dist/components/TextField/index.d.ts +3 -0
  116. package/dist/components/TextField/index.d.ts.map +1 -0
  117. package/dist/components/Toggle/ToggleField.d.ts +62 -0
  118. package/dist/components/Toggle/ToggleField.d.ts.map +1 -0
  119. package/dist/components/Toggle/ToggleField.js +126 -0
  120. package/dist/components/Toggle/index.d.ts +3 -0
  121. package/dist/components/Toggle/index.d.ts.map +1 -0
  122. package/dist/components/index.d.ts +22 -0
  123. package/dist/components/index.d.ts.map +1 -0
  124. package/dist/components/shared/CollapsibleSection.d.ts +9 -0
  125. package/dist/components/shared/CollapsibleSection.d.ts.map +1 -0
  126. package/dist/components/shared/CollapsibleSection.js +39 -0
  127. package/dist/components/shared/FieldLabel.d.ts +27 -0
  128. package/dist/components/shared/FieldLabel.d.ts.map +1 -0
  129. package/dist/components/shared/FieldLabel.js +40 -0
  130. package/dist/components/shared/FieldWrapper.d.ts +35 -0
  131. package/dist/components/shared/FieldWrapper.d.ts.map +1 -0
  132. package/dist/components/shared/FieldWrapper.js +71 -0
  133. package/dist/components/shared/index.d.ts +6 -0
  134. package/dist/components/shared/index.d.ts.map +1 -0
  135. package/dist/esg_world_logo_no_year.png +0 -0
  136. package/dist/index.d.ts +11 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +58 -0
  139. package/dist/types/sail.d.ts +37 -0
  140. package/dist/types/sail.d.ts.map +1 -0
  141. package/dist/uifaces-human-avatar.jpg +0 -0
  142. package/dist/utils/classNames.d.ts +21 -0
  143. package/dist/utils/classNames.d.ts.map +1 -0
  144. package/dist/utils/classNames.js +16 -0
  145. package/dist/vite.svg +1 -0
  146. package/package.json +85 -0
@@ -0,0 +1,7 @@
1
+ export { RichTextDisplayField } from './RichTextDisplayField';
2
+ export { TextItem } from './TextItem';
3
+ export { Icon } from './Icon';
4
+ export type { RichTextDisplayFieldProps } from './RichTextDisplayField';
5
+ export type { TextItemProps } from './TextItem';
6
+ export type { IconProps } from './Icon';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichText/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AACvE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,63 @@
1
+ import { SAILLabelPosition, SAILMarginSize, SAILSize } from '../../types/sail';
2
+ import * as React from 'react';
3
+ type SliderOrientation = "HORIZONTAL" | "VERTICAL";
4
+ /**
5
+ * Displays a slider for numeric range input
6
+ * Inspired by SAIL form field patterns (not an official SAIL component)
7
+ *
8
+ * This is a "new SAIL" component - not available in public SAIL but follows
9
+ * the same conventions and patterns for consistency with other Sailwind components.
10
+ */
11
+ export interface SliderFieldProps {
12
+ /** Text to display as the field label */
13
+ label?: string;
14
+ /** Supplemental text about this field */
15
+ instructions?: string;
16
+ /** Determines if a value is required to submit the form */
17
+ required?: boolean;
18
+ /** Determines if the field should display as grayed out */
19
+ disabled?: boolean;
20
+ /** Current value(s) - single number for single slider, array for range */
21
+ value?: number | number[];
22
+ /** Minimum value */
23
+ min?: number;
24
+ /** Maximum value */
25
+ max?: number;
26
+ /** Step increment */
27
+ step?: number;
28
+ /** Validation errors to display below the field */
29
+ validations?: string[];
30
+ /** Callback when the user changes the slider value */
31
+ saveInto?: (value: number | number[]) => void;
32
+ /** Callback when the user changes the slider value (React-style alias for saveInto) */
33
+ onChange?: (value: number | number[]) => void;
34
+ /** Validation group name (no spaces) */
35
+ validationGroup?: string;
36
+ /** Custom message when field is required and not provided */
37
+ requiredMessage?: string;
38
+ /** Determines where the label appears */
39
+ labelPosition?: SAILLabelPosition;
40
+ /** Displays a help icon with tooltip text */
41
+ helpTooltip?: string;
42
+ /** Additional text for screen readers */
43
+ accessibilityText?: string;
44
+ /** Determines whether component is displayed */
45
+ showWhen?: boolean;
46
+ /** Space added above component */
47
+ marginAbove?: SAILMarginSize;
48
+ /** Space added below component */
49
+ marginBelow?: SAILMarginSize;
50
+ /** Size of the slider */
51
+ size?: SAILSize;
52
+ /** Color of the slider track and thumb (hex or semantic) */
53
+ color?: "ACCENT" | "POSITIVE" | "NEGATIVE" | "SECONDARY" | string;
54
+ /** Orientation of the slider */
55
+ orientation?: SliderOrientation;
56
+ /** Show current value(s) as text */
57
+ showValue?: boolean;
58
+ /** Custom formatter for displayed values */
59
+ formatValue?: (value: number) => string;
60
+ }
61
+ export declare const SliderField: React.FC<SliderFieldProps>;
62
+ export {};
63
+ //# sourceMappingURL=SliderField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliderField.d.ts","sourceRoot":"","sources":["../../../src/components/Slider/SliderField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEnF,KAAK,iBAAiB,GAAG,YAAY,GAAG,UAAU,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzB,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,uFAAuF;IACvF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,yBAAyB;IACzB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,4DAA4D;IAC5D,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;IACjE,gCAAgC;IAChC,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACxC;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqNlD,CAAA"}
@@ -0,0 +1,164 @@
1
+ import { jsx as t, jsxs as p, Fragment as G } from "react/jsx-runtime";
2
+ import "react";
3
+ import * as n from "@radix-ui/react-slider";
4
+ import { FieldWrapper as W } from "../shared/FieldWrapper.js";
5
+ const Y = ({
6
+ label: b,
7
+ instructions: m,
8
+ required: f = !1,
9
+ disabled: d = !1,
10
+ value: h = 50,
11
+ min: A = 0,
12
+ max: v = 100,
13
+ step: E = 1,
14
+ validations: N = [],
15
+ saveInto: I,
16
+ onChange: O,
17
+ validationGroup: F,
18
+ requiredMessage: w,
19
+ labelPosition: y = "ABOVE",
20
+ helpTooltip: L,
21
+ accessibilityText: C,
22
+ showWhen: x = !0,
23
+ marginAbove: V = "NONE",
24
+ marginBelow: D = "STANDARD",
25
+ size: g = "STANDARD",
26
+ color: o = "ACCENT",
27
+ orientation: e = "HORIZONTAL",
28
+ showValue: S = !1,
29
+ formatValue: i = (s) => s.toString()
30
+ }) => {
31
+ if (!x) return null;
32
+ const s = `sliderfield-${Math.random().toString(36).substr(2, 9)}`, a = Array.isArray(h) ? h : [h], R = Array.isArray(h), c = {
33
+ SMALL: {
34
+ track: e === "HORIZONTAL" ? "h-1" : "w-1",
35
+ thumb: "h-4 w-4",
36
+ height: e === "VERTICAL" ? "h-32" : void 0
37
+ },
38
+ STANDARD: {
39
+ track: e === "HORIZONTAL" ? "h-2" : "w-2",
40
+ thumb: "h-5 w-5",
41
+ height: e === "VERTICAL" ? "h-40" : void 0
42
+ },
43
+ MEDIUM: {
44
+ track: e === "HORIZONTAL" ? "h-3" : "w-3",
45
+ thumb: "h-6 w-6",
46
+ height: e === "VERTICAL" ? "h-48" : void 0
47
+ },
48
+ LARGE: {
49
+ track: e === "HORIZONTAL" ? "h-4" : "w-4",
50
+ thumb: "h-8 w-8",
51
+ height: e === "VERTICAL" ? "h-56" : void 0
52
+ }
53
+ }, T = (() => {
54
+ if (o.startsWith("#"))
55
+ return {
56
+ range: "",
57
+ thumb: "border-2 border-white shadow-lg"
58
+ };
59
+ const r = {
60
+ ACCENT: {
61
+ range: "bg-blue-500",
62
+ thumb: "bg-blue-500 border-2 border-white shadow-lg hover:bg-blue-700 focus:bg-blue-700"
63
+ },
64
+ POSITIVE: {
65
+ range: "bg-green-700",
66
+ thumb: "bg-green-700 border-2 border-white shadow-lg hover:bg-green-900 focus:bg-green-900"
67
+ },
68
+ NEGATIVE: {
69
+ range: "bg-red-700",
70
+ thumb: "bg-red-700 border-2 border-white shadow-lg hover:bg-red-900 focus:bg-red-900"
71
+ },
72
+ SECONDARY: {
73
+ range: "bg-gray-700",
74
+ thumb: "bg-gray-700 border-2 border-white shadow-lg hover:bg-gray-900 focus:bg-gray-900"
75
+ }
76
+ };
77
+ return r[o] || r.ACCENT;
78
+ })(), k = (r) => {
79
+ const l = O || I;
80
+ l && !d && l(R ? r : r[0]);
81
+ }, u = N.length > 0, j = f && a.every((r) => r === A) && w, H = () => R ? `${i(a[0])} - ${i(a[1])}` : i(a[0]), Z = /* @__PURE__ */ t("div", { className: e === "VERTICAL" ? "flex justify-center" : "", children: /* @__PURE__ */ p(
82
+ n.Root,
83
+ {
84
+ id: s,
85
+ value: a,
86
+ onValueChange: k,
87
+ min: A,
88
+ max: v,
89
+ step: E,
90
+ disabled: d,
91
+ orientation: e.toLowerCase(),
92
+ className: [
93
+ "relative flex items-center select-none touch-none",
94
+ e === "HORIZONTAL" ? "w-full" : c[g].height,
95
+ d && "opacity-50 cursor-not-allowed"
96
+ ].filter(Boolean).join(" "),
97
+ "aria-label": C || b,
98
+ "aria-describedby": m ? `${s}-instructions` : void 0,
99
+ "aria-invalid": u,
100
+ "aria-errormessage": u ? `${s}-error` : void 0,
101
+ children: [
102
+ /* @__PURE__ */ t(
103
+ n.Track,
104
+ {
105
+ className: [
106
+ "relative grow rounded-full bg-gray-200",
107
+ c[g].track
108
+ ].join(" "),
109
+ children: /* @__PURE__ */ t(
110
+ n.Range,
111
+ {
112
+ className: [
113
+ "absolute rounded-full",
114
+ T.range,
115
+ e === "HORIZONTAL" ? "h-full" : "w-full"
116
+ ].join(" "),
117
+ style: o.startsWith("#") ? { backgroundColor: o } : void 0
118
+ }
119
+ )
120
+ }
121
+ ),
122
+ a.map((r, l) => /* @__PURE__ */ t(
123
+ n.Thumb,
124
+ {
125
+ className: [
126
+ "block rounded-full transition-colors",
127
+ c[g].thumb,
128
+ T.thumb,
129
+ "focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
130
+ ].join(" "),
131
+ style: o.startsWith("#") ? { backgroundColor: o } : void 0
132
+ },
133
+ l
134
+ ))
135
+ ]
136
+ }
137
+ ) }), M = S && /* @__PURE__ */ t("div", { className: [
138
+ "text-sm text-gray-700 mt-2",
139
+ e === "VERTICAL" ? "text-center" : ""
140
+ ].join(" "), children: H() }), $ = /* @__PURE__ */ p(G, { children: [
141
+ M,
142
+ u && /* @__PURE__ */ t("div", { id: `${s}-error`, className: "mt-2", role: "alert", children: N.map((r, l) => /* @__PURE__ */ t("p", { className: "text-sm text-red-700", children: r }, l)) }),
143
+ j && /* @__PURE__ */ t("p", { className: "text-sm text-red-700 mt-2", role: "alert", children: w })
144
+ ] });
145
+ return /* @__PURE__ */ t(
146
+ W,
147
+ {
148
+ label: b,
149
+ labelPosition: y,
150
+ required: f,
151
+ instructions: m,
152
+ helpTooltip: L,
153
+ accessibilityText: C,
154
+ inputId: s,
155
+ marginAbove: V,
156
+ marginBelow: D,
157
+ footer: $,
158
+ children: Z
159
+ }
160
+ );
161
+ };
162
+ export {
163
+ Y as SliderField
164
+ };
@@ -0,0 +1,3 @@
1
+ export { SliderField } from './SliderField';
2
+ export type { SliderFieldProps } from './SliderField';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Slider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,48 @@
1
+ import { SAILLabelPosition, SAILMarginSize, SAILAlign, SAILShape, SAILSemanticColor } from '../../types/sail';
2
+ import * as React from 'react';
3
+ type StampSize = "TINY" | "SMALL" | "MEDIUM" | "LARGE";
4
+ type StampBackgroundColor = SAILSemanticColor | "TRANSPARENT" | string;
5
+ type StampContentColor = SAILSemanticColor | string;
6
+ export interface StampFieldProps {
7
+ /** Text to display as the field label */
8
+ label?: string;
9
+ /** Determines where the label appears */
10
+ labelPosition?: SAILLabelPosition;
11
+ /** Supplemental text about this field */
12
+ instructions?: string;
13
+ /** Displays a help icon with the specified text as a tooltip */
14
+ helpTooltip?: string;
15
+ /** Icon to display inside the stamp */
16
+ icon?: string;
17
+ /** Text to display within the stamp */
18
+ text?: string;
19
+ /** Determines the background color */
20
+ backgroundColor?: StampBackgroundColor;
21
+ /** Determines the icon color */
22
+ contentColor?: StampContentColor;
23
+ /** Determines the size of the stamp */
24
+ size?: StampSize;
25
+ /** Determines alignment of the stamp */
26
+ align?: SAILAlign;
27
+ /** Text to display on mouseover (web) or tap (mobile) */
28
+ tooltip?: string;
29
+ /** Determines whether the component is displayed on the interface */
30
+ showWhen?: boolean;
31
+ /** Additional text to be announced by screen readers */
32
+ accessibilityText?: string;
33
+ /** Link to apply to the stamp */
34
+ link?: any;
35
+ /** Determines how much space is added above the layout */
36
+ marginAbove?: SAILMarginSize;
37
+ /** Determines how much space is added below the layout */
38
+ marginBelow?: SAILMarginSize;
39
+ /** Determines the stamp shape */
40
+ shape?: SAILShape;
41
+ }
42
+ /**
43
+ * Displays an icon and/or text on a colored circular background.
44
+ * Best used as a decorative component to add visual interest to your page.
45
+ */
46
+ export declare const StampField: React.FC<StampFieldProps>;
47
+ export {};
48
+ //# sourceMappingURL=StampField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StampField.d.ts","sourceRoot":"","sources":["../../../src/components/Stamp/StampField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAElH,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;AACtD,KAAK,oBAAoB,GAAG,iBAAiB,GAAG,aAAa,GAAG,MAAM,CAAA;AACtE,KAAK,iBAAiB,GAAG,iBAAiB,GAAG,MAAM,CAAA;AAEnD,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,eAAe,CAAC,EAAE,oBAAoB,CAAA;IACtC,gCAAgC;IAChC,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,uCAAuC;IACvC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iCAAiC;IACjC,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,0DAA0D;IAC1D,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,iCAAiC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAqShD,CAAA"}
@@ -0,0 +1,173 @@
1
+ import { jsx as a, jsxs as d } from "react/jsx-runtime";
2
+ import "react";
3
+ import * as s from "lucide-react";
4
+ const q = ({
5
+ label: m,
6
+ labelPosition: D = "ABOVE",
7
+ instructions: p,
8
+ helpTooltip: A,
9
+ icon: c,
10
+ text: l,
11
+ backgroundColor: t = "ACCENT",
12
+ contentColor: i = "STANDARD",
13
+ size: n = "MEDIUM",
14
+ align: u = "CENTER",
15
+ tooltip: g,
16
+ showWhen: C = !0,
17
+ accessibilityText: N,
18
+ link: o,
19
+ marginAbove: I = "NONE",
20
+ marginBelow: M = "NONE",
21
+ shape: O = "ROUNDED"
22
+ }) => {
23
+ if (!C) return null;
24
+ const w = {
25
+ NONE: "mt-0",
26
+ EVEN_LESS: "mt-1",
27
+ LESS: "mt-2",
28
+ STANDARD: "mt-4",
29
+ MORE: "mt-6",
30
+ EVEN_MORE: "mt-8"
31
+ }, L = {
32
+ NONE: "mb-0",
33
+ EVEN_LESS: "mb-1",
34
+ LESS: "mb-2",
35
+ STANDARD: "mb-4",
36
+ MORE: "mb-6",
37
+ EVEN_MORE: "mb-8"
38
+ }, r = {
39
+ TINY: { container: "w-6 h-6", text: "text-xs", icon: "text-xs" },
40
+ SMALL: { container: "w-8 h-8", text: "text-sm", icon: "text-sm" },
41
+ MEDIUM: { container: "w-12 h-12", text: "text-base", icon: "text-base" },
42
+ LARGE: { container: "w-16 h-16", text: "text-lg", icon: "text-lg" }
43
+ }, S = {
44
+ START: "justify-start",
45
+ CENTER: "justify-center",
46
+ END: "justify-end"
47
+ }, P = {
48
+ SQUARED: "rounded-none",
49
+ SEMI_ROUNDED: "rounded-sm",
50
+ ROUNDED: "rounded-full"
51
+ }, j = () => {
52
+ if (t === "TRANSPARENT")
53
+ return { className: "bg-transparent" };
54
+ const e = {
55
+ ACCENT: "bg-blue-500",
56
+ POSITIVE: "bg-green-700",
57
+ NEGATIVE: "bg-red-700",
58
+ SECONDARY: "bg-gray-700",
59
+ STANDARD: "bg-gray-900"
60
+ };
61
+ return e[t] ? { className: e[t] } : t.startsWith("#") ? { style: { backgroundColor: t } } : { className: "bg-blue-500" };
62
+ }, V = () => {
63
+ const e = {
64
+ STANDARD: t === "TRANSPARENT" ? "text-gray-900" : "text-white",
65
+ ACCENT: "text-blue-500",
66
+ POSITIVE: "text-green-700",
67
+ NEGATIVE: "text-red-700",
68
+ SECONDARY: "text-gray-700"
69
+ };
70
+ return e[i] ? { className: e[i] } : i.startsWith("#") ? { style: { color: i } } : { className: t === "TRANSPARENT" ? "text-gray-900" : "text-white" };
71
+ }, U = () => t !== "TRANSPARENT" ? "" : {
72
+ STANDARD: "border-gray-900",
73
+ ACCENT: "border-blue-500",
74
+ POSITIVE: "border-green-700",
75
+ NEGATIVE: "border-red-700",
76
+ SECONDARY: "border-gray-700"
77
+ }[i] || "border-gray-900", f = j(), b = V(), v = t === "TRANSPARENT" ? `border-2 ${U()}` : "", B = [
78
+ "flex",
79
+ "items-center",
80
+ "justify-center",
81
+ "font-medium",
82
+ r[n].container,
83
+ P[O],
84
+ f.className,
85
+ b.className,
86
+ v,
87
+ S[u] === "justify-start" ? "self-start" : S[u] === "justify-end" ? "self-end" : "self-center",
88
+ o ? "cursor-pointer hover:opacity-80 transition-opacity" : ""
89
+ ].filter(Boolean).join(" "), _ = [
90
+ w[I],
91
+ L[M]
92
+ ].filter(Boolean).join(" "), G = {
93
+ ...f.style,
94
+ ...b.style
95
+ }, R = (e) => {
96
+ const y = ((H) => H.split("-").map((x) => x.charAt(0).toUpperCase() + x.slice(1)).join(""))(e);
97
+ if (y in s)
98
+ return s[y];
99
+ const h = e.charAt(0).toUpperCase() + e.slice(1).toLowerCase();
100
+ if (h in s)
101
+ return s[h];
102
+ const E = {
103
+ STAR: "Star",
104
+ HOME: "Home",
105
+ USER: "User",
106
+ PHONE: "Phone",
107
+ briefcase: "Briefcase",
108
+ tasks: "ListTodo",
109
+ "paper-plane": "Send",
110
+ calendar: "Calendar",
111
+ "clock-o": "Clock",
112
+ money: "DollarSign"
113
+ }[e];
114
+ return E && E in s ? s[E] : s.Circle;
115
+ }, Y = () => {
116
+ if (c && l) {
117
+ const e = R(c);
118
+ return /* @__PURE__ */ d("div", { className: "flex flex-col items-center justify-center", children: [
119
+ /* @__PURE__ */ a(
120
+ e,
121
+ {
122
+ size: r[n].container === "w-6 h-6" ? 12 : r[n].container === "w-8 h-8" ? 14 : r[n].container === "w-12 h-12" ? 18 : 22,
123
+ className: "leading-none"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ a("span", { className: `${r[n].text} leading-none mt-0.5`, children: l })
127
+ ] });
128
+ }
129
+ if (c) {
130
+ const e = R(c);
131
+ return /* @__PURE__ */ a(
132
+ e,
133
+ {
134
+ size: r[n].container === "w-6 h-6" ? 12 : r[n].container === "w-8 h-8" ? 16 : r[n].container === "w-12 h-12" ? 20 : 28,
135
+ className: "leading-none"
136
+ }
137
+ );
138
+ }
139
+ return l ? /* @__PURE__ */ a("span", { className: `${r[n].text} leading-none font-semibold`, children: l }) : null;
140
+ }, T = /* @__PURE__ */ a(
141
+ "div",
142
+ {
143
+ className: B,
144
+ style: G,
145
+ title: g,
146
+ role: o ? "button" : void 0,
147
+ tabIndex: o ? 0 : void 0,
148
+ "aria-label": N || l || `${c} stamp`,
149
+ children: Y()
150
+ }
151
+ ), $ = o ? /* @__PURE__ */ a("div", { onClick: () => o?.onClick?.(), onKeyDown: (e) => {
152
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), o?.onClick?.());
153
+ }, children: T }) : T;
154
+ return /* @__PURE__ */ d("div", { className: _, children: [
155
+ !m || D === "COLLAPSED" ? N ? /* @__PURE__ */ a("span", { className: "sr-only", children: m || N }) : null : /* @__PURE__ */ d("label", { className: "text-base font-medium text-gray-900 block mb-2", children: [
156
+ m,
157
+ A && /* @__PURE__ */ a(
158
+ "span",
159
+ {
160
+ className: "ml-2 text-gray-700 cursor-help",
161
+ title: A,
162
+ "aria-label": "help",
163
+ children: "ℹ️"
164
+ }
165
+ )
166
+ ] }),
167
+ $,
168
+ p && /* @__PURE__ */ a("p", { className: "text-gray-700 text-sm mt-2", children: p })
169
+ ] });
170
+ };
171
+ export {
172
+ q as StampField
173
+ };
@@ -0,0 +1,3 @@
1
+ export { StampField } from './StampField';
2
+ export type { StampFieldProps } from './StampField';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Stamp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,49 @@
1
+ import { SAILLabelPosition, SAILMarginSize, SAILSize } from '../../types/sail';
2
+ import * as React from 'react';
3
+ /**
4
+ * Displays a switch (toggle) for boolean input
5
+ * Inspired by SAIL form field patterns (not an official SAIL component)
6
+ *
7
+ * This is a "new SAIL" component - not available in public SAIL but follows
8
+ * the same conventions and patterns for consistency with other Sailwind components.
9
+ */
10
+ export interface SwitchFieldProps {
11
+ /** Text to display as the field label */
12
+ label?: string;
13
+ /** Supplemental text about this field */
14
+ instructions?: string;
15
+ /** Determines if a value is required to submit the form */
16
+ required?: boolean;
17
+ /** Determines if the field should display as grayed out */
18
+ disabled?: boolean;
19
+ /** Current checked state (true = on, false = off) */
20
+ value?: boolean;
21
+ /** Validation errors to display below the field */
22
+ validations?: string[];
23
+ /** Callback when the user toggles the switch */
24
+ saveInto?: (value: boolean) => void;
25
+ /** Callback when the user toggles the switch (React-style alias for saveInto) */
26
+ onChange?: (value: boolean) => void;
27
+ /** Validation group name (no spaces) */
28
+ validationGroup?: string;
29
+ /** Custom message when field is required and not provided */
30
+ requiredMessage?: string;
31
+ /** Determines where the label appears */
32
+ labelPosition?: SAILLabelPosition;
33
+ /** Displays a help icon with tooltip text */
34
+ helpTooltip?: string;
35
+ /** Additional text for screen readers */
36
+ accessibilityText?: string;
37
+ /** Determines whether component is displayed */
38
+ showWhen?: boolean;
39
+ /** Space added above component */
40
+ marginAbove?: SAILMarginSize;
41
+ /** Space added below component */
42
+ marginBelow?: SAILMarginSize;
43
+ /** Size of the switch */
44
+ size?: SAILSize;
45
+ /** Color when switch is on (hex or semantic) */
46
+ color?: "ACCENT" | "POSITIVE" | "NEGATIVE" | string;
47
+ }
48
+ export declare const SwitchField: React.FC<SwitchFieldProps>;
49
+ //# sourceMappingURL=SwitchField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwitchField.d.ts","sourceRoot":"","sources":["../../../src/components/Switch/SwitchField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEnF;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACnC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACnC,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,yBAAyB;IACzB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;CACpD;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA8IlD,CAAA"}
@@ -0,0 +1,106 @@
1
+ import { jsx as t, jsxs as T, Fragment as R } from "react/jsx-runtime";
2
+ import "react";
3
+ import * as g from "@radix-ui/react-switch";
4
+ import { FieldWrapper as I } from "../shared/FieldWrapper.js";
5
+ const V = ({
6
+ label: i,
7
+ instructions: c,
8
+ required: s = !1,
9
+ disabled: l = !1,
10
+ value: n = !1,
11
+ validations: h = [],
12
+ saveInto: p,
13
+ onChange: w,
14
+ validationGroup: j,
15
+ requiredMessage: m,
16
+ labelPosition: k = "ABOVE",
17
+ helpTooltip: N,
18
+ accessibilityText: u,
19
+ showWhen: A = !0,
20
+ marginAbove: x = "NONE",
21
+ marginBelow: C = "STANDARD",
22
+ size: b = "STANDARD",
23
+ color: a = "ACCENT"
24
+ }) => {
25
+ if (!A) return null;
26
+ const e = `switchfield-${Math.random().toString(36).substr(2, 9)}`, f = {
27
+ SMALL: {
28
+ root: "h-5 w-9",
29
+ thumb: "h-4 w-4 data-[state=checked]:translate-x-4"
30
+ },
31
+ STANDARD: {
32
+ root: "h-6 w-11",
33
+ thumb: "h-5 w-5 data-[state=checked]:translate-x-5"
34
+ },
35
+ MEDIUM: {
36
+ root: "h-7 w-14",
37
+ thumb: "h-6 w-6 data-[state=checked]:translate-x-7"
38
+ },
39
+ LARGE: {
40
+ root: "h-9 w-18",
41
+ thumb: "h-8 w-8 data-[state=checked]:translate-x-9"
42
+ }
43
+ }, E = () => a.startsWith("#") ? "" : {
44
+ ACCENT: "data-[state=checked]:bg-blue-500",
45
+ POSITIVE: "data-[state=checked]:bg-green-700",
46
+ NEGATIVE: "data-[state=checked]:bg-red-700"
47
+ }[a] || "data-[state=checked]:bg-blue-500", v = (r) => {
48
+ const o = w || p;
49
+ o && !l && o(r);
50
+ }, d = h.length > 0, S = s && !n && m, D = /* @__PURE__ */ t(
51
+ g.Root,
52
+ {
53
+ id: e,
54
+ checked: n,
55
+ onCheckedChange: v,
56
+ disabled: l,
57
+ required: s,
58
+ className: [
59
+ f[b].root,
60
+ "relative rounded-full transition-colors border-2",
61
+ "data-[state=unchecked]:bg-gray-500 data-[state=unchecked]:border-gray-700",
62
+ E(),
63
+ "data-[state=checked]:border-transparent",
64
+ "disabled:opacity-50 disabled:cursor-not-allowed",
65
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2"
66
+ ].filter(Boolean).join(" "),
67
+ style: a.startsWith("#") && n ? { backgroundColor: a } : void 0,
68
+ "aria-label": u || i,
69
+ "aria-describedby": c ? `${e}-instructions` : void 0,
70
+ "aria-invalid": d,
71
+ "aria-errormessage": d ? `${e}-error` : void 0,
72
+ children: /* @__PURE__ */ t(
73
+ g.Thumb,
74
+ {
75
+ className: [
76
+ f[b].thumb,
77
+ "block rounded-full bg-white shadow-lg transition-transform",
78
+ "translate-x-0.5"
79
+ ].filter(Boolean).join(" ")
80
+ }
81
+ )
82
+ }
83
+ ), M = /* @__PURE__ */ T(R, { children: [
84
+ d && /* @__PURE__ */ t("div", { id: `${e}-error`, className: "mt-2", role: "alert", children: h.map((r, o) => /* @__PURE__ */ t("p", { className: "text-sm text-red-700", children: r }, o)) }),
85
+ S && /* @__PURE__ */ t("p", { className: "text-sm text-red-700 mt-2", role: "alert", children: m })
86
+ ] });
87
+ return /* @__PURE__ */ t(
88
+ I,
89
+ {
90
+ label: i,
91
+ labelPosition: k,
92
+ required: s,
93
+ instructions: c,
94
+ helpTooltip: N,
95
+ accessibilityText: u,
96
+ inputId: e,
97
+ marginAbove: x,
98
+ marginBelow: C,
99
+ footer: M,
100
+ children: D
101
+ }
102
+ );
103
+ };
104
+ export {
105
+ V as SwitchField
106
+ };
@@ -0,0 +1,3 @@
1
+ export { SwitchField } from './SwitchField';
2
+ export type { SwitchFieldProps } from './SwitchField';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Switch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const TableOfContents: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=TableOfContents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.d.ts","sourceRoot":"","sources":["../../src/components/TableOfContents.tsx"],"names":[],"mappings":"AA6HA,eAAO,MAAM,eAAe,+CA4B3B,CAAA"}