@umamichi-ui/common-components 0.1.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 (98) hide show
  1. package/README.md +112 -0
  2. package/dist/dialog/AboutDialog.d.ts +27 -0
  3. package/dist/dialog/AboutDialog.d.ts.map +1 -0
  4. package/dist/dialog/AboutDialog.js +61 -0
  5. package/dist/dialog/AboutDialog.js.map +1 -0
  6. package/dist/dialog/ConfirmDialog.d.ts +17 -0
  7. package/dist/dialog/ConfirmDialog.d.ts.map +1 -0
  8. package/dist/dialog/ConfirmDialog.js +38 -0
  9. package/dist/dialog/ConfirmDialog.js.map +1 -0
  10. package/dist/dialog/ConfirmDialogOverlay.d.ts +13 -0
  11. package/dist/dialog/ConfirmDialogOverlay.d.ts.map +1 -0
  12. package/dist/dialog/ConfirmDialogOverlay.js +28 -0
  13. package/dist/dialog/ConfirmDialogOverlay.js.map +1 -0
  14. package/dist/dialog/index.d.ts +4 -0
  15. package/dist/dialog/index.d.ts.map +1 -0
  16. package/dist/dialog/index.js +9 -0
  17. package/dist/dialog/index.js.map +1 -0
  18. package/dist/icons/ChevronIcons.d.ts +6 -0
  19. package/dist/icons/ChevronIcons.d.ts.map +1 -0
  20. package/dist/icons/ChevronIcons.js +19 -0
  21. package/dist/icons/ChevronIcons.js.map +1 -0
  22. package/dist/icons/DropdownMenuChevron.d.ts +6 -0
  23. package/dist/icons/DropdownMenuChevron.d.ts.map +1 -0
  24. package/dist/icons/DropdownMenuChevron.js +20 -0
  25. package/dist/icons/DropdownMenuChevron.js.map +1 -0
  26. package/dist/icons/InfoCircleIcon.d.ts +5 -0
  27. package/dist/icons/InfoCircleIcon.d.ts.map +1 -0
  28. package/dist/icons/InfoCircleIcon.js +17 -0
  29. package/dist/icons/InfoCircleIcon.js.map +1 -0
  30. package/dist/icons/index.d.ts +4 -0
  31. package/dist/icons/index.d.ts.map +1 -0
  32. package/dist/icons/index.js +10 -0
  33. package/dist/icons/index.js.map +1 -0
  34. package/dist/index.d.ts +6 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +45 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/menu/FloatingMenu.d.ts +28 -0
  39. package/dist/menu/FloatingMenu.d.ts.map +1 -0
  40. package/dist/menu/FloatingMenu.js +125 -0
  41. package/dist/menu/FloatingMenu.js.map +1 -0
  42. package/dist/menu/MobileActionSheet.d.ts +9 -0
  43. package/dist/menu/MobileActionSheet.d.ts.map +1 -0
  44. package/dist/menu/MobileActionSheet.js +10 -0
  45. package/dist/menu/MobileActionSheet.js.map +1 -0
  46. package/dist/menu/MobileActionSheetContent.d.ts +31 -0
  47. package/dist/menu/MobileActionSheetContent.d.ts.map +1 -0
  48. package/dist/menu/MobileActionSheetContent.js +123 -0
  49. package/dist/menu/MobileActionSheetContent.js.map +1 -0
  50. package/dist/menu/computeFloatingMenuGeometry.d.ts +12 -0
  51. package/dist/menu/computeFloatingMenuGeometry.d.ts.map +1 -0
  52. package/dist/menu/computeFloatingMenuGeometry.js +30 -0
  53. package/dist/menu/computeFloatingMenuGeometry.js.map +1 -0
  54. package/dist/menu/index.d.ts +6 -0
  55. package/dist/menu/index.d.ts.map +1 -0
  56. package/dist/menu/index.js +13 -0
  57. package/dist/menu/index.js.map +1 -0
  58. package/dist/menu/useFloatingMenuGeometry.d.ts +13 -0
  59. package/dist/menu/useFloatingMenuGeometry.d.ts.map +1 -0
  60. package/dist/menu/useFloatingMenuGeometry.js +50 -0
  61. package/dist/menu/useFloatingMenuGeometry.js.map +1 -0
  62. package/dist/overlay/OverlayStackProvider.d.ts +17 -0
  63. package/dist/overlay/OverlayStackProvider.d.ts.map +1 -0
  64. package/dist/overlay/OverlayStackProvider.js +120 -0
  65. package/dist/overlay/OverlayStackProvider.js.map +1 -0
  66. package/dist/overlay/SiteOverlayBackdrop.d.ts +13 -0
  67. package/dist/overlay/SiteOverlayBackdrop.d.ts.map +1 -0
  68. package/dist/overlay/SiteOverlayBackdrop.js +62 -0
  69. package/dist/overlay/SiteOverlayBackdrop.js.map +1 -0
  70. package/dist/overlay/index.d.ts +6 -0
  71. package/dist/overlay/index.d.ts.map +1 -0
  72. package/dist/overlay/index.js +18 -0
  73. package/dist/overlay/index.js.map +1 -0
  74. package/dist/overlay/overlayHistory.d.ts +8 -0
  75. package/dist/overlay/overlayHistory.d.ts.map +1 -0
  76. package/dist/overlay/overlayHistory.js +14 -0
  77. package/dist/overlay/overlayHistory.js.map +1 -0
  78. package/dist/overlay/overlayStackTypes.d.ts +10 -0
  79. package/dist/overlay/overlayStackTypes.d.ts.map +1 -0
  80. package/dist/overlay/overlayStackTypes.js +9 -0
  81. package/dist/overlay/overlayStackTypes.js.map +1 -0
  82. package/dist/overlay/useOverlayStackEntry.d.ts +11 -0
  83. package/dist/overlay/useOverlayStackEntry.d.ts.map +1 -0
  84. package/dist/overlay/useOverlayStackEntry.js +55 -0
  85. package/dist/overlay/useOverlayStackEntry.js.map +1 -0
  86. package/dist/presence/index.d.ts +2 -0
  87. package/dist/presence/index.d.ts.map +1 -0
  88. package/dist/presence/index.js +7 -0
  89. package/dist/presence/index.js.map +1 -0
  90. package/dist/presence/useOverlayPresence.d.ts +10 -0
  91. package/dist/presence/useOverlayPresence.d.ts.map +1 -0
  92. package/dist/presence/useOverlayPresence.js +119 -0
  93. package/dist/presence/useOverlayPresence.js.map +1 -0
  94. package/package.json +81 -0
  95. package/src/styles/about-dialog.css +117 -0
  96. package/src/styles/index.css +3 -0
  97. package/src/styles/mobile-action-sheet.css +166 -0
  98. package/src/styles/overlay.css +61 -0
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@umamichi-ui/common-components",
3
+ "version": "0.1.0",
4
+ "description": "Reusable React UI components for Umamichi sites (overlay stack, dialogs, menus)",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/umamichi-ui/common-components.git"
10
+ },
11
+ "homepage": "https://github.com/umamichi-ui/common-components#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/umamichi-ui/common-components/issues"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "keywords": [
19
+ "react",
20
+ "ui",
21
+ "overlay",
22
+ "modal",
23
+ "dialog",
24
+ "umamichi"
25
+ ],
26
+ "files": [
27
+ "dist",
28
+ "src/styles"
29
+ ],
30
+ "sideEffects": [
31
+ "**/*.css"
32
+ ],
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "import": "./dist/index.js"
37
+ },
38
+ "./presence": {
39
+ "types": "./dist/presence/index.d.ts",
40
+ "import": "./dist/presence/index.js"
41
+ },
42
+ "./overlay": {
43
+ "types": "./dist/overlay/index.d.ts",
44
+ "import": "./dist/overlay/index.js"
45
+ },
46
+ "./icons": {
47
+ "types": "./dist/icons/index.d.ts",
48
+ "import": "./dist/icons/index.js"
49
+ },
50
+ "./menu": {
51
+ "types": "./dist/menu/index.d.ts",
52
+ "import": "./dist/menu/index.js"
53
+ },
54
+ "./dialog": {
55
+ "types": "./dist/dialog/index.d.ts",
56
+ "import": "./dist/dialog/index.js"
57
+ },
58
+ "./styles.css": "./src/styles/index.css"
59
+ },
60
+ "scripts": {
61
+ "build": "vite build && tsc -p tsconfig.build.json",
62
+ "dev": "vite build --watch",
63
+ "prepublishOnly": "npm run build"
64
+ },
65
+ "peerDependencies": {
66
+ "@umamichi-ui/common-css": ">=0.8.0",
67
+ "react": "^18.0.0 || ^19.0.0",
68
+ "react-dom": "^18.0.0 || ^19.0.0"
69
+ },
70
+ "devDependencies": {
71
+ "@types/react": "^19.2.2",
72
+ "@types/react-dom": "^19.2.2",
73
+ "@umamichi-ui/common-css": "^0.8.0",
74
+ "@vitejs/plugin-react": "^5.1.0",
75
+ "react": "^19.2.0",
76
+ "react-dom": "^19.2.0",
77
+ "typescript": "^5.9.3",
78
+ "vite": "^7.1.12",
79
+ "vite-plugin-dts": "^4.5.4"
80
+ }
81
+ }
@@ -0,0 +1,117 @@
1
+ .about-dialog {
2
+ width: min(calc(100vw - 48px), 36rem);
3
+ max-width: min(calc(100vw - 48px), 36rem);
4
+ }
5
+
6
+ .about-dialog-body {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 0;
10
+ }
11
+
12
+ .about-dialog-product {
13
+ text-align: center;
14
+ }
15
+
16
+ .about-dialog-app-name {
17
+ margin: 0 0 6px;
18
+ font-size: 1.05rem;
19
+ font-weight: 600;
20
+ line-height: 1.35;
21
+ }
22
+
23
+ .about-dialog-version {
24
+ margin: 0 0 10px;
25
+ color: var(--site-muted-fg);
26
+ font-size: 0.92rem;
27
+ line-height: 1.4;
28
+ }
29
+
30
+ .about-dialog-channel {
31
+ color: var(--site-subtle-fg);
32
+ }
33
+
34
+ .about-dialog-tagline {
35
+ margin: 0;
36
+ color: var(--site-content-fg);
37
+ font-size: 0.9rem;
38
+ line-height: 1.55;
39
+ }
40
+
41
+ .about-dialog-copyright {
42
+ margin: 14px 0 0;
43
+ text-align: center;
44
+ color: var(--site-muted-fg);
45
+ font-size: 0.86rem;
46
+ }
47
+
48
+ .about-dialog-divider {
49
+ margin: 16px 0;
50
+ border: 0;
51
+ border-top: 1px solid var(--site-border);
52
+ }
53
+
54
+ .about-dialog-section + .about-dialog-section {
55
+ margin-top: 14px;
56
+ }
57
+
58
+ .about-dialog-section-title {
59
+ margin: 0 0 6px;
60
+ font-size: 0.82rem;
61
+ font-weight: 600;
62
+ letter-spacing: 0.04em;
63
+ color: var(--site-subtle-fg);
64
+ text-transform: uppercase;
65
+ }
66
+
67
+ .about-dialog-section-text {
68
+ margin: 0;
69
+ font-size: 0.9rem;
70
+ line-height: 1.55;
71
+ color: var(--site-content-fg);
72
+ }
73
+
74
+ .about-dialog-meta {
75
+ margin: 14px 0 0;
76
+ }
77
+
78
+ .about-dialog-meta-row {
79
+ display: grid;
80
+ grid-template-columns: 5.5rem minmax(0, 1fr);
81
+ gap: 8px 12px;
82
+ align-items: baseline;
83
+ font-size: 0.88rem;
84
+ line-height: 1.45;
85
+ }
86
+
87
+ .about-dialog-meta-row + .about-dialog-meta-row {
88
+ margin-top: 8px;
89
+ }
90
+
91
+ .about-dialog-meta dt {
92
+ margin: 0;
93
+ color: var(--site-muted-fg);
94
+ }
95
+
96
+ .about-dialog-meta dd {
97
+ margin: 0;
98
+ overflow-wrap: anywhere;
99
+ }
100
+
101
+ .about-dialog-meta-row:first-child dd a {
102
+ white-space: nowrap;
103
+ }
104
+
105
+ @media (max-width: 560px) {
106
+ .about-dialog-meta-row:first-child dd a {
107
+ white-space: normal;
108
+ }
109
+ }
110
+
111
+ .about-dialog-actions {
112
+ justify-content: center;
113
+ }
114
+
115
+ .about-dialog-actions .primary-button {
116
+ min-width: 6.5rem;
117
+ }
@@ -0,0 +1,3 @@
1
+ @import './overlay.css';
2
+ @import './mobile-action-sheet.css';
3
+ @import './about-dialog.css';
@@ -0,0 +1,166 @@
1
+ .mobile-action-sheet {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ max-height: min(85dvh, 100%);
6
+ box-sizing: border-box;
7
+ border-top: 1px solid var(--site-border);
8
+ background: var(--site-surface);
9
+ color: var(--site-fg);
10
+ opacity: 0;
11
+ transform: translateY(100%);
12
+ transition:
13
+ transform var(--transition-overlay, 0.22s ease),
14
+ opacity var(--transition-overlay, 0.22s ease);
15
+ padding-bottom: max(1rem, calc(env(safe-area-inset-bottom, 0px) + 2.5rem));
16
+ }
17
+
18
+ .mobile-action-sheet-panels {
19
+ display: flex;
20
+ width: 100%;
21
+ min-width: 0;
22
+ overflow: hidden;
23
+ transition: transform var(--transition-overlay, 0.22s ease);
24
+ }
25
+
26
+ .mobile-action-sheet-panels--slide {
27
+ width: 200%;
28
+ }
29
+
30
+ .mobile-action-sheet-panels--slide > .mobile-action-sheet-panel {
31
+ flex: 0 0 50%;
32
+ width: 50%;
33
+ }
34
+
35
+ .mobile-action-sheet-panel {
36
+ flex: 0 0 100%;
37
+ width: 100%;
38
+ min-width: 0;
39
+ overflow: auto;
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ .mobile-action-sheet-subheader {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 8px;
47
+ padding: 12px 12px 10px 8px;
48
+ border-bottom: 1px solid var(--site-border);
49
+ }
50
+
51
+ .mobile-action-sheet-back {
52
+ display: inline-flex;
53
+ flex-shrink: 0;
54
+ align-items: center;
55
+ justify-content: center;
56
+ width: 40px;
57
+ height: 40px;
58
+ padding: 0;
59
+ border: none;
60
+ border-radius: 0;
61
+ background: transparent;
62
+ color: inherit;
63
+ line-height: 0;
64
+ cursor: pointer;
65
+ }
66
+
67
+ .mobile-action-sheet-back-chevron {
68
+ display: block;
69
+ flex-shrink: 0;
70
+ }
71
+
72
+ .mobile-action-sheet-back:hover {
73
+ background: var(--site-hover-bg);
74
+ }
75
+
76
+ .mobile-action-sheet-subheader-title {
77
+ font-size: 1rem;
78
+ font-weight: 600;
79
+ line-height: 1.35;
80
+ }
81
+
82
+ .mobile-action-sheet-list {
83
+ margin: 0;
84
+ padding: 8px 0 0;
85
+ list-style: none;
86
+ }
87
+
88
+ .mobile-action-sheet-list-item {
89
+ margin: 0;
90
+ }
91
+
92
+ .mobile-action-sheet-item {
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: space-between;
96
+ gap: 12px;
97
+ width: 100%;
98
+ min-height: 52px;
99
+ padding: 14px 20px;
100
+ border: none;
101
+ border-radius: 0;
102
+ background: transparent;
103
+ color: inherit;
104
+ font: inherit;
105
+ font-size: 1rem;
106
+ line-height: 1.35;
107
+ text-align: left;
108
+ cursor: pointer;
109
+ }
110
+
111
+ .mobile-action-sheet-item:hover {
112
+ background: var(--site-hover-bg);
113
+ }
114
+
115
+ .mobile-action-sheet-item:active {
116
+ background: var(--site-active-bg);
117
+ }
118
+
119
+ .mobile-action-sheet-item:disabled {
120
+ opacity: 0.38;
121
+ cursor: not-allowed;
122
+ }
123
+
124
+ .mobile-action-sheet-item:disabled:hover,
125
+ .mobile-action-sheet-item:disabled:active {
126
+ background: transparent;
127
+ }
128
+
129
+ .mobile-action-sheet-item-icon {
130
+ display: inline-flex;
131
+ flex-shrink: 0;
132
+ align-items: center;
133
+ justify-content: center;
134
+ width: 24px;
135
+ height: 24px;
136
+ color: var(--site-header-fg, var(--site-fg));
137
+ }
138
+
139
+ .mobile-action-sheet-item-icon svg {
140
+ display: block;
141
+ }
142
+
143
+ .mobile-action-sheet-item-label {
144
+ flex: 1 1 auto;
145
+ min-width: 0;
146
+ }
147
+
148
+ .mobile-action-sheet-item-chevron {
149
+ display: block;
150
+ flex-shrink: 0;
151
+ color: var(--site-subtle-fg);
152
+ }
153
+
154
+ .mobile-action-sheet-separator {
155
+ height: 0;
156
+ margin: 0 20px;
157
+ border: none;
158
+ border-top: 1px solid var(--site-border);
159
+ }
160
+
161
+ @media (prefers-reduced-motion: reduce) {
162
+ .mobile-action-sheet,
163
+ .mobile-action-sheet-panels {
164
+ transition: none;
165
+ }
166
+ }
@@ -0,0 +1,61 @@
1
+ /* Full-viewport overlays(统一毛玻璃 backdrop,z-index 由 OverlayStack 内联设置) */
2
+ .site-overlay-backdrop {
3
+ position: fixed;
4
+ inset: 0;
5
+ width: 100%;
6
+ min-width: 100vw;
7
+ min-height: 100vh;
8
+ min-height: 100dvh;
9
+ margin: 0;
10
+ }
11
+
12
+ .site-overlay-backdrop-inactive {
13
+ pointer-events: none;
14
+ }
15
+
16
+ .site-overlay-backdrop--centered {
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ padding: 24px;
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ .site-overlay-backdrop--top {
25
+ display: flex;
26
+ align-items: flex-start;
27
+ justify-content: center;
28
+ padding: 20px;
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ .site-overlay-backdrop--bottom {
33
+ display: flex;
34
+ align-items: flex-end;
35
+ justify-content: stretch;
36
+ padding: 0;
37
+ box-sizing: border-box;
38
+ }
39
+
40
+ .site-overlay-backdrop--centered.is-open > .confirm-dialog,
41
+ .site-overlay-backdrop--centered.is-open > .modal-card,
42
+ .site-overlay-backdrop--centered.is-open > .example-modal,
43
+ .site-overlay-backdrop--top.is-open > .site-overlay-panel,
44
+ .site-overlay-backdrop--bottom.is-open > .mobile-action-sheet {
45
+ opacity: 1;
46
+ transform: translateY(0);
47
+ }
48
+
49
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
50
+ .site-overlay-backdrop {
51
+ background: var(--site-backdrop);
52
+ }
53
+ }
54
+
55
+ @media (prefers-reduced-transparency: reduce) {
56
+ .site-overlay-backdrop {
57
+ backdrop-filter: none;
58
+ -webkit-backdrop-filter: none;
59
+ background: var(--site-backdrop);
60
+ }
61
+ }