Skip to content

Record forms use the platform date picker, not the browser's native date input #12622

Closed

Description

@objectstack-fleet

Source

Walked on objectui main 8415d9f11, Create Opportunity (/crm_opportunity?form=new) in an English console: the Close Date field is a native <input type=date> and shows the browser's own placeholder "年/月/日" (the machine's locale), while every other control follows the app's locale and theme; it also cannot show the app's date format, min/max or the relative shortcuts the list filters offer.

Target

  1. Date and date-time fields in record forms render the console's date picker (the one the list filter and the calendar use): a text field in the app's locale format with a calendar popover, keyboard entry, clear, and today / tomorrow shortcuts.
  2. The value written is unchanged (ISO date / date-time).
  3. The native input stays as the fallback only where the picker is not loaded.

File surface

packages/plugin-form/src/ date field renderer, packages/fields date widgets, tests beside.

Acceptance

  1. Tests: a date field renders the picker with the app locale's format; typing a date writes ISO.
  2. Screenshot of the Create Opportunity form at 1280 px, light and dark.
  3. pnpm --filter @object-ui/plugin-form test, pnpm --filter @object-ui/fields test green.

Evidence

Screenshots on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit b72c97985, never merged): hotcrm-create-opportunity-native-date.jpg.

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 walk of HotCRM's core pages as a user: objectui main 8415d9f11, HotCRM 63db83e2, the vite console on :5180 against objectstack serve --dev on :4001, the maintainer's browser pane at 1024 × 768 (en). The maintainer asked for the findings to be filed on the repository each belongs to, verbatim: 「相关问题也在对应的项目上创建任务」.

Activity

  1. added
    enhancementNew feature or request
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12622-form-date-picker
    Worktree: objectui-issue-12622
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: the date and date-time field renderers record forms mount (in packages/fields/src/ and/or the packages/plugin-form/src/ field mapping), reusing the console's existing date picker. That is the one the list filter and the calendar use; ⛔ it is reused, not a second copy. Also the tests beside them, the ten packages/i18n/src/locales/*.ts packs only if a shortcut label is new, and one .changeset/12622-*.md (stop on breach; explain in the report).
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
    Clause-②: no (if reusing the picker needs a new export from a published package entry, the dev measures it and the line is corrected)
    Responsibility: n/a — not a defect card (enhancement)
    Thread-read: none
    Serial constraints cleared: no open PR touches the form date renderers. This seat's in-flight objectui#12603 (dialog gutter) touches fields/src/widgets/RecordPickerDialog.tsx and ImageLightbox.tsx, not the date widgets. objectui#12617 and #12621 are disjoint.
    Claimed at: 2026-10-16T06:39Z

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12622,
      "status": "done",
      "branch": "claude/issue-12622-form-date-picker",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12641",
      "session": "session_01XVp19E1MYUTFM3dnkwz8gB",
      "premise_still_valid": true,
      "summary": "Record forms now render date and datetime fields with a platform picker instead of the native input. The picker has a text box in the display locale's format (en 10/16/2026, zh 2026/10/16), a calendar popover using the shared Calendar primitive and its date-fns locale resolver, keyboard entry (blur/Enter), clear, and Today/Tomorrow. Values are unchanged: a date writes YYYY-MM-DD, a datetime writes an ISO instant, clear writes an empty string, and these go through the existing native adapters. Only registerField (the form's field:date/field:datetime) takes the picker, via FORM_FACE_LOADERS in packages/fields/src/index.tsx. FieldEditWidget and InlineFieldInput (the inline editors), getLazyFieldWidget (the action-param and bulk dialogs), and a form without @object-ui/fields registered keep the native input. Measured A1 as partly false: the list filters use native inputs and no picker; the calendar view uses Popover+Calendar inline; the exported components DatePicker has no consumer and no text entry, clear or shortcuts. So the reuse is the Calendar primitive, and the text/clear/shortcut layer is new, with 5 new i18n keys in all 10 packs plus FIELD_DEFAULTS. A2: the native input only ever got toDomProps keys (id, name, disabled, aria-*), and ObjectForm maps no min/max for date fields. The text box gets the same set, so aria-required, disabled and id carry over, and this is pinned.",
      "tests": "At 10527ec3e. New: localeDateText.test.ts 9 passed; DatePickerField-12622.test.tsx 13 passed; plugin-form recordFormDatePicker-12622.test.tsx 2 passed. That covers the real ObjectForm plus registerAllFields: no input[type=date|datetime-local], the label names the text box, submit writes '2026-10-20' and the ISO instant, and a CONTROL showing text/number rows still render type=text/number. Targeted vitest, 31 files: every fields test touching registerField/registerAllFields/getLazyFieldWidget/the labelling table, plus datetime-widgets, date-locale-channel, inline-widget-aria-invalid-7126, and i18n all-locales-key-parity/en-zh-key-parity/fallback-placeholder-spelling-3512. Result: 'Test Files 31 passed (31) Tests 931 passed (931)', exit 0. Ablation via objectstack scripts/ablation-replace.mjs (alias resolves @object-ui/fields to src, so no dist leg): the anchor 'FORM_FACE_LOADERS[fieldType as RegisteredFieldWidgetType] ?? loader' became 'loader /* ablation-12622 */'. Anchor went 1 to 0, blob 9bce638 to e16cae9, and the form pin turned red with 'Tests 2 failed (2)' / 'date picker not rendered'. Restored: blob == HEAD and git diff HEAD is empty, with a hash re-check. The first ablation attempt was refused by the tool because the replacement was a substring of the anchor, so no test ran in it. Type-check after building the closure under the lock (turbo build --filter '@object-ui/plugin-form^...' exit 0): fields, plugin-form and i18n type-check exit 0 each. The script echo was confirmed, and --listFiles confirms the 3 new test files are in tsconfig.test.json. NOT MEASURED: whole-dir vitest of packages/fields/, plugin-form/ and i18n/. Reason: os-verify-lock queue-timeout exit 99 on four attempts, with holder pid 17792 'bash .../scratchpad/issue-12617/pkg.sh' holding it 2157s. Declared narrowing: the targeted set above; CI runs the full set. Lint, narrowed: eslint --no-inline-config with the root eslint.config.js on the 17 changed .ts/.tsx files gives 0 errors and 148 warnings (145 pre-existing in fields/src/index.tsx, 3 'as any' in the new plugin-form test). The config has no parserOptions.project/projectService, so linting is not type-aware and an untouched file's verdict cannot move. Gates, all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, i18n-dead-keys (no datePicker key listed), check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs. check:spec-floors was not run. Screenshots are the maintainer's check, per the dispatch.",
      "mcp_calls": "0",
      "api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/fleet-write/dispatch.mjs): (1) pr_create, executed as POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12641/assignees; the read-back gave 7362 bytes sent and 7362 stored, identical. (2) comment on objectui#12622 (this os-dev-report). Plus 4 git pushes (not REST). 0 label writes: the dispatch named no labels, and objectui path labels belong to labeler.yml.",
      "open_questions": [
        {
          "question": "This ruling scopes the picker to record forms. Measured, the same date/datetime field type still renders the native input (machine-locale placeholder) on: the inline editors (FieldEditWidget: grid/detail inline, kanban required-fields dialog; plugin-detail InlineFieldInput), the action-param and bulk-action dialogs (getLazyFieldWidget shares fieldWidgetMap), and the list filters (FilterBuilder, UserFilters, plugin-view FilterUI). Should they adopt the picker?",
          "options": [
            "A: a follow-up card moves fieldWidgetMap's date/datetime to the picker faces and drops FORM_FACE_LOADERS. That gives one face per field type for forms and dialogs, and it updates the pins in app-shell ActionParamDialog.test, ActionDesigner.paramVocabulary.test and plugin-grid bulkActionDialogParams.test. Inline editors and filters would be a separate decision, because popovers in grid cells differ.",
            "B: keep the scope as ruled: forms only, the rest native."
          ],
          "recommendation": "A for the param/bulk dialogs, because they are the same form-field face and the same machine-locale placeholder defect, and splitting a field type into two faces is the drift this repo keeps paying for. The change is a small mechanical edit across 3 test files outside this card's surface. Filters and inline editors should be weighed separately."
        },
        {
          "question": "@object-ui/components exports a DatePicker (custom/date-picker.tsx) that has no in-repo consumer and is a second picker composition beside the new form picker. Should it be retired or rebuilt on the new control?",
          "options": [
            "A: retire it in a follow-up (published export: needs a changeset and a deprecation decision)",
            "B: leave it"
          ],
          "recommendation": "B for now, noted only. It has zero pull, and retiring a published export is a maintainer call."
        }
      ],
      "out_of_scope_findings": [
        "class: a (user-visible) · reach: NOT MEASURED in a browser (source reading only: UserFilters date-range and plugin-view FilterUI render a native input type=date, so the placeholder and order follow the machine locale, like the card's defect) · same family as this card's native-date class · dedupe words: list filter native date input locale, UserFilters date-range, FilterUI date, machine locale placeholder · not filed: no reach measured; PM to fold into a family close-out card if wanted",
        "carrier: none (承接者:无) · components custom/date-picker.tsx DatePicker export has zero in-repo consumers (dead-ish code) · noted in the report only, not filed",
        "environment: os-verify-lock holder pid 17792 (bash .../scratchpad/issue-12617/pkg.sh) held the shared lock 2157s+ without releasing, which blocked four of this run's attempts. Seat issue-12617 is the holder."
      ],
      "deviations": "Order said 'Anything else: stop and report'. I stayed inside the surface by scoping the picker to registerField (FORM_FACE_LOADERS) instead of fieldWidgetMap, because changing the map breaks pins in app-shell and plugin-grid. The harness attribution reminder asked for an emoji footer, but the role file's footer form was used. Whole-package test dirs are NOT MEASURED because of the lock, and the narrowing is declared.",
      "files_changed": [
        ".changeset/12622-form-date-picker.md",
        "packages/fields/src/index.tsx",
        "packages/fields/src/widgets/DatePickerField.tsx",
        "packages/fields/src/widgets/DatePickerField-12622.test.tsx",
        "packages/fields/src/widgets/localeDateText.ts",
        "packages/fields/src/widgets/localeDateText.test.ts",
        "packages/fields/src/widgets/useFieldTranslation.ts",
        "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        "packages/plugin-form/src/__tests__/recordFormDatePicker-12622.test.tsx"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Follow-up (patch round 3): head unchanged at 3d37690. The red half is the per-chunk ceiling on ui-components: main 07b0632 reads 281.8/282.2 KB (0.4 KB headroom), and this branch reads 283.7 KB, OVER by 1.4 KB (+1.9 KB from DatePickerField and localeDateText; packages/fields 86 to 88 modules). The i18n-locale-en chunk and the aggregate pass. No ceiling was raised (the objectui#8816 ruling sends every raise to the decision box). A decision is needed; options are below.

    {
      "issue": 12622,
      "status": "needs_decision",
      "branch": "claude/issue-12622-form-date-picker",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12641",
      "session": "session_01XVp19E1MYUTFM3dnkwz8gB",
      "premise_still_valid": true,
      "summary": "Patch round, no new commit: head stays 3d376907a. The Bundle Analysis red is the per-chunk ceiling on `ui-components`, not i18n. CI readings: main 07b06324 reads ui-components 281.8 KB against a 282.2 KB ceiling (289,000 B), so only 0.4 KB headroom was left; this branch reads 283.7 KB, OVER by 1.4 KB (+1.9 KB, packages/fields 86 to 88 modules in ui-components). i18n-locale-en went 45.5 to 45.6 KB of 48.8 KB and passes; the aggregate went 3093.7 to 3096.7 KB of 3119.4 KB and passes. Nothing leaked: the `ui-components` advancedChunks group in apps/console/vite.config.ts (test packages/(components|fields), priority 80, no `$initial` tag) claims ALL of packages/fields on purpose, including every widget that fieldWidgetMap loads through import(), and PER_CHUNK_MEMBERSHIP pins packages/fields as wholly in ui-components. So the FORM_FACE_LOADERS dynamic import of DatePickerField.js has no effect on chunking, the same as every other field widget. The two new modules (DatePickerField, localeDateText) are the cost of the new widget in a chunk that is eager by design. The locale keys are not the cause. I did not raise the ceiling: the file's 'Raising one' section applies the aggregate's discipline, and the objectui#8816 ruling says verbatim that the next raise goes back to the decision box (下一次撞墙仍回决策箱). The only structural fix is a carve-out, which changes gate policy, so it needs a ruling (see open_questions).",
      "tests": "No code changed this round, so there was no build or vitest run (the container is fragile and the numbers come from CI). Evidence: Bundle Analysis job 116900473133 (PR merge ref, 3d376907a over main 8ed7e5a8) printed 'ui-components 283.7 KB / 282.2 KB ceiling (OVER by 1.4 KB)' and 'packages/fields 88 modules in ui-components'. Main push job 116887545144 (07b06324, this branch's merge base) printed 'ui-components 281.8 KB / 282.2 KB ceiling (headroom 0.4 KB)' and 'packages/fields 86 modules in ui-components'. All other halves passed on both runs (aggregate, membership, sensitivity, freshness). NOT MEASURED: option A's byte saving, reason: it needs a console build of the carve-out, which was not attempted pending the ruling.",
      "mcp_calls": "3 — mcp__github__get_job_logs x3 (read-only; the REST log blob URL is blocked by the proxy)",
      "api_writes": "1 — POST /repos/objectstack-ai/objectui/issues/12622/comments (os-dev-report follow-up, sent through the fleet-write relay)",
      "open_questions": [
        {
          "question": "ui-components has 0.4 KB headroom on main, and the record-form date picker adds about 1.9 KB gzip to it. How should #12641 get green?",
          "options": [
            "A — Declared carve-out (structural). Move DatePickerField.tsx and localeDateText.ts into packages/fields/src/widgets/date-picker/. Add a vite group 'fields-date-picker' (test packages/fields/src/widgets/date-picker/, priority 82, includeDependenciesRecursively: false, the same shape as types-zod). Add a PER_CHUNK_MEMBERSHIP_CARVE_OUTS entry fields: src/widgets/date-picker into fields-date-picker. Update the pinned test (toEqual on the carve-out object, the it.each routing table). Cost: one console build plus gate-test edits, about half a day. The bytes become truly lazy (fetched only when a record form draws a date field). The existing gate still refuses a carve-out into an eager chunk. Downside: this edits gate policy, and every future form-only widget faces the same 0.4 KB wall.",
            "B — Raise PER_CHUNK_GZIP_CEILINGS['ui-components'] by ruling, with PER_CHUNK_BASELINE re-pinned to the new main reading in the same commit. Cost: one constant pair, about an hour. Downside: a ratchet move; the bytes stay eager on every page load.",
            "C — Pay down at least 1.5 KB elsewhere in ui-components on a separate card first, and block #12641 on it. Cost: unknown; nothing here names a candidate."
          ],
          "recommendation": "A. Real business need: the picker is only used on the record-form face, so making it eager loads it on every page, including pages with no form. Long-term soundness: A follows the existing carve-out rule (bytes leave the closure, and the gate checks they stay out) rather than a ratchet, while B is the 'raise because the gate fired' that objectui#8816 forbids reading as precedent. AI error-proofing: the carve-out is held module by module by the membership half, so a later edit that pulls shared neighbours into it fails loudly. Startup scope: A adds no new gate, only a declared row in an existing one. The conflict to put plainly: A still edits gate configuration, which is the maintainer's call, and B is cheaper. If the maintainer rules A, the same claim can carry it in one patch round."
        }
      ],
      "out_of_scope_findings": [
        "carrier: whoever next adds a field widget to packages/fields · noted, not filed: ui-components headroom on main is 0.4 KB (0.00x the 89 KB regression), so the next widget addition of any size reds Bundle Analysis; vendor-objectstack also reads 0.0 KB headroom on main. This is a ceiling-sensitivity observation, not one of the three filing classes · dedupe words: ui-components ceiling headroom, per-chunk budget, fields widgets eager"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat answer to the dev's open_questions[0] (the bundle ceiling) · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-16T09:54Z

    Answering the follow-up report 6212896363.

    Reading:

    • ui-components has 0.4 KB of headroom on main (281.8 of 282.2 KB). This PR's picker adds about 1.9 KB to it: DatePickerField and localeDateText, from 86 to 88 packages/fields modules.
    • The new locale keys are not the cause. i18n-locale-en reads 45.6 of 48.8 KB and passes.

    Ruling: A, the declared carve-out.

    • Move the picker's modules to packages/fields/src/widgets/date-picker/.
    • Add a lazy fields-date-picker chunk group in apps/console/vite.config.ts, the same shape as types-zod.
    • Add the matching PER_CHUNK_MEMBERSHIP_CARVE_OUTS row, plus the pinned gate test's routing-table entry.

    Why the seat rules this rather than routing it to the decision box:

    • It is not a raise. No ceiling, baseline or headroom constant moves, and no half of the gate is relaxed.
    • The carve-out mechanism already exists. The gate keeps refusing a carve-out into an eager chunk, and its membership half holds the new row module by module.
    • So it falls in the class that needs no escalation: an existing gate's internals, made stricter, not weaker and not new.

    B (raising the ui-components ceiling) is not taken. objectui#8816's ruling sends the next raise of this ceiling to the maintainer's decision box. This card does not need one.

    Pins:

    • A record-form date field still loads the picker. The existing form pin and the ablation hold.
    • The new chunk is lazy: absent from the eager closure.
    • Bundle Analysis is green, with ui-components back under its ceiling.

    Path check before landing: if vite.config.ts or the gate files fall on a governed surface, the landing follows that path's rules.

    Noted, not filed: ui-components and vendor-objectstack have almost no headroom on main. The next field widget of any size will hit the same wall. The same carve-out pattern is the route.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    Follow-up (ruling A, carve-out): new head 58c7f68. ui-components went from 283.7 KB (CI on 3d37690, over its 282.2 KB ceiling) to 282.0 KB (288,765 of 289,000 B, local build), and main reads 281.8 KB. The picker is now the lazy chunk fields-date-picker (2.3 KB gzip), not in the eager closure. The aggregate is 3093.9 of 3119.4 KB. No ceiling, baseline or headroom constant moved.

    {
      "issue": 12622,
      "status": "done",
      "branch": "claude/issue-12622-form-date-picker",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12641",
      "session": "session_01XVp19E1MYUTFM3dnkwz8gB",
      "premise_still_valid": true,
      "summary": "Seat ruling A (comment 6212914664) is implemented in 58c7f685c, pushed and now the PR head. DatePickerField.tsx, localeDateText.ts and their two co-located tests moved to packages/fields/src/widgets/date-picker/; the FORM_FACE_LOADERS import paths were updated. Added a 'fields-date-picker' advancedChunks group in apps/console/vite.config.ts (test packages/fields/src/widgets/date-picker/, priority 82, includeDependenciesRecursively: false, the types-zod shape). Added the PER_CHUNK_MEMBERSHIP_CARVE_OUTS row fields: src/widgets/date-picker into fields-date-picker, and updated the pinned gate test (the carve-out toEqual, plus a date-picker row in the it.each routing table). No ceiling, baseline or headroom constant moved. Local console build: ui-components went from 283.7 KB (CI on 3d376907a, OVER by 1.4 KB) to 282.0 KB (288,765 B) against its 282.2 KB (289,000 B) ceiling, which passes with 235 B headroom; main reads 281.8 KB. The picker is now its own lazy chunk, fields-date-picker (2,365 B gzip). The only reference to it is the import() in ui-components, and it is absent from the eager closure. PR body not edited (single-write rule); the seat may add the carve-out note.",
      "tests": "At 58c7f685c: (1) console 'vite build' run once under os-verify-lock (VERDICT command-exit 0, 116s), then 'node scripts/check-eager-closure-budget.mjs' exit 0: aggregate 3093.9 KB of 3119.4 KB (headroom 25.5 KB); ui-components 282.0 KB of 282.2 KB; vendor-objectstack 1500.4 of 1500.4; framework 74.5 of 97.7; i18n-locale-en 45.5 of 48.8. The gate printed 'packages/fields 86 modules in ui-components and its src/widgets/date-picker subtree 2 in fields-date-picker, exactly'. The sensitivity half passed on all 5 ceilings. eager-closure.json holds 70 chunks with 0 named date-picker, and the new chunk's only referrer is a dynamic import() in ui-components. check-eager-locale-catalogues exit 0. (2) vitest --maxWorkers=1: scripts/__tests__/check-eager-closure-budget.test.ts 180/180 passed; it plus check-eager-locale-catalogues, console-vite-alias-closure-4925, check-unreferenced-sources, check-side-effects-array and cross-file-line-citation-census: 6 files, 338/338 passed. The moved picker tests plus plugin-form recordFormDatePicker-12622: 3 files, 24/24 passed. (3) Ablation via objectstack scripts/ablation-replace.mjs on fields/src/index.tsx, replacing the 'FORM_FACE_LOADERS[...] ?? loader,' anchor with 'loader /* ABLATION-12622 */,'. vitest source-aliases @object-ui/fields, so no rebuild was needed. The record-form pin went red, 2/2 failed. Restore was verified: blob == HEAD acef3f63e2b4 and git diff HEAD empty. (The first attempt was a no-op, because the replacement text 'loader,' already occurred in the file; the tool refused it and restored.) (4) check:side-effects-array exit 0, check:unreferenced-sources exit 0, control-byte scan 0 hits in all 4 edited text files. NOT MEASURED: @object-ui/fields type-check, reason: dependency dist/ folders are absent in this container (239 errors, all from missing @object-ui/* declarations, 0 relative-path errors); building that closure was skipped on the fragile box, so it is declared to CI. The vite build resolved and bundled the moved paths. Governed-merges (objectstack scripts/pm/check-governed-merges.mjs --pr objectstack-ai/objectui#12641, final file list, 22 paths): 'NOT governed — ordinary queue landing applies', 939 changed lines, under 3000.",
      "mcp_calls": "3 — mcp__github__get_job_logs x3 (read-only, earlier in this run)",
      "api_writes": "2 — POST /repos/objectstack-ai/objectui/issues/12622/comments x2 (the first needs_decision report, comment 6212896363, and this follow-up), both via the fleet-write relay; plus 1 git push (58c7f685c)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: whoever next adds bytes to packages/fields or packages/components · noted, not filed: ui-components now has 235 B headroom (main 0.4 KB), and vendor-objectstack has 0.0 KB on main. The next widget-sized change to either chunk reds Bundle Analysis · dedupe words: ui-components ceiling headroom, per-chunk budget, eager field widgets"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-16T10:24Z

    PR #12641 merged through the merge queue as ca7a4c3, which is on main. Verified by content:

    • 12 of its 22 files on origin/main are blob-identical to the accepted head 58c7f68.
    • The ten locale packs also carry changes from other PRs that landed first. The queue merge's own patch (ca7a4c3^1..ca7a4c3) is line-for-line identical to the PR's patch.

    What landed:

    • Record forms draw date and datetime fields with the platform picker:
      • a text box in the display locale's format (en 10/16/2026, zh 2026/10/16);
      • a calendar popover;
      • keyboard entry, clear, and Today / Tomorrow shortcuts.
    • Values are unchanged: YYYY-MM-DD for a date, an ISO instant for a datetime.
    • The picker loads lazily in its own fields-date-picker chunk. That is the declared carve-out from seat ruling 6212914664; no budget ceiling moved.

    Still open:

    • objectui#12642 (the native-date family close-out): the dialogs, inline editors and filters still draw the browser's native date input.
    • The maintainer's browser reading of Create Opportunity at 1280 px.

    pm:dispatched is removed with this note. The card closed completed on merge.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions