@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,139 @@
1
+ import { jsxs as L, jsx as N } from "react/jsx-runtime";
2
+ import "react";
3
+ import { mergeClasses as _ } from "../../utils/classNames.js";
4
+ const v = ({
5
+ children: l,
6
+ height: b = "AUTO",
7
+ style: e = "NONE",
8
+ shape: m = "SEMI_ROUNDED",
9
+ padding: c = "STANDARD",
10
+ marginAbove: A = "NONE",
11
+ marginBelow: d = "STANDARD",
12
+ showBorder: S = !0,
13
+ showShadow: i = !1,
14
+ borderColor: r = "STANDARD",
15
+ decorativeBarPosition: a = "NONE",
16
+ decorativeBarColor: s,
17
+ showWhen: u = !0,
18
+ className: R
19
+ }) => {
20
+ if (!u) return null;
21
+ const p = {
22
+ AUTO: "h-auto",
23
+ SHORT: "h-32",
24
+ MEDIUM: "h-48",
25
+ TALL: "h-64",
26
+ EXTRA_TALL: "h-96"
27
+ }, O = {
28
+ SQUARED: "rounded-none",
29
+ // SAIL SQUARED: 0
30
+ SEMI_ROUNDED: "rounded-sm",
31
+ // SAIL SEMI_ROUNDED: 4px
32
+ ROUNDED: "rounded-md"
33
+ // SAIL ROUNDED: 8px
34
+ }, C = {
35
+ NONE: "p-0",
36
+ // SAIL NONE: 0
37
+ EVEN_LESS: "p-1",
38
+ // SAIL EVEN_LESS: 4px
39
+ LESS: "p-2",
40
+ // SAIL LESS: 8px
41
+ STANDARD: "p-4",
42
+ // SAIL STANDARD: 16px
43
+ MORE: "p-6",
44
+ // SAIL MORE: 24px
45
+ EVEN_MORE: "p-8"
46
+ // SAIL EVEN_MORE: 32px
47
+ }, T = {
48
+ NONE: "mt-0",
49
+ // SAIL NONE: 0
50
+ EVEN_LESS: "mt-1",
51
+ // SAIL EVEN_LESS: 4px
52
+ LESS: "mt-2",
53
+ // SAIL LESS: 8px
54
+ STANDARD: "mt-4",
55
+ // SAIL STANDARD: 16px
56
+ MORE: "mt-6",
57
+ // SAIL MORE: 24px
58
+ EVEN_MORE: "mt-8"
59
+ // SAIL EVEN_MORE: 32px
60
+ }, D = {
61
+ NONE: "mb-0",
62
+ // SAIL NONE: 0
63
+ EVEN_LESS: "mb-1",
64
+ // SAIL EVEN_LESS: 4px
65
+ LESS: "mb-2",
66
+ // SAIL LESS: 8px
67
+ STANDARD: "mb-4",
68
+ // SAIL STANDARD: 16px
69
+ MORE: "mb-6",
70
+ // SAIL MORE: 24px
71
+ EVEN_MORE: "mb-8"
72
+ // SAIL EVEN_MORE: 32px
73
+ }, h = {
74
+ NONE: "bg-white",
75
+ TRANSPARENT: "bg-transparent",
76
+ STANDARD: "bg-white",
77
+ ACCENT: "bg-blue-50",
78
+ SUCCESS: "bg-green-50",
79
+ WARN: "bg-orange-50",
80
+ ERROR: "bg-red-50",
81
+ INFO: "bg-sky-50",
82
+ CHARCOAL_SCHEME: "bg-gray-900",
83
+ NAVY_SCHEME: "bg-blue-900",
84
+ PLUM_SCHEME: "bg-purple-900"
85
+ }, E = !e || e === "NONE" ? { className: "bg-white" } : typeof e == "string" && e.startsWith("#") ? { style: { backgroundColor: e } } : { className: h[e] || "bg-white" }, M = {
86
+ STANDARD: "border-gray-200",
87
+ ACCENT: "border-blue-500",
88
+ POSITIVE: "border-green-700",
89
+ WARN: "border-orange-500",
90
+ NEGATIVE: "border-red-700"
91
+ }, n = r ? r.startsWith("#") ? { style: { borderColor: r } } : { className: M[r] || "border-gray-200" } : { className: "border-gray-200" }, o = {
92
+ ACCENT: "bg-blue-500",
93
+ // Blue 3 (Aurora)
94
+ SUCCESS: "bg-green-500",
95
+ // Green 3 (Aurora)
96
+ WARN: "bg-orange-500",
97
+ // Orange 3 (Aurora)
98
+ ERROR: "bg-red-500",
99
+ // Red 3 (Aurora)
100
+ INFO: "bg-sky-500"
101
+ // Sky 3 (Aurora)
102
+ }, t = s ? s.startsWith("#") ? { style: { backgroundColor: s } } : { className: o[s] || o.ACCENT } : { className: o.ACCENT }, f = `
103
+ ${E.className || ""}
104
+ ${p[b]}
105
+ ${O[m]}
106
+ ${C[c]}
107
+ ${T[A]}
108
+ ${D[d]}
109
+ ${S ? `border-2 ${n.className || ""}` : ""}
110
+ ${i ? "shadow-md" : ""}
111
+ overflow-hidden
112
+ relative
113
+ `.replace(/\s+/g, " ").trim(), y = _(f, R), g = {
114
+ ...E.style || {},
115
+ ...n.style || {}
116
+ };
117
+ return /* @__PURE__ */ L("div", { className: y, style: Object.keys(g).length > 0 ? g : void 0, children: [
118
+ a === "TOP" && /* @__PURE__ */ N(
119
+ "div",
120
+ {
121
+ className: `absolute top-0 left-0 right-0 h-1 ${t.className || ""}`,
122
+ style: t.style,
123
+ "aria-hidden": "true"
124
+ }
125
+ ),
126
+ a === "START" && /* @__PURE__ */ N(
127
+ "div",
128
+ {
129
+ className: `absolute top-0 left-0 bottom-0 w-1 ${t.className || ""}`,
130
+ style: t.style,
131
+ "aria-hidden": "true"
132
+ }
133
+ ),
134
+ /* @__PURE__ */ N("div", { className: a === "TOP" ? "pt-1" : "", children: l })
135
+ ] });
136
+ };
137
+ export {
138
+ v as CardLayout
139
+ };
@@ -0,0 +1,3 @@
1
+ export { CardLayout } from './CardLayout';
2
+ export type { CardLayoutProps } from './CardLayout';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Card/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { SAILLabelPosition, SAILMarginSize, SAILAlign } from '../../types/sail';
2
+ import * as React from 'react';
3
+ type ChoiceLayout = "STACKED" | "COMPACT";
4
+ type ChoiceStyle = "STANDARD" | "CARDS";
5
+ type Spacing = "STANDARD" | "MORE" | "EVEN_MORE";
6
+ type ChoicePosition = "START" | "END";
7
+ /**
8
+ * Displays a set of checkboxes for multi-select input
9
+ * Maps to SAIL a!checkboxField()
10
+ */
11
+ export interface CheckboxFieldProps {
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
+ /** Array of options for the user to select */
21
+ choiceLabels: any[];
22
+ /** Array of values associated with the corresponding choices */
23
+ choiceValues: any[];
24
+ /** Values of choices to display as selected */
25
+ value?: any[];
26
+ /** Validation errors to display below the field */
27
+ validations?: string[];
28
+ /** Callback when the user changes the selections */
29
+ saveInto?: (value: any[]) => void;
30
+ /** Callback when the user changes the selections (React-style alias for saveInto) */
31
+ onChange?: (value: any[]) => void;
32
+ /** Validation group name (no spaces) */
33
+ validationGroup?: string;
34
+ /** Custom message when field is required and not provided */
35
+ requiredMessage?: string;
36
+ /** Determines alignment of choice labels. Use with Grid Layout */
37
+ align?: SAILAlign | "LEFT" | "CENTER" | "RIGHT";
38
+ /** Determines where the label appears */
39
+ labelPosition?: SAILLabelPosition;
40
+ /** Displays a help icon with tooltip text */
41
+ helpTooltip?: string;
42
+ /** Determines the layout of choices */
43
+ choiceLayout?: ChoiceLayout;
44
+ /** Additional text for screen readers */
45
+ accessibilityText?: string;
46
+ /** Determines whether component is displayed */
47
+ showWhen?: boolean;
48
+ /** Determines how choices are displayed */
49
+ choiceStyle?: ChoiceStyle;
50
+ /** Determines space between options */
51
+ spacing?: Spacing;
52
+ /** Data source (record type) - not implemented in prototype */
53
+ data?: any;
54
+ /** Sort configurations - not implemented in prototype */
55
+ sort?: any[];
56
+ /** Space added above component */
57
+ marginAbove?: SAILMarginSize;
58
+ /** Space added below component */
59
+ marginBelow?: SAILMarginSize;
60
+ /** Determines whether checkboxes appear on left or right */
61
+ choicePosition?: ChoicePosition;
62
+ }
63
+ export declare const CheckboxField: React.FC<CheckboxFieldProps>;
64
+ export {};
65
+ //# sourceMappingURL=CheckboxField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxField.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/CheckboxField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEpF,KAAK,YAAY,GAAG,SAAS,GAAG,SAAS,CAAA;AACzC,KAAK,WAAW,GAAG,UAAU,GAAG,OAAO,CAAA;AACvC,KAAK,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAA;AAChD,KAAK,cAAc,GAAG,OAAO,GAAG,KAAK,CAAA;AAErC;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,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,8CAA8C;IAC9C,YAAY,EAAE,GAAG,EAAE,CAAA;IACnB,gEAAgE;IAChE,YAAY,EAAE,GAAG,EAAE,CAAA;IACnB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,GAAG,EAAE,CAAA;IACb,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IACjC,qFAAqF;IACrF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IACjC,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,kEAAkE;IAClE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC/C,yCAAyC;IACzC,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,yDAAyD;IACzD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAoLtD,CAAA"}
@@ -0,0 +1,136 @@
1
+ import { jsx as r, jsxs as N, Fragment as y } from "react/jsx-runtime";
2
+ import "react";
3
+ import { FieldWrapper as P } from "../shared/FieldWrapper.js";
4
+ const Y = ({
5
+ label: C,
6
+ instructions: g,
7
+ required: m = !1,
8
+ disabled: a = !1,
9
+ choiceLabels: x,
10
+ choiceValues: R,
11
+ value: i = [],
12
+ validations: u = [],
13
+ saveInto: b,
14
+ onChange: T,
15
+ validationGroup: H,
16
+ requiredMessage: A,
17
+ align: D,
18
+ labelPosition: S = "ABOVE",
19
+ helpTooltip: j,
20
+ choiceLayout: c = "STACKED",
21
+ accessibilityText: k,
22
+ showWhen: w = !0,
23
+ choiceStyle: t = "STANDARD",
24
+ spacing: h = "STANDARD",
25
+ data: U,
26
+ sort: W,
27
+ marginAbove: v = "NONE",
28
+ marginBelow: M = "STANDARD",
29
+ choicePosition: O
30
+ }) => {
31
+ if (!w) return null;
32
+ const s = `checkboxfield-${Math.random().toString(36).substr(2, 9)}`, $ = O ?? (t === "CARDS" ? "END" : "START"), B = {
33
+ STANDARD: c === "STACKED" ? "gap-2" : "gap-4",
34
+ MORE: c === "STACKED" ? "gap-4" : "gap-6",
35
+ EVEN_MORE: c === "STACKED" ? "gap-6" : "gap-8"
36
+ }, F = {
37
+ STANDARD: "gap-2",
38
+ MORE: "gap-4",
39
+ EVEN_MORE: "gap-6"
40
+ }, K = {
41
+ LEFT: "justify-start",
42
+ START: "justify-start",
43
+ CENTER: "justify-center",
44
+ RIGHT: "justify-end",
45
+ END: "justify-end"
46
+ }, E = (o, e) => {
47
+ const n = T || b;
48
+ if (!n) return;
49
+ const l = e ? [...i, o] : i.filter((d) => d !== o);
50
+ n(l);
51
+ }, p = u.length > 0, V = m && !i.length && A, _ = /* @__PURE__ */ r(
52
+ "div",
53
+ {
54
+ className: [
55
+ c === "STACKED" ? "flex flex-col" : "flex flex-wrap",
56
+ B[h],
57
+ D && K[D]
58
+ ].filter(Boolean).join(" "),
59
+ role: "group",
60
+ "aria-describedby": g ? `${s}-instructions` : void 0,
61
+ children: x.map((o, e) => {
62
+ const n = R[e], l = i.includes(n), d = `${s}-choice-${e}`, I = [
63
+ "flex",
64
+ "items-center",
65
+ F[h],
66
+ $ === "END" && "flex-row-reverse",
67
+ t === "CARDS" && "border border-gray-200 rounded-sm p-4 hover:border-blue-500 transition-colors cursor-pointer",
68
+ t === "CARDS" && l && "border-blue-500 bg-blue-50",
69
+ a && "opacity-50 cursor-not-allowed"
70
+ ].filter(Boolean).join(" ");
71
+ return /* @__PURE__ */ N(
72
+ "div",
73
+ {
74
+ className: I,
75
+ onClick: (f) => {
76
+ t === "CARDS" && !a && f.target.tagName !== "INPUT" && E(n, !l);
77
+ },
78
+ children: [
79
+ /* @__PURE__ */ r(
80
+ "input",
81
+ {
82
+ id: d,
83
+ type: "checkbox",
84
+ checked: l,
85
+ disabled: a,
86
+ onChange: (f) => E(n, f.target.checked),
87
+ className: [
88
+ "h-4 w-4 rounded border-gray-200 text-blue-500 focus:ring-blue-500",
89
+ a ? "cursor-not-allowed" : "cursor-pointer"
90
+ ].filter(Boolean).join(" "),
91
+ "aria-invalid": p,
92
+ "aria-errormessage": p ? `${s}-error` : void 0
93
+ }
94
+ ),
95
+ /* @__PURE__ */ r(
96
+ "label",
97
+ {
98
+ htmlFor: t === "CARDS" ? void 0 : d,
99
+ className: [
100
+ "text-base text-gray-900",
101
+ t === "CARDS" && "flex-1",
102
+ a ? "cursor-not-allowed" : "cursor-pointer"
103
+ ].filter(Boolean).join(" "),
104
+ children: o
105
+ }
106
+ )
107
+ ]
108
+ },
109
+ e
110
+ );
111
+ })
112
+ }
113
+ ), G = /* @__PURE__ */ N(y, { children: [
114
+ p && /* @__PURE__ */ r("div", { id: `${s}-error`, className: "mt-2", role: "alert", children: u.map((o, e) => /* @__PURE__ */ r("p", { className: "text-sm text-red-700", children: o }, e)) }),
115
+ V && /* @__PURE__ */ r("p", { className: "text-sm text-red-700 mt-2", role: "alert", children: A })
116
+ ] });
117
+ return /* @__PURE__ */ r(
118
+ P,
119
+ {
120
+ label: C,
121
+ labelPosition: S,
122
+ required: m,
123
+ instructions: g,
124
+ helpTooltip: j,
125
+ accessibilityText: k,
126
+ inputId: s,
127
+ marginAbove: v,
128
+ marginBelow: M,
129
+ footer: G,
130
+ children: _
131
+ }
132
+ );
133
+ };
134
+ export {
135
+ Y as CheckboxField
136
+ };
@@ -0,0 +1,3 @@
1
+ export { CheckboxField } from './CheckboxField';
2
+ export type { CheckboxFieldProps } from './CheckboxField';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,51 @@
1
+ import { SAILMarginSize } from '../../types/sail';
2
+ import * as React from 'react';
3
+ /**
4
+ * Width options for dialog sizing
5
+ */
6
+ export type DialogWidth = "NARROW" | "MEDIUM" | "MEDIUM_PLUS" | "WIDE" | "FIT";
7
+ /**
8
+ * Height options for dialog sizing
9
+ */
10
+ export type DialogHeight = "AUTO" | "FIT" | "SHORT" | "MEDIUM" | "TALL" | "EXTRA_TALL";
11
+ /**
12
+ * Displays a modal dialog overlay with customizable content
13
+ * Inspired by SAIL form field patterns (not an official SAIL component)
14
+ *
15
+ * This is a "new SAIL" component - not available in public SAIL but follows
16
+ * the same conventions and patterns for consistency with other Sailwind components.
17
+ */
18
+ export interface DialogFieldProps {
19
+ /** Whether the dialog is open */
20
+ open?: boolean;
21
+ /** Callback when dialog open state changes */
22
+ onOpenChange?: (open: boolean) => void;
23
+ /** Element that triggers the dialog (usually a button) */
24
+ trigger?: React.ReactNode;
25
+ /** Dialog title text */
26
+ title?: string;
27
+ /** Dialog description text */
28
+ description?: string;
29
+ /** Main content of the dialog */
30
+ children: React.ReactNode;
31
+ /** Width of the dialog */
32
+ width?: DialogWidth;
33
+ /** Height of the dialog */
34
+ height?: DialogHeight;
35
+ /** Whether to show the close button */
36
+ showCloseButton?: boolean;
37
+ /** Whether clicking outside closes the dialog */
38
+ closeOnOutsideClick?: boolean;
39
+ /** Whether pressing escape closes the dialog */
40
+ closeOnEscape?: boolean;
41
+ /** Determines whether component is displayed */
42
+ showWhen?: boolean;
43
+ /** Space added above component */
44
+ marginAbove?: SAILMarginSize;
45
+ /** Space added below component */
46
+ marginBelow?: SAILMarginSize;
47
+ /** Callback when dialog is closed */
48
+ onClose?: () => void;
49
+ }
50
+ export declare const DialogField: React.FC<DialogFieldProps>;
51
+ //# sourceMappingURL=DialogField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DialogField.d.ts","sourceRoot":"","sources":["../../../src/components/Dialog/DialogField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAA;AAEtF;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,8CAA8C;IAC9C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iCAAiC;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gDAAgD;IAChD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA0JlD,CAAA"}
@@ -0,0 +1,113 @@
1
+ import { jsx as e, jsxs as o } from "react/jsx-runtime";
2
+ import "react";
3
+ import * as t from "@radix-ui/react-dialog";
4
+ import { X as T } from "lucide-react";
5
+ const y = ({
6
+ open: i,
7
+ onOpenChange: d,
8
+ trigger: r,
9
+ title: s,
10
+ description: n,
11
+ children: p,
12
+ width: E = "MEDIUM",
13
+ height: l = "AUTO",
14
+ showCloseButton: m = !0,
15
+ closeOnOutsideClick: N = !0,
16
+ closeOnEscape: x = !0,
17
+ showWhen: g = !0,
18
+ marginAbove: v = "NONE",
19
+ marginBelow: w = "STANDARD",
20
+ onClose: c
21
+ }) => {
22
+ if (!g) return null;
23
+ const b = {
24
+ NONE: "",
25
+ EVEN_LESS: "mt-1",
26
+ LESS: "mt-2",
27
+ STANDARD: "mt-4",
28
+ MORE: "mt-6",
29
+ EVEN_MORE: "mt-8"
30
+ }, D = {
31
+ NONE: "",
32
+ EVEN_LESS: "mb-1",
33
+ LESS: "mb-2",
34
+ STANDARD: "mb-4",
35
+ MORE: "mb-6",
36
+ EVEN_MORE: "mb-8"
37
+ }, M = {
38
+ NARROW: "w-[90vw] max-w-sm",
39
+ // ~384px max
40
+ MEDIUM: "w-[90vw] max-w-md",
41
+ // ~448px max
42
+ MEDIUM_PLUS: "w-[90vw] max-w-lg",
43
+ // ~512px max
44
+ WIDE: "w-[90vw] max-w-2xl",
45
+ // ~672px max
46
+ FIT: "w-[95vw]"
47
+ // Full screen width (with small margin)
48
+ }, O = {
49
+ AUTO: "h-auto",
50
+ // Content-based height
51
+ FIT: "h-auto max-h-[85vh]",
52
+ // Content-based with max
53
+ SHORT: "h-[300px]",
54
+ // Fixed short height
55
+ MEDIUM: "h-[500px]",
56
+ // Fixed medium height
57
+ TALL: "h-[700px]",
58
+ // Fixed tall height
59
+ EXTRA_TALL: "h-[85vh]"
60
+ // Very tall, viewport-based
61
+ }, u = [
62
+ b[v],
63
+ D[w]
64
+ ].filter(Boolean).join(" "), f = (a) => {
65
+ d && d(a), !a && c && c();
66
+ }, h = /* @__PURE__ */ o(t.Portal, { children: [
67
+ /* @__PURE__ */ e(t.Overlay, { className: "fixed inset-0 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" }),
68
+ /* @__PURE__ */ o(
69
+ t.Content,
70
+ {
71
+ className: [
72
+ "fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2",
73
+ "bg-white rounded-md shadow-lg border border-gray-200",
74
+ "p-6",
75
+ M[E],
76
+ O[l],
77
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
78
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
79
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
80
+ "data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]",
81
+ "data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
82
+ "focus:outline-none"
83
+ ].filter(Boolean).join(" "),
84
+ onPointerDownOutside: N ? void 0 : (a) => a.preventDefault(),
85
+ onEscapeKeyDown: x ? void 0 : (a) => a.preventDefault(),
86
+ children: [
87
+ (s || n || m) && /* @__PURE__ */ e("div", { className: "mb-4", children: /* @__PURE__ */ o("div", { className: "flex items-start justify-between", children: [
88
+ /* @__PURE__ */ o("div", { className: "flex-1", children: [
89
+ s && /* @__PURE__ */ e(t.Title, { className: "text-lg font-semibold text-gray-900 mb-2", children: s }),
90
+ n && /* @__PURE__ */ e(t.Description, { className: "text-sm text-gray-700", children: n })
91
+ ] }),
92
+ m && /* @__PURE__ */ e(t.Close, { asChild: !0, children: /* @__PURE__ */ e(
93
+ "button",
94
+ {
95
+ className: "ml-4 p-1 rounded-sm text-gray-500 hover:text-gray-700 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500",
96
+ "aria-label": "Close dialog",
97
+ children: /* @__PURE__ */ e(T, { className: "h-4 w-4" })
98
+ }
99
+ ) })
100
+ ] }) }),
101
+ /* @__PURE__ */ e("div", { className: l !== "AUTO" && l !== "FIT" ? "overflow-y-auto" : "", children: p })
102
+ ]
103
+ }
104
+ )
105
+ ] });
106
+ return r ? /* @__PURE__ */ e("div", { className: u, children: /* @__PURE__ */ o(t.Root, { open: i, onOpenChange: f, children: [
107
+ /* @__PURE__ */ e(t.Trigger, { asChild: !0, children: r }),
108
+ h
109
+ ] }) }) : /* @__PURE__ */ e("div", { className: u, children: /* @__PURE__ */ e(t.Root, { open: i, onOpenChange: f, children: h }) });
110
+ };
111
+ export {
112
+ y as DialogField
113
+ };
@@ -0,0 +1,3 @@
1
+ export { DialogField } from './DialogField';
2
+ export type { DialogFieldProps, DialogWidth, DialogHeight } from './DialogField';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,87 @@
1
+ import { SAILLabelPosition, SAILMarginSize } from '../../types/sail';
2
+ import * as React from 'react';
3
+ type SearchDisplay = "AUTO" | "ON" | "OFF";
4
+ /**
5
+ * Displays a list of choices for the user to select one item
6
+ * Maps to SAIL a!dropdownField()
7
+ */
8
+ export interface DropdownFieldProps {
9
+ /** Text to display as the field label */
10
+ label?: string;
11
+ /** Determines where the label appears */
12
+ labelPosition?: SAILLabelPosition;
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
+ /** Array of options for the user to select */
20
+ choiceLabels: any[];
21
+ /** Array of values associated with the corresponding choices */
22
+ choiceValues: any[];
23
+ /** Text to display when nothing is selected and value is null */
24
+ placeholder?: string;
25
+ /** Value of the choice to display as selected */
26
+ value?: any;
27
+ /** Validation errors to display below the field */
28
+ validations?: string[];
29
+ /** Callback when the user changes the selection */
30
+ saveInto?: (value: any) => void;
31
+ /** Callback when the user changes the selection (React-style alias for saveInto) */
32
+ onChange?: (value: any) => void;
33
+ /** Validation group name (no spaces) */
34
+ validationGroup?: string;
35
+ /** Custom message when field is required and not provided */
36
+ requiredMessage?: string;
37
+ /** Displays a help icon with tooltip text */
38
+ helpTooltip?: string;
39
+ /** Additional text for screen readers */
40
+ accessibilityText?: string;
41
+ /** Determines whether component is displayed */
42
+ showWhen?: boolean;
43
+ /** Determines when a search box displays above options */
44
+ searchDisplay?: SearchDisplay;
45
+ /** Data source (record type) - not implemented in prototype */
46
+ data?: any;
47
+ /** Sort configurations - not implemented in prototype */
48
+ sort?: any[];
49
+ /** Space added above component */
50
+ marginAbove?: SAILMarginSize;
51
+ /** Space added below component */
52
+ marginBelow?: SAILMarginSize;
53
+ }
54
+ /**
55
+ * Single-select dropdown field component
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * <DropdownField
60
+ * label="Language"
61
+ * instructions="In which language are you most proficient?"
62
+ * choiceLabels={["English", "Spanish", "French", "German"]}
63
+ * choiceValues={["en_US", "es_ES", "fr_FR", "de_DE"]}
64
+ * value={selectedLanguage}
65
+ * saveInto={(value) => setSelectedLanguage(value)}
66
+ * placeholder="Select a language"
67
+ * searchDisplay="AUTO"
68
+ * />
69
+ * ```
70
+ *
71
+ * SAIL Translation:
72
+ * ```sail
73
+ * a!dropdownField(
74
+ * label: "Language",
75
+ * instructions: "In which language are you most proficient?",
76
+ * choiceLabels: {"English", "Spanish", "French", "German"},
77
+ * choiceValues: {"en_US", "es_ES", "fr_FR", "de_DE"},
78
+ * value: local!language,
79
+ * saveInto: local!language,
80
+ * placeholder: "Select a language",
81
+ * searchDisplay: "AUTO"
82
+ * )
83
+ * ```
84
+ */
85
+ export declare const DropdownField: React.FC<DropdownFieldProps>;
86
+ export {};
87
+ //# sourceMappingURL=DropdownField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownField.d.ts","sourceRoot":"","sources":["../../../src/components/Dropdown/DropdownField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEzE,KAAK,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAA;AAE1C;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,YAAY,EAAE,GAAG,EAAE,CAAA;IACnB,gEAAgE;IAChE,YAAY,EAAE,GAAG,EAAE,CAAA;IACnB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IAC/B,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,yDAAyD;IACzD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,kCAAkC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAA;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAEtD,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import "react";
3
+ import { DropdownFieldBase as e } from "./DropdownFieldBase.js";
4
+ const m = (o) => /* @__PURE__ */ r(e, { multiple: !1, ...o });
5
+ export {
6
+ m as DropdownField
7
+ };