@godxjp/ui 19.0.0 → 19.2.0
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/README.md +25 -128
- package/dist/app/app-provider.d.ts +1 -1
- package/dist/app/app-provider.js +3 -0
- package/dist/app/theme-axes.d.ts +4 -15
- package/dist/app/timezones.d.ts +1 -4
- package/dist/components/charts/area-chart.d.ts +2 -3
- package/dist/components/charts/bar-chart.d.ts +2 -3
- package/dist/components/charts/chart-frame.d.ts +7 -16
- package/dist/components/charts/chart-summary.d.ts +2 -2
- package/dist/components/charts/compact-bar-trend.d.ts +9 -24
- package/dist/components/charts/index.d.ts +1 -6
- package/dist/components/data-display/badge.d.ts +2 -12
- package/dist/components/data-display/card.d.ts +21 -41
- package/dist/components/data-display/carousel.d.ts +1 -2
- package/dist/components/data-display/code-block.d.ts +4 -0
- package/dist/components/data-display/code-block.js +24 -0
- package/dist/components/data-display/data-table.d.ts +15 -37
- package/dist/components/data-display/data-table.js +1 -3
- package/dist/components/data-display/descriptions.d.ts +2 -6
- package/dist/components/data-display/descriptions.js +0 -2
- package/dist/components/data-display/index.d.ts +4 -0
- package/dist/components/data-display/index.js +4 -0
- package/dist/components/data-display/list-row.d.ts +3 -22
- package/dist/components/data-display/permission-matrix.d.ts +7 -20
- package/dist/components/data-display/progress.d.ts +1 -1
- package/dist/components/data-display/prose.d.ts +4 -0
- package/dist/components/data-display/prose.js +20 -0
- package/dist/components/data-display/service-launcher-card.d.ts +3 -10
- package/dist/components/data-display/table.d.ts +20 -80
- package/dist/components/data-display/table.js +0 -3
- package/dist/components/data-display/timeline.d.ts +3 -5
- package/dist/components/data-entry/branch-scope-picker.d.ts +2 -19
- package/dist/components/data-entry/branch-scope-picker.js +0 -1
- package/dist/components/data-entry/calendar.d.ts +3 -2
- package/dist/components/data-entry/calendar.js +58 -3
- package/dist/components/data-entry/cascader.js +3 -1
- package/dist/components/data-entry/checkbox-group.js +12 -5
- package/dist/components/data-entry/checkbox.js +30 -21
- package/dist/components/data-entry/command-palette.d.ts +8 -22
- package/dist/components/data-entry/date-picker.d.ts +4 -5
- package/dist/components/data-entry/date-picker.js +12 -3
- package/dist/components/data-entry/date-range-picker.d.ts +1 -1
- package/dist/components/data-entry/date-range-picker.js +17 -6
- package/dist/components/data-entry/form-errors.d.ts +7 -18
- package/dist/components/data-entry/form-field.d.ts +1 -1
- package/dist/components/data-entry/form-field.js +15 -6
- package/dist/components/data-entry/form.d.ts +1 -9
- package/dist/components/data-entry/input.d.ts +16 -14
- package/dist/components/data-entry/input.js +13 -3
- package/dist/components/data-entry/month-picker.js +6 -4
- package/dist/components/data-entry/month-range-picker.d.ts +4 -6
- package/dist/components/data-entry/month-range-picker.js +11 -5
- package/dist/components/data-entry/number-input.d.ts +1 -5
- package/dist/components/data-entry/number-input.js +1 -0
- package/dist/components/data-entry/radio.js +19 -6
- package/dist/components/data-entry/search-select.d.ts +3 -5
- package/dist/components/data-entry/search-select.js +8 -2
- package/dist/components/data-entry/select.d.ts +15 -2
- package/dist/components/data-entry/select.js +57 -10
- package/dist/components/data-entry/switch.js +9 -2
- package/dist/components/data-entry/textarea.d.ts +10 -16
- package/dist/components/data-entry/textarea.js +8 -1
- package/dist/components/data-entry/time-picker.d.ts +3 -5
- package/dist/components/data-entry/tree-select.js +3 -1
- package/dist/components/data-entry/upload-types.d.ts +1 -5
- package/dist/components/data-entry/use-upload-draft.d.ts +0 -4
- package/dist/components/feedback/dialog.d.ts +6 -15
- package/dist/components/feedback/overlay-header-tone.d.ts +1 -1
- package/dist/components/feedback/sheet.d.ts +3 -10
- package/dist/components/feedback/sheet.js +1 -1
- package/dist/components/feedback/sonner.js +2 -3
- package/dist/components/general/activity.d.ts +4 -30
- package/dist/components/general/button.js +1 -10
- package/dist/components/general/logo.d.ts +6 -28
- package/dist/components/general/reveal.d.ts +3 -9
- package/dist/components/general/typography.d.ts +1 -3
- package/dist/components/layout/account-chip.d.ts +8 -0
- package/dist/components/layout/account-chip.js +45 -0
- package/dist/components/layout/auth-divider.d.ts +2 -9
- package/dist/components/layout/auth-shell.d.ts +1 -14
- package/dist/components/layout/breadcrumb.d.ts +1 -5
- package/dist/components/layout/centered-shell.d.ts +4 -18
- package/dist/components/layout/error-surface.d.ts +11 -28
- package/dist/components/layout/error-surface.js +4 -1
- package/dist/components/layout/index.d.ts +2 -0
- package/dist/components/layout/index.js +2 -0
- package/dist/components/layout/legal-document-shell.d.ts +5 -28
- package/dist/components/layout/master-detail.d.ts +2 -18
- package/dist/components/layout/page-container.js +0 -1
- package/dist/components/layout/responsive-grid.d.ts +6 -1
- package/dist/components/layout/responsive-grid.js +9 -2
- package/dist/components/layout/service-role-panel.d.ts +7 -19
- package/dist/components/layout/sidebar.d.ts +5 -27
- package/dist/components/layout/sidebar.js +0 -1
- package/dist/components/layout/split-pane.d.ts +0 -7
- package/dist/components/layout/topbar.d.ts +1 -14
- package/dist/components/navigation/app-setting-picker.js +1 -3
- package/dist/components/navigation/filter-bar.d.ts +1 -6
- package/dist/components/navigation/pagination-utils.d.ts +2 -12
- package/dist/components/navigation/tabs-scroll.d.ts +2 -36
- package/dist/components/navigation/tabs.js +4 -8
- package/dist/components/query/data-state.d.ts +2 -2
- package/dist/components/ui/credential-reveal.d.ts +1 -4
- package/dist/components/ui/hover-card.d.ts +1 -2
- package/dist/components/ui/separator.d.ts +2 -15
- package/dist/components/ui/toggle-group.d.ts +1 -5
- package/dist/components/ui/toggle.d.ts +6 -31
- package/dist/email/brand-mark.d.ts +6 -34
- package/dist/email/color.d.ts +7 -17
- package/dist/email/geometry.d.ts +4 -8
- package/dist/email/index.d.ts +4 -48
- package/dist/email/inline-style.d.ts +3 -9
- package/dist/email/urgency.d.ts +2 -7
- package/dist/form/form-context.d.ts +2 -5
- package/dist/form/form-root.d.ts +1 -2
- package/dist/i18n/messages/en.json +4 -0
- package/dist/i18n/messages/ja.json +4 -0
- package/dist/i18n/messages/vi.json +4 -0
- package/dist/inertia/index.d.ts +2 -10
- package/dist/lib/control-styles.d.ts +10 -21
- package/dist/lib/control-styles.js +4 -6
- package/dist/lib/datetime/format-date.d.ts +1 -4
- package/dist/lib/field-a11y.d.ts +31 -36
- package/dist/lib/field-a11y.js +16 -2
- package/dist/lib/format.d.ts +4 -8
- package/dist/lib/hooks.d.ts +6 -12
- package/dist/lib/permission-grid.d.ts +3 -18
- package/dist/lib/query-error.d.ts +3 -3
- package/dist/props/components/app.prop.d.ts +19 -27
- package/dist/props/components/charts.prop.d.ts +2 -3
- package/dist/props/components/data-display.prop.d.ts +48 -72
- package/dist/props/components/data-entry.prop.d.ts +41 -30
- package/dist/props/components/form.prop.d.ts +2 -6
- package/dist/props/components/general.prop.d.ts +11 -27
- package/dist/props/components/layout.prop.d.ts +89 -260
- package/dist/props/components/navigation.prop.d.ts +27 -42
- package/dist/props/registry.d.ts +31 -0
- package/dist/props/registry.js +33 -0
- package/dist/props/vocabulary/data.prop.d.ts +18 -49
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/interaction.prop.d.ts +10 -12
- package/dist/props/vocabulary/layout.prop.d.ts +8 -30
- package/dist/props/vocabulary/shared.prop.d.ts +3 -2
- package/dist/styles/alert-layout.css +1 -32
- package/dist/styles/badge-layout.css +4 -18
- package/dist/styles/base.css +14 -113
- package/dist/styles/card-layout.css +6 -128
- package/dist/styles/chart-layout.css +2 -17
- package/dist/styles/control.css +380 -458
- package/dist/styles/core.css +21 -0
- package/dist/styles/data-display-layout.css +175 -94
- package/dist/styles/data-entry-layout.css +0 -45
- package/dist/styles/density.css +1 -30
- package/dist/styles/dialog-layout.css +5 -69
- package/dist/styles/focus-ring.css +13 -87
- package/dist/styles/fonts.css +1 -31
- package/dist/styles/form-layout.css +7 -91
- package/dist/styles/index.css +2 -20
- package/dist/styles/layout.css +38 -456
- package/dist/styles/logo-layout.css +1 -35
- package/dist/styles/motion.css +3 -42
- package/dist/styles/navigation-layout.css +3 -50
- package/dist/styles/shell-layout.css +37 -403
- package/dist/styles/table-layout.css +16 -274
- package/dist/styles/text-layout.css +7 -21
- package/dist/styles/toggle.css +1 -23
- package/dist/theme/dxs.canonical.css +1 -55
- package/dist/theme/example.service.css +1 -26
- package/dist/theme/famgia.service.css +5 -15
- package/dist/tokens/axes.css +3 -40
- package/dist/tokens/base.css +1 -4
- package/dist/tokens/components/activity.css +6 -42
- package/dist/tokens/components/badge.css +4 -13
- package/dist/tokens/components/banner.css +4 -9
- package/dist/tokens/components/card.css +32 -88
- package/dist/tokens/components/chart.css +9 -26
- package/dist/tokens/components/control.css +37 -222
- package/dist/tokens/components/data-display.css +28 -79
- package/dist/tokens/components/data-entry.css +5 -19
- package/dist/tokens/components/descriptions.css +7 -27
- package/dist/tokens/components/email.css +38 -84
- package/dist/tokens/components/error-surface.css +2 -18
- package/dist/tokens/components/feedback.css +27 -124
- package/dist/tokens/components/form.css +13 -45
- package/dist/tokens/components/legal-document.css +16 -41
- package/dist/tokens/components/list-row.css +11 -36
- package/dist/tokens/components/logo.css +2 -57
- package/dist/tokens/components/navigation.css +16 -94
- package/dist/tokens/components/scroll-area.css +2 -18
- package/dist/tokens/components/separator.css +8 -30
- package/dist/tokens/components/sheet.css +3 -14
- package/dist/tokens/components/shell.css +53 -307
- package/dist/tokens/components/sidebar.css +5 -22
- package/dist/tokens/components/table.css +19 -140
- package/dist/tokens/components/toggle.css +3 -65
- package/dist/tokens/components/upload.css +7 -43
- package/dist/tokens/foundation.css +108 -383
- package/dist/tokens/semantic/layout.css +33 -207
- package/docs/CANONICAL-CONTRACTS.md +206 -0
- package/docs/COMPONENTS.md +157 -0
- package/docs/COMPOSITION-VS-COMPONENT.md +105 -0
- package/docs/CONSUMER-RULES.md +14 -0
- package/docs/CUSTOMER-THEMING.md +162 -0
- package/docs/DATETIME.md +69 -0
- package/docs/DEVELOPMENT.md +173 -0
- package/docs/FORMS.md +143 -0
- package/docs/FRAME-A11Y-CI.md +267 -0
- package/docs/FRAME-COVERAGE-LEDGER.md +123 -0
- package/docs/FRAME-COVERAGE-REPORT.md +140 -0
- package/docs/FRAME-COVERAGE-STANDARD.md +65 -0
- package/docs/FRAME-COVERAGE.md +29 -0
- package/docs/PROPS-REGISTRY.md +61 -0
- package/docs/PROPS-VOCABULARY.md +100 -0
- package/docs/README.md +60 -0
- package/docs/REGISTRY.md +70 -0
- package/docs/SPACING.md +56 -0
- package/docs/STANDARDS-vocabulary-tokens.md +48 -0
- package/docs/TESTING.md +98 -0
- package/docs/TOKENS.md +347 -0
- package/docs/asset-modules.d.ts +46 -0
- package/docs/assets/cover-terrain.svg +6 -0
- package/docs/assets/portrait-amber.svg +5 -0
- package/docs/assets/portrait-clay.svg +5 -0
- package/docs/assets/portrait-indigo.svg +5 -0
- package/docs/assets/portrait-iris.svg +5 -0
- package/docs/assets/portrait-moss.svg +5 -0
- package/docs/assets/portrait-plum.svg +5 -0
- package/docs/assets/portrait-slate.svg +5 -0
- package/docs/charts/compact-bar-trend.tsx +328 -0
- package/docs/charts/size-tiers.tsx +192 -0
- package/docs/data-display/accordion.tsx +99 -0
- package/docs/data-display/avatar.tsx +355 -0
- package/docs/data-display/badge.tsx +247 -0
- package/docs/data-display/card/examples/detail-panel.tsx +106 -0
- package/docs/data-display/card/index.md +3 -0
- package/docs/data-display/card/index.tsx +285 -0
- package/docs/data-display/carousel.tsx +156 -0
- package/docs/data-display/charts.tsx +198 -0
- package/docs/data-display/code-block.tsx +90 -0
- package/docs/data-display/collapsible.tsx +162 -0
- package/docs/data-display/credential-reveal.tsx +145 -0
- package/docs/data-display/data-table/examples/approval-queue.tsx +212 -0
- package/docs/data-display/data-table/examples/grid-features.tsx +158 -0
- package/docs/data-display/data-table/examples/list-page.tsx +175 -0
- package/docs/data-display/data-table/index.md +5 -0
- package/docs/data-display/data-table/index.tsx +295 -0
- package/docs/data-display/descriptions.tsx +143 -0
- package/docs/data-display/empty-state.tsx +164 -0
- package/docs/data-display/hover-card.tsx +181 -0
- package/docs/data-display/list-row.tsx +420 -0
- package/docs/data-display/permission-matrix.tsx +184 -0
- package/docs/data-display/popover-touch.tsx +27 -0
- package/docs/data-display/popover.tsx +245 -0
- package/docs/data-display/progress.tsx +84 -0
- package/docs/data-display/prose.tsx +105 -0
- package/docs/data-display/qr-code.tsx +68 -0
- package/docs/data-display/scroll-area.tsx +271 -0
- package/docs/data-display/service-launcher-card.tsx +145 -0
- package/docs/data-display/stat-card.tsx +99 -0
- package/docs/data-display/table.tsx +251 -0
- package/docs/data-display/timeline.tsx +112 -0
- package/docs/data-display/touch-actions.tsx +36 -0
- package/docs/data-display/tree-list.tsx +107 -0
- package/docs/data-entry/branch-scope-picker.tsx +123 -0
- package/docs/data-entry/calendar.tsx +180 -0
- package/docs/data-entry/cascader.tsx +378 -0
- package/docs/data-entry/checkbox.tsx +256 -0
- package/docs/data-entry/color-picker.tsx +117 -0
- package/docs/data-entry/command-palette.tsx +179 -0
- package/docs/data-entry/command.tsx +262 -0
- package/docs/data-entry/country-picker-recipe.tsx +170 -0
- package/docs/data-entry/date-picker.tsx +191 -0
- package/docs/data-entry/date-range-picker.tsx +149 -0
- package/docs/data-entry/form/examples/employee-settings.tsx +267 -0
- package/docs/data-entry/form/examples/invoice-form.tsx +387 -0
- package/docs/data-entry/form-field/examples/a11y-contract.tsx +240 -0
- package/docs/data-entry/form-field/examples/create-form.tsx +105 -0
- package/docs/data-entry/form-field/index.md +8 -0
- package/docs/data-entry/form-field/index.tsx +326 -0
- package/docs/data-entry/form-inertia.tsx +80 -0
- package/docs/data-entry/form-root.tsx +102 -0
- package/docs/data-entry/form.tsx +724 -0
- package/docs/data-entry/input-otp.tsx +231 -0
- package/docs/data-entry/input.tsx +114 -0
- package/docs/data-entry/label.tsx +100 -0
- package/docs/data-entry/month-picker.tsx +101 -0
- package/docs/data-entry/month-range-picker.tsx +115 -0
- package/docs/data-entry/number-input.tsx +240 -0
- package/docs/data-entry/password-input.tsx +106 -0
- package/docs/data-entry/password-strength.tsx +97 -0
- package/docs/data-entry/radio-group.tsx +95 -0
- package/docs/data-entry/rating.tsx +87 -0
- package/docs/data-entry/search-input.tsx +120 -0
- package/docs/data-entry/select-async-contracts.tsx +108 -0
- package/docs/data-entry/select-matrix.tsx +204 -0
- package/docs/data-entry/select.tsx +369 -0
- package/docs/data-entry/slider.tsx +130 -0
- package/docs/data-entry/switch.tsx +67 -0
- package/docs/data-entry/tag-input.tsx +108 -0
- package/docs/data-entry/textarea.tsx +209 -0
- package/docs/data-entry/time-picker.tsx +99 -0
- package/docs/data-entry/toggle-count.tsx +293 -0
- package/docs/data-entry/toggle-group.tsx +225 -0
- package/docs/data-entry/toggle.tsx +127 -0
- package/docs/data-entry/transfer.tsx +97 -0
- package/docs/data-entry/tree-select.tsx +204 -0
- package/docs/data-entry/upload.tsx +184 -0
- package/docs/feedback/alert-dialog.tsx +270 -0
- package/docs/feedback/alert.tsx +248 -0
- package/docs/feedback/banner.tsx +183 -0
- package/docs/feedback/danger-confirm.tsx +88 -0
- package/docs/feedback/dialog-touch.tsx +24 -0
- package/docs/feedback/dialog.tsx +193 -0
- package/docs/feedback/sheet.tsx +410 -0
- package/docs/feedback/skeleton.tsx +111 -0
- package/docs/feedback/toast.tsx +135 -0
- package/docs/feedback/tooltip.tsx +171 -0
- package/docs/feedback/two-factor-setup.tsx +68 -0
- package/docs/foundation/_email-specimen.ts +274 -0
- package/docs/foundation/colors.tsx +202 -0
- package/docs/foundation/density.tsx +232 -0
- package/docs/foundation/email-tokens.tsx +306 -0
- package/docs/foundation/radius-shadow.tsx +152 -0
- package/docs/foundation/spacing.tsx +211 -0
- package/docs/foundation/typography.tsx +147 -0
- package/docs/general/activity.tsx +224 -0
- package/docs/general/button/examples/destructive-confirm.tsx +90 -0
- package/docs/general/button/examples/form-actions.tsx +85 -0
- package/docs/general/button/examples/toolbar.tsx +160 -0
- package/docs/general/button/index.md +12 -0
- package/docs/general/button/index.tsx +211 -0
- package/docs/general/logo.tsx +131 -0
- package/docs/general/reveal.tsx +41 -0
- package/docs/general/typography.tsx +152 -0
- package/docs/layout/account-chip.tsx +72 -0
- package/docs/layout/admin-collection.tsx +122 -0
- package/docs/layout/app-shell.tsx +374 -0
- package/docs/layout/aspect-ratio.tsx +119 -0
- package/docs/layout/auth-account-summary.tsx +103 -0
- package/docs/layout/auth-divider.tsx +28 -0
- package/docs/layout/auth-footer.tsx +37 -0
- package/docs/layout/auth-identity.tsx +36 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.md +41 -0
- package/docs/layout/auth-recovery/examples/mfa-challenge.tsx +254 -0
- package/docs/layout/auth-recovery/examples/mobile-390.md +25 -0
- package/docs/layout/auth-recovery/examples/mobile-390.tsx +82 -0
- package/docs/layout/auth-recovery/examples/password-recovery.md +24 -0
- package/docs/layout/auth-recovery/examples/password-recovery.tsx +197 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.md +27 -0
- package/docs/layout/auth-recovery/examples/wrapping-ja-en-vi.tsx +156 -0
- package/docs/layout/auth-recovery/index.md +140 -0
- package/docs/layout/auth-recovery/index.tsx +96 -0
- package/docs/layout/auth-shell-context.tsx +103 -0
- package/docs/layout/auth-shell-device.tsx +112 -0
- package/docs/layout/auth-shell-registration.tsx +335 -0
- package/docs/layout/auth-shell-variants.tsx +139 -0
- package/docs/layout/auth-shell.tsx +59 -0
- package/docs/layout/auth-stack.tsx +40 -0
- package/docs/layout/centered-shell.tsx +102 -0
- package/docs/layout/error-surface/examples/application-403.tsx +84 -0
- package/docs/layout/error-surface/examples/application-404.tsx +77 -0
- package/docs/layout/error-surface/examples/system-500.tsx +47 -0
- package/docs/layout/error-surface/examples/system-503.tsx +48 -0
- package/docs/layout/error-surface/index.md +153 -0
- package/docs/layout/error-surface/index.tsx +239 -0
- package/docs/layout/flex.tsx +262 -0
- package/docs/layout/legal-document-shell/_data.ts +110 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.md +12 -0
- package/docs/layout/legal-document-shell/examples/desktop-1440.tsx +83 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.md +22 -0
- package/docs/layout/legal-document-shell/examples/mobile-390.tsx +70 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.md +3 -0
- package/docs/layout/legal-document-shell/examples/tablet-1024.tsx +84 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.md +18 -0
- package/docs/layout/legal-document-shell/examples/wrapping-ja-en-vi.tsx +61 -0
- package/docs/layout/legal-document-shell/index.md +51 -0
- package/docs/layout/legal-document-shell/index.tsx +101 -0
- package/docs/layout/master-detail.tsx +387 -0
- package/docs/layout/org-switcher.tsx +131 -0
- package/docs/layout/page-container.tsx +946 -0
- package/docs/layout/resizable-panel.tsx +419 -0
- package/docs/layout/responsive-grid.tsx +235 -0
- package/docs/layout/separator.tsx +327 -0
- package/docs/layout/service-role-panel.tsx +144 -0
- package/docs/layout/sidebar.tsx +586 -0
- package/docs/layout/split-pane.tsx +451 -0
- package/docs/layout/topbar.tsx +347 -0
- package/docs/navigation/app-setting-picker.tsx +141 -0
- package/docs/navigation/breadcrumb.tsx +128 -0
- package/docs/navigation/context-menu.tsx +117 -0
- package/docs/navigation/dropdown-menu.tsx +213 -0
- package/docs/navigation/filter-bar.tsx +227 -0
- package/docs/navigation/menubar.tsx +141 -0
- package/docs/navigation/navigation-menu.tsx +165 -0
- package/docs/navigation/pagination.tsx +241 -0
- package/docs/navigation/steps.tsx +263 -0
- package/docs/navigation/tabs-rtl.tsx +28 -0
- package/docs/navigation/tabs.tsx +308 -0
- package/docs/navigation/toolbar.tsx +339 -0
- package/docs/providers/app-provider.tsx +191 -0
- package/docs/providers/format-date.tsx +230 -0
- package/docs/query/button-refetch.tsx +160 -0
- package/docs/query/data-state.tsx +192 -0
- package/docs/query/infinite-query-state.tsx +93 -0
- package/docs/query/mutation-feedback.tsx +70 -0
- package/docs/query/prefetch-link.tsx +262 -0
- package/docs/query/touch-actions.tsx +68 -0
- package/docs/showcase/acme-portal.tsx +441 -0
- package/docs/showcase/acme-website.tsx +455 -0
- package/docs/showcase/case1-warehouse-dashboard.tsx +343 -0
- package/docs/showcase/case2-employee-me.tsx +441 -0
- package/docs/showcase/case3-approval-workflow.tsx +527 -0
- package/docs/showcase/case4-login.tsx +307 -0
- package/docs/showcase/case5-shift-calendar.tsx +795 -0
- package/docs/showcase/case6-agency-handy.tsx +1072 -0
- package/docs/showcase/futurelastic-web.tsx +390 -0
- package/docs/showcase/org-switcher.tsx +313 -0
- package/docs/showcase/permission-matrix.tsx +343 -0
- package/docs/showcase/public-landing.tsx +210 -0
- package/docs/showcase/settings-account-sections.tsx +559 -0
- package/docs/showcase/settings-security-mfa.tsx +145 -0
- package/docs/showcase/table-approval-queue.tsx +199 -0
- package/docs/showcase/table-bulk-actions.tsx +460 -0
- package/docs/showcase/table-compact-kintone.tsx +438 -0
- package/docs/showcase/table-conditional-format.tsx +367 -0
- package/docs/showcase/table-crud-list.tsx +544 -0
- package/docs/showcase/table-density.tsx +340 -0
- package/docs/showcase/table-expandable-rows.tsx +471 -0
- package/docs/showcase/table-filter-chips.tsx +461 -0
- package/docs/showcase/table-footer-totals.tsx +311 -0
- package/docs/showcase/table-grouped-subtotals.tsx +388 -0
- package/docs/showcase/table-master-detail.tsx +479 -0
- package/docs/showcase/table-pagination.tsx +320 -0
- package/docs/showcase/table-states.tsx +363 -0
- package/docs/showcase/table-sticky-columns.tsx +373 -0
- package/docs/showcase/table-tree-rows.tsx +444 -0
- package/docs/showcase/table-view-tabs.tsx +488 -0
- package/package.json +10 -11
- package/scripts/_agent-setup.mjs +16 -2
- package/scripts/audit-hook.mjs +3 -13
- package/scripts/init-agent-kit.mjs +1 -14
- package/scripts/postinstall.mjs +12 -12
- package/scripts/ui-audit.mjs +93 -31
- package/scripts/visual-audit-rules.mjs +51 -7
- package/scripts/visual-audit.mjs +118 -47
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Showcase · table-view-tabs — 保存ビュー (V7)
|
|
3
|
+
*
|
|
4
|
+
* Saved-view ribbon over a 勤怠 (attendance) DataTable. Each saved view is a tab
|
|
5
|
+
* with a colored signal dot + a count pill. Switching the active view swaps
|
|
6
|
+
* the DataTable PRESET: it re-filters the rows AND changes which columns are
|
|
7
|
+
* shown (e.g. the 「要承認」 view surfaces an 申請者/申請時刻 column the default
|
|
8
|
+
* 「全件」 view hides, while 「遅刻・早退」 surfaces a 差異(分) column).
|
|
9
|
+
*
|
|
10
|
+
* Composition map (intent → real @godxjp/ui primitive):
|
|
11
|
+
* page chrome ............ PageContainer (title + subtitle + extra actions)
|
|
12
|
+
* saved-view ribbon ...... Tabs (controlled) + TabsList + TabsTrigger
|
|
13
|
+
* each trigger = colored dot (Badge tone, dot) + label + count pill
|
|
14
|
+
* the grid ............... DataTable (per-view columns + filtered data)
|
|
15
|
+
* status cells ........... Badge tone (fixed signaling) / Badge status
|
|
16
|
+
* bulk + density ......... DataTable.Toolbar / BulkActions / DensityToggle
|
|
17
|
+
* pager .................. DataTable.Pagination
|
|
18
|
+
*
|
|
19
|
+
* DNA: compact density, tabular-nums on time/number columns, fixed color
|
|
20
|
+
* signaling (success 若竹 / warning 山吹 / attention→destructive / info 群青),
|
|
21
|
+
* small headings, quiet JP copy, no emoji.
|
|
22
|
+
*/
|
|
23
|
+
import * as React from "react";
|
|
24
|
+
import { Download, RefreshCw, Check, X } from "lucide-react";
|
|
25
|
+
|
|
26
|
+
import { Button, Text } from "@godxjp/ui/general";
|
|
27
|
+
import { Badge, Card, CardContent, DataTable, type ColumnDef } from "@godxjp/ui/data-display";
|
|
28
|
+
import { Tabs, TabsList, TabsTrigger } from "@godxjp/ui/navigation";
|
|
29
|
+
import { Flex, PageContainer } from "@godxjp/ui/layout";
|
|
30
|
+
import type { SortStateProp } from "@godxjp/ui/props";
|
|
31
|
+
|
|
32
|
+
// ── Domain model ──────────────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
type AttendanceStatus = "approved" | "pending" | "late" | "early" | "absent";
|
|
35
|
+
|
|
36
|
+
type Attendance = {
|
|
37
|
+
id: string;
|
|
38
|
+
date: string; // MM/DD (火)
|
|
39
|
+
employee: string;
|
|
40
|
+
dept: string;
|
|
41
|
+
clockIn: string; // HH:mm or "—"
|
|
42
|
+
clockOut: string; // HH:mm or "—"
|
|
43
|
+
workMin: number; // 実働(分)
|
|
44
|
+
status: AttendanceStatus;
|
|
45
|
+
applicant: string; // 申請者 (承認待ちのみ)
|
|
46
|
+
appliedAt: string; // 申請時刻
|
|
47
|
+
varianceMin: number; // 遅刻/早退の差異(分) — 遅刻=+, 早退=-
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// 状態 → Badge tone (fixed-mapping, never remap).
|
|
51
|
+
const STATUS_LABEL: Record<AttendanceStatus, string> = {
|
|
52
|
+
approved: "承認済",
|
|
53
|
+
pending: "承認待ち",
|
|
54
|
+
late: "遅刻",
|
|
55
|
+
early: "早退",
|
|
56
|
+
absent: "欠勤",
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const STATUS_TONE: Record<AttendanceStatus, "success" | "warning" | "destructive" | "info"> = {
|
|
60
|
+
approved: "success", // 若竹
|
|
61
|
+
pending: "warning", // 山吹
|
|
62
|
+
late: "destructive", // 朱(注意) — 非破壊だが要対応
|
|
63
|
+
early: "info", // 群青
|
|
64
|
+
absent: "destructive", // 茜
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// ── Mock 勤怠 data (Saitama 倉庫部 / 配送部 / 事務部) ─────────────────────────────
|
|
68
|
+
|
|
69
|
+
const RECORDS: Attendance[] = [
|
|
70
|
+
{
|
|
71
|
+
id: "ATT-0512",
|
|
72
|
+
date: "06/03 (火)",
|
|
73
|
+
employee: "佐藤 真琴",
|
|
74
|
+
dept: "倉庫部",
|
|
75
|
+
clockIn: "08:58",
|
|
76
|
+
clockOut: "18:02",
|
|
77
|
+
workMin: 484,
|
|
78
|
+
status: "approved",
|
|
79
|
+
applicant: "—",
|
|
80
|
+
appliedAt: "—",
|
|
81
|
+
varianceMin: 0,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "ATT-0511",
|
|
85
|
+
date: "06/03 (火)",
|
|
86
|
+
employee: "鈴木 大輔",
|
|
87
|
+
dept: "配送部",
|
|
88
|
+
clockIn: "09:14",
|
|
89
|
+
clockOut: "18:05",
|
|
90
|
+
workMin: 471,
|
|
91
|
+
status: "late",
|
|
92
|
+
applicant: "—",
|
|
93
|
+
appliedAt: "—",
|
|
94
|
+
varianceMin: 14,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "ATT-0510",
|
|
98
|
+
date: "06/03 (火)",
|
|
99
|
+
employee: "高橋 恵",
|
|
100
|
+
dept: "事務部",
|
|
101
|
+
clockIn: "09:00",
|
|
102
|
+
clockOut: "16:40",
|
|
103
|
+
workMin: 400,
|
|
104
|
+
status: "early",
|
|
105
|
+
applicant: "—",
|
|
106
|
+
appliedAt: "—",
|
|
107
|
+
varianceMin: -80,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "ATT-0509",
|
|
111
|
+
date: "06/03 (火)",
|
|
112
|
+
employee: "田中 涼介",
|
|
113
|
+
dept: "倉庫部",
|
|
114
|
+
clockIn: "08:55",
|
|
115
|
+
clockOut: "—",
|
|
116
|
+
workMin: 0,
|
|
117
|
+
status: "pending",
|
|
118
|
+
applicant: "田中 涼介",
|
|
119
|
+
appliedAt: "06/03 18:21",
|
|
120
|
+
varianceMin: 0,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: "ATT-0508",
|
|
124
|
+
date: "06/03 (火)",
|
|
125
|
+
employee: "伊藤 美咲",
|
|
126
|
+
dept: "配送部",
|
|
127
|
+
clockIn: "—",
|
|
128
|
+
clockOut: "—",
|
|
129
|
+
workMin: 0,
|
|
130
|
+
status: "absent",
|
|
131
|
+
applicant: "—",
|
|
132
|
+
appliedAt: "—",
|
|
133
|
+
varianceMin: 0,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: "ATT-0507",
|
|
137
|
+
date: "06/02 (月)",
|
|
138
|
+
employee: "渡辺 健",
|
|
139
|
+
dept: "事務部",
|
|
140
|
+
clockIn: "09:02",
|
|
141
|
+
clockOut: "18:00",
|
|
142
|
+
workMin: 478,
|
|
143
|
+
status: "pending",
|
|
144
|
+
applicant: "渡辺 健",
|
|
145
|
+
appliedAt: "06/02 18:33",
|
|
146
|
+
varianceMin: 0,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: "ATT-0506",
|
|
150
|
+
date: "06/02 (月)",
|
|
151
|
+
employee: "山本 千尋",
|
|
152
|
+
dept: "倉庫部",
|
|
153
|
+
clockIn: "09:21",
|
|
154
|
+
clockOut: "18:10",
|
|
155
|
+
workMin: 469,
|
|
156
|
+
status: "late",
|
|
157
|
+
applicant: "—",
|
|
158
|
+
appliedAt: "—",
|
|
159
|
+
varianceMin: 21,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: "ATT-0505",
|
|
163
|
+
date: "06/02 (月)",
|
|
164
|
+
employee: "中村 蓮",
|
|
165
|
+
dept: "配送部",
|
|
166
|
+
clockIn: "08:50",
|
|
167
|
+
clockOut: "17:20",
|
|
168
|
+
workMin: 450,
|
|
169
|
+
status: "early",
|
|
170
|
+
applicant: "—",
|
|
171
|
+
appliedAt: "—",
|
|
172
|
+
varianceMin: -40,
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: "ATT-0504",
|
|
176
|
+
date: "06/02 (月)",
|
|
177
|
+
employee: "小林 葵",
|
|
178
|
+
dept: "事務部",
|
|
179
|
+
clockIn: "08:57",
|
|
180
|
+
clockOut: "18:01",
|
|
181
|
+
workMin: 484,
|
|
182
|
+
status: "approved",
|
|
183
|
+
applicant: "—",
|
|
184
|
+
appliedAt: "—",
|
|
185
|
+
varianceMin: 0,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: "ATT-0503",
|
|
189
|
+
date: "06/02 (月)",
|
|
190
|
+
employee: "加藤 直樹",
|
|
191
|
+
dept: "倉庫部",
|
|
192
|
+
clockIn: "09:05",
|
|
193
|
+
clockOut: "—",
|
|
194
|
+
workMin: 0,
|
|
195
|
+
status: "pending",
|
|
196
|
+
applicant: "加藤 直樹",
|
|
197
|
+
appliedAt: "06/02 19:02",
|
|
198
|
+
varianceMin: 0,
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
// 実働(分) → 8:04 形式
|
|
203
|
+
const hm = (min: number) => {
|
|
204
|
+
if (min <= 0) return "—";
|
|
205
|
+
const h = Math.floor(min / 60);
|
|
206
|
+
const m = min % 60;
|
|
207
|
+
return `${h}:${String(m).padStart(2, "0")}`;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// ── Reusable column fragments ───────────────────────────────────────────────────
|
|
211
|
+
|
|
212
|
+
const statusCell: ColumnDef<Attendance> = {
|
|
213
|
+
key: "status",
|
|
214
|
+
header: "状態",
|
|
215
|
+
align: "center",
|
|
216
|
+
render: (row) => (
|
|
217
|
+
<Badge tone={STATUS_TONE[row.status]} variant="outline">
|
|
218
|
+
{STATUS_LABEL[row.status]}
|
|
219
|
+
</Badge>
|
|
220
|
+
),
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const employeeCol: ColumnDef<Attendance> = {
|
|
224
|
+
key: "employee",
|
|
225
|
+
header: "従業員",
|
|
226
|
+
sortable: true,
|
|
227
|
+
render: (row) => (
|
|
228
|
+
<Flex direction="col" gap="xs">
|
|
229
|
+
<Text size="sm" weight="medium">
|
|
230
|
+
{row.employee}
|
|
231
|
+
</Text>
|
|
232
|
+
<Text size="2xs" tone="muted">
|
|
233
|
+
{row.dept}
|
|
234
|
+
</Text>
|
|
235
|
+
</Flex>
|
|
236
|
+
),
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
const dateCol: ColumnDef<Attendance> = {
|
|
240
|
+
key: "date",
|
|
241
|
+
header: "日付",
|
|
242
|
+
width: "w-28",
|
|
243
|
+
sortable: true,
|
|
244
|
+
render: (row) => <Text tabular>{row.date}</Text>,
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const idCol: ColumnDef<Attendance> = {
|
|
248
|
+
key: "id",
|
|
249
|
+
header: "勤怠ID",
|
|
250
|
+
width: "w-28",
|
|
251
|
+
hiddenOnMobile: true,
|
|
252
|
+
render: (row) => (
|
|
253
|
+
<Text size="xs" mono tabular>
|
|
254
|
+
{row.id}
|
|
255
|
+
</Text>
|
|
256
|
+
),
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const clockCols: ColumnDef<Attendance>[] = [
|
|
260
|
+
{
|
|
261
|
+
key: "clockIn",
|
|
262
|
+
header: "出勤",
|
|
263
|
+
align: "right",
|
|
264
|
+
render: (row) => <Text tabular>{row.clockIn}</Text>,
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
key: "clockOut",
|
|
268
|
+
header: "退勤",
|
|
269
|
+
align: "right",
|
|
270
|
+
render: (row) => <Text tabular>{row.clockOut}</Text>,
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
key: "workMin",
|
|
274
|
+
header: "実働",
|
|
275
|
+
align: "right",
|
|
276
|
+
hiddenOnMobile: true,
|
|
277
|
+
render: (row) => <Text tabular>{hm(row.workMin)}</Text>,
|
|
278
|
+
},
|
|
279
|
+
];
|
|
280
|
+
|
|
281
|
+
const varianceCol: ColumnDef<Attendance> = {
|
|
282
|
+
key: "varianceMin",
|
|
283
|
+
header: "差異(分)",
|
|
284
|
+
align: "right",
|
|
285
|
+
sortable: true,
|
|
286
|
+
render: (row) => (
|
|
287
|
+
<Text
|
|
288
|
+
tone={row.varianceMin > 0 ? "destructive" : row.varianceMin < 0 ? "info" : "muted"}
|
|
289
|
+
tabular
|
|
290
|
+
>
|
|
291
|
+
{row.varianceMin > 0 ? `+${row.varianceMin}` : row.varianceMin || "—"}
|
|
292
|
+
</Text>
|
|
293
|
+
),
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const applicantCols: ColumnDef<Attendance>[] = [
|
|
297
|
+
{ key: "applicant", header: "申請者", render: (row) => row.applicant },
|
|
298
|
+
{
|
|
299
|
+
key: "appliedAt",
|
|
300
|
+
header: "申請時刻",
|
|
301
|
+
align: "right",
|
|
302
|
+
hiddenOnMobile: true,
|
|
303
|
+
render: (row) => <Text tabular>{row.appliedAt}</Text>,
|
|
304
|
+
},
|
|
305
|
+
];
|
|
306
|
+
|
|
307
|
+
// ── Saved-view presets (the core of this showcase) ─────────────────────────────
|
|
308
|
+
// Each view = { filter, columns }. Switching the tab swaps BOTH.
|
|
309
|
+
|
|
310
|
+
type ViewId = "all" | "pending" | "late" | "absent" | "approved";
|
|
311
|
+
|
|
312
|
+
type SavedView = {
|
|
313
|
+
id: ViewId;
|
|
314
|
+
label: string;
|
|
315
|
+
/** signal dot tone — colored Badge dot in the ribbon */
|
|
316
|
+
dot: "success" | "warning" | "destructive" | "info" | "neutral";
|
|
317
|
+
filter: (r: Attendance) => boolean;
|
|
318
|
+
columns: ColumnDef<Attendance>[];
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
const VIEWS: SavedView[] = [
|
|
322
|
+
{
|
|
323
|
+
id: "all",
|
|
324
|
+
label: "全件",
|
|
325
|
+
dot: "neutral",
|
|
326
|
+
filter: () => true,
|
|
327
|
+
columns: [dateCol, employeeCol, ...clockCols, statusCell, idCol],
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
id: "pending",
|
|
331
|
+
label: "要承認",
|
|
332
|
+
dot: "warning",
|
|
333
|
+
filter: (r) => r.status === "pending",
|
|
334
|
+
// surfaces 申請者 / 申請時刻 — hides 実働/退勤 noise
|
|
335
|
+
columns: [dateCol, employeeCol, ...applicantCols, statusCell],
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
id: "late",
|
|
339
|
+
label: "遅刻・早退",
|
|
340
|
+
dot: "destructive",
|
|
341
|
+
filter: (r) => r.status === "late" || r.status === "early",
|
|
342
|
+
// surfaces 差異(分)
|
|
343
|
+
columns: [dateCol, employeeCol, clockCols[0], clockCols[1], varianceCol, statusCell],
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
id: "absent",
|
|
347
|
+
label: "欠勤",
|
|
348
|
+
dot: "info",
|
|
349
|
+
filter: (r) => r.status === "absent",
|
|
350
|
+
columns: [dateCol, employeeCol, statusCell, idCol],
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
id: "approved",
|
|
354
|
+
label: "承認済",
|
|
355
|
+
dot: "success",
|
|
356
|
+
filter: (r) => r.status === "approved",
|
|
357
|
+
columns: [dateCol, employeeCol, ...clockCols, statusCell],
|
|
358
|
+
},
|
|
359
|
+
];
|
|
360
|
+
|
|
361
|
+
// dot tone → token class (fixed signaling; no hex)
|
|
362
|
+
const DOT_CLASS: Record<SavedView["dot"], string> = {
|
|
363
|
+
success: "bg-success",
|
|
364
|
+
warning: "bg-warning",
|
|
365
|
+
destructive: "bg-destructive",
|
|
366
|
+
info: "bg-info",
|
|
367
|
+
neutral: "bg-muted-foreground",
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
function ViewTrigger({ view, count }: { view: SavedView; count: number }) {
|
|
371
|
+
return (
|
|
372
|
+
<span className="flex items-center gap-2">
|
|
373
|
+
<span aria-hidden="true" className={`size-2 rounded-full ${DOT_CLASS[view.dot]}`} />
|
|
374
|
+
<span>{view.label}</span>
|
|
375
|
+
<Text
|
|
376
|
+
as="span"
|
|
377
|
+
size="2xs"
|
|
378
|
+
weight="medium"
|
|
379
|
+
tone="muted"
|
|
380
|
+
tabular
|
|
381
|
+
className="bg-muted inline-flex min-w-5 items-center justify-center rounded-full px-1.5"
|
|
382
|
+
>
|
|
383
|
+
{count}
|
|
384
|
+
</Text>
|
|
385
|
+
</span>
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
export default function Demo() {
|
|
390
|
+
const [view, setView] = React.useState<ViewId>("pending");
|
|
391
|
+
const [selected, setSelected] = React.useState<Set<string>>(new Set(["ATT-0509"]));
|
|
392
|
+
const [sort, setSort] = React.useState<SortStateProp | undefined>({
|
|
393
|
+
key: "date",
|
|
394
|
+
direction: "desc",
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
const active = VIEWS.find((v) => v.id === view) ?? VIEWS[0];
|
|
398
|
+
|
|
399
|
+
// Per-view counts for the ribbon pills.
|
|
400
|
+
const counts = React.useMemo(() => {
|
|
401
|
+
const map = {} as Record<ViewId, number>;
|
|
402
|
+
for (const v of VIEWS) map[v.id] = RECORDS.filter(v.filter).length;
|
|
403
|
+
return map;
|
|
404
|
+
}, []);
|
|
405
|
+
|
|
406
|
+
// Apply the active view's filter, then the (shared) sort.
|
|
407
|
+
const rows = React.useMemo(() => {
|
|
408
|
+
const filtered = RECORDS.filter(active.filter);
|
|
409
|
+
if (!sort) return filtered;
|
|
410
|
+
const dir = sort.direction === "asc" ? 1 : -1;
|
|
411
|
+
return [...filtered].sort((a, b) => {
|
|
412
|
+
const av = a[sort.key as keyof Attendance] as string | number;
|
|
413
|
+
const bv = b[sort.key as keyof Attendance] as string | number;
|
|
414
|
+
return (av < bv ? -1 : av > bv ? 1 : 0) * dir;
|
|
415
|
+
});
|
|
416
|
+
}, [active, sort]);
|
|
417
|
+
|
|
418
|
+
return (
|
|
419
|
+
<PageContainer
|
|
420
|
+
title="勤怠一覧"
|
|
421
|
+
subtitle="埼玉センター · 倉庫部 / 配送部 / 事務部 · 2026年6月"
|
|
422
|
+
density="compact"
|
|
423
|
+
extra={
|
|
424
|
+
<Flex direction="row" gap="sm">
|
|
425
|
+
<Button variant="outline" size="sm">
|
|
426
|
+
<RefreshCw aria-hidden="true" />
|
|
427
|
+
更新
|
|
428
|
+
</Button>
|
|
429
|
+
<Button variant="outline" size="sm">
|
|
430
|
+
<Download aria-hidden="true" />
|
|
431
|
+
CSV出力
|
|
432
|
+
</Button>
|
|
433
|
+
</Flex>
|
|
434
|
+
}
|
|
435
|
+
>
|
|
436
|
+
<Flex direction="col" gap="md">
|
|
437
|
+
{/* Saved-view ribbon — controlled Tabs; switching swaps the preset below. */}
|
|
438
|
+
<Tabs value={view} onValueChange={(v) => setView(v as ViewId)}>
|
|
439
|
+
<TabsList variant="line" className="h-auto flex-wrap gap-1 border-b">
|
|
440
|
+
{VIEWS.map((v) => (
|
|
441
|
+
<TabsTrigger
|
|
442
|
+
key={v.id}
|
|
443
|
+
value={v.id}
|
|
444
|
+
className="data-[state=active]:border-primary rounded-none border-b-2 border-transparent bg-transparent px-3 py-2 shadow-none data-[state=active]:bg-transparent data-[state=active]:shadow-none"
|
|
445
|
+
>
|
|
446
|
+
<ViewTrigger view={v} count={counts[v.id]} />
|
|
447
|
+
</TabsTrigger>
|
|
448
|
+
))}
|
|
449
|
+
</TabsList>
|
|
450
|
+
</Tabs>
|
|
451
|
+
|
|
452
|
+
{/* The grid — columns + data both come from the active saved view. */}
|
|
453
|
+
<Card>
|
|
454
|
+
<CardContent flush>
|
|
455
|
+
<DataTable
|
|
456
|
+
data={rows}
|
|
457
|
+
columns={active.columns}
|
|
458
|
+
getRowId={(row) => row.id}
|
|
459
|
+
selectable
|
|
460
|
+
selected={selected}
|
|
461
|
+
onSelectChange={setSelected}
|
|
462
|
+
onRowClick={() => {}}
|
|
463
|
+
sort={sort}
|
|
464
|
+
onSortChange={setSort}
|
|
465
|
+
empty={<Text tone="muted">このビューに該当する勤怠はありません</Text>}
|
|
466
|
+
>
|
|
467
|
+
<DataTable.Toolbar>
|
|
468
|
+
<DataTable.BulkActions>
|
|
469
|
+
<Button size="sm" variant="outline">
|
|
470
|
+
<X aria-hidden="true" />
|
|
471
|
+
差戻し
|
|
472
|
+
</Button>
|
|
473
|
+
<Button size="sm">
|
|
474
|
+
<Check aria-hidden="true" />
|
|
475
|
+
一括承認
|
|
476
|
+
</Button>
|
|
477
|
+
</DataTable.BulkActions>
|
|
478
|
+
<DataTable.DensityToggle />
|
|
479
|
+
</DataTable.Toolbar>
|
|
480
|
+
<DataTable.Content />
|
|
481
|
+
<DataTable.Pagination cursor="ATT-0503" hasMore onChange={() => {}} />
|
|
482
|
+
</DataTable>
|
|
483
|
+
</CardContent>
|
|
484
|
+
</Card>
|
|
485
|
+
</Flex>
|
|
486
|
+
</PageContainer>
|
|
487
|
+
);
|
|
488
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@godxjp/ui",
|
|
3
|
-
"version": "19.
|
|
4
|
-
"godxUiMcp": "19.
|
|
3
|
+
"version": "19.2.0",
|
|
4
|
+
"godxUiMcp": "19.2.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"scripts/init-agent-kit.mjs",
|
|
33
33
|
"scripts/postinstall.mjs",
|
|
34
34
|
"scripts/_agent-setup.mjs",
|
|
35
|
-
"scripts/cli.mjs"
|
|
35
|
+
"scripts/cli.mjs",
|
|
36
|
+
"docs"
|
|
36
37
|
],
|
|
37
38
|
"main": "./dist/index.js",
|
|
38
39
|
"types": "./dist/index.d.ts",
|
|
@@ -333,14 +334,13 @@
|
|
|
333
334
|
"check:final-touch-rtl": "node scripts/check-final-touch-rtl.mjs",
|
|
334
335
|
"check:frame-runtime": "pnpm check:data-entry-frame-runtime && pnpm check:data-entry-touch-aria && pnpm check:layout-nav-frames && pnpm check:provider-feedback-query-runtime && pnpm check:layout-nav-closure && pnpm check:final-touch-rtl && pnpm check:data-table-pagination-wrap && pnpm check:button-icon-xs",
|
|
335
336
|
"pretest": "pnpm check:frame-coverage",
|
|
336
|
-
"verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-
|
|
337
|
-
"verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-
|
|
338
|
-
"verify:ci": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-
|
|
339
|
-
"verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-
|
|
337
|
+
"verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
|
|
338
|
+
"verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
|
|
339
|
+
"verify:ci": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm test",
|
|
340
|
+
"verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:no-external-assets && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync",
|
|
340
341
|
"verify:browser": "pnpm check:contrast && pnpm check:visual-audit",
|
|
341
342
|
"verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage && pnpm check:frame-axe",
|
|
342
|
-
"verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve
|
|
343
|
-
"check:mcp-lockstep": "node scripts/check-release-lockstep.mjs",
|
|
343
|
+
"verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve",
|
|
344
344
|
"check:release-plan": "node scripts/check-release-command-plan.mjs",
|
|
345
345
|
"check:packed-public-contract": "node scripts/check-packed-public-contract.mjs",
|
|
346
346
|
"check:mcp-pattern-imports": "node scripts/check-mcp-pattern-imports.mjs",
|
|
@@ -357,6 +357,7 @@
|
|
|
357
357
|
"check:token-scale-bypass": "node scripts/check-token-scale-bypass.mjs",
|
|
358
358
|
"check:dist-tokens-resolve": "node scripts/check-dist-tokens-resolve.mjs",
|
|
359
359
|
"check:no-hardcoded-geometry": "node scripts/check-no-hardcoded-geometry.mjs",
|
|
360
|
+
"check:no-external-assets": "node scripts/check-no-external-assets.mjs",
|
|
360
361
|
"check:no-hardcoded-css-values": "node scripts/check-no-hardcoded-css-values.mjs",
|
|
361
362
|
"check:no-inline-magic-numbers": "node scripts/check-no-inline-magic-numbers.mjs",
|
|
362
363
|
"check:no-tailwind-class-assertions": "node scripts/check-no-tailwind-class-assertions.mjs",
|
|
@@ -364,9 +365,7 @@
|
|
|
364
365
|
"check:rtl": "node scripts/check-rtl.mjs",
|
|
365
366
|
"check:typography": "node scripts/check-typography.mjs",
|
|
366
367
|
"gen:component-tokens": "node scripts/gen-component-tokens.mjs",
|
|
367
|
-
"check:mcp-token-sync": "node scripts/gen-component-tokens.mjs --check",
|
|
368
368
|
"gen:email-tokens": "node scripts/gen-email-tokens.mjs",
|
|
369
|
-
"check:email-token-sync": "node scripts/gen-email-tokens.mjs --check",
|
|
370
369
|
"check:core-isolation": "node scripts/check-core-isolation.mjs",
|
|
371
370
|
"check:no-consumer-coupling": "node scripts/check-no-consumer-coupling.mjs",
|
|
372
371
|
"release": "node scripts/release.mjs",
|
package/scripts/_agent-setup.mjs
CHANGED
|
@@ -21,6 +21,13 @@ export const WORKFLOW_MD = `# @godxjp/ui — mandatory workflow (read every sess
|
|
|
21
21
|
You are building UI in an app that uses @godxjp/ui. Follow this EVERY time you create
|
|
22
22
|
or change a component, page, or form — no exceptions.
|
|
23
23
|
|
|
24
|
+
## The rules the audit enforces (docs/CONSUMER-RULES.md in node_modules/@godxjp/ui)
|
|
25
|
+
- Styles: \`@import "@godxjp/ui/styles"\` or \`@godxjp/ui/styles/core\` (no fonts). Never cherry-pick layers.
|
|
26
|
+
- Layout: sections of a page are spaced by \`PageContainer\`; siblings go in \`<Flex direction="col" gap>\` /
|
|
27
|
+
\`<ResponsiveGrid>\`. No \`flex\` / \`grid\` / \`gap-*\` / \`p-*\` / \`m-*\` on your own elements.
|
|
28
|
+
- Surfaces: \`Card\` / \`Badge\` / \`Avatar\` / \`ListRow\` / \`Descriptions\` / \`EmptyState\` — never a
|
|
29
|
+
\`rounded border\` div. Text is \`<Text tone size weight truncate>\`, never utility classes.
|
|
30
|
+
|
|
24
31
|
## Before writing UI
|
|
25
32
|
1. **MCP-first.** Consult the godx-ui MCP: \`get_component <Name>\`, \`search_components\`,
|
|
26
33
|
\`list_audit_rules\`, \`list_visual_checks\`. Never guess a prop; never hand-roll what a
|
|
@@ -47,6 +54,11 @@ export const CLAUDE_MD_BLOCK = `<!-- godxjp-ui:start (managed by @godxjp/ui —
|
|
|
47
54
|
|
|
48
55
|
This app uses @godxjp/ui. EVERY time you build or change UI:
|
|
49
56
|
|
|
57
|
+
0. **Ten rules** — read \`node_modules/@godxjp/ui/docs/CONSUMER-RULES.md\` once. Styles via
|
|
58
|
+
\`@godxjp/ui/styles\` or \`styles/core\` (never cherry-pick layers). Page sections are spaced by
|
|
59
|
+
\`PageContainer\`; siblings go in \`<Flex direction="col" gap>\` / \`<ResponsiveGrid>\`; no
|
|
60
|
+
\`flex\`/\`grid\`/\`gap-*\`/\`p-*\`/\`m-*\` on your own elements; boxes are \`Card\`/\`Badge\`/
|
|
61
|
+
\`ListRow\`/\`Descriptions\`, never a \`rounded border\` div; text is \`<Text tone size weight>\`.
|
|
50
62
|
1. **MCP-first.** Consult the \`godx-ui\` MCP — \`get_component\`, \`search_components\`,
|
|
51
63
|
\`list_audit_rules\`, \`list_visual_checks\`. Never guess a prop; never hand-roll what a
|
|
52
64
|
primitive already does.
|
|
@@ -120,8 +132,10 @@ export function writeWorkflowMd(root) {
|
|
|
120
132
|
return true;
|
|
121
133
|
}
|
|
122
134
|
|
|
123
|
-
/**
|
|
124
|
-
*
|
|
135
|
+
/**
|
|
136
|
+
* Append the godxjp-ui mandate to the consumer's CLAUDE.md (created if absent). Idempotent via the
|
|
137
|
+
* markers.
|
|
138
|
+
*/
|
|
125
139
|
export function ensureClaudeMd(root) {
|
|
126
140
|
const path = join(root, "CLAUDE.md");
|
|
127
141
|
const existing = existsSync(path) ? readFileSync(path, "utf8") : null;
|
package/scripts/audit-hook.mjs
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Claude Code PostToolUse hook — the FORCING FUNCTION.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* after EVERY Write/Edit/MultiEdit of a .tsx/.ts file, the godxjp-ui static audit
|
|
7
|
-
* runs on that file and its findings are fed straight back to the agent. The agent
|
|
8
|
-
* cannot skip it — the harness runs the hook, not the agent's goodwill — so a
|
|
9
|
-
* hand-rolled <label>+<Input>, a raw <button>, a loud palette colour, or an emoji
|
|
10
|
-
* is surfaced the instant it is written, and the agent self-corrects.
|
|
11
|
-
*
|
|
12
|
-
* Contract: reads the hook JSON on stdin ({ tool_input: { file_path } }). Prints
|
|
13
|
-
* findings to stderr and exits 2 when any are found (Claude Code feeds stderr back
|
|
14
|
-
* to the model); exits 0 (silent) when the file is clean or irrelevant. Non-fatal —
|
|
15
|
-
* it never blocks the edit, it just makes the agent SEE the issue.
|
|
3
|
+
* Claude Code PostToolUse hook — the FORCING FUNCTION. The agent cannot skip it — the harness runs
|
|
4
|
+
* the hook, not the agent's goodwill — so a hand-rolled <label>+<Input>, a raw <button>, a loud
|
|
5
|
+
* palette colour, or an emoji is surfaced the instant it is written, and the agent self-corrects.
|
|
16
6
|
*/
|
|
17
7
|
import { execFileSync } from "node:child_process";
|
|
18
8
|
import { readFileSync } from "node:fs";
|
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* init-agent-kit — the FULL forcing-kit. Run once from a consumer app:
|
|
4
|
-
* npx @godxjp/ui init-agent
|
|
5
|
-
*
|
|
6
|
-
* Scaffolds (idempotent, non-destructive) the harness-enforced workflow so an agent
|
|
7
|
-
* follows the whole godxjp-ui process every time it touches UI:
|
|
8
|
-
* 1. .mcp.json — registers the godx-ui MCP (component + audit guidance)
|
|
9
|
-
* 2. .claude/settings.json — PostToolUse hook auto-runs the audit on every .tsx edit
|
|
10
|
-
* and feeds findings back; SessionStart injects the mandate
|
|
11
|
-
* 3. .claude/godxjp-ui-workflow.md — the per-session mandate the SessionStart hook reads
|
|
12
|
-
*
|
|
13
|
-
* Existing config is preserved (hooks are appended only if absent). It then prints the
|
|
14
|
-
* optional pre-commit / CI snippets.
|
|
15
|
-
*/
|
|
2
|
+
/** init-agent-kit — the FULL forcing-kit. */
|
|
16
3
|
import {
|
|
17
4
|
ensureClaudeHooks,
|
|
18
5
|
ensureClaudeMd,
|