@qijenchen/design-system 0.1.0-beta.93 → 0.1.0-beta.96
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/AGENTS.md +6 -208
- package/CLAUDE.md +2 -23
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +47 -23
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +1 -5
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/data-table-filter-value-picker.js +4 -0
- package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -1
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +3 -2
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-tree.js +6 -0
- package/dist/components/DataTable/filter-tree.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +183 -156
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +4 -2
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/Field/field-context.d.ts +12 -0
- package/dist/components/Field/field-context.d.ts.map +1 -1
- package/dist/components/Field/field-context.js +10 -1
- package/dist/components/Field/field-context.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +7 -1
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js +11 -2
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/InlineEdit/inline-edit.d.ts +5 -0
- package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
- package/dist/components/InlineEdit/inline-edit.js +65 -33
- package/dist/components/InlineEdit/inline-edit.js.map +1 -1
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +3 -2
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +2 -1
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Popover/popover.d.ts.map +1 -1
- package/dist/components/Popover/popover.js +4 -2
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +59 -37
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +11 -0
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +22 -5
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +4 -3
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +9 -0
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js +71 -27
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/ds-canonical/adapters/claude/agents/README.md +58 -0
- package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +14 -0
- package/ds-canonical/adapters/claude-root-instructions.md +24 -0
- package/ds-canonical/adapters/claude-settings-base.json +172 -0
- package/ds-canonical/commands/README.md +8 -13
- package/ds-canonical/commands/gov-status.md +5 -75
- package/ds-canonical/fork/AGENTS.md +116 -213
- package/ds-canonical/fork/CLAUDE.md +54 -0
- package/ds-canonical/fork/codex/agents/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/codex/agents/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/codex/agents/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +29 -19
- package/ds-canonical/fork/codex/agents/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/codex/agents/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/codex/agents/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/SKILL.md +244 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/codex/agents/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/codex/agents/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/codex/agents/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/codex/agents/skills/scan-similar-bugs/SKILL.md +212 -0
- package/ds-canonical/fork/codex/agents/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/SKILL.md +259 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/codex/agents/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/codex/hooks.json +44 -3
- package/ds-canonical/fork/common/closed-tool-execution.mjs +1001 -0
- package/ds-canonical/fork/common/instruction.md +116 -0
- package/ds-canonical/fork/consumer/governance-check.mjs +3059 -0
- package/ds-canonical/fork/consumer/lib/closed-tool-execution.mjs +1001 -0
- package/ds-canonical/fork/consumer/lock.json +189 -0
- package/ds-canonical/fork/consumer/lock.schema.json +338 -0
- package/ds-canonical/fork/consumer/managed-files/0235cf6b3fd402a3717881dc205b5bf77aed7632e7d7d6f1811a40e3033bd816.blob +145 -0
- package/ds-canonical/fork/consumer/managed-files/145aab4b4fc470fc9ba7679b4a1d87d4f6a6d604940bd40f8d675c8af696498f.blob +47 -0
- package/ds-canonical/fork/consumer/managed-files/189e551431181e4a88783c02130d2787b801ef731c86e35bcde89a7313aa020e.blob +149 -0
- package/ds-canonical/fork/consumer/managed-files/24ad71c8613ddcf6fd23818cb3bb477a1fb6d83af4550b0bad43099813088686.blob +28 -0
- package/ds-canonical/fork/consumer/managed-files/2d1ef5617a5ce3c39ad9aae1c42af7d199f9270c0a0ccb490b63d62dbc6913db.blob +1001 -0
- package/ds-canonical/fork/consumer/managed-files/3625e02235cf166a50649a4d704cfb68fead69d0e168c481df013ebae9f6be25.blob +1412 -0
- package/ds-canonical/fork/consumer/managed-files/3ddedc67b464bdfe3dde9803a2d917920c96d633678b802eee638a44cd47366a.blob +8 -0
- package/ds-canonical/fork/consumer/managed-files/423729840acdd43c812f17c245b871716c6b60f76e4d3e94864d0e34a815bf8d.blob +348 -0
- package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +464 -0
- package/ds-canonical/fork/consumer/managed-files/475fba657eaeb8abd88f60635f3eadab27a9d0d3114ba4fffc65f43a2a0fe6e2.blob +124 -0
- package/ds-canonical/fork/consumer/managed-files/61c6aca6d7f04bedbf556eaa9d3043681fe48cbe0e93a8ccb1d69a7c5e23fdcf.blob +113 -0
- package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +2398 -0
- package/ds-canonical/fork/consumer/managed-files/65410b66e8799a560e07b71779c186fed2a0ef50575ac44745df7a0938a9c2b4.blob +317 -0
- package/ds-canonical/fork/consumer/managed-files/6929a3c8bb4d69c507720b4754aeb339c6cbb8ff655e0a381d76606d64695e38.blob +393 -0
- package/ds-canonical/fork/consumer/managed-files/6b746628ac11fcccbe277ef6fea94cc2a7b90ea2822e83536eae80d5ee4b3fa5.blob +167 -0
- package/ds-canonical/fork/consumer/managed-files/76d485470d30ff014afacf7ce643763de9f4f956d9fc8128dbc1814774cf2e63.blob +671 -0
- package/ds-canonical/fork/consumer/managed-files/77e06f62670dfee01e9b5e8b0f8dad085ce711d75538c1fb0679d9818acaca82.blob +424 -0
- package/ds-canonical/fork/consumer/managed-files/7937321877e5c34c27dae36c0d507d21cd42fa3f46a8f11a284b8b4a52b6faa4.blob +84 -0
- package/ds-canonical/fork/consumer/managed-files/794bb911ba8ebef58ab0d44a55b9968a19d2c62bcfb310b1ee3a84166f087f21.blob +880 -0
- package/ds-canonical/fork/consumer/managed-files/7b17835d0ceb17cdcdcaf930540a3e5d0943a34a747ac43c12ca8cd485c11581.blob +44 -0
- package/ds-canonical/fork/consumer/managed-files/7eb6cc60abfdabaf6617c336058fad1454ccde08889295767bfd9b7fd153cc6e.blob +778 -0
- package/ds-canonical/fork/consumer/managed-files/81037efa5b3b9f4a875704005fb268acdc9233bb901f44902e4e37e1da92b8e3.blob +46 -0
- package/ds-canonical/fork/consumer/managed-files/884721550b56308812b20917adac7a12f36fdb4ecda6b02460a7f5a219c0c966.blob +78 -0
- package/ds-canonical/fork/consumer/managed-files/91f414b9462ddc1e4be1d4c6ca4ac7a7340a6eec9e98ee109cbc049d3b354b6a.blob +36 -0
- package/ds-canonical/fork/consumer/managed-files/92e4828cdcb96ff0d01daa16f6885f24045a8e72820665650f2a1890dc3a446c.blob +121 -0
- package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +43 -0
- package/ds-canonical/fork/consumer/managed-files/974521d6b8fe796ea4c58b3c78b0c2b8a1be262b97100d77aaf4cc9c7724bcab.blob +45 -0
- package/ds-canonical/fork/consumer/managed-files/9791c85388d2e2e2bd564e2550fadc3351c4c960a47ce838098afcba7544eb90.blob +959 -0
- package/ds-canonical/fork/consumer/managed-files/a448d2222133335c30e6fda5116e26a40db3283a19d62ccc0663c30d272262a7.blob +174 -0
- package/ds-canonical/fork/consumer/managed-files/ab072e7f2eca51f0e18a5e18c4b333260ee5d219a12cc6df5bb2d683f0b2734d.blob +2636 -0
- package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +596 -0
- package/ds-canonical/fork/consumer/managed-files/c4aa767f11714467de0038a2149cf78074baddc17fc6a9e074b6aed7544c6f3c.blob +80 -0
- package/ds-canonical/fork/consumer/managed-files/c893e9b734b162f4c631fef871128c16a9ab565f796a0e76d7f320f821f220f5.blob +41 -0
- package/ds-canonical/fork/consumer/managed-files/cd9c61f8ff24fb9bcc3663e346e2cfa419cfb84e02aae18d3dc66dd192681696.blob +9 -0
- package/ds-canonical/fork/consumer/managed-files/da2ad2737315d25a5300905ddefd62f1695056a8a1af155c5b34170ad9923bce.blob +38 -0
- package/ds-canonical/fork/consumer/managed-files/e1b11160d6c4043002d2cbff6d9a4ae551698a96137773c4244dadfac152fcb0.blob +222 -0
- package/ds-canonical/fork/consumer/managed-files/e26057408661597aac4a57cdf7e30e2f9d0afb1b9a2dbbb692c3805cd9028ca5.blob +250 -0
- package/ds-canonical/fork/consumer/managed-files/e68ae1915965d8e17d4b2441c00c2b97fe062ea308ae8535c9eebb2fc16fa245.blob +20 -0
- package/ds-canonical/fork/consumer/managed-files/e71c65f45c6af7ce12b6b3c0d8028f185da5b719e2050c9b2a6b243d41ae4878.blob +182 -0
- package/ds-canonical/fork/consumer/managed-files/e813096d69c49812e40e00be9ac8fa14d77f0ec1f97ab4c45cb096b3bedd35de.blob +3 -0
- package/ds-canonical/fork/consumer/managed-files/e930ebca6fd8eeb30802aac0930efae7bcc44cc0996f24de07c11ca6a081fedf.blob +277 -0
- package/ds-canonical/fork/consumer/managed-files/ea94e914d5c8acb84ad7660e5bda0f01b6ccc8cf96b0f6b1ce048f8938d0f5b5.blob +47 -0
- package/ds-canonical/fork/consumer/managed-files/f4db6e616d5229aa7e700c6a3ace022cb9d90baae74e38ca65fce617f18e0d9b.blob +110 -0
- package/ds-canonical/fork/consumer/managed-files/faa128c26102415dc5345e68698efbbd28a395c35ee278dceae044cf430692b2.blob +11 -0
- package/ds-canonical/fork/governance.lock +1552 -103
- package/ds-canonical/fork/hooks/_log-fire.sh +109 -12
- package/ds-canonical/fork/hooks/block_prototype_imports.py +148 -29
- package/ds-canonical/fork/hooks/check_chrome_header_avatar_canonical.sh +23 -12
- package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +116 -65
- package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +140 -0
- package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +84 -30
- package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +16 -6
- package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +65 -21
- package/ds-canonical/fork/hooks/check_field_family_invariants.sh +90 -24
- package/ds-canonical/fork/hooks/check_fork_product_quality.sh +8 -6
- package/ds-canonical/fork/hooks/check_item_list_gap.sh +4 -2
- package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +31 -13
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +220 -95
- package/ds-canonical/fork/hooks/check_pattern_invariants.sh +73 -14
- package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +23 -12
- package/ds-canonical/fork/hooks/check_story_determinism.sh +1 -1
- package/ds-canonical/fork/hooks/check_story_invariants.sh +342 -61
- package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +52 -23
- package/ds-canonical/fork/hooks/check_tailwind_wildcard_in_docs.sh +20 -13
- package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +105 -22
- package/ds-canonical/fork/hooks/lib/_hook_integrity.sh +158 -0
- package/ds-canonical/fork/hooks/lib/_provider_paths.sh +162 -0
- package/ds-canonical/fork/launchers/approval-evidence.mjs +1131 -0
- package/ds-canonical/fork/launchers/authority-decision-evidence.mjs +413 -0
- package/ds-canonical/fork/launchers/canonical-order.mjs +8 -0
- package/ds-canonical/fork/launchers/fork-governance-dispatcher.sh +139 -29
- package/ds-canonical/fork/launchers/format-provider-hook-output.mjs +25 -0
- package/ds-canonical/fork/launchers/independent-review.mjs +490 -0
- package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +88 -43
- package/ds-canonical/fork/launchers/normalize-provider-event.mjs +355 -0
- package/ds-canonical/fork/launchers/product-hook-dispatch-runtime.mjs +1067 -0
- package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +1646 -0
- package/ds-canonical/fork/launchers/provider-hook-output-transport.mjs +525 -0
- package/ds-canonical/fork/launchers/settings-hooks.json +30 -53
- package/ds-canonical/fork/manifest.json +1881 -23
- package/ds-canonical/fork/providers/claude/hook-config.json +333 -0
- package/ds-canonical/fork/providers/claude/instruction.md +54 -0
- package/ds-canonical/fork/providers/claude/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/providers/claude/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/providers/claude/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/providers/claude/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/providers/claude/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/SKILL.md +244 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/providers/claude/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/providers/claude/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/providers/claude/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/providers/claude/skills/scan-similar-bugs/SKILL.md +212 -0
- package/ds-canonical/fork/providers/claude/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/SKILL.md +259 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/providers/claude/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/providers/codex/hook-config.json +57 -0
- package/ds-canonical/fork/providers/codex/skills/bug-fix-rhythm/SKILL.md +207 -0
- package/ds-canonical/fork/providers/codex/skills/code-quality-audit/SKILL.md +71 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/SKILL.md +244 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/flow-diagram.md +180 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/handoff-template.md +177 -0
- package/ds-canonical/fork/providers/codex/skills/delivery-handoff/references/inventory-checklist.md +196 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/SKILL.md +43 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/providers/codex/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/providers/codex/skills/performance-audit/SKILL.md +114 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/SKILL.md +244 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/audit-checks.md +250 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/common-misuses.md +329 -0
- package/ds-canonical/fork/providers/codex/skills/product-ui-audit/references/report-template.md +163 -0
- package/ds-canonical/fork/providers/codex/skills/propose-options/SKILL.md +190 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/SKILL.md +246 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/audit-checks.md +39 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/benchmark-sources.md +94 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/checkpoints.md +200 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/evaluation-matrix.md +142 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/ooux-template.md +198 -0
- package/ds-canonical/fork/providers/codex/skills/prototype/references/proposal-template.md +230 -0
- package/ds-canonical/fork/providers/codex/skills/scan-similar-bugs/SKILL.md +212 -0
- package/ds-canonical/fork/providers/codex/skills/ux-audit/SKILL.md +135 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/SKILL.md +259 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/output/.gitkeep +0 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/audit-architecture.md +101 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/visual-checklist.md +297 -0
- package/ds-canonical/fork/providers/codex/skills/visual-audit/references/world-class-benchmarks.md +198 -0
- package/ds-canonical/fork/references/story-baseline-registry.json +117 -0
- package/ds-canonical/fork/references/story-baseline-registry.schema.json +145 -0
- package/ds-canonical/fork/references/utility-registry.json +377 -0
- package/ds-canonical/fork/references/utility-registry.schema.json +373 -0
- package/ds-canonical/fork/review/canonical-order.mjs +8 -0
- package/ds-canonical/fork/review/provider-review-binding.mjs +2377 -0
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +19 -12
- package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +19 -15
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +17 -11
- package/ds-canonical/fork/skills/independent-review/SKILL.md +37 -0
- package/ds-canonical/fork/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/fork/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/fork/skills/performance-audit/SKILL.md +11 -8
- package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +31 -21
- package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +9 -5
- package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +30 -26
- package/ds-canonical/fork/skills/propose-options/SKILL.md +6 -4
- package/ds-canonical/fork/skills/prototype/SKILL.md +21 -21
- package/ds-canonical/fork/skills/prototype/references/audit-checks.md +7 -6
- package/ds-canonical/fork/skills/prototype/references/checkpoints.md +26 -17
- package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +2 -1
- package/ds-canonical/fork/skills/prototype/references/ooux-template.md +1 -1
- package/ds-canonical/fork/skills/prototype/references/proposal-template.md +6 -5
- package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +28 -27
- package/ds-canonical/fork/skills/ux-audit/SKILL.md +8 -5
- package/ds-canonical/fork/skills/visual-audit/SKILL.md +37 -43
- package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +15 -15
- package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +6 -6
- package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +2 -2
- package/ds-canonical/hooks/README.md +37 -23
- package/ds-canonical/hooks/_log-fire.sh +109 -12
- package/ds-canonical/hooks/auto_regen_ds_barrel.sh +52 -20
- package/ds-canonical/hooks/block_prototype_imports.py +148 -29
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +76 -66
- package/ds-canonical/hooks/check_audit_sample_escape.sh +4 -4
- package/ds-canonical/hooks/check_benchmark_citation.sh +3 -3
- package/ds-canonical/hooks/check_canonical_propagation.sh +81 -22
- package/ds-canonical/hooks/check_chrome_header_avatar_canonical.sh +22 -11
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +100 -56
- package/ds-canonical/hooks/check_codex_collab_5step.sh +31 -25
- package/ds-canonical/hooks/check_consumer_app_invariants.sh +116 -65
- package/ds-canonical/hooks/check_consumer_code_quality.sh +140 -0
- package/ds-canonical/hooks/check_datatable_invariants.sh +103 -25
- package/ds-canonical/hooks/check_dim_count_drift.sh +5 -4
- package/ds-canonical/hooks/check_ds_anchor_preflight.sh +83 -29
- package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +16 -6
- package/ds-canonical/hooks/check_escape_marker_abuse.sh +65 -21
- package/ds-canonical/hooks/check_field_controls_contracts.sh +10 -8
- package/ds-canonical/hooks/check_field_family_invariants.sh +90 -24
- package/ds-canonical/hooks/check_file_size_budget.sh +32 -14
- package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +60 -21
- package/ds-canonical/hooks/check_item_list_gap.sh +4 -2
- package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +31 -13
- package/ds-canonical/hooks/check_main_branch_workbench.sh +27 -68
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +20 -9
- package/ds-canonical/hooks/check_opacity_token_usage.sh +220 -95
- package/ds-canonical/hooks/check_orphan_ds_css.sh +48 -18
- package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +29 -11
- package/ds-canonical/hooks/check_pattern_invariants.sh +73 -14
- package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +4 -4
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +3 -2
- package/ds-canonical/hooks/check_plugin_fork_health.sh +151 -41
- package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +5 -109
- package/ds-canonical/hooks/check_propose_discipline.sh +116 -29
- package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +6 -4
- package/ds-canonical/hooks/check_propose_without_benchmark.sh +10 -6
- package/ds-canonical/hooks/check_select_all_canonical.sh +1 -1
- package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +22 -11
- package/ds-canonical/hooks/check_solo_workflow.sh +117 -186
- package/ds-canonical/hooks/check_spec_class_drift.sh +33 -19
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +6 -5
- package/ds-canonical/hooks/check_story_determinism.sh +1 -1
- package/ds-canonical/hooks/check_story_invariants.sh +526 -213
- package/ds-canonical/hooks/check_storybook_addon_packaging.sh +65 -15
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +137 -67
- package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +52 -23
- package/ds-canonical/hooks/check_tailwind_wildcard_in_docs.sh +20 -13
- package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +15 -12
- package/ds-canonical/hooks/chrome_header_dispatcher.sh +75 -26
- package/ds-canonical/hooks/enforce_home_charter.sh +29 -8
- package/ds-canonical/hooks/governance_control_plane.sh +15 -0
- package/ds-canonical/hooks/inject_deploy_url_after_push.sh +105 -22
- package/ds-canonical/hooks/inject_pending_self_audit.sh +27 -24
- package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +77 -29
- package/ds-canonical/hooks/lib/_approval_re.sh +5 -6
- package/ds-canonical/hooks/lib/_chrome_header_handcraft.sh +66 -20
- package/ds-canonical/hooks/lib/_code_quality.sh +9 -9
- package/ds-canonical/hooks/lib/_cva_default_sync.sh +11 -13
- package/ds-canonical/hooks/lib/_governance_coverage_check.sh +48 -21
- package/ds-canonical/hooks/lib/_hardcoded_strings.sh +13 -10
- package/ds-canonical/hooks/lib/_header_with_tabs_border.sh +68 -48
- package/ds-canonical/hooks/lib/_hook_integrity.sh +158 -0
- package/ds-canonical/hooks/lib/_layout_space_canonical.sh +5 -5
- package/ds-canonical/hooks/lib/_overlay_handcraft.sh +21 -23
- package/ds-canonical/hooks/lib/_person_data_richness.sh +5 -5
- package/ds-canonical/hooks/lib/_provider_paths.sh +162 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +5 -5
- package/ds-canonical/hooks/lib/_tab_lg_chrome_header_equal.sh +247 -27
- package/ds-canonical/hooks/lib/_token_hygiene.sh +39 -22
- package/ds-canonical/hooks/lib/approval-evidence.mjs +1131 -0
- package/ds-canonical/hooks/lib/audit-report-validator.mjs +118 -0
- package/ds-canonical/hooks/lib/provider-marker-regex.mjs +23 -0
- package/ds-canonical/hooks/lib/tsx-governance-analysis.mjs +410 -0
- package/ds-canonical/hooks/log_governance_fires.sh +45 -13
- package/ds-canonical/hooks/log_skill_invokes.sh +8 -7
- package/ds-canonical/hooks/post_edit_dispatcher.sh +106 -28
- package/ds-canonical/hooks/registrations.json +488 -0
- package/ds-canonical/hooks/registrations.schema.json +58 -0
- package/ds-canonical/hooks/retired/2026-06-11-prune-merge/check_propose_plain_chinese.sh +1 -1
- package/ds-canonical/hooks/retired/check_governance_compliance.sh +1 -1
- package/ds-canonical/hooks/session_start_governance_check.sh +109 -78
- package/ds-canonical/hooks/stop_audit_content_quality.sh +20 -0
- package/ds-canonical/hooks/stop_extract_canonical_rules.sh +20 -0
- package/ds-canonical/hooks/stop_passive_logging.sh +133 -59
- package/ds-canonical/hooks/stop_self_audit.sh +349 -210
- package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v1.jsonl +3 -0
- package/ds-canonical/hooks/tests/fixtures/transcripts/claude-transcript-jsonl-v2.jsonl +3 -0
- package/ds-canonical/hooks/tests/registration-output-contracts.mjs +151 -0
- package/ds-canonical/hooks/tests/run-all.sh +35 -5
- package/ds-canonical/hooks/tests/test_auto_regen_ds_barrel.sh +48 -4
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +157 -9
- package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +265 -127
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +119 -12
- package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +0 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +0 -0
- package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +56 -5
- package/ds-canonical/hooks/tests/test_check_chrome_header_avatar_canonical.sh +6 -6
- package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +193 -100
- package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +143 -17
- package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +49 -5
- package/ds-canonical/hooks/tests/test_check_consumer_app_invariants.sh +128 -0
- package/ds-canonical/hooks/tests/test_check_consumer_app_story_title.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +64 -0
- package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_consumer_no_ds_catalog.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_data_table_size_num_to_meta_width.sh +26 -8
- package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +126 -12
- package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +13 -8
- package/ds-canonical/hooks/tests/test_check_ds_anchor_preflight.sh +53 -7
- package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +3 -3
- package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +17 -7
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +72 -16
- package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +67 -5
- package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +107 -4
- package/ds-canonical/hooks/tests/test_check_full_story_visual_interaction_sweep.sh +25 -15
- package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +177 -67
- package/ds-canonical/hooks/tests/test_check_item_list_gap.sh +7 -7
- package/ds-canonical/hooks/tests/test_check_layout_space_magic_numbers.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +45 -110
- package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +19 -2
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +114 -8
- package/ds-canonical/hooks/tests/test_check_orphan_ds_css.sh +38 -22
- package/ds-canonical/hooks/tests/test_check_overlay_open_focus_escape_probe.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +68 -6
- package/ds-canonical/hooks/tests/test_check_plugin_fork_health.sh +53 -0
- package/ds-canonical/hooks/tests/test_check_post_main_ssot_propagate.sh +37 -0
- package/ds-canonical/hooks/tests/test_check_propose_cite_required.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_propose_discipline.sh +59 -0
- package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +7 -5
- package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +5 -5
- package/ds-canonical/hooks/tests/test_check_propose_without_benchmark.sh +45 -0
- package/ds-canonical/hooks/tests/test_check_sidebar_menu_button_implicit_wrap.sh +5 -5
- package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +183 -105
- package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +35 -7
- package/ds-canonical/hooks/tests/{test_check_story_anatomy.sh.broken → test_check_story_anatomy.sh} +73 -4
- package/ds-canonical/hooks/tests/{test_check_story_category.sh.broken → test_check_story_category.sh} +82 -2
- package/ds-canonical/hooks/tests/test_check_story_determinism.sh +39 -0
- package/ds-canonical/hooks/tests/test_check_story_invariants.sh +559 -43
- package/ds-canonical/hooks/tests/{test_check_story_name_jargon.sh.broken → test_check_story_name_jargon.sh} +22 -1
- package/ds-canonical/hooks/tests/test_check_storybook_addon_packaging.sh +79 -0
- package/ds-canonical/hooks/tests/test_check_storybook_addon_preset_cjs.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +546 -28
- package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +180 -98
- package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +3 -3
- package/ds-canonical/hooks/tests/test_check_tailwind_wildcard_in_docs.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +63 -15
- package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +12 -6
- package/ds-canonical/hooks/tests/test_chrome_header_dispatcher.sh +125 -0
- package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +57 -3
- package/ds-canonical/hooks/tests/test_governance_control_plane.sh +66 -0
- package/ds-canonical/hooks/tests/test_governance_coverage_check.sh +88 -0
- package/ds-canonical/hooks/tests/test_hook_integrity_classification.sh +217 -0
- package/ds-canonical/hooks/tests/test_inject_deploy_url_after_push.sh +85 -2
- package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +116 -11
- package/ds-canonical/hooks/tests/test_log_governance_fires.sh +117 -1
- package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +74 -5
- package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +234 -77
- package/ds-canonical/hooks/tests/test_provider_peer_symmetry.sh +76 -0
- package/ds-canonical/hooks/tests/test_registration_output_contracts.sh +20 -0
- package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +130 -18
- package/ds-canonical/hooks/tests/test_stop_audit_content_quality.sh +75 -0
- package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +101 -23
- package/ds-canonical/hooks/tests/test_stop_extract_canonical_rules.sh +75 -0
- package/ds-canonical/hooks/tests/{test_stop_governance_drift_check.sh.broken → test_stop_governance_drift_check.sh} +22 -12
- package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +102 -1
- package/ds-canonical/hooks/tests/test_stop_repository_command_context.sh +38 -0
- package/ds-canonical/hooks/tests/test_stop_self_audit.sh +363 -9
- package/ds-canonical/references/README.md +8 -8
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +4 -4
- package/ds-canonical/references/build-ui-canonicals.md +3 -3
- package/ds-canonical/references/certified-surfaces.md +46 -15
- package/ds-canonical/references/cva-patterns.md +2 -2
- package/ds-canonical/references/failure-class-registry.json +3 -2
- package/ds-canonical/references/governance-audit-coverage.md +8 -8
- package/ds-canonical/references/naming-conventions.md +1 -1
- package/ds-canonical/references/preflight-gate-baseline.json +210 -3
- package/ds-canonical/references/principle-dim-map.json +15 -9
- package/ds-canonical/references/props-naming.md +1 -1
- package/ds-canonical/references/scenario-definition.md +33 -30
- package/ds-canonical/references/spec-rules.md +1 -1
- package/ds-canonical/references/ssot-consultation.md +3 -3
- package/ds-canonical/references/ssot-index.md +1 -1
- package/ds-canonical/references/story-baseline-registry.json +9 -6
- package/ds-canonical/references/story-baseline-registry.schema.json +145 -0
- package/ds-canonical/references/structural-token-retention.md +1 -1
- package/ds-canonical/references/tailwind-gotchas.md +2 -2
- package/ds-canonical/references/ui-dev-rules.md +1 -1
- package/ds-canonical/rules/README.md +14 -9
- package/ds-canonical/rules/meta-patterns.md +13 -13
- package/ds-canonical/rules/self-verify.md +12 -7
- package/ds-canonical/rules/spec-rules.md +1 -1
- package/ds-canonical/rules/ui-development.md +5 -5
- package/ds-canonical/skills/README.md +27 -15
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +14 -7
- package/ds-canonical/skills/canonical-reviewer/SKILL.md +29 -0
- package/ds-canonical/skills/code-quality-audit/SKILL.md +11 -7
- package/ds-canonical/skills/codex-collab/SKILL.md +19 -238
- package/ds-canonical/skills/codex-collab/references/brief-template.md +37 -47
- package/ds-canonical/skills/codex-collab/references/transport.md +38 -57
- package/ds-canonical/skills/codify-corrections/SKILL.md +32 -31
- package/ds-canonical/skills/codify-principle/SKILL.md +33 -32
- package/ds-canonical/skills/component-quality-gate/SKILL.md +13 -13
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +7 -7
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +28 -229
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +36 -131
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +33 -187
- package/ds-canonical/skills/deep-audit-cross-codex/references/skill-relationships-antipatterns-benchmarks.md +22 -24
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +15 -79
- package/ds-canonical/skills/deep-audit-cross-codex/references/upstream-directives-r-mapping.md +24 -23
- package/ds-canonical/skills/delivery-handoff/SKILL.md +14 -8
- package/ds-canonical/skills/design-system-audit/SKILL.md +63 -62
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +86 -77
- package/ds-canonical/skills/design-system-audit/references/checkpoints.md +59 -50
- package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +8 -8
- package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +37 -32
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +39 -38
- package/ds-canonical/skills/ensure-canonical/SKILL.md +36 -34
- package/ds-canonical/skills/governance-health/SKILL.md +26 -22
- package/ds-canonical/skills/governance-status/SKILL.md +30 -0
- package/ds-canonical/skills/independent-review/SKILL.md +37 -0
- package/ds-canonical/skills/independent-review/agents/openai.yaml +4 -0
- package/ds-canonical/skills/independent-review/references/evidence-contract.md +24 -0
- package/ds-canonical/skills/knowledge-prune/SKILL.md +45 -52
- package/ds-canonical/skills/knowledge-prune/references/phase-z-cross-repo-ssot-propagation.md +10 -7
- package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +6 -6
- package/ds-canonical/skills/new-component/SKILL.md +18 -12
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +7 -6
- package/ds-canonical/skills/performance-audit/SKILL.md +13 -10
- package/ds-canonical/skills/product-ui-audit/SKILL.md +27 -17
- package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +7 -4
- package/ds-canonical/skills/product-ui-audit/references/report-template.md +30 -26
- package/ds-canonical/skills/propose-options/SKILL.md +1 -1
- package/ds-canonical/skills/prototype/SKILL.md +19 -21
- package/ds-canonical/skills/prototype/references/audit-checks.md +6 -5
- package/ds-canonical/skills/prototype/references/checkpoints.md +26 -17
- package/ds-canonical/skills/prototype/references/ooux-template.md +1 -1
- package/ds-canonical/skills/prototype/references/proposal-template.md +4 -4
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +22 -21
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +21 -20
- package/ds-canonical/skills/story-writing/SKILL.md +12 -12
- package/ds-canonical/skills/story-writing/references/anatomy-standard.md +1 -1
- package/ds-canonical/skills/story-writing/references/category-templates.md +5 -5
- package/ds-canonical/skills/ux-audit/SKILL.md +12 -9
- package/ds-canonical/skills/visual-audit/SKILL.md +41 -47
- package/ds-canonical/skills/visual-audit/references/audit-architecture.md +7 -7
- package/ds-canonical/skills/visual-audit/references/visual-checklist.md +12 -12
- package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +3 -3
- package/ds-canonical/templates/_README.md +6 -7
- package/ds-canonical/templates/consumer-governance.md +78 -0
- package/ds-canonical/templates/dashboard-app.tsx +3 -1
- package/ds-canonical/templates/product-launchers/fork-governance-dispatcher.sh +154 -0
- package/ds-canonical/templates/product-launchers/format-provider-hook-output.mjs +25 -0
- package/ds-canonical/templates/product-launchers/independent-review.mjs +490 -0
- package/ds-canonical/templates/product-launchers/inject_fork_governance_preamble.sh +99 -0
- package/ds-canonical/templates/product-launchers/normalize-provider-event.mjs +355 -0
- package/ds-canonical/templates/product-launchers/product-hook-dispatch-runtime.mjs +1067 -0
- package/ds-canonical/templates/product-provider-wiring.json +80 -0
- package/ds-canonical/templates/product-provider-wiring.schema.json +151 -0
- package/llms-full.txt +6 -6
- package/llms.txt +2 -2
- package/package.json +15 -4
- package/src/components/Accordion/accordion.principles.stories.tsx +16 -26
- package/src/components/Accordion/accordion.stories.tsx +22 -40
- package/src/components/Calendar/calendar.spec.md +1 -1
- package/src/components/Calendar/calendar.tsx +59 -25
- package/src/components/DataTable/cell-registry.tsx +3 -7
- package/src/components/DataTable/data-table.spec.md +1 -0
- package/src/components/DataTable/data-table.tsx +9 -2
- package/src/components/DatePicker/date-picker.spec.md +1 -1
- package/src/components/DatePicker/date-picker.tsx +203 -147
- package/src/components/Dialog/dialog.spec.md +1 -1
- package/src/components/Dialog/dialog.tsx +8 -2
- package/src/components/Field/field-context.ts +25 -1
- package/src/components/Field/field-wrapper.tsx +7 -1
- package/src/components/Field/field.spec.md +7 -0
- package/src/components/Field/field.tsx +13 -2
- package/src/components/InlineEdit/inline-edit.spec.md +12 -0
- package/src/components/InlineEdit/inline-edit.stories.tsx +28 -17
- package/src/components/InlineEdit/inline-edit.tsx +94 -31
- package/src/components/Input/input.tsx +7 -2
- package/src/components/LinkInput/link-input.spec.md +1 -1
- package/src/components/LinkInput/link-input.tsx +5 -1
- package/src/components/Popover/popover.tsx +7 -2
- package/src/components/Select/select.principles.stories.tsx +4 -3
- package/src/components/Select/select.stories.tsx +7 -6
- package/src/components/Select/select.tsx +61 -29
- package/src/components/Textarea/textarea.spec.md +10 -1
- package/src/components/Textarea/textarea.tsx +38 -5
- package/src/components/TimePicker/time-picker.tsx +11 -5
- package/src/components/Tooltip/tooltip.spec.md +6 -0
- package/src/patterns/element-anatomy/item-anatomy.spec.md +8 -1
- package/src/patterns/element-anatomy/item-anatomy.tsx +111 -30
- package/src/patterns/element-anatomy/truncated-text.spec.md +13 -2
- package/src/tokens/uiSize/uiSize.css +11 -0
- package/src/tokens/uiSize/uiSize.spec.md +1 -0
- package/src/tokens/utility-registry.json +119 -4
- package/src/tokens/utility-registry.schema.json +373 -0
- package/tools/README.md +9 -0
- package/tools/codemods/cli.mjs +93 -0
- package/tools/codemods/index.mjs +582 -0
- package/tools/shared/safe-filesystem.mjs +371 -0
- package/tools/visual-baseline/cli.mjs +97 -0
- package/tools/visual-baseline/index.mjs +522 -0
- /package/dist/{react-day-picker.css → index.css} +0 -0
|
@@ -202,6 +202,12 @@ function matchOperator(op, cellValue, filterValue, datePrecision, prepared) {
|
|
|
202
202
|
return String(cellValue ?? "").toLowerCase().includes((prepared == null ? void 0 : prepared.filterTextLower) ?? String(filterValue).toLowerCase());
|
|
203
203
|
case "does_not_contain":
|
|
204
204
|
return !String(cellValue ?? "").toLowerCase().includes((prepared == null ? void 0 : prepared.filterTextLower) ?? String(filterValue).toLowerCase());
|
|
205
|
+
// 2026-05-12 Round 6 fix(user 抓 Roadmap 進階篩選「全部」結果空)— impl-vs-spec drift。
|
|
206
|
+
// Per `filter-operators.spec.md` L116「is 直接接受多值,不另設 is_any_of」+ L103-116
|
|
207
|
+
// select(is/is_not + select_multi ValueShape OR 語意)+ L31-32(select.is / person.is 都走
|
|
208
|
+
// select_multi / person_multi ValueShape)。原 impl 只做 single-value 比對,filterValue 是
|
|
209
|
+
// array(全選 options)→ String(array)= "v1,v2" → 永遠 != single cellValue → 結果空。
|
|
210
|
+
// Fix:加 array handling,走 OR 語意:any → match;is_not → every-not-match。
|
|
205
211
|
case "is":
|
|
206
212
|
if (datePrecision) {
|
|
207
213
|
const a = toDateMs(cellValue, datePrecision);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-tree.js","sources":["../../../src/components/DataTable/filter-tree.ts"],"sourcesContent":["/**\n * filter-tree.ts — FilterTree types + helpers + evaluator\n *\n * 抽自 data-table-filter-panel.tsx 為了 file-size budget(panel 拆分)。\n * 純資料結構 + pure functions,無 UI dep。\n *\n * 詳:./filter-operators.spec.md\n */\n\nimport {\n startOfDay, endOfDay,\n startOfWeek, endOfWeek,\n startOfMonth, endOfMonth,\n addDays, addWeeks, addMonths, subDays,\n} from 'date-fns'\nimport { OPERATOR_REGISTRY, type OperatorSpec } from './filter-operators'\n\n/**\n * 把 relative key 轉成 [start, end] 時間區間(local time,inclusive)。\n * 對齊 Notion / ClickUp idiom — 以「今天」為錨點計算。\n */\nfunction relativeKeyToRange(key: string, now: Date = new Date()): [number, number] | null {\n const today = startOfDay(now)\n switch (key) {\n case 'today': return [today.getTime(), endOfDay(now).getTime()]\n case 'yesterday': return [startOfDay(subDays(now, 1)).getTime(), endOfDay(subDays(now, 1)).getTime()]\n case 'tomorrow': return [startOfDay(addDays(now, 1)).getTime(), endOfDay(addDays(now, 1)).getTime()]\n case 'this_week': return [startOfWeek(now, { weekStartsOn: 1 }).getTime(), endOfWeek(now, { weekStartsOn: 1 }).getTime()]\n case 'last_week': return [startOfWeek(addWeeks(now, -1), { weekStartsOn: 1 }).getTime(), endOfWeek(addWeeks(now, -1), { weekStartsOn: 1 }).getTime()]\n case 'next_week': return [startOfWeek(addWeeks(now, 1), { weekStartsOn: 1 }).getTime(), endOfWeek(addWeeks(now, 1), { weekStartsOn: 1 }).getTime()]\n case 'this_month': return [startOfMonth(now).getTime(), endOfMonth(now).getTime()]\n case 'last_month': return [startOfMonth(addMonths(now, -1)).getTime(), endOfMonth(addMonths(now, -1)).getTime()]\n case 'next_month': return [startOfMonth(addMonths(now, 1)).getTime(), endOfMonth(addMonths(now, 1)).getTime()]\n case 'past_7_days': return [startOfDay(subDays(now, 7)).getTime(), endOfDay(now).getTime()]\n case 'past_30_days': return [startOfDay(subDays(now, 30)).getTime(), endOfDay(now).getTime()]\n case 'next_7_days': return [startOfDay(now).getTime(), endOfDay(addDays(now, 7)).getTime()]\n case 'next_30_days': return [startOfDay(now).getTime(), endOfDay(addDays(now, 30)).getTime()]\n default: return null\n }\n}\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type Conjunction = 'and' | 'or'\n\nexport interface FilterCondition {\n kind: 'cond'\n /** 唯一 row id(stable across renders) */\n id: string\n /** 對應 column id;空字串 = 尚未選 field(operator/value picker disabled) */\n field: string\n /** OperatorSpec.op key — 對齊 OPERATOR_REGISTRY */\n op: string\n /** 依 ValueShape 解讀的值 */\n value: unknown\n /** Date 欄位比對精度(2026-07-04 Q6 拍板,兌現 spec「includeTime」雙精度契約):\n * panel 建 condition 時依 column meta 寫入 — includeTime=true → 'ms',否則 'day'\n * (AG Grid midnight-truncate / MUI X setHours(0,0,0,0) 共識;避 Airtable 邊界漏抓地雷)。\n * 非 date 欄位 / 舊 tree 無此欄 → undefined(date ops fallback 'day' 預設)。 */\n datePrecision?: 'day' | 'ms'\n}\n\nexport interface FilterGroup {\n kind: 'group'\n id: string\n /** group 內 children 共用的 join(全 AND 或全 OR;不允許混) */\n conjunction: Conjunction\n /** ⚠️ 型別鎖死:children 只能 condition,不可再 nested group(1-level cap) */\n children: FilterCondition[]\n}\n\nexport type FilterTreeFlat = {\n mode: 'flat'\n conjunction: Conjunction\n children: FilterCondition[]\n}\n\nexport type FilterTreeNested = {\n mode: 'nested'\n conjunction: Conjunction\n children: FilterGroup[]\n}\n\nexport type FilterTree = FilterTreeFlat | FilterTreeNested\n\n// ── Helpers — public API ────────────────────────────────────────────────\n\n/** Empty FilterTree — consumer 用來 init useState */\nexport function createEmptyFilterTree(mode: 'flat'): FilterTreeFlat\nexport function createEmptyFilterTree(mode: 'nested'): FilterTreeNested\nexport function createEmptyFilterTree(mode: 'flat' | 'nested'): FilterTree {\n if (mode === 'flat') return { mode: 'flat', conjunction: 'and', children: [] }\n return { mode: 'nested', conjunction: 'and', children: [] }\n}\n\n/** 是否有任何 active filter — DataTable trigger button checked state 用 */\nexport function isFilterTreeActive(tree: FilterTree): boolean {\n if (tree.mode === 'flat') {\n return tree.children.some((c) => isConditionComplete(c))\n }\n return tree.children.some((g) => g.children.some((c) => isConditionComplete(c)))\n}\n\n/** Condition 是否「已填齊」可參與 filter 求值 */\nfunction isConditionComplete(c: FilterCondition): boolean {\n if (!c.field || !c.op) return false\n const spec = getOperatorSpecLoose(c.op)\n if (!spec) return false\n if (spec.valueShape === 'none') return true\n return c.value !== '' && c.value !== null && c.value !== undefined\n}\n\n/** loose lookup — 我們不知 columnType,試所有 type。\n * D3 perf(2026-07-06):module-level Map cache — OPERATOR_REGISTRY 是 module 常數,\n * 同一 op key 查詢結果永不變;原每 call 線性掃全 registry,而 evaluateTree 熱路徑\n * per-row 呼叫時(10k rows × N conditions)放大成數十萬次比較,cache 後 O(1)。 */\nconst opSpecLooseCache = new Map<string, OperatorSpec | null>()\nfunction getOperatorSpecLoose(op: string): OperatorSpec | null {\n const cached = opSpecLooseCache.get(op)\n if (cached !== undefined) return cached\n let found: OperatorSpec | null = null\n for (const list of Object.values(OPERATOR_REGISTRY)) {\n const hit = list.find((o) => o.op === op)\n if (hit) { found = hit; break }\n }\n opSpecLooseCache.set(op, found)\n return found\n}\n\n// ── Deep-equal compare(refresh icon 顯示判定用) ─────────────────────────\n\n/** Compare two FilterTrees structurally — 忽略內部 row id(refresh-detect 不該被內部 id 干擾)*/\nexport function isFilterTreeEqual(a: FilterTree, b: FilterTree): boolean {\n if (a.mode !== b.mode || a.conjunction !== b.conjunction) return false\n if (a.children.length !== b.children.length) return false\n if (a.mode === 'flat' && b.mode === 'flat') {\n return a.children.every((c, i) => isConditionEqual(c, b.children[i]))\n }\n if (a.mode === 'nested' && b.mode === 'nested') {\n return a.children.every((g, i) => isGroupEqual(g, b.children[i]))\n }\n return false\n}\n\nfunction isGroupEqual(a: FilterGroup, b: FilterGroup): boolean {\n if (a.conjunction !== b.conjunction) return false\n if (a.children.length !== b.children.length) return false\n return a.children.every((c, i) => isConditionEqual(c, b.children[i]))\n}\n\nfunction isConditionEqual(a: FilterCondition, b: FilterCondition): boolean {\n if (a.field !== b.field || a.op !== b.op) return false\n return JSON.stringify(a.value) === JSON.stringify(b.value)\n}\n\n// ── Tree Evaluation(globalFilter approach)──────────────────────────────\n\n// ── D3 perf(2026-07-06):per-condition compile-once cache ────────────────\n// TanStack globalFilterFn 逐 row 呼叫 evaluateTree,原實作每 row 重做「跨全 rows 不變」\n// 的常數工作:isConditionComplete(operator registry 掃描)、dateMs(filterValue) 重 parse、\n// filterValue 重 toLowerCase、is_relative 重算時間區間 — 10k rows × N conditions 全額放大。\n// Fix:以 condition 物件為 key 的 WeakMap 快取 filterValue 側預解析結果,row loop 只轉\n// cellValue 側。Panel 更新走 immutable `{ ...c, ...patch }`(新物件 = 新 cache entry),\n// 舊 entry 隨舊 condition 物件 GC — cache 無失效問題。\ninterface PreparedCondition {\n /** isConditionComplete 結果(registry 掃描一次,取代原 per-row filter 掃描) */\n complete: boolean\n /** filterValue 側是否 Person(物件或含 Person 的陣列) */\n filterIsPerson: boolean\n /** person 比對 ops 的 filter 側 id array(cellValue 是 Person 時也走 person path,故照 op 準備) */\n filterPersonIds: string[] | null\n /** 文字 ops 用:String(filterValue).toLowerCase() */\n filterTextLower: string | null\n /** is / is_not 陣列(多值 OR 語意)逐元素 lowercase */\n filterTextLowerArr: string[] | null\n /** 單值 date ops(is_before 家族;is / is_not with datePrecision)— datePrecision 已套 */\n filterDateMs: number | null\n /** is_between 兩端(空端 = ±Infinity,語意同原 inline 邏輯) */\n filterDateStart: number | null\n filterDateEnd: number | null\n /** is_relative:快取區間 + 計算當日 stamp(跨日自動重算 — 所有 relative 區間都是\n * calendar day 的純函數,同日內恆定,見 localDayKey) */\n relRange: [number, number] | null\n relDayKey: number\n}\n\nconst PERSON_CAPABLE_OPS = new Set(['is', 'is_not', 'has_any_of', 'has_all_of', 'has_none_of'])\nconst DATE_SINGLE_OPS = new Set(['is_before', 'is_after', 'is_on_or_before', 'is_on_or_after'])\nconst TEXT_OPS = new Set(['contains', 'does_not_contain', 'starts_with', 'ends_with', 'is', 'is_not'])\n\nconst preparedCache = new WeakMap<FilterCondition, PreparedCondition>()\n\nfunction prepareCondition(c: FilterCondition): PreparedCondition {\n const hit = preparedCache.get(c)\n if (hit) return hit\n const fv = c.value\n const isBetweenPair = c.op === 'is_between' && Array.isArray(fv) && fv.length === 2\n const prepared: PreparedCondition = {\n complete: isConditionComplete(c),\n filterIsPerson: isPersonObject(fv) || (Array.isArray(fv) && fv.some(isPersonObject)),\n filterPersonIds: PERSON_CAPABLE_OPS.has(c.op)\n ? (Array.isArray(fv) ? fv.map(personId) : [personId(fv)])\n : null,\n filterTextLower: TEXT_OPS.has(c.op) ? String(fv).toLowerCase() : null,\n filterTextLowerArr:\n (c.op === 'is' || c.op === 'is_not') && Array.isArray(fv) ? fv.map((v) => String(v).toLowerCase()) : null,\n filterDateMs:\n DATE_SINGLE_OPS.has(c.op) || ((c.op === 'is' || c.op === 'is_not') && c.datePrecision !== undefined)\n ? toDateMs(fv, c.datePrecision)\n : null,\n filterDateStart: isBetweenPair ? (fv[0] ? toDateMs(fv[0], c.datePrecision) : -Infinity) : null,\n filterDateEnd: isBetweenPair ? (fv[1] ? toDateMs(fv[1], c.datePrecision) : Infinity) : null,\n relRange: null,\n relDayKey: 0,\n }\n preparedCache.set(c, prepared)\n return prepared\n}\n\n/**\n * 整棵 FilterTree 對 row 求 boolean。\n * 配合 useReactTable `globalFilterFn`:\n *\n * const tree = useState<FilterTree>(createEmptyFilterTree('flat'))\n * useReactTable({\n * state: { globalFilter: tree },\n * onGlobalFilterChange: setTree,\n * globalFilterFn: (row, _, t: FilterTree) => evaluateTree(t, row.original),\n * getFilteredRowModel: getFilteredRowModel(),\n * })\n */\n// any-allow: row-generic — TanStack row.original 是 generic,filter eval 跨 type 必走 any\nexport function evaluateTree(tree: FilterTree, row: any): boolean {\n if (tree.children.length === 0) return true\n\n if (tree.mode === 'flat') {\n // null = 無 complete condition → pass-through(語意同原 completed.length === 0 分支)\n return evaluateConditionsJoined(tree.children, tree.conjunction, row) ?? true\n }\n\n // nested — group 沒任何 complete condition 的視為 pass-through(不參與 conjunction),\n // 語意同原 meaningful filter\n let sawMeaningful = false\n for (const g of tree.children) {\n const r = evaluateConditionsJoined(g.children, g.conjunction, row)\n if (r === null) continue\n sawMeaningful = true\n if (tree.conjunction === 'and') {\n if (!r) return false\n } else if (r) {\n return true\n }\n }\n if (!sawMeaningful) return true\n return tree.conjunction === 'and'\n}\n\n/** 一組 conditions 依 conjunction 求 boolean;null = 組內無 complete condition(pass-through)。\n * D3 perf:prepared.complete 取代原 per-row `children.filter(isConditionComplete)`\n * (registry 掃描 + filter/map 兩個中間陣列 alloc);and/or 短路 — 條件是 pure predicate\n * 無副作用,求值順序 / 省略不影響結果。 */\n// any-allow: row-generic\nfunction evaluateConditionsJoined(children: FilterCondition[], conjunction: Conjunction, row: any): boolean | null {\n let sawComplete = false\n for (const c of children) {\n const prepared = prepareCondition(c)\n if (!prepared.complete) continue\n sawComplete = true\n const matched = evaluateCondition(c, prepared, row)\n if (conjunction === 'and') {\n if (!matched) return false\n } else if (matched) {\n return true\n }\n }\n if (!sawComplete) return null\n return conjunction === 'and'\n}\n\n// any-allow: row-generic\nfunction evaluateCondition(cond: FilterCondition, prepared: PreparedCondition, row: any): boolean {\n if (!cond.field || !cond.op) return true\n const cellValue = row?.[cond.field]\n return matchOperator(cond.op, cellValue, cond.value, cond.datePrecision, prepared)\n}\n\n// PersonValue identity helper(2026-05-07):\n// person/multiPerson cell value 是 `{ name, avatarUrl?, description? }` 物件 — 比對時用 `name`\n// 當 stable id(PeoplePicker SSOT 沒有 id field,name 是唯一身分標識)。對齊 Notion / Linear /\n// Asana 的 person filter 比對 idiom(都用 name/email 當 id)。\nfunction personId(v: unknown): string {\n if (v && typeof v === 'object' && 'name' in v) return String((v as { name: unknown }).name ?? '')\n return String(v ?? '')\n}\nfunction isPersonObject(v: unknown): v is { name: string } {\n return !!v && typeof v === 'object' && 'name' in v\n}\n\n// Q6(2026-07-04):date 比對精度 helper — 'ms' 全精度;其餘(含 undefined)day 級\n// (本地時區 startOfDay 截斷,對齊 AG Grid / MUI X date 欄 midnight 慣例)。\n// D3 perf(2026-07-06):自 matchOperator 內 closure 提升 top-level — prepareCondition\n// (filterValue 側,每 condition 一次)與 matchOperator(cellValue 側,每 row)共用同一實作。\nfunction toDateMs(v: unknown, datePrecision?: 'day' | 'ms'): number {\n const d = new Date(String(v))\n if (Number.isNaN(d.getTime())) return NaN\n return datePrecision === 'ms' ? d.getTime() : startOfDay(d).getTime()\n}\n\n/** 本地日曆日 stamp(yyyymmdd)— is_relative 快取跨日失效判定(每 row 1 個 Date alloc,\n * 取代原 relativeKeyToRange 每 row 4-10 個 Date alloc + 區間重算) */\nfunction localDayKey(d: Date): number {\n return d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate()\n}\n\n// code-quality-allow: long-function — 13-operator switch dispatch table,table-driven 重構會把 op-specific guards 拆出反增 indirection\nfunction matchOperator(op: string, cellValue: unknown, filterValue: unknown, datePrecision?: 'day' | 'ms', prepared?: PreparedCondition): boolean {\n // 不需 value 的 op\n switch (op) {\n case 'is_set': return cellValue !== null && cellValue !== undefined && cellValue !== ''\n case 'is_not_set': return cellValue === null || cellValue === undefined || cellValue === ''\n case 'is_true': return cellValue === true\n case 'is_false': return cellValue === false\n }\n\n // 需 value 但 value 空 → 視為 incomplete,pass-through\n if (filterValue === null || filterValue === undefined || filterValue === '') return true\n if (Array.isArray(filterValue) && filterValue.length === 0) return true\n\n // Person-aware specialization(person_single / person_multi)— 物件透過 name 比對。\n // 偵測:cellValue 或 filterValue 任一是 Person object(或包 Person 的陣列)→ 走 personId path。\n // D3 perf:filterValue 側偵測 + id array 消費 prepared 快取(cellValue 側必然 per-row)。\n const cellIsPerson = isPersonObject(cellValue) || (Array.isArray(cellValue) && cellValue.some(isPersonObject))\n const filterIsPerson = prepared\n ? prepared.filterIsPerson\n : isPersonObject(filterValue) || (Array.isArray(filterValue) && filterValue.some(isPersonObject))\n if (cellIsPerson || filterIsPerson) {\n const cellIds = Array.isArray(cellValue) ? cellValue.map(personId) : [personId(cellValue)]\n const filterIds = prepared?.filterPersonIds ?? (Array.isArray(filterValue) ? filterValue.map(personId) : [personId(filterValue)])\n switch (op) {\n case 'is': return cellIds.length === 1 && filterIds.length >= 1 && filterIds.includes(cellIds[0])\n case 'is_not': return !(cellIds.length === 1 && filterIds.length >= 1 && filterIds.includes(cellIds[0]))\n case 'has_any_of': return cellIds.some((c) => filterIds.includes(c))\n case 'has_all_of': return filterIds.every((f) => cellIds.includes(f))\n case 'has_none_of':return !cellIds.some((c) => filterIds.includes(c))\n default: return true\n }\n }\n\n // (date 精度 helper 已提升為 top-level `toDateMs`;文字 ops 的 filterValue lowercase 消費\n // prepared 快取,prepared 缺席 = deprecated dataTableFilterMatch 路徑 inline fallback — D3 perf)\n\n switch (op) {\n case 'contains': return String(cellValue ?? '').toLowerCase().includes(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'does_not_contain': return !String(cellValue ?? '').toLowerCase().includes(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n // 2026-05-12 Round 6 fix(user 抓 Roadmap 進階篩選「全部」結果空)— impl-vs-spec drift。\n // Per `filter-operators.spec.md` L116「is 直接接受多值,不另設 is_any_of」+ L103-116\n // select(is/is_not + select_multi ValueShape OR 語意)+ L31-32(select.is / person.is 都走\n // select_multi / person_multi ValueShape)。原 impl 只做 single-value 比對,filterValue 是\n // array(全選 options)→ String(array)= \"v1,v2\" → 永遠 != single cellValue → 結果空。\n // Fix:加 array handling,走 OR 語意:any → match;is_not → every-not-match。\n case 'is':\n // Q6:date 欄位(datePrecision 有值)走日期比對非字串 — 「2026-06-01」與「2026-06-01 14:30」\n // 在 day 精度下相等(原字串小寫相等連同日不同格式都漏)\n if (datePrecision) {\n const a = toDateMs(cellValue, datePrecision)\n const b = prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision)\n return !Number.isNaN(a) && a === b\n }\n if (Array.isArray(filterValue)) {\n const cellLower = String(cellValue ?? '').toLowerCase()\n const filterLowers = prepared?.filterTextLowerArr ?? filterValue.map((v) => String(v).toLowerCase())\n return filterLowers.some((v) => cellLower === v)\n }\n return String(cellValue ?? '').toLowerCase() === (prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'is_not':\n if (datePrecision) {\n const a = toDateMs(cellValue, datePrecision)\n const b = prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision)\n return Number.isNaN(a) || a !== b\n }\n if (Array.isArray(filterValue)) {\n const cellLower = String(cellValue ?? '').toLowerCase()\n const filterLowers = prepared?.filterTextLowerArr ?? filterValue.map((v) => String(v).toLowerCase())\n return filterLowers.every((v) => cellLower !== v)\n }\n return String(cellValue ?? '').toLowerCase() !== (prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'starts_with': return String(cellValue ?? '').toLowerCase().startsWith(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'ends_with': return String(cellValue ?? '').toLowerCase().endsWith(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n\n case 'equals': return Number(cellValue) === Number(filterValue)\n case 'not_equals': return Number(cellValue) !== Number(filterValue)\n case 'gt': return Number(cellValue) > Number(filterValue)\n case 'gte': return Number(cellValue) >= Number(filterValue)\n case 'lt': return Number(cellValue) < Number(filterValue)\n case 'lte': return Number(cellValue) <= Number(filterValue)\n\n case 'is_before': return toDateMs(cellValue, datePrecision) < (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_after': return toDateMs(cellValue, datePrecision) > (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_on_or_before': return toDateMs(cellValue, datePrecision) <= (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_on_or_after': return toDateMs(cellValue, datePrecision) >= (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_between': {\n if (!Array.isArray(filterValue) || filterValue.length !== 2) return true\n const cv = toDateMs(cellValue, datePrecision)\n const start = prepared?.filterDateStart ?? (filterValue[0] ? toDateMs(filterValue[0], datePrecision) : -Infinity)\n const end = prepared?.filterDateEnd ?? (filterValue[1] ? toDateMs(filterValue[1], datePrecision) : Infinity)\n return cv >= start && cv <= end\n }\n case 'is_relative': {\n // Phase D 完整實作 — relative key → time range → in-range test\n // D3 perf:relativeKeyToRange 所有輸出都是 calendar day 的純函數(today / this_week /\n // past_7_days… 全是日界),同日內恆定 → 以 localDayKey 判跨日,同日重用快取區間\n // (原每 row 重算 4-10 個 Date alloc)。\n let range: [number, number] | null\n if (prepared) {\n const now = new Date()\n const dayKey = localDayKey(now)\n if (prepared.relDayKey !== dayKey) {\n prepared.relRange = relativeKeyToRange(String(filterValue), now)\n prepared.relDayKey = dayKey\n }\n range = prepared.relRange\n } else {\n range = relativeKeyToRange(String(filterValue))\n }\n if (!range) return true // unknown key,pass-through\n const cv = new Date(String(cellValue)).getTime()\n if (Number.isNaN(cv)) return false // invalid cellValue → 不命中\n const [start, end] = range\n return cv >= start && cv <= end\n }\n\n case 'has_any_of': {\n if (!Array.isArray(filterValue)) return true\n if (Array.isArray(cellValue)) return cellValue.some((c) => filterValue.includes(c))\n return filterValue.includes(cellValue)\n }\n case 'has_all_of': {\n if (!Array.isArray(filterValue)) return true\n if (Array.isArray(cellValue)) return filterValue.every((v) => cellValue.includes(v))\n return false\n }\n case 'has_none_of': {\n if (!Array.isArray(filterValue)) return true\n if (Array.isArray(cellValue)) return !cellValue.some((c) => filterValue.includes(c))\n return !filterValue.includes(cellValue)\n }\n\n default: return true\n }\n}\n\n/**\n * @deprecated v0.x — old per-column filterFn integration。\n * 新版用 `evaluateTree` 配 TanStack `globalFilter`。\n * 保留為了過渡期 backward-compat,新 consumer 不要用。\n */\nexport function dataTableFilterMatch(cellValue: unknown, filterValue: unknown): boolean {\n if (typeof filterValue === 'object' && filterValue !== null && 'operator' in filterValue && 'value' in filterValue) {\n const fv = filterValue as { operator: string; value: unknown }\n return matchOperator(fv.operator, cellValue, fv.value)\n }\n return String(cellValue ?? '').toLowerCase().includes(String(filterValue ?? '').toLowerCase())\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-tree.js","sources":["../../../src/components/DataTable/filter-tree.ts"],"sourcesContent":["/**\n * filter-tree.ts — FilterTree types + helpers + evaluator\n *\n * 抽自 data-table-filter-panel.tsx 為了 file-size budget(panel 拆分)。\n * 純資料結構 + pure functions,無 UI dep。\n *\n * 詳:./filter-operators.spec.md\n */\n\nimport {\n startOfDay, endOfDay,\n startOfWeek, endOfWeek,\n startOfMonth, endOfMonth,\n addDays, addWeeks, addMonths, subDays,\n} from 'date-fns'\nimport { OPERATOR_REGISTRY, type OperatorSpec } from './filter-operators'\n\n/**\n * 把 relative key 轉成 [start, end] 時間區間(local time,inclusive)。\n * 對齊 Notion / ClickUp idiom — 以「今天」為錨點計算。\n */\nfunction relativeKeyToRange(key: string, now: Date = new Date()): [number, number] | null {\n const today = startOfDay(now)\n switch (key) {\n case 'today': return [today.getTime(), endOfDay(now).getTime()]\n case 'yesterday': return [startOfDay(subDays(now, 1)).getTime(), endOfDay(subDays(now, 1)).getTime()]\n case 'tomorrow': return [startOfDay(addDays(now, 1)).getTime(), endOfDay(addDays(now, 1)).getTime()]\n case 'this_week': return [startOfWeek(now, { weekStartsOn: 1 }).getTime(), endOfWeek(now, { weekStartsOn: 1 }).getTime()]\n case 'last_week': return [startOfWeek(addWeeks(now, -1), { weekStartsOn: 1 }).getTime(), endOfWeek(addWeeks(now, -1), { weekStartsOn: 1 }).getTime()]\n case 'next_week': return [startOfWeek(addWeeks(now, 1), { weekStartsOn: 1 }).getTime(), endOfWeek(addWeeks(now, 1), { weekStartsOn: 1 }).getTime()]\n case 'this_month': return [startOfMonth(now).getTime(), endOfMonth(now).getTime()]\n case 'last_month': return [startOfMonth(addMonths(now, -1)).getTime(), endOfMonth(addMonths(now, -1)).getTime()]\n case 'next_month': return [startOfMonth(addMonths(now, 1)).getTime(), endOfMonth(addMonths(now, 1)).getTime()]\n case 'past_7_days': return [startOfDay(subDays(now, 7)).getTime(), endOfDay(now).getTime()]\n case 'past_30_days': return [startOfDay(subDays(now, 30)).getTime(), endOfDay(now).getTime()]\n case 'next_7_days': return [startOfDay(now).getTime(), endOfDay(addDays(now, 7)).getTime()]\n case 'next_30_days': return [startOfDay(now).getTime(), endOfDay(addDays(now, 30)).getTime()]\n default: return null\n }\n}\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport type Conjunction = 'and' | 'or'\n\nexport interface FilterCondition {\n kind: 'cond'\n /** 唯一 row id(stable across renders) */\n id: string\n /** 對應 column id;空字串 = 尚未選 field(operator/value picker disabled) */\n field: string\n /** OperatorSpec.op key — 對齊 OPERATOR_REGISTRY */\n op: string\n /** 依 ValueShape 解讀的值 */\n value: unknown\n /** Date 欄位比對精度(2026-07-04 Q6 拍板,兌現 spec「includeTime」雙精度契約):\n * panel 建 condition 時依 column meta 寫入 — includeTime=true → 'ms',否則 'day'\n * (AG Grid midnight-truncate / MUI X setHours(0,0,0,0) 共識;避 Airtable 邊界漏抓地雷)。\n * 非 date 欄位 / 舊 tree 無此欄 → undefined(date ops fallback 'day' 預設)。 */\n datePrecision?: 'day' | 'ms'\n}\n\nexport interface FilterGroup {\n kind: 'group'\n id: string\n /** group 內 children 共用的 join(全 AND 或全 OR;不允許混) */\n conjunction: Conjunction\n /** ⚠️ 型別鎖死:children 只能 condition,不可再 nested group(1-level cap) */\n children: FilterCondition[]\n}\n\nexport type FilterTreeFlat = {\n mode: 'flat'\n conjunction: Conjunction\n children: FilterCondition[]\n}\n\nexport type FilterTreeNested = {\n mode: 'nested'\n conjunction: Conjunction\n children: FilterGroup[]\n}\n\nexport type FilterTree = FilterTreeFlat | FilterTreeNested\n\n// ── Helpers — public API ────────────────────────────────────────────────\n\n/** Empty FilterTree — consumer 用來 init useState */\nexport function createEmptyFilterTree(mode: 'flat'): FilterTreeFlat\nexport function createEmptyFilterTree(mode: 'nested'): FilterTreeNested\nexport function createEmptyFilterTree(mode: 'flat' | 'nested'): FilterTree {\n if (mode === 'flat') return { mode: 'flat', conjunction: 'and', children: [] }\n return { mode: 'nested', conjunction: 'and', children: [] }\n}\n\n/** 是否有任何 active filter — DataTable trigger button checked state 用 */\nexport function isFilterTreeActive(tree: FilterTree): boolean {\n if (tree.mode === 'flat') {\n return tree.children.some((c) => isConditionComplete(c))\n }\n return tree.children.some((g) => g.children.some((c) => isConditionComplete(c)))\n}\n\n/** Condition 是否「已填齊」可參與 filter 求值 */\nfunction isConditionComplete(c: FilterCondition): boolean {\n if (!c.field || !c.op) return false\n const spec = getOperatorSpecLoose(c.op)\n if (!spec) return false\n if (spec.valueShape === 'none') return true\n return c.value !== '' && c.value !== null && c.value !== undefined\n}\n\n/** loose lookup — 我們不知 columnType,試所有 type。\n * D3 perf(2026-07-06):module-level Map cache — OPERATOR_REGISTRY 是 module 常數,\n * 同一 op key 查詢結果永不變;原每 call 線性掃全 registry,而 evaluateTree 熱路徑\n * per-row 呼叫時(10k rows × N conditions)放大成數十萬次比較,cache 後 O(1)。 */\nconst opSpecLooseCache = new Map<string, OperatorSpec | null>()\nfunction getOperatorSpecLoose(op: string): OperatorSpec | null {\n const cached = opSpecLooseCache.get(op)\n if (cached !== undefined) return cached\n let found: OperatorSpec | null = null\n for (const list of Object.values(OPERATOR_REGISTRY)) {\n const hit = list.find((o) => o.op === op)\n if (hit) { found = hit; break }\n }\n opSpecLooseCache.set(op, found)\n return found\n}\n\n// ── Deep-equal compare(refresh icon 顯示判定用) ─────────────────────────\n\n/** Compare two FilterTrees structurally — 忽略內部 row id(refresh-detect 不該被內部 id 干擾)*/\nexport function isFilterTreeEqual(a: FilterTree, b: FilterTree): boolean {\n if (a.mode !== b.mode || a.conjunction !== b.conjunction) return false\n if (a.children.length !== b.children.length) return false\n if (a.mode === 'flat' && b.mode === 'flat') {\n return a.children.every((c, i) => isConditionEqual(c, b.children[i]))\n }\n if (a.mode === 'nested' && b.mode === 'nested') {\n return a.children.every((g, i) => isGroupEqual(g, b.children[i]))\n }\n return false\n}\n\nfunction isGroupEqual(a: FilterGroup, b: FilterGroup): boolean {\n if (a.conjunction !== b.conjunction) return false\n if (a.children.length !== b.children.length) return false\n return a.children.every((c, i) => isConditionEqual(c, b.children[i]))\n}\n\nfunction isConditionEqual(a: FilterCondition, b: FilterCondition): boolean {\n if (a.field !== b.field || a.op !== b.op) return false\n return JSON.stringify(a.value) === JSON.stringify(b.value)\n}\n\n// ── Tree Evaluation(globalFilter approach)──────────────────────────────\n\n// ── D3 perf(2026-07-06):per-condition compile-once cache ────────────────\n// TanStack globalFilterFn 逐 row 呼叫 evaluateTree,原實作每 row 重做「跨全 rows 不變」\n// 的常數工作:isConditionComplete(operator registry 掃描)、dateMs(filterValue) 重 parse、\n// filterValue 重 toLowerCase、is_relative 重算時間區間 — 10k rows × N conditions 全額放大。\n// Fix:以 condition 物件為 key 的 WeakMap 快取 filterValue 側預解析結果,row loop 只轉\n// cellValue 側。Panel 更新走 immutable `{ ...c, ...patch }`(新物件 = 新 cache entry),\n// 舊 entry 隨舊 condition 物件 GC — cache 無失效問題。\ninterface PreparedCondition {\n /** isConditionComplete 結果(registry 掃描一次,取代原 per-row filter 掃描) */\n complete: boolean\n /** filterValue 側是否 Person(物件或含 Person 的陣列) */\n filterIsPerson: boolean\n /** person 比對 ops 的 filter 側 id array(cellValue 是 Person 時也走 person path,故照 op 準備) */\n filterPersonIds: string[] | null\n /** 文字 ops 用:String(filterValue).toLowerCase() */\n filterTextLower: string | null\n /** is / is_not 陣列(多值 OR 語意)逐元素 lowercase */\n filterTextLowerArr: string[] | null\n /** 單值 date ops(is_before 家族;is / is_not with datePrecision)— datePrecision 已套 */\n filterDateMs: number | null\n /** is_between 兩端(空端 = ±Infinity,語意同原 inline 邏輯) */\n filterDateStart: number | null\n filterDateEnd: number | null\n /** is_relative:快取區間 + 計算當日 stamp(跨日自動重算 — 所有 relative 區間都是\n * calendar day 的純函數,同日內恆定,見 localDayKey) */\n relRange: [number, number] | null\n relDayKey: number\n}\n\nconst PERSON_CAPABLE_OPS = new Set(['is', 'is_not', 'has_any_of', 'has_all_of', 'has_none_of'])\nconst DATE_SINGLE_OPS = new Set(['is_before', 'is_after', 'is_on_or_before', 'is_on_or_after'])\nconst TEXT_OPS = new Set(['contains', 'does_not_contain', 'starts_with', 'ends_with', 'is', 'is_not'])\n\nconst preparedCache = new WeakMap<FilterCondition, PreparedCondition>()\n\nfunction prepareCondition(c: FilterCondition): PreparedCondition {\n const hit = preparedCache.get(c)\n if (hit) return hit\n const fv = c.value\n const isBetweenPair = c.op === 'is_between' && Array.isArray(fv) && fv.length === 2\n const prepared: PreparedCondition = {\n complete: isConditionComplete(c),\n filterIsPerson: isPersonObject(fv) || (Array.isArray(fv) && fv.some(isPersonObject)),\n filterPersonIds: PERSON_CAPABLE_OPS.has(c.op)\n ? (Array.isArray(fv) ? fv.map(personId) : [personId(fv)])\n : null,\n filterTextLower: TEXT_OPS.has(c.op) ? String(fv).toLowerCase() : null,\n filterTextLowerArr:\n (c.op === 'is' || c.op === 'is_not') && Array.isArray(fv) ? fv.map((v) => String(v).toLowerCase()) : null,\n filterDateMs:\n DATE_SINGLE_OPS.has(c.op) || ((c.op === 'is' || c.op === 'is_not') && c.datePrecision !== undefined)\n ? toDateMs(fv, c.datePrecision)\n : null,\n filterDateStart: isBetweenPair ? (fv[0] ? toDateMs(fv[0], c.datePrecision) : -Infinity) : null,\n filterDateEnd: isBetweenPair ? (fv[1] ? toDateMs(fv[1], c.datePrecision) : Infinity) : null,\n relRange: null,\n relDayKey: 0,\n }\n preparedCache.set(c, prepared)\n return prepared\n}\n\n/**\n * 整棵 FilterTree 對 row 求 boolean。\n * 配合 useReactTable `globalFilterFn`:\n *\n * const tree = useState<FilterTree>(createEmptyFilterTree('flat'))\n * useReactTable({\n * state: { globalFilter: tree },\n * onGlobalFilterChange: setTree,\n * globalFilterFn: (row, _, t: FilterTree) => evaluateTree(t, row.original),\n * getFilteredRowModel: getFilteredRowModel(),\n * })\n */\n// any-allow: row-generic — TanStack row.original 是 generic,filter eval 跨 type 必走 any\nexport function evaluateTree(tree: FilterTree, row: any): boolean {\n if (tree.children.length === 0) return true\n\n if (tree.mode === 'flat') {\n // null = 無 complete condition → pass-through(語意同原 completed.length === 0 分支)\n return evaluateConditionsJoined(tree.children, tree.conjunction, row) ?? true\n }\n\n // nested — group 沒任何 complete condition 的視為 pass-through(不參與 conjunction),\n // 語意同原 meaningful filter\n let sawMeaningful = false\n for (const g of tree.children) {\n const r = evaluateConditionsJoined(g.children, g.conjunction, row)\n if (r === null) continue\n sawMeaningful = true\n if (tree.conjunction === 'and') {\n if (!r) return false\n } else if (r) {\n return true\n }\n }\n if (!sawMeaningful) return true\n return tree.conjunction === 'and'\n}\n\n/** 一組 conditions 依 conjunction 求 boolean;null = 組內無 complete condition(pass-through)。\n * D3 perf:prepared.complete 取代原 per-row `children.filter(isConditionComplete)`\n * (registry 掃描 + filter/map 兩個中間陣列 alloc);and/or 短路 — 條件是 pure predicate\n * 無副作用,求值順序 / 省略不影響結果。 */\n// any-allow: row-generic\nfunction evaluateConditionsJoined(children: FilterCondition[], conjunction: Conjunction, row: any): boolean | null {\n let sawComplete = false\n for (const c of children) {\n const prepared = prepareCondition(c)\n if (!prepared.complete) continue\n sawComplete = true\n const matched = evaluateCondition(c, prepared, row)\n if (conjunction === 'and') {\n if (!matched) return false\n } else if (matched) {\n return true\n }\n }\n if (!sawComplete) return null\n return conjunction === 'and'\n}\n\n// any-allow: row-generic\nfunction evaluateCondition(cond: FilterCondition, prepared: PreparedCondition, row: any): boolean {\n if (!cond.field || !cond.op) return true\n const cellValue = row?.[cond.field]\n return matchOperator(cond.op, cellValue, cond.value, cond.datePrecision, prepared)\n}\n\n// PersonValue identity helper(2026-05-07):\n// person/multiPerson cell value 是 `{ name, avatarUrl?, description? }` 物件 — 比對時用 `name`\n// 當 stable id(PeoplePicker SSOT 沒有 id field,name 是唯一身分標識)。對齊 Notion / Linear /\n// Asana 的 person filter 比對 idiom(都用 name/email 當 id)。\nfunction personId(v: unknown): string {\n if (v && typeof v === 'object' && 'name' in v) return String((v as { name: unknown }).name ?? '')\n return String(v ?? '')\n}\nfunction isPersonObject(v: unknown): v is { name: string } {\n return !!v && typeof v === 'object' && 'name' in v\n}\n\n// Q6(2026-07-04):date 比對精度 helper — 'ms' 全精度;其餘(含 undefined)day 級\n// (本地時區 startOfDay 截斷,對齊 AG Grid / MUI X date 欄 midnight 慣例)。\n// D3 perf(2026-07-06):自 matchOperator 內 closure 提升 top-level — prepareCondition\n// (filterValue 側,每 condition 一次)與 matchOperator(cellValue 側,每 row)共用同一實作。\nfunction toDateMs(v: unknown, datePrecision?: 'day' | 'ms'): number {\n const d = new Date(String(v))\n if (Number.isNaN(d.getTime())) return NaN\n return datePrecision === 'ms' ? d.getTime() : startOfDay(d).getTime()\n}\n\n/** 本地日曆日 stamp(yyyymmdd)— is_relative 快取跨日失效判定(每 row 1 個 Date alloc,\n * 取代原 relativeKeyToRange 每 row 4-10 個 Date alloc + 區間重算) */\nfunction localDayKey(d: Date): number {\n return d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate()\n}\n\n// code-quality-allow: long-function — 13-operator switch dispatch table,table-driven 重構會把 op-specific guards 拆出反增 indirection\nfunction matchOperator(op: string, cellValue: unknown, filterValue: unknown, datePrecision?: 'day' | 'ms', prepared?: PreparedCondition): boolean {\n // 不需 value 的 op\n switch (op) {\n case 'is_set': return cellValue !== null && cellValue !== undefined && cellValue !== ''\n case 'is_not_set': return cellValue === null || cellValue === undefined || cellValue === ''\n case 'is_true': return cellValue === true\n case 'is_false': return cellValue === false\n }\n\n // 需 value 但 value 空 → 視為 incomplete,pass-through\n if (filterValue === null || filterValue === undefined || filterValue === '') return true\n if (Array.isArray(filterValue) && filterValue.length === 0) return true\n\n // Person-aware specialization(person_single / person_multi)— 物件透過 name 比對。\n // 偵測:cellValue 或 filterValue 任一是 Person object(或包 Person 的陣列)→ 走 personId path。\n // D3 perf:filterValue 側偵測 + id array 消費 prepared 快取(cellValue 側必然 per-row)。\n const cellIsPerson = isPersonObject(cellValue) || (Array.isArray(cellValue) && cellValue.some(isPersonObject))\n const filterIsPerson = prepared\n ? prepared.filterIsPerson\n : isPersonObject(filterValue) || (Array.isArray(filterValue) && filterValue.some(isPersonObject))\n if (cellIsPerson || filterIsPerson) {\n const cellIds = Array.isArray(cellValue) ? cellValue.map(personId) : [personId(cellValue)]\n const filterIds = prepared?.filterPersonIds ?? (Array.isArray(filterValue) ? filterValue.map(personId) : [personId(filterValue)])\n switch (op) {\n case 'is': return cellIds.length === 1 && filterIds.length >= 1 && filterIds.includes(cellIds[0])\n case 'is_not': return !(cellIds.length === 1 && filterIds.length >= 1 && filterIds.includes(cellIds[0]))\n case 'has_any_of': return cellIds.some((c) => filterIds.includes(c))\n case 'has_all_of': return filterIds.every((f) => cellIds.includes(f))\n case 'has_none_of':return !cellIds.some((c) => filterIds.includes(c))\n default: return true\n }\n }\n\n // (date 精度 helper 已提升為 top-level `toDateMs`;文字 ops 的 filterValue lowercase 消費\n // prepared 快取,prepared 缺席 = deprecated dataTableFilterMatch 路徑 inline fallback — D3 perf)\n\n switch (op) {\n case 'contains': return String(cellValue ?? '').toLowerCase().includes(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'does_not_contain': return !String(cellValue ?? '').toLowerCase().includes(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n // 2026-05-12 Round 6 fix(user 抓 Roadmap 進階篩選「全部」結果空)— impl-vs-spec drift。\n // Per `filter-operators.spec.md` L116「is 直接接受多值,不另設 is_any_of」+ L103-116\n // select(is/is_not + select_multi ValueShape OR 語意)+ L31-32(select.is / person.is 都走\n // select_multi / person_multi ValueShape)。原 impl 只做 single-value 比對,filterValue 是\n // array(全選 options)→ String(array)= \"v1,v2\" → 永遠 != single cellValue → 結果空。\n // Fix:加 array handling,走 OR 語意:any → match;is_not → every-not-match。\n case 'is':\n // Q6:date 欄位(datePrecision 有值)走日期比對非字串 — 「2026-06-01」與「2026-06-01 14:30」\n // 在 day 精度下相等(原字串小寫相等連同日不同格式都漏)\n if (datePrecision) {\n const a = toDateMs(cellValue, datePrecision)\n const b = prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision)\n return !Number.isNaN(a) && a === b\n }\n if (Array.isArray(filterValue)) {\n const cellLower = String(cellValue ?? '').toLowerCase()\n const filterLowers = prepared?.filterTextLowerArr ?? filterValue.map((v) => String(v).toLowerCase())\n return filterLowers.some((v) => cellLower === v)\n }\n return String(cellValue ?? '').toLowerCase() === (prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'is_not':\n if (datePrecision) {\n const a = toDateMs(cellValue, datePrecision)\n const b = prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision)\n return Number.isNaN(a) || a !== b\n }\n if (Array.isArray(filterValue)) {\n const cellLower = String(cellValue ?? '').toLowerCase()\n const filterLowers = prepared?.filterTextLowerArr ?? filterValue.map((v) => String(v).toLowerCase())\n return filterLowers.every((v) => cellLower !== v)\n }\n return String(cellValue ?? '').toLowerCase() !== (prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'starts_with': return String(cellValue ?? '').toLowerCase().startsWith(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n case 'ends_with': return String(cellValue ?? '').toLowerCase().endsWith(prepared?.filterTextLower ?? String(filterValue).toLowerCase())\n\n case 'equals': return Number(cellValue) === Number(filterValue)\n case 'not_equals': return Number(cellValue) !== Number(filterValue)\n case 'gt': return Number(cellValue) > Number(filterValue)\n case 'gte': return Number(cellValue) >= Number(filterValue)\n case 'lt': return Number(cellValue) < Number(filterValue)\n case 'lte': return Number(cellValue) <= Number(filterValue)\n\n case 'is_before': return toDateMs(cellValue, datePrecision) < (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_after': return toDateMs(cellValue, datePrecision) > (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_on_or_before': return toDateMs(cellValue, datePrecision) <= (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_on_or_after': return toDateMs(cellValue, datePrecision) >= (prepared?.filterDateMs ?? toDateMs(filterValue, datePrecision))\n case 'is_between': {\n if (!Array.isArray(filterValue) || filterValue.length !== 2) return true\n const cv = toDateMs(cellValue, datePrecision)\n const start = prepared?.filterDateStart ?? (filterValue[0] ? toDateMs(filterValue[0], datePrecision) : -Infinity)\n const end = prepared?.filterDateEnd ?? (filterValue[1] ? toDateMs(filterValue[1], datePrecision) : Infinity)\n return cv >= start && cv <= end\n }\n case 'is_relative': {\n // Phase D 完整實作 — relative key → time range → in-range test\n // D3 perf:relativeKeyToRange 所有輸出都是 calendar day 的純函數(today / this_week /\n // past_7_days… 全是日界),同日內恆定 → 以 localDayKey 判跨日,同日重用快取區間\n // (原每 row 重算 4-10 個 Date alloc)。\n let range: [number, number] | null\n if (prepared) {\n const now = new Date()\n const dayKey = localDayKey(now)\n if (prepared.relDayKey !== dayKey) {\n prepared.relRange = relativeKeyToRange(String(filterValue), now)\n prepared.relDayKey = dayKey\n }\n range = prepared.relRange\n } else {\n range = relativeKeyToRange(String(filterValue))\n }\n if (!range) return true // unknown key,pass-through\n const cv = new Date(String(cellValue)).getTime()\n if (Number.isNaN(cv)) return false // invalid cellValue → 不命中\n const [start, end] = range\n return cv >= start && cv <= end\n }\n\n case 'has_any_of': {\n if (!Array.isArray(filterValue)) return true\n if (Array.isArray(cellValue)) return cellValue.some((c) => filterValue.includes(c))\n return filterValue.includes(cellValue)\n }\n case 'has_all_of': {\n if (!Array.isArray(filterValue)) return true\n if (Array.isArray(cellValue)) return filterValue.every((v) => cellValue.includes(v))\n return false\n }\n case 'has_none_of': {\n if (!Array.isArray(filterValue)) return true\n if (Array.isArray(cellValue)) return !cellValue.some((c) => filterValue.includes(c))\n return !filterValue.includes(cellValue)\n }\n\n default: return true\n }\n}\n\n/**\n * @deprecated v0.x — old per-column filterFn integration。\n * 新版用 `evaluateTree` 配 TanStack `globalFilter`。\n * 保留為了過渡期 backward-compat,新 consumer 不要用。\n */\nexport function dataTableFilterMatch(cellValue: unknown, filterValue: unknown): boolean {\n if (typeof filterValue === 'object' && filterValue !== null && 'operator' in filterValue && 'value' in filterValue) {\n const fv = filterValue as { operator: string; value: unknown }\n return matchOperator(fv.operator, cellValue, fv.value)\n }\n return String(cellValue ?? '').toLowerCase().includes(String(filterValue ?? '').toLowerCase())\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DatePicker/date-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAwB,UAAU,EAAE,MAAM,8CAA8C,CAAA;
|
|
1
|
+
{"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DatePicker/date-picker.tsx"],"names":[],"mappings":"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"}
|