@flamingo-stack/openframe-frontend-core 0.0.398-snapshot.20260710082611 → 0.0.398

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 (99) hide show
  1. package/dist/{chunk-RIC4TCPD.cjs → chunk-2DGA5LHT.cjs} +12 -12
  2. package/dist/{chunk-RIC4TCPD.cjs.map → chunk-2DGA5LHT.cjs.map} +1 -1
  3. package/dist/{chunk-FXWURWDU.js → chunk-2TBXIW7L.js} +2 -2
  4. package/dist/{chunk-O5NA3ULU.cjs → chunk-4BVRLCCA.cjs} +82 -82
  5. package/dist/{chunk-O5NA3ULU.cjs.map → chunk-4BVRLCCA.cjs.map} +1 -1
  6. package/dist/{chunk-JBLBFJ4N.cjs → chunk-7Q2DZEUA.cjs} +26 -26
  7. package/dist/{chunk-JBLBFJ4N.cjs.map → chunk-7Q2DZEUA.cjs.map} +1 -1
  8. package/dist/{chunk-2XVOYDRF.js → chunk-B2K5COVE.js} +135 -125
  9. package/dist/{chunk-2XVOYDRF.js.map → chunk-B2K5COVE.js.map} +1 -1
  10. package/dist/{chunk-4PEC5KU6.cjs → chunk-C4DHYDXB.cjs} +9 -9
  11. package/dist/{chunk-4PEC5KU6.cjs.map → chunk-C4DHYDXB.cjs.map} +1 -1
  12. package/dist/{chunk-VOHOA3WV.cjs → chunk-FZIMFLJG.cjs} +19 -19
  13. package/dist/{chunk-VOHOA3WV.cjs.map → chunk-FZIMFLJG.cjs.map} +1 -1
  14. package/dist/{chunk-Z5ERSGP2.js → chunk-G42EXM23.js} +2 -2
  15. package/dist/{chunk-4K5XJ5EJ.js → chunk-GKRJOS6S.js} +2 -2
  16. package/dist/{chunk-QNYNXSYQ.cjs → chunk-HMTOQGYU.cjs} +12 -12
  17. package/dist/{chunk-QNYNXSYQ.cjs.map → chunk-HMTOQGYU.cjs.map} +1 -1
  18. package/dist/{chunk-NCW22SII.cjs → chunk-LBDKAMOH.cjs} +59 -59
  19. package/dist/{chunk-NCW22SII.cjs.map → chunk-LBDKAMOH.cjs.map} +1 -1
  20. package/dist/{chunk-G3A7QHCX.js → chunk-MGJZQ3EE.js} +3 -3
  21. package/dist/{chunk-XBCAY6NE.js → chunk-MNQVBME4.js} +3 -3
  22. package/dist/{chunk-4H2ICJYB.js → chunk-MQXUIYYN.js} +2 -2
  23. package/dist/{chunk-2L6ALD2Q.js → chunk-N4R7TRF3.js} +3 -3
  24. package/dist/{chunk-GA5AN24T.cjs → chunk-NYIZVI4I.cjs} +3 -10
  25. package/dist/chunk-NYIZVI4I.cjs.map +1 -0
  26. package/dist/{chunk-G5NDKTX6.cjs → chunk-PE37UDPF.cjs} +31 -31
  27. package/dist/{chunk-G5NDKTX6.cjs.map → chunk-PE37UDPF.cjs.map} +1 -1
  28. package/dist/{chunk-A6KGHQRF.js → chunk-URODM26E.js} +4 -4
  29. package/dist/{chunk-BSJO5VFV.js → chunk-VDDNJ6XC.js} +5 -5
  30. package/dist/{chunk-7OKNKZBW.cjs → chunk-VVO7AZKZ.cjs} +468 -458
  31. package/dist/chunk-VVO7AZKZ.cjs.map +1 -0
  32. package/dist/{chunk-ZDT2MBKE.cjs → chunk-WJSUUOPU.cjs} +37 -37
  33. package/dist/{chunk-ZDT2MBKE.cjs.map → chunk-WJSUUOPU.cjs.map} +1 -1
  34. package/dist/{chunk-CRRH7RJX.js → chunk-WXOIEYXW.js} +4 -4
  35. package/dist/{chunk-HGKWTKW7.js → chunk-X2FPWS3P.js} +3 -10
  36. package/dist/chunk-X2FPWS3P.js.map +1 -0
  37. package/dist/{chunk-YWCCKB4J.cjs → chunk-XYT5PIKZ.cjs} +5 -5
  38. package/dist/{chunk-YWCCKB4J.cjs.map → chunk-XYT5PIKZ.cjs.map} +1 -1
  39. package/dist/{chunk-VVKWNVKE.js → chunk-Y3FREU4B.js} +4 -4
  40. package/dist/{chunk-D5IHYUBY.cjs → chunk-YEWGFWNM.cjs} +30 -30
  41. package/dist/{chunk-D5IHYUBY.cjs.map → chunk-YEWGFWNM.cjs.map} +1 -1
  42. package/dist/components/case-studies/index.cjs +9 -9
  43. package/dist/components/case-studies/index.js +3 -3
  44. package/dist/components/chat/index.cjs +3 -3
  45. package/dist/components/chat/index.js +2 -2
  46. package/dist/components/contact/index.cjs +4 -4
  47. package/dist/components/contact/index.js +3 -3
  48. package/dist/components/docs/index.cjs +6 -6
  49. package/dist/components/docs/index.js +5 -5
  50. package/dist/components/embeds/index.cjs +4 -4
  51. package/dist/components/embeds/index.js +3 -3
  52. package/dist/components/faq/index.cjs +4 -4
  53. package/dist/components/faq/index.js +3 -3
  54. package/dist/components/features/auth/complete-account-form.d.ts.map +1 -1
  55. package/dist/components/features/auth/create-organization-form.d.ts.map +1 -1
  56. package/dist/components/features/auth/openframe-sso-signup-form.d.ts.map +1 -1
  57. package/dist/components/features/index.cjs +3 -3
  58. package/dist/components/features/index.js +2 -2
  59. package/dist/components/help-center-pages/index.cjs +21 -21
  60. package/dist/components/help-center-pages/index.js +12 -12
  61. package/dist/components/index.cjs +144 -144
  62. package/dist/components/index.js +10 -10
  63. package/dist/components/navigation/index.cjs +3 -3
  64. package/dist/components/navigation/index.js +2 -2
  65. package/dist/components/onboarding-guides/index.cjs +6 -6
  66. package/dist/components/onboarding-guides/index.js +5 -5
  67. package/dist/components/related-content/index.cjs +4 -4
  68. package/dist/components/related-content/index.js +3 -3
  69. package/dist/components/tickets/index.cjs +6 -6
  70. package/dist/components/tickets/index.js +5 -5
  71. package/dist/components/ui/field-wrapper.d.ts +1 -1
  72. package/dist/components/ui/field-wrapper.d.ts.map +1 -1
  73. package/dist/components/ui/file-manager/index.cjs +50 -50
  74. package/dist/components/ui/file-manager/index.js +1 -1
  75. package/dist/components/ui/index.cjs +3 -3
  76. package/dist/components/ui/index.js +2 -2
  77. package/dist/index.cjs +3 -3
  78. package/dist/index.js +2 -2
  79. package/package.json +1 -1
  80. package/src/components/features/auth/complete-account-form.tsx +51 -37
  81. package/src/components/features/auth/create-organization-form.tsx +29 -22
  82. package/src/components/features/auth/openframe-sso-signup-form.tsx +51 -37
  83. package/src/components/ui/field-wrapper.tsx +3 -6
  84. package/src/stories/Input.stories.tsx +0 -44
  85. package/src/stories/auth/CreateOrganization.stories.tsx +0 -19
  86. package/dist/chunk-7OKNKZBW.cjs.map +0 -1
  87. package/dist/chunk-GA5AN24T.cjs.map +0 -1
  88. package/dist/chunk-HGKWTKW7.js.map +0 -1
  89. /package/dist/{chunk-FXWURWDU.js.map → chunk-2TBXIW7L.js.map} +0 -0
  90. /package/dist/{chunk-Z5ERSGP2.js.map → chunk-G42EXM23.js.map} +0 -0
  91. /package/dist/{chunk-4K5XJ5EJ.js.map → chunk-GKRJOS6S.js.map} +0 -0
  92. /package/dist/{chunk-G3A7QHCX.js.map → chunk-MGJZQ3EE.js.map} +0 -0
  93. /package/dist/{chunk-XBCAY6NE.js.map → chunk-MNQVBME4.js.map} +0 -0
  94. /package/dist/{chunk-4H2ICJYB.js.map → chunk-MQXUIYYN.js.map} +0 -0
  95. /package/dist/{chunk-2L6ALD2Q.js.map → chunk-N4R7TRF3.js.map} +0 -0
  96. /package/dist/{chunk-A6KGHQRF.js.map → chunk-URODM26E.js.map} +0 -0
  97. /package/dist/{chunk-BSJO5VFV.js.map → chunk-VDDNJ6XC.js.map} +0 -0
  98. /package/dist/{chunk-CRRH7RJX.js.map → chunk-WXOIEYXW.js.map} +0 -0
  99. /package/dist/{chunk-VVKWNVKE.js.map → chunk-Y3FREU4B.js.map} +0 -0
package/dist/index.js CHANGED
@@ -916,7 +916,7 @@ import {
916
916
  validateEmailDomain,
917
917
  validateEmailDomainList,
918
918
  validatePhoneNumber
919
- } from "./chunk-2XVOYDRF.js";
919
+ } from "./chunk-B2K5COVE.js";
920
920
  import {
921
921
  CommandApprovalToast,
922
922
  DEFAULT_MIN_FILL_MS,
@@ -1065,7 +1065,7 @@ import {
1065
1065
  SkeletonText,
1066
1066
  SplitButton,
1067
1067
  buttonVariants
1068
- } from "./chunk-HGKWTKW7.js";
1068
+ } from "./chunk-X2FPWS3P.js";
1069
1069
  import "./chunk-6U3IUD57.js";
1070
1070
  import "./chunk-OHPI2HRK.js";
1071
1071
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.398-snapshot.20260710082611",
3
+ "version": "0.0.398",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -111,43 +111,57 @@ export function CompleteAccountForm({
111
111
  </>
112
112
  )}
113
113
 
114
- {/* Name + password fields — single column on every breakpoint */}
115
- <Input
116
- label="First Name"
117
- placeholder="Enter First Name"
118
- value={firstName}
119
- error={errors?.firstName}
120
- disabled={fieldsDisabled}
121
- onChange={(event) => onFirstNameChange(event.target.value)}
122
- onKeyDown={handleKeyDown}
123
- />
124
- <Input
125
- label="Last Name"
126
- placeholder="Enter Last Name"
127
- value={lastName}
128
- error={errors?.lastName}
129
- disabled={fieldsDisabled}
130
- onChange={(event) => onLastNameChange(event.target.value)}
131
- onKeyDown={handleKeyDown}
132
- />
133
- <PasswordInput
134
- label="Password"
135
- placeholder="Enter Password"
136
- value={password}
137
- error={errors?.password}
138
- disabled={fieldsDisabled}
139
- onChange={(event) => onPasswordChange(event.target.value)}
140
- onKeyDown={handleKeyDown}
141
- />
142
- <PasswordInput
143
- label="Confirm Password"
144
- placeholder="Confirm Password"
145
- value={confirmPassword}
146
- error={errors?.confirmPassword}
147
- disabled={fieldsDisabled}
148
- onChange={(event) => onConfirmPasswordChange(event.target.value)}
149
- onKeyDown={handleKeyDown}
150
- />
114
+ {/* First + Last name */}
115
+ <div className="flex gap-[var(--spacing-system-l)]">
116
+ <div className="min-w-0 flex-1">
117
+ <Input
118
+ label="First Name"
119
+ placeholder="Enter First Name"
120
+ value={firstName}
121
+ error={errors?.firstName}
122
+ disabled={fieldsDisabled}
123
+ onChange={(event) => onFirstNameChange(event.target.value)}
124
+ onKeyDown={handleKeyDown}
125
+ />
126
+ </div>
127
+ <div className="min-w-0 flex-1">
128
+ <Input
129
+ label="Last Name"
130
+ placeholder="Enter Last Name"
131
+ value={lastName}
132
+ error={errors?.lastName}
133
+ disabled={fieldsDisabled}
134
+ onChange={(event) => onLastNameChange(event.target.value)}
135
+ onKeyDown={handleKeyDown}
136
+ />
137
+ </div>
138
+ </div>
139
+
140
+ {/* Password + Confirm */}
141
+ <div className="flex gap-[var(--spacing-system-l)]">
142
+ <div className="min-w-0 flex-1">
143
+ <PasswordInput
144
+ label="Password"
145
+ placeholder="Enter Password"
146
+ value={password}
147
+ error={errors?.password}
148
+ disabled={fieldsDisabled}
149
+ onChange={(event) => onPasswordChange(event.target.value)}
150
+ onKeyDown={handleKeyDown}
151
+ />
152
+ </div>
153
+ <div className="min-w-0 flex-1">
154
+ <PasswordInput
155
+ label="Confirm Password"
156
+ placeholder="Confirm Password"
157
+ value={confirmPassword}
158
+ error={errors?.confirmPassword}
159
+ disabled={fieldsDisabled}
160
+ onChange={(event) => onConfirmPasswordChange(event.target.value)}
161
+ onKeyDown={handleKeyDown}
162
+ />
163
+ </div>
164
+ </div>
151
165
 
152
166
  {/* Actions — optional back + submit */}
153
167
  <div className="flex items-center gap-[var(--spacing-system-l)]">
@@ -110,27 +110,33 @@ export function CreateOrganizationForm({
110
110
  <p className="text-h4 text-ods-text-secondary">Start your journey with OpenFrame.</p>
111
111
  </div>
112
112
 
113
- {/* Email + Organization Name — single column on every breakpoint */}
114
- <Input
115
- type="email"
116
- label="Email"
117
- placeholder="username@mail.com"
118
- value={email}
119
- error={errors?.email ?? emailStatus?.message}
120
- errorVariant={errors?.email ? 'error' : emailStatus?.variant}
121
- disabled={fieldsDisabled}
122
- onChange={(event) => onEmailChange(event.target.value)}
123
- onKeyDown={handleKeyDown}
124
- />
125
- <Input
126
- label="Organization Name"
127
- placeholder="Your Company Name"
128
- value={organizationName}
129
- error={errors?.organizationName}
130
- disabled={fieldsDisabled}
131
- onChange={(event) => onOrganizationNameChange(event.target.value)}
132
- onKeyDown={handleKeyDown}
133
- />
113
+ {/* Email + Organization Name — side by side on every breakpoint */}
114
+ <div className="flex gap-[var(--spacing-system-l)]">
115
+ <div className="min-w-0 flex-1">
116
+ <Input
117
+ type="email"
118
+ label="Email"
119
+ placeholder="username@mail.com"
120
+ value={email}
121
+ error={errors?.email ?? emailStatus?.message}
122
+ errorVariant={errors?.email ? 'error' : emailStatus?.variant}
123
+ disabled={fieldsDisabled}
124
+ onChange={(event) => onEmailChange(event.target.value)}
125
+ onKeyDown={handleKeyDown}
126
+ />
127
+ </div>
128
+ <div className="min-w-0 flex-1">
129
+ <Input
130
+ label="Organization Name"
131
+ placeholder="Your Company Name"
132
+ value={organizationName}
133
+ error={errors?.organizationName}
134
+ disabled={fieldsDisabled}
135
+ onChange={(event) => onOrganizationNameChange(event.target.value)}
136
+ onKeyDown={handleKeyDown}
137
+ />
138
+ </div>
139
+ </div>
134
140
 
135
141
  {/* Domain */}
136
142
  <div className="flex flex-col">
@@ -145,7 +151,8 @@ export function CreateOrganizationForm({
145
151
  onChange={(event) => onDomainChange(event.target.value)}
146
152
  onKeyDown={handleKeyDown}
147
153
  />
148
- {domainSlot && <div className="pt-[var(--spacing-system-s)]">{domainSlot}</div>}
154
+ {/* Top padding clears the absolutely-positioned field message */}
155
+ {domainSlot && <div className="pt-[var(--spacing-system-l)]">{domainSlot}</div>}
149
156
  </div>
150
157
 
151
158
  {/* Terms & Privacy */}
@@ -102,43 +102,57 @@ export function OpenFrameSsoSignUpForm({
102
102
  onKeyDown={handleKeyDown}
103
103
  />
104
104
 
105
- {/* Name + password fields — single column on every breakpoint */}
106
- <Input
107
- label="First Name"
108
- placeholder="Enter First Name"
109
- value={firstName}
110
- error={errors?.firstName}
111
- disabled={fieldsDisabled}
112
- onChange={(event) => onFirstNameChange(event.target.value)}
113
- onKeyDown={handleKeyDown}
114
- />
115
- <Input
116
- label="Last Name"
117
- placeholder="Enter Last Name"
118
- value={lastName}
119
- error={errors?.lastName}
120
- disabled={fieldsDisabled}
121
- onChange={(event) => onLastNameChange(event.target.value)}
122
- onKeyDown={handleKeyDown}
123
- />
124
- <PasswordInput
125
- label="Password"
126
- placeholder="Enter Password"
127
- value={password}
128
- error={errors?.password}
129
- disabled={fieldsDisabled}
130
- onChange={(event) => onPasswordChange(event.target.value)}
131
- onKeyDown={handleKeyDown}
132
- />
133
- <PasswordInput
134
- label="Confirm Password"
135
- placeholder="Confirm Password"
136
- value={confirmPassword}
137
- error={errors?.confirmPassword}
138
- disabled={fieldsDisabled}
139
- onChange={(event) => onConfirmPasswordChange(event.target.value)}
140
- onKeyDown={handleKeyDown}
141
- />
105
+ {/* First + Last name */}
106
+ <div className="flex gap-[var(--spacing-system-l)]">
107
+ <div className="min-w-0 flex-1">
108
+ <Input
109
+ label="First Name"
110
+ placeholder="Enter First Name"
111
+ value={firstName}
112
+ error={errors?.firstName}
113
+ disabled={fieldsDisabled}
114
+ onChange={(event) => onFirstNameChange(event.target.value)}
115
+ onKeyDown={handleKeyDown}
116
+ />
117
+ </div>
118
+ <div className="min-w-0 flex-1">
119
+ <Input
120
+ label="Last Name"
121
+ placeholder="Enter Last Name"
122
+ value={lastName}
123
+ error={errors?.lastName}
124
+ disabled={fieldsDisabled}
125
+ onChange={(event) => onLastNameChange(event.target.value)}
126
+ onKeyDown={handleKeyDown}
127
+ />
128
+ </div>
129
+ </div>
130
+
131
+ {/* Password + Confirm */}
132
+ <div className="flex gap-[var(--spacing-system-l)]">
133
+ <div className="min-w-0 flex-1">
134
+ <PasswordInput
135
+ label="Password"
136
+ placeholder="Enter Password"
137
+ value={password}
138
+ error={errors?.password}
139
+ disabled={fieldsDisabled}
140
+ onChange={(event) => onPasswordChange(event.target.value)}
141
+ onKeyDown={handleKeyDown}
142
+ />
143
+ </div>
144
+ <div className="min-w-0 flex-1">
145
+ <PasswordInput
146
+ label="Confirm Password"
147
+ placeholder="Confirm Password"
148
+ value={confirmPassword}
149
+ error={errors?.confirmPassword}
150
+ disabled={fieldsDisabled}
151
+ onChange={(event) => onConfirmPasswordChange(event.target.value)}
152
+ onKeyDown={handleKeyDown}
153
+ />
154
+ </div>
155
+ </div>
142
156
 
143
157
  {/* Forgot password + Continue */}
144
158
  <div className="flex items-center gap-[var(--spacing-system-l)]">
@@ -6,7 +6,7 @@ import { cn } from "../../utils/cn"
6
6
  export interface FieldWrapperProps {
7
7
  /** Label text displayed above the field */
8
8
  label?: string
9
- /** Status message displayed below the field. Wraps up to two lines, then ellipsizes. */
9
+ /** Status message displayed below the field. Space is always reserved to prevent layout shifts. */
10
10
  error?: string
11
11
  /** Color variant for the message: "error" (red), "warning" (yellow), "success" (green) or "muted" (grey) */
12
12
  errorVariant?: "error" | "warning" | "success" | "muted"
@@ -27,7 +27,7 @@ const FieldWrapper = React.forwardRef<HTMLDivElement, FieldWrapperProps>(
27
27
  const hasChrome = label != null || error != null
28
28
 
29
29
  return (
30
- <div ref={ref} className={cn(hasChrome ? "flex w-full flex-col" : "contents", className)}>
30
+ <div ref={ref} className={cn(hasChrome ? "relative flex w-full flex-col" : "contents", className)}>
31
31
  {label && (
32
32
  <label className="text-h4 text-ods-text-primary mb-1">
33
33
  {label}
@@ -35,10 +35,7 @@ const FieldWrapper = React.forwardRef<HTMLDivElement, FieldWrapperProps>(
35
35
  )}
36
36
  {children}
37
37
  {error && (
38
- <p
39
- className={cn("mt-1 text-h6 break-words line-clamp-2", errorVariantClasses[errorVariant])}
40
- title={error}
41
- >
38
+ <p className={cn("absolute bottom-0 left-0 right-0 translate-y-full text-h6 truncate", errorVariantClasses[errorVariant])} title={error}>
42
39
  {error}
43
40
  </p>
44
41
  )}
@@ -219,47 +219,3 @@ export const AllVariants: Story = {
219
219
  </div>
220
220
  ),
221
221
  };
222
-
223
- /**
224
- * Error / status states. Long messages wrap up to two lines, then ellipsize.
225
- */
226
- export const ErrorState: Story = {
227
- args: {
228
- placeholder: 'Enter text...',
229
- },
230
- render: () => (
231
- <div style={{ display: 'flex', flexDirection: 'column', gap: '2.5rem', width: '480px' }}>
232
- <Input label="Short error (no interaction)" placeholder="username@mail.com" error="Required field" />
233
- <Input
234
- label="Long error — wraps to two lines"
235
- defaultValue="ada@example.com"
236
- error="This email is already registered. Sign in instead or use a different email address to create the organization."
237
- />
238
- {/* Half-width pair, as on the Create Organization screen */}
239
- <div style={{ display: 'flex', gap: '1.5rem' }}>
240
- <Input
241
- label="Email"
242
- defaultValue="ada@example.com"
243
- error="This email is already registered. Sign in instead."
244
- />
245
- <Input
246
- label="Organization Name"
247
- defaultValue="ϕ"
248
- error="Organization Name must be 2-100 characters"
249
- />
250
- </div>
251
- <Input
252
- label="Success status"
253
- defaultValue="ada@example.com"
254
- error="Email is available"
255
- errorVariant="success"
256
- />
257
- <Input
258
- label="Muted status (long, truncating)"
259
- defaultValue="ada-lovelace-computing"
260
- error="Checking availability against every registered organization domain, this may take a moment…"
261
- errorVariant="muted"
262
- />
263
- </div>
264
- ),
265
- };
@@ -97,25 +97,6 @@ export const Filled: Story = {
97
97
  ),
98
98
  }
99
99
 
100
- /**
101
- * Error state: long messages under the fields wrap up to two lines.
102
- */
103
- export const ErrorState: Story = {
104
- render: () => (
105
- <CreateOrganizationPage
106
- email="ada@example.com"
107
- organizationName="ϕ"
108
- domainSuffix=".openframe.ai"
109
- termsUrl="#terms"
110
- privacyPolicyUrl="#privacy"
111
- emailStatus={{ message: 'This email is already registered. Sign in instead.', variant: 'error' }}
112
- errors={{
113
- organizationName: 'Organization Name must be 2-100 characters',
114
- }}
115
- />
116
- ),
117
- }
118
-
119
100
  const SSO_PROVIDERS: AuthSsoProvider[] = ['openframe', 'google', 'microsoft']
120
101
 
121
102
  /** SSO configured: fields disabled, submit replaced by provider buttons. */