@elytracms/studio 0.0.78 → 0.0.79

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 (85) hide show
  1. package/dist/components/app-views/default-modules.js +5 -1
  2. package/dist/components/app-views/default-modules.js.map +1 -1
  3. package/dist/components/assets/asset-thumb.js +12 -11
  4. package/dist/components/assets/asset-thumb.js.map +1 -1
  5. package/dist/components/builder/blocks-panel.d.ts +11 -5
  6. package/dist/components/builder/blocks-panel.js +18 -24
  7. package/dist/components/builder/blocks-panel.js.map +1 -1
  8. package/dist/components/builder/canvas-render-context.d.ts +22 -0
  9. package/dist/components/builder/canvas-render-context.js +65 -9
  10. package/dist/components/builder/canvas-render-context.js.map +1 -1
  11. package/dist/components/builder/reuse.d.ts +25 -0
  12. package/dist/components/builder/reuse.js +11 -2
  13. package/dist/components/builder/reuse.js.map +1 -1
  14. package/dist/components/cms/asset-field.js +52 -19
  15. package/dist/components/cms/asset-field.js.map +1 -1
  16. package/dist/components/cms/asset-picker-core.d.ts +40 -0
  17. package/dist/components/cms/asset-picker-core.js +21 -0
  18. package/dist/components/cms/asset-picker-core.js.map +1 -1
  19. package/dist/components/cms/asset-picker.d.ts +11 -2
  20. package/dist/components/cms/asset-picker.js +34 -13
  21. package/dist/components/cms/asset-picker.js.map +1 -1
  22. package/dist/components/cms/cell.js +2 -1
  23. package/dist/components/cms/cell.js.map +1 -1
  24. package/dist/components/cms/cms-store.d.ts +8 -1
  25. package/dist/components/cms/cms-store.js +8 -7
  26. package/dist/components/cms/cms-store.js.map +1 -1
  27. package/dist/components/cms/collection-table.js +7 -1
  28. package/dist/components/cms/collection-table.js.map +1 -1
  29. package/dist/components/cms/date-input-core.d.ts +64 -0
  30. package/dist/components/cms/date-input-core.js +78 -0
  31. package/dist/components/cms/date-input-core.js.map +1 -0
  32. package/dist/components/cms/date-input.d.ts +43 -0
  33. package/dist/components/cms/date-input.js +109 -0
  34. package/dist/components/cms/date-input.js.map +1 -0
  35. package/dist/components/cms/document-diff-view.js +2 -1
  36. package/dist/components/cms/document-diff-view.js.map +1 -1
  37. package/dist/components/cms/document-staging.d.ts +15 -4
  38. package/dist/components/cms/document-staging.js +26 -15
  39. package/dist/components/cms/document-staging.js.map +1 -1
  40. package/dist/components/cms/editable-cell.js +39 -5
  41. package/dist/components/cms/editable-cell.js.map +1 -1
  42. package/dist/components/cms/field-control.js +38 -7
  43. package/dist/components/cms/field-control.js.map +1 -1
  44. package/dist/components/cms/scalar-value-editor.js +4 -1
  45. package/dist/components/cms/scalar-value-editor.js.map +1 -1
  46. package/dist/components/cms/slug-auto-derive.d.ts +41 -0
  47. package/dist/components/cms/slug-auto-derive.js +14 -0
  48. package/dist/components/cms/slug-auto-derive.js.map +1 -0
  49. package/dist/components/components/transfer-dialog.js +3 -1
  50. package/dist/components/components/transfer-dialog.js.map +1 -1
  51. package/dist/components/project-session.d.ts +44 -22
  52. package/dist/components/project-session.js +72 -36
  53. package/dist/components/project-session.js.map +1 -1
  54. package/dist/lib/assets/asset-url.d.ts +20 -0
  55. package/dist/lib/assets/asset-url.js +25 -0
  56. package/dist/lib/assets/asset-url.js.map +1 -0
  57. package/dist/lib/assets/browser-blob-storage.d.ts +80 -0
  58. package/dist/lib/assets/browser-blob-storage.js +86 -0
  59. package/dist/lib/assets/browser-blob-storage.js.map +1 -0
  60. package/dist/lib/assets/index.d.ts +2 -0
  61. package/dist/lib/assets/index.js +2 -0
  62. package/dist/lib/assets/index.js.map +1 -1
  63. package/dist/lib/data/collection-content.d.ts +20 -1
  64. package/dist/lib/data/collection-content.js +51 -1
  65. package/dist/lib/data/collection-content.js.map +1 -1
  66. package/dist/lib/data/content-session-refresh.d.ts +74 -0
  67. package/dist/lib/data/content-session-refresh.js +138 -0
  68. package/dist/lib/data/content-session-refresh.js.map +1 -0
  69. package/dist/lib/data/index.d.ts +2 -0
  70. package/dist/lib/data/index.js +2 -0
  71. package/dist/lib/data/index.js.map +1 -1
  72. package/dist/lib/data/playground-unload-guard.d.ts +22 -0
  73. package/dist/lib/data/playground-unload-guard.js +73 -0
  74. package/dist/lib/data/playground-unload-guard.js.map +1 -0
  75. package/dist/lib/i18n/messages.de.js +3 -1
  76. package/dist/lib/i18n/messages.de.js.map +1 -1
  77. package/dist/lib/i18n/messages.en.d.ts +2 -0
  78. package/dist/lib/i18n/messages.en.js +5 -1
  79. package/dist/lib/i18n/messages.en.js.map +1 -1
  80. package/dist/lib/persistence/index.js +6 -1
  81. package/dist/lib/persistence/index.js.map +1 -1
  82. package/dist/ui/input.d.ts +8 -3
  83. package/dist/ui/input.js +6 -1
  84. package/dist/ui/input.js.map +1 -1
  85. package/package.json +2 -2
@@ -1,5 +1,6 @@
1
1
  import { SEED_PROJECT_ID, createSeededPersistenceAdapter } from '@elytracms/core/persistence';
2
2
  import { resolveDeploymentCollections, resolveDeploymentProjectId, resolveDeploymentUrl, } from '../workspace/index.js';
3
+ import { createBrowserBlobStorage } from '../assets/browser-blob-storage.js';
3
4
  import { getConvexClient } from './convex-client.js';
4
5
  import { ConvexPersistenceAdapter } from './convex-adapter.js';
5
6
  import { resolveBackendConfig } from './backend-mode.js';
@@ -44,7 +45,11 @@ export async function selectPersistenceAdapter() {
44
45
  // repo's demo `post.slug`, EC-315) gets promoted into `localized`, not just
45
46
  // the schema — see `reconcileSeedDocumentLocalization` in `@elytracms/core/persistence`.
46
47
  const collections = resolveDeploymentCollections();
47
- const adapter = await createSeededPersistenceAdapter(projectId, collections.length > 0 ? collections : undefined);
48
+ // EC-459: seed with a studio-owned blob adapter that mints real browser-
49
+ // displayable URLs (object URLs) instead of the engine default's opaque
50
+ // `memory://` locator — see `browser-blob-storage.ts` for the full
51
+ // rationale. Playground-only; the Convex branch above is untouched.
52
+ const adapter = await createSeededPersistenceAdapter(projectId, collections.length > 0 ? collections : undefined, { blobs: createBrowserBlobStorage() });
48
53
  return adapter;
49
54
  }
50
55
  throw new Error(config.detail);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/persistence/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA;AAE7F,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAGrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAA;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,wBAAwB,CACjC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EACjD,0BAA0B,CAAC,kBAAkB,CAAC;QAC9C,sEAAsE;QACtE,0EAA0E;QAC1E,sCAAsC;QACtC,4BAA4B,EAAE,CAC/B,CAAA;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,6EAA6E;QAC7E,0DAA0D;QAC1D,0EAA0E;QAC1E,+EAA+E;QAC/E,+EAA+E;QAC/E,8EAA8E;QAC9E,MAAM,SAAS,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAA;QAC7D,6EAA6E;QAC7E,gFAAgF;QAChF,8EAA8E;QAC9E,+EAA+E;QAC/E,2EAA2E;QAC3E,wEAAwE;QACxE,6EAA6E;QAC7E,wEAAwE;QACxE,8EAA8E;QAC9E,2EAA2E;QAC3E,4EAA4E;QAC5E,yFAAyF;QACzF,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAA;QAClD,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAClD,SAAS,EACT,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CACjD,CAAA;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAA;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACrE,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,YAAY,CAAA;IACrD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAA;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnE,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,8BAA8B,EAC9B,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,GACV,MAAM,gBAAgB,CAAA;AAQvB,kFAAkF;AAClF,gFAAgF;AAChF,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA","sourcesContent":["import { SEED_PROJECT_ID, createSeededPersistenceAdapter } from '@elytracms/core/persistence'\nimport type { PersistenceAdapter } from '@elytracms/core/persistence'\nimport {\n resolveDeploymentCollections,\n resolveDeploymentProjectId,\n resolveDeploymentUrl,\n} from '../workspace'\nimport { getConvexClient } from './convex-client'\nimport { ConvexPersistenceAdapter } from './convex-adapter'\nimport { resolveBackendConfig } from './backend-mode'\nimport type { StudioBackendMode } from './backend-mode'\n\n/**\n * Select the persistence backend (EC-153, vision AD-1). **Convex is the\n * default**: a configured `VITE_CONVEX_URL` is required unless the explicit\n * playground flag (`VITE_ELYTRA_MODE=playground`) opts into the deterministic,\n * seeded in-memory adapter. There is **no automatic in-memory fallback** —\n * missing configuration is a hard, descriptive error (the `DeploymentSetupGate`\n * renders it as a boot-error screen before any adapter is requested).\n *\n * EC-150: the Convex path uses the *shared* client so the auth adapter's\n * session JWT (set via `client.setAuth`) authenticates every persistence call.\n */\nexport async function selectPersistenceAdapter(): Promise<PersistenceAdapter> {\n const config = resolveBackendConfig()\n if (config.kind === 'convex') {\n return new ConvexPersistenceAdapter(\n getConvexClient(resolveDeploymentUrl(config.url)),\n resolveDeploymentProjectId('aurora-marketing'),\n // CMS collections are config-owned (EC-183, AD-11): inject the active\n // project's collections so the adapter serves the schema from config (the\n // backend has no `cmsSchemas` table).\n resolveDeploymentCollections(),\n )\n }\n if (config.kind === 'playground') {\n // EC-207: routes/redirects are config-sourced, never seeded to the backend —\n // the playground adapter no longer seeds route documents.\n // EC-310: key the seed under the ACTIVE project id (the config slug, e.g.\n // `aurora`) — not the engine's default `prj_aurora` — so content + memberships\n // sit under the same id the studio operates on. Otherwise authorization denies\n // every read (\"not a member of project 'aurora'\") and content resolves empty.\n const projectId = resolveDeploymentProjectId(SEED_PROJECT_ID)\n // EC-361 (AD-11 parity with the Convex adapter above): when a config project\n // declares collections, the playground serves the CONFIG-OWNED schema — not the\n // engine's seeded sample schema — so every schema reader (the content-session\n // hydration, the persister baseline, query validation's `filterable` set) sees\n // the same declarations connected mode serves. The resolved config already\n // carries the EC-257 default asset collection. Without a config (engine\n // fixtures/tests) the seeded sample schema stands, byte-identical to before.\n // EC-424: passing `collections` straight into the seed (not a follow-up\n // `saveSchema`) also reconciles the seeded DOCUMENTS against them — a field a\n // config declares localized but the shared fixture stores plain (e.g. this\n // repo's demo `post.slug`, EC-315) gets promoted into `localized`, not just\n // the schema — see `reconcileSeedDocumentLocalization` in `@elytracms/core/persistence`.\n const collections = resolveDeploymentCollections()\n const adapter = await createSeededPersistenceAdapter(\n projectId,\n collections.length > 0 ? collections : undefined,\n )\n return adapter\n }\n throw new Error(config.detail)\n}\n\n/**\n * A stable key identifying the active backend (EC-179): the resolved deployment\n * URL for the active project under Convex, or `playground`. The operations\n * bootstrap caches one bundle per key, so switching to a project on a different\n * deployment transparently selects (or builds) that backend's operations client.\n */\nexport function activeDeploymentKey(): string {\n const config = resolveBackendConfig()\n if (config.kind === 'convex') return resolveDeploymentUrl(config.url)\n if (config.kind === 'playground') return 'playground'\n throw new Error(config.detail)\n}\n\n/**\n * The active backend mode. Throws the same descriptive error as\n * {@link selectPersistenceAdapter} when the studio is misconfigured — UI that\n * only needs \"is this the playground?\" should use `isPlaygroundMode()`.\n */\nexport function persistenceMode(): StudioBackendMode {\n const config = resolveBackendConfig()\n if (config.kind === 'misconfigured') throw new Error(config.detail)\n return config.kind\n}\n\nexport { ConvexPersistenceAdapter } from './convex-adapter'\nexport {\n CONVEX_URL_ENV_VAR,\n DEV_LOGIN_ENV_VAR,\n MODE_ENV_VAR,\n PLAYGROUND_MODE,\n STUDIO_ENV_KEYS,\n detectStudioEnvAnomaly,\n isDevAutoLoginActive,\n isDevRuntime,\n isPlaygroundMode,\n provideStudioEnv,\n resetProvidedStudioEnvForTests,\n resolveBackendConfig,\n resolveDevAutoLogin,\n studioEnv,\n} from './backend-mode'\nexport type {\n DevAutoLoginCredentials,\n EnvRecord,\n StudioBackendConfig,\n StudioBackendMode,\n StudioEnvAnomaly,\n} from './backend-mode'\n// EC-258: the deployment-readiness facts mapper (the boot DeploymentSetupGate + a\n// future `elytra doctor` CLI compose the same `checkDeploymentReady` contract).\nexport { studioDeploymentReadiness, studioReadinessFacts } from './deployment-readiness'\nexport type { StudioReadinessInputs } from './deployment-readiness'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/persistence/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { SEED_PROJECT_ID, createSeededPersistenceAdapter } from '@elytracms/core/persistence'\nimport type { PersistenceAdapter } from '@elytracms/core/persistence'\nimport {\n resolveDeploymentCollections,\n resolveDeploymentProjectId,\n resolveDeploymentUrl,\n} from '../workspace'\nimport { createBrowserBlobStorage } from '../assets/browser-blob-storage'\nimport { getConvexClient } from './convex-client'\nimport { ConvexPersistenceAdapter } from './convex-adapter'\nimport { resolveBackendConfig } from './backend-mode'\nimport type { StudioBackendMode } from './backend-mode'\n\n/**\n * Select the persistence backend (EC-153, vision AD-1). **Convex is the\n * default**: a configured `VITE_CONVEX_URL` is required unless the explicit\n * playground flag (`VITE_ELYTRA_MODE=playground`) opts into the deterministic,\n * seeded in-memory adapter. There is **no automatic in-memory fallback** —\n * missing configuration is a hard, descriptive error (the `DeploymentSetupGate`\n * renders it as a boot-error screen before any adapter is requested).\n *\n * EC-150: the Convex path uses the *shared* client so the auth adapter's\n * session JWT (set via `client.setAuth`) authenticates every persistence call.\n */\nexport async function selectPersistenceAdapter(): Promise<PersistenceAdapter> {\n const config = resolveBackendConfig()\n if (config.kind === 'convex') {\n return new ConvexPersistenceAdapter(\n getConvexClient(resolveDeploymentUrl(config.url)),\n resolveDeploymentProjectId('aurora-marketing'),\n // CMS collections are config-owned (EC-183, AD-11): inject the active\n // project's collections so the adapter serves the schema from config (the\n // backend has no `cmsSchemas` table).\n resolveDeploymentCollections(),\n )\n }\n if (config.kind === 'playground') {\n // EC-207: routes/redirects are config-sourced, never seeded to the backend —\n // the playground adapter no longer seeds route documents.\n // EC-310: key the seed under the ACTIVE project id (the config slug, e.g.\n // `aurora`) — not the engine's default `prj_aurora` — so content + memberships\n // sit under the same id the studio operates on. Otherwise authorization denies\n // every read (\"not a member of project 'aurora'\") and content resolves empty.\n const projectId = resolveDeploymentProjectId(SEED_PROJECT_ID)\n // EC-361 (AD-11 parity with the Convex adapter above): when a config project\n // declares collections, the playground serves the CONFIG-OWNED schema — not the\n // engine's seeded sample schema — so every schema reader (the content-session\n // hydration, the persister baseline, query validation's `filterable` set) sees\n // the same declarations connected mode serves. The resolved config already\n // carries the EC-257 default asset collection. Without a config (engine\n // fixtures/tests) the seeded sample schema stands, byte-identical to before.\n // EC-424: passing `collections` straight into the seed (not a follow-up\n // `saveSchema`) also reconciles the seeded DOCUMENTS against them — a field a\n // config declares localized but the shared fixture stores plain (e.g. this\n // repo's demo `post.slug`, EC-315) gets promoted into `localized`, not just\n // the schema — see `reconcileSeedDocumentLocalization` in `@elytracms/core/persistence`.\n const collections = resolveDeploymentCollections()\n // EC-459: seed with a studio-owned blob adapter that mints real browser-\n // displayable URLs (object URLs) instead of the engine default's opaque\n // `memory://` locator — see `browser-blob-storage.ts` for the full\n // rationale. Playground-only; the Convex branch above is untouched.\n const adapter = await createSeededPersistenceAdapter(\n projectId,\n collections.length > 0 ? collections : undefined,\n { blobs: createBrowserBlobStorage() },\n )\n return adapter\n }\n throw new Error(config.detail)\n}\n\n/**\n * A stable key identifying the active backend (EC-179): the resolved deployment\n * URL for the active project under Convex, or `playground`. The operations\n * bootstrap caches one bundle per key, so switching to a project on a different\n * deployment transparently selects (or builds) that backend's operations client.\n */\nexport function activeDeploymentKey(): string {\n const config = resolveBackendConfig()\n if (config.kind === 'convex') return resolveDeploymentUrl(config.url)\n if (config.kind === 'playground') return 'playground'\n throw new Error(config.detail)\n}\n\n/**\n * The active backend mode. Throws the same descriptive error as\n * {@link selectPersistenceAdapter} when the studio is misconfigured — UI that\n * only needs \"is this the playground?\" should use `isPlaygroundMode()`.\n */\nexport function persistenceMode(): StudioBackendMode {\n const config = resolveBackendConfig()\n if (config.kind === 'misconfigured') throw new Error(config.detail)\n return config.kind\n}\n\nexport { ConvexPersistenceAdapter } from './convex-adapter'\nexport {\n CONVEX_URL_ENV_VAR,\n DEV_LOGIN_ENV_VAR,\n MODE_ENV_VAR,\n PLAYGROUND_MODE,\n STUDIO_ENV_KEYS,\n detectStudioEnvAnomaly,\n isDevAutoLoginActive,\n isDevRuntime,\n isPlaygroundMode,\n provideStudioEnv,\n resetProvidedStudioEnvForTests,\n resolveBackendConfig,\n resolveDevAutoLogin,\n studioEnv,\n} from './backend-mode'\nexport type {\n DevAutoLoginCredentials,\n EnvRecord,\n StudioBackendConfig,\n StudioBackendMode,\n StudioEnvAnomaly,\n} from './backend-mode'\n// EC-258: the deployment-readiness facts mapper (the boot DeploymentSetupGate + a\n// future `elytra doctor` CLI compose the same `checkDeploymentReady` contract).\nexport { studioDeploymentReadiness, studioReadinessFacts } from './deployment-readiness'\nexport type { StudioReadinessInputs } from './deployment-readiness'\n"]}
@@ -1,3 +1,8 @@
1
- import type { InputHTMLAttributes } from 'react';
2
- /** Named text input primitive — shadcn-style, token-driven. */
3
- export declare function Input({ className, type, ...props }: InputHTMLAttributes<HTMLInputElement>): import("react").JSX.Element;
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ /**
3
+ * Named text input primitive — shadcn-style, token-driven. Takes a `ref` (React
4
+ * 19 passes it as a plain prop) so controls that must talk to the DOM node —
5
+ * e.g. the EC-463 date control's native `beforeinput`/`paste` listeners — can
6
+ * still use the shared primitive instead of a bare `<input>`.
7
+ */
8
+ export declare function Input({ className, type, ...props }: ComponentPropsWithRef<'input'>): import("react").JSX.Element;
package/dist/ui/input.js CHANGED
@@ -1,6 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from '../lib/utils.js';
3
- /** Named text input primitive — shadcn-style, token-driven. */
3
+ /**
4
+ * Named text input primitive — shadcn-style, token-driven. Takes a `ref` (React
5
+ * 19 passes it as a plain prop) so controls that must talk to the DOM node —
6
+ * e.g. the EC-463 date control's native `beforeinput`/`paste` listeners — can
7
+ * still use the shared primitive instead of a bare `<input>`.
8
+ */
4
9
  export function Input({ className, type = 'text', ...props }) {
5
10
  return (_jsx("input", { type: type, className: cn('flex h-8 w-full rounded-md border border-input bg-background px-2.5 text-sm text-foreground shadow-sm transition-colors', 'placeholder:text-muted-foreground/60', 'focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 outline-none', 'disabled:cursor-not-allowed disabled:opacity-50', className), ...props }));
6
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/ui/input.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,+DAA+D;AAC/D,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,KAAK,EAAyC;IACjG,OAAO,CACL,gBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,sCAAsC,EACtC,wFAAwF,EACxF,iDAAiD,EACjD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC","sourcesContent":["import type { InputHTMLAttributes } from 'react'\nimport { cn } from '../lib/utils'\n\n/** Named text input primitive — shadcn-style, token-driven. */\nexport function Input({ className, type = 'text', ...props }: InputHTMLAttributes<HTMLInputElement>) {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-8 w-full rounded-md border border-input bg-background px-2.5 text-sm text-foreground shadow-sm transition-colors',\n 'placeholder:text-muted-foreground/60',\n 'focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n}\n"]}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/ui/input.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,KAAK,EAAkC;IAC1F,OAAO,CACL,gBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,sCAAsC,EACtC,wFAAwF,EACxF,iDAAiD,EACjD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC","sourcesContent":["import type { ComponentPropsWithRef } from 'react'\nimport { cn } from '../lib/utils'\n\n/**\n * Named text input primitive — shadcn-style, token-driven. Takes a `ref` (React\n * 19 passes it as a plain prop) so controls that must talk to the DOM node —\n * e.g. the EC-463 date control's native `beforeinput`/`paste` listeners — can\n * still use the shared primitive instead of a bare `<input>`.\n */\nexport function Input({ className, type = 'text', ...props }: ComponentPropsWithRef<'input'>) {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-8 w-full rounded-md border border-input bg-background px-2.5 text-sm text-foreground shadow-sm transition-colors',\n 'placeholder:text-muted-foreground/60',\n 'focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/40 outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n )\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elytracms/studio",
3
3
  "author": "finaldream <hi@finaldream.de>",
4
- "version": "0.0.78",
4
+ "version": "0.0.79",
5
5
  "private": false,
6
6
  "description": "The Elytra studio engine (UI + lib + routes + data-only Convex schema) as an importable package. Extraction staged in EXTRACTION.md (EC-223); Stages 1-2 = UI primitives + router-free lib leaves.",
7
7
  "license": "MIT",
@@ -150,7 +150,7 @@
150
150
  "lucide-react": "^1.23.0",
151
151
  "tailwind-merge": "^3.6.0",
152
152
  "zod": "^4.4.3",
153
- "@elytracms/core": "^0.0.78"
153
+ "@elytracms/core": "^0.0.79"
154
154
  },
155
155
  "peerDependencies": {
156
156
  "@tanstack/react-router": "^1.170.0",