@shepai/cli 1.60.0 → 1.62.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/dist/src/presentation/web/components/common/action-button/action-button.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.js +7 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/action-button/action-button.stories.js +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +10 -1
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +20 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +68 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +23 -2
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +16 -3
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.js +14 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.js +2 -0
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.js +4 -1
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.js +1 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +14 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -1
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.js +13 -0
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.js +2 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +7 -13
- package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-notifications.js +18 -18
- package/dist/src/presentation/web/hooks/use-sound-action.d.ts +100 -0
- package/dist/src/presentation/web/hooks/use-sound-action.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-sound-action.js +42 -0
- package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts +6 -0
- package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-sound-action.stories.js +61 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/server/chunks/ssr/{_34627374._.js → _d3711354._.js} +2 -2
- package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -0
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_34627374._.js → _d3711354._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.tsx +9 -1
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +82 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +16 -2
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +29 -3
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +14 -2
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +17 -4
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.tsx +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx +14 -1
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx +6 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -1
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -1
- package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.tsx +14 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +2 -2
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +7 -12
- package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +20 -19
- package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.stories.tsx +107 -0
- package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.ts +53 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{bac5122e95f5c7eb.js → 13664c029245afc8.js} +1 -1
- package/web/.next/static/chunks/45f510f84c7c417d.css +2 -0
- package/web/.next/static/chunks/8e4c719503d9387e.js +1 -0
- package/web/.next/static/chunks/cd44f06f18e3425a.js +10 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/_34627374._.js.map +0 -1
- package/web/.next/static/chunks/1fe24572a810eafa.js +0 -10
- package/web/.next/static/chunks/7d3c5ae8f47e74cd.js +0 -1
- package/web/.next/static/chunks/8b2879f911a05b55.css +0 -2
- /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → 2z-UoCok36_D1hh1-N88G}/_buildManifest.js +0 -0
- /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → 2z-UoCok36_D1hh1-N88G}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → 2z-UoCok36_D1hh1-N88G}/_ssgManifest.js +0 -0
package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"node": {
|
|
3
|
-
"
|
|
3
|
+
"007a62721e1bc5362586b473fae8c3f95131819457": {
|
|
4
4
|
"workers": {
|
|
5
5
|
"app/_not-found/page": {
|
|
6
6
|
"moduleId": 66973,
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"filename": "src/presentation/web/app/actions/pick-folder.ts",
|
|
44
44
|
"exportedName": "pickFolder"
|
|
45
45
|
},
|
|
46
|
-
"
|
|
46
|
+
"6009aa3c55bba1ddde7b13bf164dcd3ca47c18796e": {
|
|
47
47
|
"workers": {
|
|
48
48
|
"app/page": {
|
|
49
49
|
"moduleId": 16555,
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"filename": "src/presentation/web/app/actions/approve-feature.ts",
|
|
59
59
|
"exportedName": "approveFeature"
|
|
60
60
|
},
|
|
61
|
-
"
|
|
61
|
+
"60cfc37a2191fd62989f5c7336084946887366097e": {
|
|
62
62
|
"workers": {
|
|
63
63
|
"app/page": {
|
|
64
64
|
"moduleId": 16555,
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"filename": "src/presentation/web/app/actions/reject-feature.ts",
|
|
74
74
|
"exportedName": "rejectFeature"
|
|
75
75
|
},
|
|
76
|
-
"
|
|
76
|
+
"4048eaf5f7609b4ef04f879498d18d73ca951fe1a6": {
|
|
77
77
|
"workers": {
|
|
78
78
|
"app/page": {
|
|
79
79
|
"moduleId": 16555,
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
|
|
89
89
|
"exportedName": "getFeatureArtifact"
|
|
90
90
|
},
|
|
91
|
-
"
|
|
91
|
+
"40957ee941603cfc08dfa297df5bb4a4349446eae2": {
|
|
92
92
|
"workers": {
|
|
93
93
|
"app/page": {
|
|
94
94
|
"moduleId": 16555,
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"filename": "src/presentation/web/app/actions/get-research-artifact.ts",
|
|
104
104
|
"exportedName": "getResearchArtifact"
|
|
105
105
|
},
|
|
106
|
-
"
|
|
106
|
+
"00800d322465815891a1a89a535319abbc467a4764": {
|
|
107
107
|
"workers": {
|
|
108
108
|
"app/page": {
|
|
109
109
|
"moduleId": 16555,
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"filename": "src/presentation/web/app/actions/get-workflow-defaults.ts",
|
|
119
119
|
"exportedName": "getWorkflowDefaults"
|
|
120
120
|
},
|
|
121
|
-
"
|
|
121
|
+
"40ccc596c8732aa1aea4988c8c4849c043d6e8cfd0": {
|
|
122
122
|
"workers": {
|
|
123
123
|
"app/page": {
|
|
124
124
|
"moduleId": 16555,
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
"filename": "src/presentation/web/app/actions/get-merge-review-data.ts",
|
|
134
134
|
"exportedName": "getMergeReviewData"
|
|
135
135
|
},
|
|
136
|
-
"
|
|
136
|
+
"4061cc10691887f77f67e764939de05c9e670098a2": {
|
|
137
137
|
"workers": {
|
|
138
138
|
"app/page": {
|
|
139
139
|
"moduleId": 16555,
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"filename": "src/presentation/web/app/actions/open-ide.ts",
|
|
149
149
|
"exportedName": "openIde"
|
|
150
150
|
},
|
|
151
|
-
"
|
|
151
|
+
"40a654c23471f5749fd5a822bb7bde886b4a18803d": {
|
|
152
152
|
"workers": {
|
|
153
153
|
"app/page": {
|
|
154
154
|
"moduleId": 16555,
|
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
"filename": "src/presentation/web/app/actions/open-shell.ts",
|
|
164
164
|
"exportedName": "openShell"
|
|
165
165
|
},
|
|
166
|
-
"
|
|
166
|
+
"4095e26b914b90885e19c106f328bf95e365943a01": {
|
|
167
167
|
"workers": {
|
|
168
168
|
"app/page": {
|
|
169
169
|
"moduleId": 16555,
|
|
@@ -178,7 +178,7 @@
|
|
|
178
178
|
"filename": "src/presentation/web/app/actions/open-folder.ts",
|
|
179
179
|
"exportedName": "openFolder"
|
|
180
180
|
},
|
|
181
|
-
"
|
|
181
|
+
"4028cbc8b7daaf40907e6b11b058b81357f988dce5": {
|
|
182
182
|
"workers": {
|
|
183
183
|
"app/page": {
|
|
184
184
|
"moduleId": 16555,
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
"filename": "src/presentation/web/app/actions/create-feature.ts",
|
|
194
194
|
"exportedName": "createFeature"
|
|
195
195
|
},
|
|
196
|
-
"
|
|
196
|
+
"40a5f2b9870c264affcc0afed840b19d7736760d09": {
|
|
197
197
|
"workers": {
|
|
198
198
|
"app/page": {
|
|
199
199
|
"moduleId": 16555,
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
"filename": "src/presentation/web/app/actions/delete-feature.ts",
|
|
209
209
|
"exportedName": "deleteFeature"
|
|
210
210
|
},
|
|
211
|
-
"
|
|
211
|
+
"40ec31fc0e50addf6a63fe78fd2265089ea6fc2436": {
|
|
212
212
|
"workers": {
|
|
213
213
|
"app/page": {
|
|
214
214
|
"moduleId": 16555,
|
|
@@ -223,7 +223,7 @@
|
|
|
223
223
|
"filename": "src/presentation/web/app/actions/add-repository.ts",
|
|
224
224
|
"exportedName": "addRepository"
|
|
225
225
|
},
|
|
226
|
-
"
|
|
226
|
+
"40f152f20c14e3edf19b73729aad8232a78f9bddcd": {
|
|
227
227
|
"workers": {
|
|
228
228
|
"app/page": {
|
|
229
229
|
"moduleId": 16555,
|
|
@@ -240,5 +240,5 @@
|
|
|
240
240
|
}
|
|
241
241
|
},
|
|
242
242
|
"edge": {},
|
|
243
|
-
"encryptionKey": "
|
|
243
|
+
"encryptionKey": "OdTyfJgxB9kSZVRPajI4sJD9Ig3KfcfHQ67zTSc0fRs="
|
|
244
244
|
}
|
|
@@ -24,7 +24,7 @@ function noop() {
|
|
|
24
24
|
// intentional no-op for stories
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
/** Default labeled button with outline variant. */
|
|
27
|
+
/** Default labeled button with outline variant. Plays "click" sound on press. */
|
|
28
28
|
export const Default: Story = {
|
|
29
29
|
args: {
|
|
30
30
|
onClick: noop,
|
package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.tsx
CHANGED
|
@@ -4,6 +4,7 @@ import type { LucideIcon } from 'lucide-react';
|
|
|
4
4
|
import { Loader2, CircleAlert } from 'lucide-react';
|
|
5
5
|
import { cn } from '@/lib/utils';
|
|
6
6
|
import { Button } from '@/components/ui/button';
|
|
7
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
7
8
|
|
|
8
9
|
export interface ActionButtonProps {
|
|
9
10
|
label: string;
|
|
@@ -29,13 +30,20 @@ export function ActionButton({
|
|
|
29
30
|
variant = 'outline',
|
|
30
31
|
size = 'sm',
|
|
31
32
|
}: ActionButtonProps) {
|
|
33
|
+
const clickSound = useSoundAction('click');
|
|
34
|
+
|
|
35
|
+
const handleClick = () => {
|
|
36
|
+
clickSound.play();
|
|
37
|
+
onClick();
|
|
38
|
+
};
|
|
39
|
+
|
|
32
40
|
return (
|
|
33
41
|
<Button
|
|
34
42
|
variant={variant}
|
|
35
43
|
size={size}
|
|
36
44
|
aria-label={label}
|
|
37
45
|
disabled={loading}
|
|
38
|
-
onClick={
|
|
46
|
+
onClick={handleClick}
|
|
39
47
|
className={cn(
|
|
40
48
|
'gap-1.5',
|
|
41
49
|
error && 'text-destructive hover:text-destructive',
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { Check } from 'lucide-react';
|
|
4
|
+
import { DrawerActionBar } from './drawer-action-bar';
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof DrawerActionBar> = {
|
|
7
|
+
title: 'Composed/DrawerActionBar',
|
|
8
|
+
component: DrawerActionBar,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'centered',
|
|
12
|
+
},
|
|
13
|
+
args: {
|
|
14
|
+
onApprove: fn().mockName('onApprove'),
|
|
15
|
+
approveLabel: 'Approve',
|
|
16
|
+
},
|
|
17
|
+
decorators: [
|
|
18
|
+
(Story) => (
|
|
19
|
+
<div className="w-[400px] rounded-md border">
|
|
20
|
+
<Story />
|
|
21
|
+
</div>
|
|
22
|
+
),
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export default meta;
|
|
27
|
+
type Story = StoryObj<typeof DrawerActionBar>;
|
|
28
|
+
|
|
29
|
+
/** Default — approve button only. Plays "approve" sound on click. */
|
|
30
|
+
export const Default: Story = {};
|
|
31
|
+
|
|
32
|
+
/** With approve icon. */
|
|
33
|
+
export const WithIcon: Story = {
|
|
34
|
+
args: {
|
|
35
|
+
approveLabel: 'Approve PRD',
|
|
36
|
+
approveIcon: <Check className="mr-1.5 h-4 w-4" />,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** With reject button. Plays "reject" sound on reject click, "approve" on approve. */
|
|
41
|
+
export const WithReject: Story = {
|
|
42
|
+
args: {
|
|
43
|
+
onReject: fn().mockName('onReject'),
|
|
44
|
+
approveLabel: 'Approve',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Processing state — buttons disabled, no sounds play. */
|
|
49
|
+
export const Processing: Story = {
|
|
50
|
+
args: {
|
|
51
|
+
onReject: fn().mockName('onReject'),
|
|
52
|
+
approveLabel: 'Approve',
|
|
53
|
+
isProcessing: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Rejecting state — buttons disabled. */
|
|
58
|
+
export const Rejecting: Story = {
|
|
59
|
+
args: {
|
|
60
|
+
onReject: fn().mockName('onReject'),
|
|
61
|
+
approveLabel: 'Approve',
|
|
62
|
+
isRejecting: true,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** With revision input and reject button. */
|
|
67
|
+
export const WithRevisionInput: Story = {
|
|
68
|
+
args: {
|
|
69
|
+
onReject: fn().mockName('onReject'),
|
|
70
|
+
approveLabel: 'Approve',
|
|
71
|
+
revisionPlaceholder: 'Ask AI to revise the plan...',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** Custom reject dialog title. */
|
|
76
|
+
export const CustomRejectTitle: Story = {
|
|
77
|
+
args: {
|
|
78
|
+
onReject: fn().mockName('onReject'),
|
|
79
|
+
approveLabel: 'Approve Plan',
|
|
80
|
+
rejectDialogTitle: 'Reject Plan',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
@@ -5,6 +5,7 @@ import { X } from 'lucide-react';
|
|
|
5
5
|
import { Button } from '@/components/ui/button';
|
|
6
6
|
import { RejectFeedbackDialog } from '@/components/common/reject-feedback-dialog';
|
|
7
7
|
import { DrawerRevisionInput } from '@/components/common/drawer-revision-input';
|
|
8
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
8
9
|
import type { DrawerActionBarProps } from './drawer-action-bar-config';
|
|
9
10
|
|
|
10
11
|
export function DrawerActionBar({
|
|
@@ -20,6 +21,8 @@ export function DrawerActionBar({
|
|
|
20
21
|
children,
|
|
21
22
|
}: DrawerActionBarProps) {
|
|
22
23
|
const [rejectDialogOpen, setRejectDialogOpen] = useState(false);
|
|
24
|
+
const approveSound = useSoundAction('approve');
|
|
25
|
+
const rejectSound = useSoundAction('reject');
|
|
23
26
|
const disabled = isProcessing || isRejecting;
|
|
24
27
|
|
|
25
28
|
return (
|
|
@@ -40,7 +43,10 @@ export function DrawerActionBar({
|
|
|
40
43
|
variant="outline"
|
|
41
44
|
className="text-destructive hover:text-destructive"
|
|
42
45
|
disabled={disabled}
|
|
43
|
-
onClick={() =>
|
|
46
|
+
onClick={() => {
|
|
47
|
+
rejectSound.play();
|
|
48
|
+
setRejectDialogOpen(true);
|
|
49
|
+
}}
|
|
44
50
|
>
|
|
45
51
|
<X className="mr-1.5 h-4 w-4" />
|
|
46
52
|
Reject
|
|
@@ -54,7 +60,15 @@ export function DrawerActionBar({
|
|
|
54
60
|
/>
|
|
55
61
|
</>
|
|
56
62
|
) : null}
|
|
57
|
-
<Button
|
|
63
|
+
<Button
|
|
64
|
+
type="button"
|
|
65
|
+
className="flex-1"
|
|
66
|
+
disabled={disabled}
|
|
67
|
+
onClick={() => {
|
|
68
|
+
approveSound.play();
|
|
69
|
+
onApprove();
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
58
72
|
{approveIcon}
|
|
59
73
|
{approveLabel}
|
|
60
74
|
</Button>
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
CheckIcon,
|
|
15
15
|
} from 'lucide-react';
|
|
16
16
|
import { cn } from '@/lib/utils';
|
|
17
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
17
18
|
import {
|
|
18
19
|
Drawer,
|
|
19
20
|
DrawerContent,
|
|
@@ -93,6 +94,9 @@ export function FeatureCreateDrawer({
|
|
|
93
94
|
features,
|
|
94
95
|
initialParentId,
|
|
95
96
|
}: FeatureCreateDrawerProps) {
|
|
97
|
+
const drawerOpenSound = useSoundAction('drawer-open');
|
|
98
|
+
const drawerCloseSound = useSoundAction('drawer-close');
|
|
99
|
+
const createSound = useSoundAction('create');
|
|
96
100
|
const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;
|
|
97
101
|
const defaultPush = workflowDefaults?.push ?? false;
|
|
98
102
|
const defaultOpenPr = workflowDefaults?.openPr ?? false;
|
|
@@ -105,6 +109,13 @@ export function FeatureCreateDrawer({
|
|
|
105
109
|
const [openPr, setOpenPr] = useState(defaultOpenPr);
|
|
106
110
|
const [parentId, setParentId] = useState<string | undefined>(undefined);
|
|
107
111
|
|
|
112
|
+
// Play drawer-open sound when the drawer opens
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
if (open) {
|
|
115
|
+
drawerOpenSound.play();
|
|
116
|
+
}
|
|
117
|
+
}, [open, drawerOpenSound]);
|
|
118
|
+
|
|
108
119
|
// Sync state when workflowDefaults load asynchronously
|
|
109
120
|
useEffect(() => {
|
|
110
121
|
if (workflowDefaults) {
|
|
@@ -134,17 +145,19 @@ export function FeatureCreateDrawer({
|
|
|
134
145
|
const handleOpenChange = useCallback(
|
|
135
146
|
(nextOpen: boolean) => {
|
|
136
147
|
if (!nextOpen) {
|
|
148
|
+
drawerCloseSound.play();
|
|
137
149
|
resetForm();
|
|
138
150
|
onClose();
|
|
139
151
|
}
|
|
140
152
|
},
|
|
141
|
-
[onClose, resetForm]
|
|
153
|
+
[onClose, resetForm, drawerCloseSound]
|
|
142
154
|
);
|
|
143
155
|
|
|
144
156
|
const handleSubmit = useCallback(
|
|
145
157
|
(e: React.FormEvent) => {
|
|
146
158
|
e.preventDefault();
|
|
147
159
|
if (!name.trim()) return;
|
|
160
|
+
createSound.play();
|
|
148
161
|
const trimmedDescription = description.trim() || undefined;
|
|
149
162
|
onSubmit({
|
|
150
163
|
name: name.trim(),
|
|
@@ -160,6 +173,7 @@ export function FeatureCreateDrawer({
|
|
|
160
173
|
openPr,
|
|
161
174
|
...(parentId ? { parentId } : {}),
|
|
162
175
|
});
|
|
176
|
+
resetForm();
|
|
163
177
|
},
|
|
164
178
|
[
|
|
165
179
|
name,
|
|
@@ -171,6 +185,8 @@ export function FeatureCreateDrawer({
|
|
|
171
185
|
push,
|
|
172
186
|
openPr,
|
|
173
187
|
parentId,
|
|
188
|
+
createSound,
|
|
189
|
+
resetForm,
|
|
174
190
|
]
|
|
175
191
|
);
|
|
176
192
|
|
|
@@ -198,7 +214,10 @@ export function FeatureCreateDrawer({
|
|
|
198
214
|
<button
|
|
199
215
|
type="button"
|
|
200
216
|
aria-label="Close"
|
|
201
|
-
onClick={
|
|
217
|
+
onClick={() => {
|
|
218
|
+
drawerCloseSound.play();
|
|
219
|
+
onClose();
|
|
220
|
+
}}
|
|
202
221
|
className="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden"
|
|
203
222
|
>
|
|
204
223
|
<XIcon className="size-4" />
|
|
@@ -357,7 +376,14 @@ export function FeatureCreateDrawer({
|
|
|
357
376
|
{/* Footer */}
|
|
358
377
|
<Separator />
|
|
359
378
|
<DrawerFooter className="flex-row justify-end gap-2">
|
|
360
|
-
<Button
|
|
379
|
+
<Button
|
|
380
|
+
variant="outline"
|
|
381
|
+
onClick={() => {
|
|
382
|
+
drawerCloseSound.play();
|
|
383
|
+
onClose();
|
|
384
|
+
}}
|
|
385
|
+
disabled={isSubmitting}
|
|
386
|
+
>
|
|
361
387
|
Cancel
|
|
362
388
|
</Button>
|
|
363
389
|
<Button type="submit" form="create-feature-form" disabled={!name.trim() || isSubmitting}>
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { XIcon, Loader2, Trash2, ExternalLink, GitCommitHorizontal } from 'lucide-react';
|
|
4
4
|
import { PrStatus } from '@shepai/core/domain/generated/output';
|
|
5
5
|
import { cn } from '@/lib/utils';
|
|
6
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
6
7
|
import { OpenActionMenu } from '@/components/common/open-action-menu';
|
|
7
8
|
import {
|
|
8
9
|
Drawer,
|
|
@@ -44,6 +45,9 @@ export function FeatureDrawer({
|
|
|
44
45
|
onDelete,
|
|
45
46
|
isDeleting = false,
|
|
46
47
|
}: FeatureDrawerProps) {
|
|
48
|
+
const drawerOpenSound = useSoundAction('drawer-open');
|
|
49
|
+
const drawerCloseSound = useSoundAction('drawer-close');
|
|
50
|
+
|
|
47
51
|
return (
|
|
48
52
|
<Drawer
|
|
49
53
|
direction="right"
|
|
@@ -51,7 +55,12 @@ export function FeatureDrawer({
|
|
|
51
55
|
handleOnly
|
|
52
56
|
open={selectedNode !== null}
|
|
53
57
|
onOpenChange={(open) => {
|
|
54
|
-
if (
|
|
58
|
+
if (open) {
|
|
59
|
+
drawerOpenSound.play();
|
|
60
|
+
} else {
|
|
61
|
+
drawerCloseSound.play();
|
|
62
|
+
onClose();
|
|
63
|
+
}
|
|
55
64
|
}}
|
|
56
65
|
>
|
|
57
66
|
<DrawerContent direction="right" className="w-96" showCloseButton={false}>
|
|
@@ -61,7 +70,10 @@ export function FeatureDrawer({
|
|
|
61
70
|
<button
|
|
62
71
|
type="button"
|
|
63
72
|
aria-label="Close"
|
|
64
|
-
onClick={
|
|
73
|
+
onClick={() => {
|
|
74
|
+
drawerCloseSound.play();
|
|
75
|
+
onClose();
|
|
76
|
+
}}
|
|
65
77
|
className="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden"
|
|
66
78
|
>
|
|
67
79
|
<XIcon className="size-4" />
|
|
@@ -194,7 +194,7 @@ const mockData: PrdQuestionnaireData = {
|
|
|
194
194
|
finalAction: mockFinalAction,
|
|
195
195
|
};
|
|
196
196
|
|
|
197
|
-
/** Default state — first step shown, no selections. Click options to auto-advance. */
|
|
197
|
+
/** Default state — first step shown, no selections. Click options to auto-advance. Plays "select" on option click, "navigate" on step/nav buttons. */
|
|
198
198
|
export const Default: Story = {
|
|
199
199
|
render: () => <InteractiveQuestionnaire data={mockData} />,
|
|
200
200
|
};
|
|
@@ -6,6 +6,7 @@ import { cn } from '@/lib/utils';
|
|
|
6
6
|
import { Button } from '@/components/ui/button';
|
|
7
7
|
import { Badge } from '@/components/ui/badge';
|
|
8
8
|
import { DrawerActionBar } from '@/components/common/drawer-action-bar';
|
|
9
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
9
10
|
import type { PrdQuestionnaireProps } from './prd-questionnaire-config';
|
|
10
11
|
|
|
11
12
|
export function PrdQuestionnaire({
|
|
@@ -20,6 +21,8 @@ export function PrdQuestionnaire({
|
|
|
20
21
|
}: PrdQuestionnaireProps) {
|
|
21
22
|
const { question, context, questions, finalAction } = data;
|
|
22
23
|
const [currentStep, setCurrentStep] = useState(0);
|
|
24
|
+
const selectSound = useSoundAction('select');
|
|
25
|
+
const navigateSound = useSoundAction('navigate');
|
|
23
26
|
|
|
24
27
|
const total = questions.length;
|
|
25
28
|
const isFirstStep = currentStep === 0;
|
|
@@ -30,13 +33,14 @@ export function PrdQuestionnaire({
|
|
|
30
33
|
|
|
31
34
|
const handleSelect = useCallback(
|
|
32
35
|
(questionId: string, optionId: string) => {
|
|
36
|
+
selectSound.play();
|
|
33
37
|
onSelect(questionId, optionId);
|
|
34
38
|
// Auto-advance to the next step after selection (unless last step)
|
|
35
39
|
if (!isLastStep) {
|
|
36
40
|
setTimeout(() => setCurrentStep((s) => s + 1), 250);
|
|
37
41
|
}
|
|
38
42
|
},
|
|
39
|
-
[onSelect, isLastStep]
|
|
43
|
+
[onSelect, isLastStep, selectSound]
|
|
40
44
|
);
|
|
41
45
|
|
|
42
46
|
if (total === 0) return null;
|
|
@@ -73,7 +77,10 @@ export function PrdQuestionnaire({
|
|
|
73
77
|
idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '',
|
|
74
78
|
idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''
|
|
75
79
|
)}
|
|
76
|
-
onClick={() =>
|
|
80
|
+
onClick={() => {
|
|
81
|
+
navigateSound.play();
|
|
82
|
+
setCurrentStep(idx);
|
|
83
|
+
}}
|
|
77
84
|
/>
|
|
78
85
|
))}
|
|
79
86
|
</div>
|
|
@@ -129,7 +136,10 @@ export function PrdQuestionnaire({
|
|
|
129
136
|
variant="ghost"
|
|
130
137
|
size="sm"
|
|
131
138
|
disabled={isFirstStep || isProcessing}
|
|
132
|
-
onClick={() =>
|
|
139
|
+
onClick={() => {
|
|
140
|
+
navigateSound.play();
|
|
141
|
+
setCurrentStep((s) => s - 1);
|
|
142
|
+
}}
|
|
133
143
|
>
|
|
134
144
|
<ChevronLeft className="mr-1 h-4 w-4" />
|
|
135
145
|
Previous
|
|
@@ -141,7 +151,10 @@ export function PrdQuestionnaire({
|
|
|
141
151
|
variant="ghost"
|
|
142
152
|
size="sm"
|
|
143
153
|
disabled={isProcessing}
|
|
144
|
-
onClick={() =>
|
|
154
|
+
onClick={() => {
|
|
155
|
+
navigateSound.play();
|
|
156
|
+
setCurrentStep((s) => s + 1);
|
|
157
|
+
}}
|
|
145
158
|
>
|
|
146
159
|
{selections[currentQuestion.id] ? 'Next' : 'Skip'}
|
|
147
160
|
<ChevronRight className="ml-1 h-4 w-4" />
|
|
@@ -25,8 +25,10 @@ const meta: Meta<typeof SidebarCollapseToggle> = {
|
|
|
25
25
|
export default meta;
|
|
26
26
|
type Story = StoryObj<typeof meta>;
|
|
27
27
|
|
|
28
|
+
/** Expanded state — clicking plays "collapse" sound. */
|
|
28
29
|
export const Expanded: Story = {};
|
|
29
30
|
|
|
31
|
+
/** Collapsed state — clicking plays "expand" sound. */
|
|
30
32
|
export const Collapsed: Story = {
|
|
31
33
|
decorators: [
|
|
32
34
|
(Story) => (
|
|
@@ -4,6 +4,7 @@ import { PanelLeft } from 'lucide-react';
|
|
|
4
4
|
import { useSidebar } from '@/components/ui/sidebar';
|
|
5
5
|
import { Button } from '@/components/ui/button';
|
|
6
6
|
import { cn } from '@/lib/utils';
|
|
7
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
7
8
|
|
|
8
9
|
export interface SidebarCollapseToggleProps {
|
|
9
10
|
className?: string;
|
|
@@ -11,8 +12,20 @@ export interface SidebarCollapseToggleProps {
|
|
|
11
12
|
|
|
12
13
|
export function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps) {
|
|
13
14
|
const { toggleSidebar, open } = useSidebar();
|
|
15
|
+
const expandSound = useSoundAction('expand');
|
|
16
|
+
const collapseSound = useSoundAction('collapse');
|
|
14
17
|
const label = open ? 'Collapse sidebar' : 'Expand sidebar';
|
|
15
18
|
|
|
19
|
+
const handleClick = () => {
|
|
20
|
+
// Play sound based on current state (before toggle)
|
|
21
|
+
if (open) {
|
|
22
|
+
collapseSound.play();
|
|
23
|
+
} else {
|
|
24
|
+
expandSound.play();
|
|
25
|
+
}
|
|
26
|
+
toggleSidebar();
|
|
27
|
+
};
|
|
28
|
+
|
|
16
29
|
return (
|
|
17
30
|
<div className={cn('flex', className)}>
|
|
18
31
|
<Button
|
|
@@ -20,7 +33,7 @@ export function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps)
|
|
|
20
33
|
variant="ghost"
|
|
21
34
|
size="icon"
|
|
22
35
|
className="size-7 cursor-pointer group-data-[collapsible=icon]:size-8!"
|
|
23
|
-
onClick={
|
|
36
|
+
onClick={handleClick}
|
|
24
37
|
aria-label={label}
|
|
25
38
|
>
|
|
26
39
|
<PanelLeft className="size-4" />
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
1
3
|
import Link from 'next/link';
|
|
2
4
|
import type { Route } from 'next';
|
|
3
5
|
import type { LucideIcon } from 'lucide-react';
|
|
4
6
|
import { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';
|
|
7
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
5
8
|
|
|
6
9
|
export interface SidebarNavItemProps {
|
|
7
10
|
icon: LucideIcon;
|
|
@@ -11,10 +14,12 @@ export interface SidebarNavItemProps {
|
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
export function SidebarNavItem({ icon: Icon, label, href, active = false }: SidebarNavItemProps) {
|
|
17
|
+
const navigateSound = useSoundAction('navigate');
|
|
18
|
+
|
|
14
19
|
return (
|
|
15
20
|
<SidebarMenuItem data-testid="sidebar-nav-item">
|
|
16
21
|
<SidebarMenuButton asChild isActive={active} tooltip={label}>
|
|
17
|
-
<Link href={href as Route}>
|
|
22
|
+
<Link href={href as Route} onClick={() => navigateSound.play()}>
|
|
18
23
|
<Icon />
|
|
19
24
|
<span>{label}</span>
|
|
20
25
|
</Link>
|
|
@@ -63,7 +63,7 @@ const meta: Meta<typeof TechDecisionsReview> = {
|
|
|
63
63
|
export default meta;
|
|
64
64
|
type Story = StoryObj<typeof TechDecisionsReview>;
|
|
65
65
|
|
|
66
|
-
/** Default — scrollable list of decisions taken. */
|
|
66
|
+
/** Default — scrollable list of decisions taken. "Other Options Considered" toggle plays expand/collapse sounds. */
|
|
67
67
|
export const Default: Story = {
|
|
68
68
|
args: {
|
|
69
69
|
data: mockData,
|
|
@@ -6,6 +6,7 @@ import Markdown from 'react-markdown';
|
|
|
6
6
|
import { Check, ChevronRight, GitCompareArrows, Layers } from 'lucide-react';
|
|
7
7
|
import { Badge } from '@/components/ui/badge';
|
|
8
8
|
import { DrawerActionBar } from '@/components/common/drawer-action-bar';
|
|
9
|
+
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
9
10
|
import type { TechDecisionsReviewProps, TechDecision } from './tech-decisions-review-config';
|
|
10
11
|
|
|
11
12
|
const markdownComponents: Components = {
|
|
@@ -46,6 +47,18 @@ const markdownComponents: Components = {
|
|
|
46
47
|
|
|
47
48
|
function DecisionCard({ decision, index }: { decision: TechDecision; index: number }) {
|
|
48
49
|
const [alternativesOpen, setAlternativesOpen] = useState(false);
|
|
50
|
+
const expandSound = useSoundAction('expand');
|
|
51
|
+
const collapseSound = useSoundAction('collapse');
|
|
52
|
+
|
|
53
|
+
const handleToggleAlternatives = () => {
|
|
54
|
+
// Play sound based on current state (before toggle)
|
|
55
|
+
if (alternativesOpen) {
|
|
56
|
+
collapseSound.play();
|
|
57
|
+
} else {
|
|
58
|
+
expandSound.play();
|
|
59
|
+
}
|
|
60
|
+
setAlternativesOpen((prev) => !prev);
|
|
61
|
+
};
|
|
49
62
|
|
|
50
63
|
return (
|
|
51
64
|
<div className="border-border rounded-lg border">
|
|
@@ -82,7 +95,7 @@ function DecisionCard({ decision, index }: { decision: TechDecision; index: numb
|
|
|
82
95
|
<div className="border-border border-t">
|
|
83
96
|
<button
|
|
84
97
|
type="button"
|
|
85
|
-
onClick={
|
|
98
|
+
onClick={handleToggleAlternatives}
|
|
86
99
|
className="text-muted-foreground hover:bg-muted/50 flex w-full items-center gap-1.5 px-4 py-3 text-xs font-medium transition-colors"
|
|
87
100
|
>
|
|
88
101
|
<ChevronRight
|
|
@@ -13,10 +13,12 @@ const meta: Meta<typeof ThemeToggle> = {
|
|
|
13
13
|
export default meta;
|
|
14
14
|
type Story = StoryObj<typeof meta>;
|
|
15
15
|
|
|
16
|
+
/** Default — click to toggle theme. Plays toggle-on (dark) or toggle-off (light) sound. */
|
|
16
17
|
export const Default: Story = {
|
|
17
18
|
render: () => <ThemeToggle />,
|
|
18
19
|
};
|
|
19
20
|
|
|
21
|
+
/** In context with label. Sounds play on each toggle click. */
|
|
20
22
|
export const InContext: Story = {
|
|
21
23
|
render: () => (
|
|
22
24
|
<div className="flex items-center gap-4 rounded-lg border p-4">
|