@godxjp/ui 28.12.0 → 29.0.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.
Files changed (178) hide show
  1. package/agent/START-HERE.md +29 -10
  2. package/agent/components/Anchor.json +6 -1
  3. package/agent/components/AppLauncher.json +10 -0
  4. package/agent/components/AppShell.json +1 -1
  5. package/agent/components/AreaChart.json +19 -1
  6. package/agent/components/Attachments.json +26 -1
  7. package/agent/components/BarChart.json +11 -1
  8. package/agent/components/BranchScopePicker.json +10 -0
  9. package/agent/components/Cascader.json +6 -1
  10. package/agent/components/Checkbox.json +6 -0
  11. package/agent/components/CompactBarTrend.json +1 -1
  12. package/agent/components/CredentialReveal.json +21 -0
  13. package/agent/components/DataState.json +1 -1
  14. package/agent/components/DataTable.json +4 -4
  15. package/agent/components/FormField.json +1 -1
  16. package/agent/components/InfiniteQueryState.json +1 -1
  17. package/agent/components/Input.json +1 -1
  18. package/agent/components/InputOTP.json +35 -0
  19. package/agent/components/LineChart.json +20 -2
  20. package/agent/components/ListRow.json +1 -1
  21. package/agent/components/Masonry.json +1 -1
  22. package/agent/components/MasterDetail.json +1 -1
  23. package/agent/components/PasswordStrength.json +1 -1
  24. package/agent/components/PermissionMatrix.json +6 -1
  25. package/agent/components/SearchInput.json +5 -0
  26. package/agent/components/Select.json +1 -0
  27. package/agent/components/ServiceRolePanel.json +5 -0
  28. package/agent/components/Sidebar.json +1 -1
  29. package/agent/components/Switch.json +6 -0
  30. package/agent/components/Table.json +8 -3
  31. package/agent/components/Tabs.json +10 -0
  32. package/agent/components/ThemeScope.json +49 -0
  33. package/agent/components/TimeRangePicker.json +5 -0
  34. package/agent/components/Topbar.json +1 -0
  35. package/agent/components/TopbarItem.json +2 -1
  36. package/agent/components/Transfer.json +6 -1
  37. package/agent/components/TreeSelect.json +1 -1
  38. package/agent/components/Upload.json +5 -0
  39. package/agent/components/UploadCropDialog.json +1 -1
  40. package/agent/components/formatDate.json +1 -1
  41. package/agent/components-index.json +5 -0
  42. package/agent/components.json +297 -31
  43. package/agent/index.json +19 -9
  44. package/agent/llms.txt +10 -10
  45. package/agent/patterns/tenant-brand-color.json +28 -0
  46. package/agent/patterns-index.json +27 -0
  47. package/agent/patterns.json +28 -0
  48. package/agent/rules.json +15 -0
  49. package/agent/tokens.json +4965 -970
  50. package/dist/app/index.d.ts +3 -0
  51. package/dist/app/index.js +3 -0
  52. package/dist/app/tenant-theme.d.ts +80 -0
  53. package/dist/app/tenant-theme.js +154 -0
  54. package/dist/app/theme-axes.d.ts +14 -1
  55. package/dist/app/theme-axes.js +24 -31
  56. package/dist/components/charts/chart-cartesian.d.ts +5 -1
  57. package/dist/components/charts/chart-cartesian.js +15 -8
  58. package/dist/components/data-display/badge.d.ts +1 -1
  59. package/dist/components/data-display/badge.js +20 -2
  60. package/dist/components/data-display/carousel.js +4 -4
  61. package/dist/components/data-display/data-table.js +13 -2
  62. package/dist/components/data-display/permission-matrix.js +1 -1
  63. package/dist/components/data-display/table.d.ts +11 -2
  64. package/dist/components/data-display/table.js +18 -2
  65. package/dist/components/data-entry/control-appearance.d.ts +12 -6
  66. package/dist/components/data-entry/control-appearance.js +1 -1
  67. package/dist/components/data-entry/select.js +4 -3
  68. package/dist/components/feedback/dialog.js +6 -3
  69. package/dist/components/feedback/overlay-header-tone.d.ts +7 -0
  70. package/dist/components/feedback/overlay-header-tone.js +4 -4
  71. package/dist/components/feedback/sheet.d.ts +1 -1
  72. package/dist/components/feedback/sheet.js +6 -9
  73. package/dist/components/feedback/sonner.js +16 -3
  74. package/dist/components/general/button.js +22 -5
  75. package/dist/components/layout/affix.js +15 -1
  76. package/dist/components/layout/sidebar.js +7 -1
  77. package/dist/components/navigation/anchor.d.ts +1 -1
  78. package/dist/components/navigation/anchor.js +5 -4
  79. package/dist/components/navigation/app-setting-picker.js +1 -1
  80. package/dist/components/navigation/pagination.js +1 -1
  81. package/dist/components/navigation/tabs.js +15 -2
  82. package/dist/components/query/infinite-query-state.d.ts +22 -6
  83. package/dist/contracts/measurement.json +1 -1
  84. package/dist/i18n/messages/en.json +0 -697
  85. package/dist/i18n/messages/ja.json +0 -691
  86. package/dist/i18n/messages/vi.json +0 -691
  87. package/dist/lib/control-styles.d.ts +31 -11
  88. package/dist/lib/control-styles.js +6 -6
  89. package/dist/lib/overlay-portal.d.ts +20 -0
  90. package/dist/lib/overlay-portal.js +93 -0
  91. package/dist/props/components/app.prop.d.ts +12 -0
  92. package/dist/props/components/charts.prop.d.ts +30 -0
  93. package/dist/props/components/index.d.ts +1 -1
  94. package/dist/props/components/navigation.prop.d.ts +21 -2
  95. package/dist/props/components/query.prop.d.ts +36 -2
  96. package/dist/props/registry.d.ts +46 -1
  97. package/dist/props/registry.js +38 -3
  98. package/dist/styles/alert-layout.css +34 -14
  99. package/dist/styles/badge-layout.css +10 -6
  100. package/dist/styles/base.css +14 -5
  101. package/dist/styles/card-layout.css +19 -8
  102. package/dist/styles/chart-layout.css +22 -3
  103. package/dist/styles/control.css +165 -59
  104. package/dist/styles/data-display-layout.css +129 -36
  105. package/dist/styles/data-entry-layout.css +23 -87
  106. package/dist/styles/dialog-layout.css +49 -19
  107. package/dist/styles/float-button-layout.css +5 -5
  108. package/dist/styles/focus-ring.css +9 -5
  109. package/dist/styles/layout.css +42 -15
  110. package/dist/styles/logo-layout.css +1 -1
  111. package/dist/styles/motion.css +1 -1
  112. package/dist/styles/navigation-layout.css +90 -29
  113. package/dist/styles/shell-layout.css +63 -40
  114. package/dist/styles/table-layout.css +56 -17
  115. package/dist/styles/text-layout.css +13 -4
  116. package/dist/styles/toggle.css +8 -2
  117. package/dist/tokens/components/actions.css +1 -1
  118. package/dist/tokens/components/attachments.css +4 -4
  119. package/dist/tokens/components/badge.css +4 -4
  120. package/dist/tokens/components/callout.css +1 -1
  121. package/dist/tokens/components/card.css +9 -4
  122. package/dist/tokens/components/chart.css +10 -1
  123. package/dist/tokens/components/chat-bubble.css +1 -1
  124. package/dist/tokens/components/control.css +28 -10
  125. package/dist/tokens/components/conversations.css +2 -1
  126. package/dist/tokens/components/data-display.css +12 -7
  127. package/dist/tokens/components/descriptions.css +1 -1
  128. package/dist/tokens/components/draggable-panel.css +1 -1
  129. package/dist/tokens/components/feedback.css +28 -8
  130. package/dist/tokens/components/float-button.css +1 -1
  131. package/dist/tokens/components/legal-document.css +1 -1
  132. package/dist/tokens/components/logo.css +1 -1
  133. package/dist/tokens/components/mega-menu.css +5 -3
  134. package/dist/tokens/components/navigation.css +21 -7
  135. package/dist/tokens/components/segmented.css +8 -3
  136. package/dist/tokens/components/shell.css +19 -5
  137. package/dist/tokens/components/table.css +9 -1
  138. package/dist/tokens/components/thought-chain.css +1 -1
  139. package/dist/tokens/components/toggle.css +2 -0
  140. package/dist/tokens/components/tree.css +3 -1
  141. package/dist/tokens/components/upload.css +6 -6
  142. package/dist/tokens/components/welcome.css +1 -1
  143. package/dist/tokens/foundation.css +28 -1
  144. package/docs/COMPOSITION-VS-COMPONENT.md +31 -0
  145. package/docs/CUSTOMER-THEMING.md +637 -1
  146. package/docs/DESIGN-AUTHORITY.md +13 -0
  147. package/docs/FRAME-COVERAGE-REPORT.md +3 -2
  148. package/docs/GLASSMORPHISM-STANDARD.md +196 -0
  149. package/docs/THEME-API-COVERAGE.md +538 -0
  150. package/docs/TOKEN-RESOLUTION.md +195 -0
  151. package/docs/TOKENS.md +63 -24
  152. package/docs/asset-modules.d.ts +7 -0
  153. package/docs/data-display/charts.tsx +80 -0
  154. package/docs/data-display/data-table/index.tsx +30 -0
  155. package/docs/data-display/popover.tsx +1 -1
  156. package/docs/data-display/table.tsx +52 -0
  157. package/docs/feedback/sheet.tsx +10 -10
  158. package/docs/foundation/density.tsx +4 -4
  159. package/docs/i18n/messages/en.json +1201 -0
  160. package/docs/i18n/messages/ja.json +1195 -0
  161. package/docs/i18n/messages/vi.json +1195 -0
  162. package/docs/layout/account-chip.tsx +2 -2
  163. package/docs/layout/responsive-grid.tsx +1 -1
  164. package/docs/navigation/toolbar.tsx +20 -12
  165. package/docs/providers/theme-scope.tsx +186 -0
  166. package/docs/showcase/caimono-price-comparison.tsx +911 -0
  167. package/docs/showcase/case4-login.tsx +2 -2
  168. package/docs/showcase/marketing-page.tsx +3 -2
  169. package/docs/showcase/permission-matrix.tsx +13 -5
  170. package/docs/showcase/table-pagination.tsx +2 -1
  171. package/docs/showcase/tenant-brand-color.tsx +338 -0
  172. package/docs/showcase/theme-customization.tsx +2 -1
  173. package/docs/showcase/theme-lab.tsx +2125 -0
  174. package/docs/themes/flat.css +462 -0
  175. package/docs/themes/glassmorphism.css +958 -0
  176. package/docs/themes/index.ts +200 -0
  177. package/package.json +4 -3
  178. package/scripts/explain-token.mjs +382 -0
@@ -629,10 +629,6 @@
629
629
  "outsideBefore": "Before the visible range",
630
630
  "schedule": "Schedule"
631
631
  },
632
- "textExamples": {
633
- "preservedText": "Plain text",
634
- "sampleText": "First line\n Indented line\n\nLast line"
635
- },
636
632
  "chat": {
637
633
  "bubble": {
638
634
  "typing": "Typing…",
@@ -669,698 +665,5 @@
669
665
  "error": "failed"
670
666
  }
671
667
  }
672
- },
673
- "themeShowcase": {
674
- "page": {
675
- "title": "Flexible theme customization",
676
- "subtitle": "One seed moves the whole system. Pick a palette and every control, surface, mark and focus ring on the board below repaints in place."
677
- },
678
- "bar": {
679
- "title": "Theme",
680
- "description": "The chips set the --primary seed inside a scope. Nothing here edits a component, forks a stylesheet or overrides a role.",
681
- "paletteLabel": "Palette",
682
- "cornerLabel": "Corner radius",
683
- "customLabel": "Custom seed",
684
- "customHint": "Any hex. The hover, pressed, border, focus and link steps all derive from it.",
685
- "identityNote": "The identity colour deliberately stays where it is: a tenant that changes its action colour does not retint its logo."
686
- },
687
- "palette": {
688
- "godx": "GoDX",
689
- "indigo": "Indigo",
690
- "teal": "Teal",
691
- "amber": "Amber",
692
- "rose": "Rose",
693
- "custom": "Custom"
694
- },
695
- "corner": {
696
- "sharp": "Sharp",
697
- "default": "Default",
698
- "soft": "Soft"
699
- },
700
- "tabs": {
701
- "components": "Components",
702
- "dashboard": "Dashboard"
703
- },
704
- "form": {
705
- "email": "Work email",
706
- "emailHint": "Release notices only.",
707
- "emailPlaceholder": "you@ops.example.jp",
708
- "handle": "Handle",
709
- "regions": "Regions",
710
- "regionsPlaceholder": "Select regions",
711
- "regionsEmpty": "No region selected yet.",
712
- "labels": "Labels",
713
- "labelsPlaceholder": "Add a label",
714
- "plan": "Plan",
715
- "releaseDate": "Release date",
716
- "channels": "Notification channels",
717
- "cadence": "Cadence",
718
- "density": "Row density",
719
- "autoDeploy": "Deploy on merge",
720
- "autoDeployHint": "A green pipeline promotes to staging without asking.",
721
- "freeze": "Release freeze",
722
- "budget": "Error budget · {value}",
723
- "syncing": "Syncing the release ledger"
724
- },
725
- "plan": {
726
- "starter": "Starter",
727
- "standard": "Standard",
728
- "scale": "Scale"
729
- },
730
- "channel": {
731
- "email": "Email",
732
- "escalation": "Escalate to the on-call rotation when a release stays in review for longer than one working day, including weekends and public holidays in the owning region",
733
- "escalationHint": "Sent to the rotation, never to an individual.",
734
- "pager": "Pager"
735
- },
736
- "cadence": {
737
- "daily": "Daily",
738
- "weekly": "Weekly",
739
- "manual": "Manual"
740
- },
741
- "density": {
742
- "compact": "Compact",
743
- "default": "Default",
744
- "comfortable": "Comfortable"
745
- },
746
- "steps": {
747
- "caption": "Release progress",
748
- "finished": "Finished",
749
- "finishedHint": "Artefacts signed and archived.",
750
- "inProcess": "In process",
751
- "waiting": "Waiting",
752
- "waitingHint": "Blocked on the contrast audit for the new seed."
753
- },
754
- "progress": {
755
- "rollout": "Rollout · {value}",
756
- "quota": "Build minutes · {value}",
757
- "done": "Done"
758
- },
759
- "legend": {
760
- "failed": "Failed",
761
- "review": "In review",
762
- "shipped": "Shipped"
763
- },
764
- "status": {
765
- "caption": "Status marks",
766
- "success": "Success",
767
- "error": "Error",
768
- "default": "Default",
769
- "processing": "Processing",
770
- "warning": "Warning",
771
- "seed": "Seed"
772
- },
773
- "action": {
774
- "primary": "Deploy",
775
- "secondary": "Compare",
776
- "outline": "Roll back",
777
- "dashed": "Add stage",
778
- "ghost": "Logs",
779
- "deploying": "Deploying",
780
- "discard": "Discard this release candidate"
781
- },
782
- "confirm": {
783
- "trigger": "Delete release",
784
- "title": "Delete this release?",
785
- "description": "The artefacts stay in the registry. The release record and its approvals do not.",
786
- "cancel": "Keep",
787
- "ok": "Delete"
788
- },
789
- "avatars": {
790
- "caption": "12 reviewers"
791
- },
792
- "rating": {
793
- "1": "Unusable",
794
- "2": "Rough",
795
- "3": "Acceptable",
796
- "4": "Good",
797
- "5": "Shippable"
798
- },
799
- "otp": {
800
- "title": "Verify this device",
801
- "description": "Enter the six-digit code from your authenticator app.",
802
- "field": "Verification code",
803
- "verify": "Verify"
804
- },
805
- "signup": {
806
- "title": "Create an account",
807
- "description": "One account covers every environment you have been granted.",
808
- "email": "Work email",
809
- "password": "Password",
810
- "submit": "Create account",
811
- "or": "or",
812
- "sso": "Continue with single sign-on",
813
- "passkey": "Continue with a passkey"
814
- },
815
- "notify": {
816
- "title": "Notifications",
817
- "longTitle": "Your invitation to the Platform Reliability and Release Governance working group is waiting for a response",
818
- "longMeta": "2026-09-12 09:12 UTC · expires in 3 days",
819
- "open": "Open",
820
- "bareTitle": "Invoice issued"
821
- },
822
- "qr": {
823
- "caption": "Authenticator enrolment",
824
- "label": "Two-factor authentication setup code",
825
- "manualKey": "Manual setup key"
826
- },
827
- "welcome": {
828
- "title": "Start from one hex",
829
- "description": "Give the generator a brand colour and it writes the seed file, measures every contrast pair and refuses the ones that miss.",
830
- "dismiss": "Dismiss"
831
- },
832
- "chat": {
833
- "assistant": "Assistant",
834
- "sent": "09:41",
835
- "answer": "The seed is scoped to the board, so the rest of the document keeps its own palette.",
836
- "bare": "And the focus ring?"
837
- },
838
- "thought": {
839
- "label": "How the seed was applied",
840
- "read": "Read the scope",
841
- "readHint": "[data-godx-theme] on the board root",
842
- "contrast": "Measure the pair",
843
- "contrastBody": "Label on fill and fill on canvas, both themes, against WCAG 2.2 SC 1.4.3 and SC 1.4.11.",
844
- "write": "Write the email fallback"
845
- },
846
- "carousel": {
847
- "caption": "Shipped palettes"
848
- },
849
- "alert": {
850
- "title": "Check",
851
- "description": "The custom seed is applied as authored. Nothing lifts a light seed onto the dark spine, so a brand that has to read on both canvases needs a second value measured against the dark one.",
852
- "okTitle": "Contrast verified"
853
- },
854
- "timeline": {
855
- "seedApplied": "Seed applied",
856
- "scope": "Board scope",
857
- "contrastQueued": "Contrast sweep queued"
858
- },
859
- "dashboard": {
860
- "releases": "Releases",
861
- "releasesHint": "Rolling 30 days",
862
- "revenue": "Recognised revenue",
863
- "failureRate": "Change failure rate",
864
- "failureHint": "Lower is better",
865
- "seatsLabel": "Regions in scope",
866
- "seats": {
867
- "one": "{count} region",
868
- "other": "{count} regions"
869
- },
870
- "mix": "Release mix",
871
- "activity": "Recent activity",
872
- "environment": "Environment",
873
- "owner": "Owner",
874
- "ledger": "Ledger reference",
875
- "table": "Releases",
876
- "tableHint": "Owners, regions and amounts are formatted for the active locale.",
877
- "updated": "Updated {date}",
878
- "rotate": "Rotate key"
879
- },
880
- "table": {
881
- "id": "Release",
882
- "owner": "Owner",
883
- "region": "Region",
884
- "ref": "Reference",
885
- "status": "Status",
886
- "amount": "Amount",
887
- "noRef": "Not set"
888
- },
889
- "releaseStatus": {
890
- "shipped": "Shipped",
891
- "review": "In review",
892
- "draft": "Draft",
893
- "failed": "Failed"
894
- }
895
- },
896
- "themeEditor": {
897
- "title": "Theme editor",
898
- "subtitle": "One seed colour in, a whole brand out, measured rather than asserted.",
899
- "unreadable": {
900
- "title": "The token stylesheet could not be read",
901
- "description": "This page derives a brand from the canvas colours and ramp steps the document is painting, read from the live stylesheet. Neither could be read here, so nothing below it would be a measurement."
902
- },
903
- "order": {
904
- "title": "Seed, then role, then scope, then instance",
905
- "description": "Stop at the first level that does the job. Every level below the seed is a value that has stopped deriving, and nothing tells you when the brand moves past it."
906
- },
907
- "seed": {
908
- "title": "1. Seed",
909
- "description": "The brand's action colour: what a primary button is filled with. In most cases this is the whole theme.",
910
- "label": "Brand seed",
911
- "helper": "A six digit hex. Everything below derives from it and is measured against WCAG 2.2 AA.",
912
- "presetLabel": "Edge cases",
913
- "presetHelper": "Each of these produces an answer a well behaved blue hides.",
914
- "presetPlaceholder": "A seed of your own",
915
- "preset": {
916
- "godx": "This package's own seed",
917
- "blue": "An ordinary brand blue",
918
- "very-light": "Near white: the fill cannot clear the light canvas",
919
- "very-dark": "Near black: the dark seed runs to white",
920
- "sunflower": "Sunflower: repoints the state steps in both themes"
921
- },
922
- "announce": {
923
- "one": "Seed {hex}. Light {light}, dark {dark}. {pass} of {count} measured pair clears AA.",
924
- "other": "Seed {hex}. Light {light}, dark {dark}. {pass} of {count} measured pairs clear AA."
925
- },
926
- "announceNoDark": "Seed {hex}. No lightness at this hue and saturation carries a readable fill on the dark canvas, so there is no dark theme to measure."
927
- },
928
- "derived": {
929
- "title": "2. What the seed produces",
930
- "description": "Read only, because these are results. Three roles per theme are written into the export; the rest derive from the primary in scope at the element that paints them, so writing them would pin them to this seed.",
931
- "tableLabel": "Roles derived from the seed",
932
- "column": {
933
- "token": "Token",
934
- "light": "Light",
935
- "dark": "Dark",
936
- "emitted": "In the export"
937
- },
938
- "written": "Written",
939
- "derivedOnly": "Derives"
940
- },
941
- "contrast": {
942
- "title": "3. Contrast",
943
- "description": "Every pair the seed produces, measured with the package's own WCAG helper. A label on its fill owes 4.5:1 (SC 1.4.3); a fill on the canvas behind it owes 3:1 (SC 1.4.11).",
944
- "tableLabel": "Measured contrast pairs",
945
- "column": {
946
- "pair": "Pair",
947
- "measured": "Measured",
948
- "threshold": "Needs",
949
- "result": "Result"
950
- },
951
- "pair": {
952
- "label-on-fill-light": "Primary label on fill, light",
953
- "label-on-fill-dark": "Primary label on fill, dark",
954
- "fill-on-canvas-light": "Primary fill on canvas, light",
955
- "fill-on-canvas-dark": "Primary fill on canvas, dark",
956
- "link-on-canvas-light": "Link ink on canvas, light",
957
- "link-on-canvas-dark": "Link ink on canvas, dark"
958
- },
959
- "ratio": "{value}:1",
960
- "pass": "Clears AA",
961
- "fail": "Below AA"
962
- },
963
- "overrides": {
964
- "title": "4. Per token overrides",
965
- "description": "Below the seed on purpose. Reach for one only when the seed is right and a single token must differ.",
966
- "costTitle": "What an override costs",
967
- "costDescription": "A token set by hand stops following the seed. The next brand change moves everything derived and leaves this value behind, and no audit reports it.",
968
- "labelTitle": "Label colour on the fill",
969
- "labelHelper": "By default the label is chosen by the seed's own luminance, the same 0.179 threshold a runtime re-theme uses. Forcing it is the one override the generator has a flag for.",
970
- "labelAuto": "Automatic",
971
- "labelLight": "Light label",
972
- "labelDark": "Dark label",
973
- "darkTitle": "Dark seed lightness",
974
- "darkHelper": "Contrast parity with the light theme puts it at {parity}. Hue and saturation are held either way; only lightness moves. An authored value is allowed to fail, and the table above is how it says so.",
975
- "darkNoParity": "No lightness at this hue and saturation clears both floors, so there is no parity value to depart from.",
976
- "darkReset": "Back to parity",
977
- "darkAuthored": "Authored",
978
- "darkParity": "At parity"
979
- },
980
- "export": {
981
- "title": "5. Export",
982
- "description": "Paste the first block into your own theme file and the second over the baked email palette, which no stylesheet can reach.",
983
- "nameLabel": "Theme name",
984
- "nameHelper": "Writes {name}.service.css and {name}.email.ts.",
985
- "matches": "Identical to gen:brand",
986
- "diverges": "No command emits this",
987
- "divergesWhy": "The dark seed's lightness was authored here. The generator searches for parity and has no flag for it, so no command reproduces this file.",
988
- "cssLabel": "Theme CSS for {name}",
989
- "emailLabel": "Email palette for {name}",
990
- "noDarkTitle": "This seed has no readable dark fill",
991
- "noDarkDescription": "No lightness at this hue and saturation clears both 4.5:1 on its own label and 3:1 on the dark canvas. Desaturate the seed, or force the label above and look again."
992
- },
993
- "preview": {
994
- "lightTitle": "Light",
995
- "darkTitle": "Dark",
996
- "seedIs": "Scoped to {hex}",
997
- "tableLabel": "Invoice lines",
998
- "column": {
999
- "id": "Line",
1000
- "item": "Item",
1001
- "owner": "Owner",
1002
- "state": "State"
1003
- },
1004
- "state": {
1005
- "active": "Active",
1006
- "pending": "Pending"
1007
- },
1008
- "line": {
1009
- "licence": "Licence",
1010
- "support": "Support",
1011
- "setup": "Setup"
1012
- },
1013
- "action": {
1014
- "save": "Save",
1015
- "duplicate": "Duplicate",
1016
- "export": "Export",
1017
- "add": "Add line",
1018
- "dismiss": "Dismiss",
1019
- "delete": "Delete",
1020
- "details": "Details"
1021
- },
1022
- "badge": {
1023
- "brand": "Brand",
1024
- "success": "Paid",
1025
- "warning": "Due soon",
1026
- "destructive": "Overdue",
1027
- "info": "Draft",
1028
- "neutral": "Archived"
1029
- },
1030
- "alert": {
1031
- "title": "Billing address is incomplete",
1032
- "description": "Invoices cannot be issued until it is filled in.",
1033
- "link": "Back to the seed"
1034
- },
1035
- "field": {
1036
- "org": "Organisation",
1037
- "orgHelper": "Appears on every issued document.",
1038
- "plan": "Plan",
1039
- "tax": "Include tax",
1040
- "mail": "Send automatically"
1041
- },
1042
- "plan": {
1043
- "starter": "Starter",
1044
- "pro": "Pro",
1045
- "scale": "Scale"
1046
- }
1047
- }
1048
- },
1049
- "marketingShowcase": {
1050
- "brand": {
1051
- "name": "Example Works",
1052
- "suffix": "Approvals"
1053
- },
1054
- "nav": {
1055
- "label": "Primary",
1056
- "product": "Product",
1057
- "solutions": "Solutions",
1058
- "pricing": "Pricing",
1059
- "docs": "Docs",
1060
- "signIn": "Sign in",
1061
- "getStarted": "Start free",
1062
- "open": "Open navigation",
1063
- "title": "Navigation",
1064
- "description": "Every destination in the bar, including the two that fold away at phone width.",
1065
- "close": "Close navigation"
1066
- },
1067
- "hero": {
1068
- "eyebrow": "Approval workflow",
1069
- "title": "Every approval, in one auditable trail.",
1070
- "lead": "Route an invoice, a purchase order or a contract to the approver who owns it, keep the evidence beside the decision, and export the year in one file.",
1071
- "primary": "Start free",
1072
- "secondary": "Book a walkthrough",
1073
- "trust": "No card. 14 days. Cancel inside the product.",
1074
- "panelTitle": "Tonight's queue",
1075
- "panelNote": "Live figures from one tenant, refreshed on approval.",
1076
- "pending": "Waiting on you",
1077
- "cleared": "Cleared today",
1078
- "median": "Median decision",
1079
- "medianValue": "4h 12m",
1080
- "endpointLabel": "Webhook endpoint",
1081
- "endpointNote": "Copied verbatim into your gateway. It has no break opportunity in it."
1082
- },
1083
- "logos": {
1084
- "title": "Teams that left email approvals behind",
1085
- "caption": "The track ships PAUSED, and the control beside it is a real button in the tab order.",
1086
- "marqueeLabel": "Customer wordmarks"
1087
- },
1088
- "features": {
1089
- "title": "What it does",
1090
- "lead": "Six capabilities, and not one of them is a new component.",
1091
- "routingTitle": "Routing",
1092
- "routingBody": "A rule reads the amount, the cost centre and the vendor, then picks the approver who owns that combination.",
1093
- "auditTitle": "An audit trail your accountant can read without asking anyone what a status code means",
1094
- "residencyTitle": "Residency",
1095
- "residencyBody": "Every document and every derived index stays in the Tokyo region.",
1096
- "evidenceTitle": "承認の証跡",
1097
- "evidenceBody": "決裁の理由と添付を同じ行に残します。Evidence and decision are one record, not two systems.",
1098
- "webhookTitle": "Webhooks",
1099
- "webhookBody": "Each endpoint carries an identifier with nowhere to break, and the card holds it:",
1100
- "ssoTitle": "SSO",
1101
- "ssoBody": "SAML and OIDC, with group mapping onto approval roles."
1102
- },
1103
- "testimonials": {
1104
- "title": "What the first year looked like",
1105
- "label": "Customer quotes",
1106
- "ratingLabel": "Rating",
1107
- "q1": "We closed the quarter without a single approval sitting in somebody's inbox, the auditor asked for one export instead of eleven, and the finance team stopped keeping a private spreadsheet to track what had actually been signed.",
1108
- "a1": "山口 佳奈",
1109
- "r1": "Controller, Aoba Foods",
1110
- "q2": "It stopped the arguments.",
1111
- "a2": "Dana Whitfield",
1112
- "r2": "Head of Procurement, Meridian Health",
1113
- "q3": "Chúng tôi chuyển 240 quy trình phê duyệt sang đây trong sáu tuần, và không mất một chứng từ nào.",
1114
- "a3": "Trần Minh Khoa",
1115
- "r3": "Finance Lead, Truong An"
1116
- },
1117
- "pricing": {
1118
- "title": "Pricing",
1119
- "lead": "Per approver, per month. The yearly cycle bills once.",
1120
- "cycleLabel": "Billing cycle",
1121
- "monthly": "Monthly",
1122
- "yearly": "Yearly",
1123
- "perMonth": "per approver / month",
1124
- "billedYearly": "billed once a year",
1125
- "popular": "Most chosen",
1126
- "saving": "2 months free",
1127
- "fresh": "New",
1128
- "quoted": "Quoted",
1129
- "quotedNote": "Priced against your approver count and your residency region.",
1130
- "starterName": "Starter",
1131
- "starterNote": "One approval chain, one region.",
1132
- "teamName": "Team",
1133
- "teamNote": "Parallel chains, delegation, and the evidence export.",
1134
- "enterpriseName": "エンタープライズ",
1135
- "enterpriseNote": "専用テナント · SSO · 監査窓口。Dedicated tenant, SSO, named auditor contact.",
1136
- "cta": "Start free",
1137
- "ctaQuote": "Talk to us",
1138
- "featChains": "Approval chains",
1139
- "featDelegation": "Delegation and out-of-office",
1140
- "featExport": "One-file audit export",
1141
- "featSso": "SAML and OIDC",
1142
- "featResidency": "Choice of residency region",
1143
- "featSupport": "Named support contact",
1144
- "limitedChains": "One chain only",
1145
- "limitedSupport": "Business hours"
1146
- },
1147
- "cta": {
1148
- "title": "Put one approval chain through it this week",
1149
- "lead": "Import a chain from a spreadsheet, send three real approvals through it, and keep the export.",
1150
- "primary": "Start free",
1151
- "secondary": "Book a walkthrough",
1152
- "note": "Sales replies within one business day, Tokyo time."
1153
- },
1154
- "footer": {
1155
- "label": "Footer",
1156
- "product": "Product",
1157
- "company": "Company",
1158
- "legal": "Legal",
1159
- "contact": "Contact",
1160
- "featuresLink": "Features",
1161
- "pricingLink": "Pricing",
1162
- "changelog": "Changelog",
1163
- "status": "Status",
1164
- "about": "About",
1165
- "careers": "Careers",
1166
- "terms": "Terms",
1167
- "privacy": "Privacy",
1168
- "security": "Security",
1169
- "subprocessors": "Subprocessors",
1170
- "accessibility": "Accessibility statement",
1171
- "salesLine": "Sales",
1172
- "supportLine": "Support",
1173
- "addressLabel": "Registered office",
1174
- "address": "Chiyoda, Tokyo",
1175
- "rights": "Example Works. A fictional company, for documentation only."
1176
- }
1177
- },
1178
- "showcase": {
1179
- "pagination": {
1180
- "recordCount": {
1181
- "one": "{count} record",
1182
- "other": "{count} records"
1183
- },
1184
- "loadMore": {
1185
- "one": "Load {count} more",
1186
- "other": "Load {count} more"
1187
- }
1188
- },
1189
- "flexMeasure": {
1190
- "title": "measure — full-bleed outside, a measured column inside",
1191
- "lead": "A band is a <section> carrying the edge-to-edge paint around one Flex that measure centres and caps at --page-measure-*. The gutter stays pad's job: measure adds none. narrow (42rem) and medium (48rem) are reading measures; wide (72rem) is the marketing one."
1192
- },
1193
- "tagInput": {
1194
- "longIdTitle": "Long identifiers and +N",
1195
- "ledgerLabel": "Ledger ID",
1196
- "ledgerHelper": "A 71-character identifier still stays inside the control"
1197
- }
1198
- },
1199
- "serviceLauncherShowcase": {
1200
- "page": {
1201
- "title": "ServiceLauncherCard",
1202
- "subtitle": "Tiles for an organization's internal application list — available, restricted, suspended, archived, loading, and catalog entry."
1203
- },
1204
- "status": {
1205
- "available": "Available",
1206
- "active": "Active",
1207
- "maintenance": "Under maintenance",
1208
- "stopped": "Stopped",
1209
- "adminOnly": "Admin only",
1210
- "preparing": "Preparing",
1211
- "archived": "Archived",
1212
- "unapplied": "Not requested",
1213
- "noPermission": "No permission",
1214
- "attentionRequired": "Attention required"
1215
- },
1216
- "action": {
1217
- "openService": "Open service",
1218
- "open": "Open",
1219
- "viewStatus": "View status",
1220
- "viewHistory": "View history",
1221
- "checkPermissions": "Check permissions",
1222
- "openSettings": "Open settings",
1223
- "viewArchive": "View archive",
1224
- "openRequestForm": "Open request form",
1225
- "openList": "Open the list",
1226
- "openServiceEnglish": "Open service"
1227
- },
1228
- "sections": {
1229
- "basics": {
1230
- "heading": "1 · Basics · services you can use",
1231
- "why": "Icon, name, status, description, identifier, action. The status copy always belongs to the consumer — the component only decides what the Badge's tone means.",
1232
- "attendance": {
1233
- "title": "Attendance management",
1234
- "description": "Manage clock-in/out, shifts, and leave requests in one workspace."
1235
- },
1236
- "expense": {
1237
- "title": "Expense reimbursement",
1238
- "description": "Handles everything from receipt submission and approval to journal-entry sync."
1239
- },
1240
- "meetingRoom": {
1241
- "title": "Meeting room booking",
1242
- "description": "Book meeting rooms and equipment for each site."
1243
- }
1244
- },
1245
- "statusTones": {
1246
- "heading": "2 · All 6 statusTone values",
1247
- "why": "success / warning / destructive / info / neutral / muted. The tone only decides what the Badge means — the copy, the judgment, and whether the action is allowed all come from the consumer.",
1248
- "mail": {
1249
- "title": "Internal mail",
1250
- "description": "Manage mailboxes, distribution lists, and shared signatures."
1251
- },
1252
- "fileShare": {
1253
- "title": "File sharing",
1254
- "description": "Handles department folders and external share links."
1255
- },
1256
- "dataSync": {
1257
- "title": "Data integration platform",
1258
- "description": "Manages data-sync jobs with external systems."
1259
- },
1260
- "iam": {
1261
- "title": "Access management",
1262
- "description": "Review roles, two-factor authentication policy, and audit events."
1263
- },
1264
- "integrations": {
1265
- "title": "Connected apps",
1266
- "description": "Configure third-party integration connections and scopes."
1267
- },
1268
- "legacyKb": {
1269
- "title": "Legacy knowledge base",
1270
- "description": "Keeps operating procedures through fiscal year 2024 in read-only storage."
1271
- }
1272
- },
1273
- "disabledReason": {
1274
- "heading": "3 · disabledReason · the reason an action doesn't work comes before the action",
1275
- "why": "A disabled button conveys no 'why' at all. That's why the reason is placed before the action in DOM order (WCAG 2.2 · 1.3.2), and the tile carries data-unavailable so its medallion recedes. disabledReason does not disable the button — that stays the consumer's own Button prop.",
1276
- "inventory": {
1277
- "title": "Inventory management",
1278
- "description": "Manage inventory, stock movements, and physical counts by site.",
1279
- "reason": "This department's usage request has not been approved yet."
1280
- },
1281
- "contracts": {
1282
- "title": "Contract management",
1283
- "description": "Handles contract storage, deadline notifications, and e-signature requests.",
1284
- "reason": "Viewing requires a Legal department role. Apply through the IT help desk."
1285
- },
1286
- "analytics": {
1287
- "title": "Analytics platform",
1288
- "description": "Provides company-wide dashboards and data marts.",
1289
- "reason": "This service has been suspended by an organization administrator."
1290
- }
1291
- },
1292
- "loadingCatalog": {
1293
- "heading": "4 · Loading state and catalog entry",
1294
- "why": "ServiceLauncherCardSkeleton is the initial placeholder with the same skeleton, requires a label, carries aria-busy, and deliberately never opens a live region. ServiceCatalogCta is the companion tile you place alongside it only when a real additional entry point exists, and it accepts a glyph other than the default Plus.",
1295
- "skeletonLabel": "Loading service",
1296
- "addApp": {
1297
- "title": "Add an app"
1298
- },
1299
- "allApps": {
1300
- "title": "View all internal apps"
1301
- }
1302
- },
1303
- "edgeCases": {
1304
- "heading": "5 · Touching the edges · a 3-line name, no description, a long hostname that won't break",
1305
- "why": "A tidy example never shows where a tile breaks. This is the side that breaks: a name that wraps to 3 lines sits next to a 2-word name in the same row, a tile with no description sits beside one that has one, and a hostname with no whitespace tries to stretch the column. If it looks unsightly, this section is doing its job — what has to hold up is the component, not the sample data.",
1306
- "hrPortal": {
1307
- "title": "Global HR information platform · Employee self-service portal (Asia-Pacific)",
1308
- "description": "An integrated workspace that centrally manages HR master data, attendance, payroll, and performance reviews."
1309
- },
1310
- "dailyReport": {
1311
- "title": "Daily report"
1312
- },
1313
- "warningConsole": {
1314
- "title": "Global Workforce Identity & Entitlement Administration Console",
1315
- "description": "Review pending entitlement requests before the next access certification.",
1316
- "reason": "Your organization has no approved request for this service yet."
1317
- }
1318
- },
1319
- "minimalTiles": {
1320
- "heading": "6 · Minimal tiles",
1321
- "why": "Only icon, title, and action are required. Omit statusLabel and the whole Badge row disappears; omit description and metadata too and the skeleton still holds — compare its height with the fully loaded tile next to it.",
1322
- "wiki": {
1323
- "title": "Internal wiki"
1324
- },
1325
- "contact": {
1326
- "title": "Support contact",
1327
- "description": "Internal system inquiries are accepted here."
1328
- },
1329
- "calendar": {
1330
- "title": "Company-wide calendar",
1331
- "description": "Shares company-wide events, holidays, and site-specific schedules.",
1332
- "reason": "Published as read-only."
1333
- }
1334
- },
1335
- "logo": {
1336
- "heading": "7 · logo · an uploaded logo, and the services that have none",
1337
- "why": "logo is a URL to an image the administrator uploaded, and it only replaces icon when it actually loads. icon stays required — a freshly created service has no logo, and a service whose URL now 404s has none either. A broken image never enters the DOM. The image box is the same 20px as the glyph (--card-service-launcher-icon-glyph-size), and its aspect ratio is preserved with object-fit: contain.",
1338
- "uploaded": {
1339
- "title": "Attendance management",
1340
- "description": "A service with an uploaded logo. The medallion shows the logo instead of icon."
1341
- },
1342
- "missing": {
1343
- "title": "Attendance management (no logo set)",
1344
- "description": "The same tile without a logo passed. icon stays as-is, and the medallion size doesn't change either."
1345
- },
1346
- "broken": {
1347
- "title": "Data integration platform (logo 404)",
1348
- "description": "logo_url is set but the file doesn't exist. The tile doesn't go blank — it falls back to icon."
1349
- },
1350
- "wideMark": {
1351
- "title": "Expense reimbursement",
1352
- "description": "A wide 240×96 wordmark logo. Because of contain it's never cropped, and the box width stays the same as the glyph's."
1353
- },
1354
- "withReason": {
1355
- "title": "Access management",
1356
- "description": "logo and disabledReason are orthogonal. State is conveyed by the Badge and the reason text — we never let another company's brand color carry that meaning on our own.",
1357
- "reason": "Viewing requires an administrator role."
1358
- },
1359
- "emptyString": {
1360
- "title": "Internal mail",
1361
- "description": "An empty-string logo. It's treated the same as not set, and issues no wasted request either."
1362
- }
1363
- }
1364
- }
1365
668
  }
1366
669
  }