@arqel-dev/fields 0.14.0 → 0.15.1

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/dist/slug.js CHANGED
@@ -1,7 +1,8 @@
1
+ import { useArqelTranslations } from '@arqel-dev/react/utils';
1
2
  import { cn } from '@arqel-dev/ui/utils';
2
3
  import { jsx } from 'react/jsx-runtime';
3
4
 
4
- // src/shared/styles.ts
5
+ // src/slug/SlugInput.tsx
5
6
  var inputClasses = cn(
6
7
  "h-9 w-full rounded-sm border border-[var(--input)]",
7
8
  "bg-background px-3 text-sm text-foreground",
@@ -26,6 +27,7 @@ function SlugInput({
26
27
  describedBy
27
28
  }) {
28
29
  const f = field;
30
+ const t = useArqelTranslations();
29
31
  const hasError = errors !== void 0 && errors.length > 0;
30
32
  return /* @__PURE__ */ jsx(
31
33
  "input",
@@ -34,7 +36,7 @@ function SlugInput({
34
36
  type: "text",
35
37
  className: inputClasses,
36
38
  value: typeof value === "string" ? value : "",
37
- placeholder: f.placeholder ?? "my-resource-slug",
39
+ placeholder: f.placeholder ?? t("arqel.fields.slug.placeholder", "my-resource-slug"),
38
40
  disabled: disabled || f.disabled || f.readonly,
39
41
  readOnly: f.readonly === true,
40
42
  required: f.required === true,
package/dist/slug.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/styles.ts","../src/slug/SlugInput.tsx"],"names":[],"mappings":";;;;AAOO,IAAM,YAAA,GAAe,EAAA;AAAA,EAC1B,oDAAA;AAAA,EACA,4CAAA;AAAA,EACA,mCAAA;AAAA,EACA,yEAAA;AAAA,EACA,iDAAA;AAAA,EACA;AACF,CAAA;AAE+B,EAAA;AAAA,EAC7B,uCAAA;AAAA,EACA,cAAA;AAAA,EACA,yEAAA;AAAA,EACA;AACF;ACLO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,MAC3C,WAAA,EAAa,EAAE,WAAA,IAAe,kBAAA;AAAA,MAC9B,QAAA,EAAU,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAAA,MACtC,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,SAAA,EAAW,EAAE,KAAA,CAAM,SAAA;AAAA,MACnB,YAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAQ,cAAA;AAAA,MACR,gBAAc,QAAA,IAAY,MAAA;AAAA,MAC1B,kBAAA,EAAkB,WAAA;AAAA,MAClB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC;AAAA;AAAA,GACnD;AAEJ;AAEO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,MACJ,WAAA,EAAY,CACZ,SAAA,CAAU,KAAK,EACf,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,QAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC3B","file":"slug.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<SlugInput>` — auto-generated URL-safe slug.\n *\n * Phase 1 ships a manual slug field (text input with slug normalisation\n * on every keystroke). Auto-derivation from a source field (`dependsOn`)\n * lands as a follow-up because it requires either FormContext access\n * or a dependency-resolver pipeline that we don't yet expose.\n *\n * Reserved slug detection (`field.props.reservedSlugs`) is enforced\n * server-side via the Validator; the input itself just normalises.\n */\n\nimport type { SlugFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SlugInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SlugFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? 'my-resource-slug'}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n autoComplete=\"off\"\n pattern=\"^[a-z0-9-]*$\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(slugify(e.target.value))}\n />\n );\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/styles.ts","../src/slug/SlugInput.tsx"],"names":[],"mappings":";;;;;AAOO,IAAM,YAAA,GAAe,EAAA;AAAA,EAC1B,oDAAA;AAAA,EACA,4CAAA;AAAA,EACA,mCAAA;AAAA,EACA,yEAAA;AAAA,EACA,iDAAA;AAAA,EACA;AACF,CAAA;AAE+B,EAAA;AAAA,EAC7B,uCAAA;AAAA,EACA,cAAA;AAAA,EACA,yEAAA;AAAA,EACA;AACF;ACJO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,MAC3C,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,iCAAiC,kBAAkB,CAAA;AAAA,MACnF,QAAA,EAAU,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAAA,MACtC,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,SAAA,EAAW,EAAE,KAAA,CAAM,SAAA;AAAA,MACnB,YAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAQ,cAAA;AAAA,MACR,gBAAc,QAAA,IAAY,MAAA;AAAA,MAC1B,kBAAA,EAAkB,WAAA;AAAA,MAClB,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC;AAAA;AAAA,GACnD;AAEJ;AAEO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,MACJ,WAAA,EAAY,CACZ,SAAA,CAAU,KAAK,EACf,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,QAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC3B","file":"slug.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<SlugInput>` — auto-generated URL-safe slug.\n *\n * Phase 1 ships a manual slug field (text input with slug normalisation\n * on every keystroke). Auto-derivation from a source field (`dependsOn`)\n * lands as a follow-up because it requires either FormContext access\n * or a dependency-resolver pipeline that we don't yet expose.\n *\n * Reserved slug detection (`field.props.reservedSlugs`) is enforced\n * server-side via the Validator; the input itself just normalises.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { SlugFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function SlugInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as SlugFieldSchema;\n const t = useArqelTranslations();\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? t('arqel.fields.slug.placeholder', 'my-resource-slug')}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n autoComplete=\"off\"\n pattern=\"^[a-z0-9-]*$\"\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(slugify(e.target.value))}\n />\n );\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n"]}
package/dist/text.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { cn } from '@arqel-dev/ui/utils';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { useArqelTranslations } from '@arqel-dev/react/utils';
3
4
  import { useState } from 'react';
4
5
 
5
6
  // src/shared/styles.ts
@@ -56,6 +57,7 @@ function PasswordInput({
56
57
  describedBy
57
58
  }) {
58
59
  const f = field;
60
+ const t = useArqelTranslations();
59
61
  const [revealed, setRevealed] = useState(false);
60
62
  const hasError = errors !== void 0 && errors.length > 0;
61
63
  const isDisabled = disabled || f.disabled || f.readonly;
@@ -81,7 +83,7 @@ function PasswordInput({
81
83
  "button",
82
84
  {
83
85
  type: "button",
84
- "aria-label": revealed ? "Hide password" : "Show password",
86
+ "aria-label": revealed ? t("arqel.fields.password.hide", "Hide password") : t("arqel.fields.password.show", "Show password"),
85
87
  "aria-pressed": revealed,
86
88
  disabled: isDisabled,
87
89
  onClick: () => setRevealed((v) => !v),
package/dist/text.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/styles.ts","../src/text/EmailInput.tsx","../src/text/PasswordInput.tsx","../src/text/TextareaInput.tsx","../src/text/TextInput.tsx","../src/text/UrlInput.tsx"],"names":["jsx","cn"],"mappings":"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","file":"text.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<EmailInput>` — `<input type=\"email\">` with sensible defaults.\n *\n * Mirrors browser email validation; server-side validation remains the\n * source of truth (Laravel `email` rule).\n */\n\nimport type { EmailFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function EmailInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as EmailFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"email\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'email'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<PasswordInput>` — masked input with a \"reveal\" toggle button.\n *\n * Toggles between `type=\"password\"` and `type=\"text\"`; the button\n * is rendered inside the trailing edge of the input via wrapper.\n */\n\nimport type { PasswordFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function PasswordInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as PasswordFieldSchema;\n const [revealed, setRevealed] = useState(false);\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type={revealed ? 'text' : 'password'}\n className={cn(inputClasses, 'pr-10')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'current-password'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n <button\n type=\"button\"\n aria-label={revealed ? 'Hide password' : 'Show password'}\n aria-pressed={revealed}\n disabled={isDisabled}\n onClick={() => setRevealed((v) => !v)}\n className={cn(\n 'absolute inset-y-0 right-0 flex w-9 items-center justify-center text-sm',\n 'text-muted-foreground hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {revealed ? '◉' : '○'}\n </button>\n </div>\n );\n}\n","import type { TextareaFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextareaInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextareaFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <textarea\n id={inputId}\n className={cn(inputClasses, 'h-auto min-h-[5rem] py-2')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n rows={4}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<TextInput>` — generic single-line text field.\n *\n * Used as the registered component for FieldType `text` and `slug`.\n * Slug-specific auto-generation logic lives in FIELDS-JS-004's\n * `<SlugInput>`; this component is the simple text path.\n */\n\nimport type { TextFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n minLength={f.props.minLength}\n pattern={f.props.pattern}\n autoComplete={f.props.autocomplete}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","import type { UrlFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function UrlInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as UrlFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"url\"\n inputMode=\"url\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? 'https://…'}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'url'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/styles.ts","../src/text/EmailInput.tsx","../src/text/PasswordInput.tsx","../src/text/TextareaInput.tsx","../src/text/TextInput.tsx","../src/text/UrlInput.tsx"],"names":["jsx","cn"],"mappings":";;;;;;AAOO,IAAM,YAAA,GAAe,EAAA;AAAA,EAC1B,oDAAA;AAAA,EACA,4CAAA;AAAA,EACA,mCAAA;AAAA,EACA,yEAAA;AAAA,EACA,iDAAA;AAAA,EACA;AACF,CAAA;AAE+B,EAAA;AAAA,EAC7B,uCAAA;AAAA,EACA,cAAA;AAAA,EACA,yEAAA;AAAA,EACA;AACF;ACVO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,MAC3C,WAAA,EAAa,EAAE,WAAA,IAAe,MAAA;AAAA,MAC9B,QAAA,EAAU,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAAA,MACtC,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,YAAA,IAAgB,OAAA;AAAA,MACtC,gBAAc,QAAA,IAAY,MAAA;AAAA,MAC1B,kBAAA,EAAkB,WAAA;AAAA,MAClB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,GAC1C;AAEJ;ACxBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,IAAI,oBAAA,EAAqB;AAC/B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAE/C,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,WAAW,MAAA,GAAS,UAAA;AAAA,QAC1B,SAAA,EAAWC,EAAAA,CAAG,YAAA,EAAc,OAAO,CAAA;AAAA,QACnC,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,QAC3C,WAAA,EAAa,EAAE,WAAA,IAAe,MAAA;AAAA,QAC9B,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,QACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,QACzB,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,YAAA,IAAgB,kBAAA;AAAA,QACtC,gBAAc,QAAA,IAAY,MAAA;AAAA,QAC1B,kBAAA,EAAkB,WAAA;AAAA,QAClB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,KAC1C;AAAA,oBACAD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EACE,WACI,CAAA,CAAE,4BAAA,EAA8B,eAAe,CAAA,GAC/C,CAAA,CAAE,8BAA8B,eAAe,CAAA;AAAA,QAErD,cAAA,EAAc,QAAA;AAAA,QACd,QAAA,EAAU,UAAA;AAAA,QACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QACpC,SAAA,EAAWC,EAAAA;AAAA,UACT,yEAAA;AAAA,UACA,6CAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,qBAAW,QAAA,GAAM;AAAA;AAAA;AACpB,GAAA,EACF,CAAA;AAEJ;AC5DO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,uBACED,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,SAAA,EAAWC,EAAAA,CAAG,YAAA,EAAc,0BAA0B,CAAA;AAAA,MACtD,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,MAC3C,WAAA,EAAa,EAAE,WAAA,IAAe,MAAA;AAAA,MAC9B,QAAA,EAAU,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAAA,MACtC,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,IAAA,EAAM,CAAA;AAAA,MACN,gBAAc,QAAA,IAAY,MAAA;AAAA,MAC1B,kBAAA,EAAkB,WAAA;AAAA,MAClB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,GAC1C;AAEJ;ACnBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,uBACED,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,MAC3C,WAAA,EAAa,EAAE,WAAA,IAAe,MAAA;AAAA,MAC9B,QAAA,EAAU,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAAA,MACtC,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,SAAA,EAAW,EAAE,KAAA,CAAM,SAAA;AAAA,MACnB,SAAA,EAAW,EAAE,KAAA,CAAM,SAAA;AAAA,MACnB,OAAA,EAAS,EAAE,KAAA,CAAM,OAAA;AAAA,MACjB,YAAA,EAAc,EAAE,KAAA,CAAM,YAAA;AAAA,MACtB,gBAAc,QAAA,IAAY,MAAA;AAAA,MAC1B,kBAAA,EAAkB,WAAA;AAAA,MAClB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,GAC1C;AAEJ;ACtCO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA;AACzD,EAAA,uBACEA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAU,KAAA;AAAA,MACV,SAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAA;AAAA,MAC3C,WAAA,EAAa,EAAE,WAAA,IAAe,gBAAA;AAAA,MAC9B,QAAA,EAAU,QAAA,IAAY,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA;AAAA,MACtC,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,QAAA,EAAU,EAAE,QAAA,KAAa,IAAA;AAAA,MACzB,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,YAAA,IAAgB,KAAA;AAAA,MACtC,gBAAc,QAAA,IAAY,MAAA;AAAA,MAC1B,kBAAA,EAAkB,WAAA;AAAA,MAClB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK;AAAA;AAAA,GAC1C;AAEJ","file":"text.js","sourcesContent":["/**\n * Shared input styling — keeps the visual contract consistent across\n * every Field component without forcing a wrapper component.\n */\n\nimport { cn } from '@arqel-dev/ui/utils';\n\nexport const inputClasses = cn(\n 'h-9 w-full rounded-sm border border-[var(--input)]',\n 'bg-background px-3 text-sm text-foreground',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-invalid:border-destructive',\n);\n\nexport const checkboxClasses = cn(\n 'h-4 w-4 rounded border-[var(--input)]',\n 'text-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n);\n","/**\n * `<EmailInput>` — `<input type=\"email\">` with sensible defaults.\n *\n * Mirrors browser email validation; server-side validation remains the\n * source of truth (Laravel `email` rule).\n */\n\nimport type { EmailFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function EmailInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as EmailFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"email\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'email'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<PasswordInput>` — masked input with a \"reveal\" toggle button.\n *\n * Toggles between `type=\"password\"` and `type=\"text\"`; the button\n * is rendered inside the trailing edge of the input via wrapper.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { PasswordFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { useState } from 'react';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function PasswordInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as PasswordFieldSchema;\n const t = useArqelTranslations();\n const [revealed, setRevealed] = useState(false);\n const hasError = errors !== undefined && errors.length > 0;\n const isDisabled = disabled || f.disabled || f.readonly;\n\n return (\n <div className=\"relative\">\n <input\n id={inputId}\n type={revealed ? 'text' : 'password'}\n className={cn(inputClasses, 'pr-10')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={isDisabled}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'current-password'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n <button\n type=\"button\"\n aria-label={\n revealed\n ? t('arqel.fields.password.hide', 'Hide password')\n : t('arqel.fields.password.show', 'Show password')\n }\n aria-pressed={revealed}\n disabled={isDisabled}\n onClick={() => setRevealed((v) => !v)}\n className={cn(\n 'absolute inset-y-0 right-0 flex w-9 items-center justify-center text-sm',\n 'text-muted-foreground hover:text-foreground',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n >\n {revealed ? '◉' : '○'}\n </button>\n </div>\n );\n}\n","import type { TextareaFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { cn } from '@arqel-dev/ui/utils';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextareaInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextareaFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <textarea\n id={inputId}\n className={cn(inputClasses, 'h-auto min-h-[5rem] py-2')}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n rows={4}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","/**\n * `<TextInput>` — generic single-line text field.\n *\n * Used as the registered component for FieldType `text` and `slug`.\n * Slug-specific auto-generation logic lives in FIELDS-JS-004's\n * `<SlugInput>`; this component is the simple text path.\n */\n\nimport type { TextFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function TextInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as TextFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"text\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? undefined}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n maxLength={f.props.maxLength}\n minLength={f.props.minLength}\n pattern={f.props.pattern}\n autoComplete={f.props.autocomplete}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n","import type { UrlFieldSchema } from '@arqel-dev/types/fields';\nimport type { FieldRendererProps } from '@arqel-dev/ui/form';\nimport { inputClasses } from '../shared/styles.js';\n\nexport function UrlInput({\n field,\n value,\n onChange,\n errors,\n disabled,\n inputId,\n describedBy,\n}: FieldRendererProps) {\n const f = field as UrlFieldSchema;\n const hasError = errors !== undefined && errors.length > 0;\n return (\n <input\n id={inputId}\n type=\"url\"\n inputMode=\"url\"\n className={inputClasses}\n value={typeof value === 'string' ? value : ''}\n placeholder={f.placeholder ?? 'https://…'}\n disabled={disabled || f.disabled || f.readonly}\n readOnly={f.readonly === true}\n required={f.required === true}\n autoComplete={f.props.autocomplete ?? 'url'}\n aria-invalid={hasError || undefined}\n aria-describedby={describedBy}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arqel-dev/fields",
3
- "version": "0.14.0",
3
+ "version": "0.15.1",
4
4
  "description": "Rich React input components for Arqel — registered into @arqel-dev/ui's FieldRegistry.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://arqel.dev",
@@ -77,12 +77,13 @@
77
77
  "SKILL.md"
78
78
  ],
79
79
  "dependencies": {
80
- "@arqel-dev/types": "0.14.0"
80
+ "@arqel-dev/types": "0.15.1"
81
81
  },
82
82
  "peerDependencies": {
83
83
  "react": "^19.2.0",
84
84
  "react-dom": "^19.2.0",
85
- "@arqel-dev/ui": "0.14.0"
85
+ "@arqel-dev/react": "0.15.1",
86
+ "@arqel-dev/ui": "0.15.1"
86
87
  },
87
88
  "devDependencies": {
88
89
  "@inertiajs/react": "^3.0.0",
@@ -97,7 +98,8 @@
97
98
  "tsup": "^8.5.0",
98
99
  "typescript": "^5.6.3",
99
100
  "vitest": "^4.1.0",
100
- "@arqel-dev/ui": "0.14.0"
101
+ "@arqel-dev/react": "0.15.1",
102
+ "@arqel-dev/ui": "0.15.1"
101
103
  },
102
104
  "publishConfig": {
103
105
  "access": "public"