Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4c9a972
Add Superfluid Campaign GoodWidget
BountyCoder Jul 29, 2026
8dba121
Address review issues: ARIA, accessibility, SSR guard, dedup fallback…
Copilot Jul 29, 2026
16e8dc0
Split-scope follow-up: Claim SUP CTA, live airdrop-status hook, mobil…
BountyCoder Jul 30, 2026
98699ea
Address round-2 review feedback on Superfluid Campaign widget
BountyCoder Jul 30, 2026
fceb9c7
Add Superfluid Campaign GoodWidget
goodbounties-nanoclaw-agent[bot] Jul 29, 2026
d6e90cd
Address review issues: ARIA, accessibility, SSR guard, dedup fallback…
Copilot Jul 29, 2026
9421358
Split-scope follow-up: Claim SUP CTA, live airdrop-status hook, mobil…
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
a4040c6
Address round-2 review feedback on Superfluid Campaign widget
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
ac0035d
Merge branch 'feat/superfluid-campaign-widget' of github.com:GoodDoll…
L03TJ3 Jul 30, 2026
6de8c96
add: support for preview deployments on pull-requests
L03TJ3 Jul 30, 2026
6b7a814
Merge branch 'main' of github.com:GoodDollar/GoodWidget into feat/sup…
L03TJ3 Jul 30, 2026
5c35e36
add reactnativesvg shims in example apps
L03TJ3 Jul 30, 2026
fa14925
Wire leaderboard tabs to live Superfluid Points API
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
28a1904
Wire campaign 606's SUP totals to the live Superfluid programs API
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
b51b05b
Update Showcase stories to use real live data adapters
Copilot Jul 30, 2026
e6cd70c
Replace CORS-protected programs API with Superfluid Base subgraph query
Copilot Jul 30, 2026
b006f5d
Refine campaign widget copy/sizing and make action cards fully clickable
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
8fe7fd0
Update campaign description and how-to-participate copy (change reque…
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
f1f3169
Fix header and action-card overflow on narrow viewports (#130 change …
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
679177a
Fix flexWrap over-triggering unnecessary wraps in header/action-card …
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
e4f7244
Revert "Fix flexWrap over-triggering unnecessary wraps in header/acti…
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
9fef71b
Revert "Fix header and action-card overflow on narrow viewports (#130…
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
850f54e
Align leaderboard view spacing and header with content view
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
f9b1aaa
Fix Connect wallet button clipping/collapse in header rows
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
7feb739
Pin Leaderboard header close button top-right independent of CTA wrap
goodbounties-nanoclaw-agent[bot] Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions examples/html/src/shims/reactNativeSvg.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React from 'react'

type SvgElementProps = React.SVGProps<SVGSVGElement> & {
accessibilityRole?: string
}

type SvgGroupProps = React.SVGProps<SVGGElement> & {
rotation?: string | number
origin?: string
}

type SvgCircleProps = React.SVGProps<SVGCircleElement> & {
onPress?: () => void
}

/** Web implementation for the react-native-svg primitives used by GoodWidget dependencies. */
function Svg({ accessibilityRole: _accessibilityRole, ...props }: SvgElementProps) {
return <svg {...props} />
}

/** Mirrors react-native-svg's G transform props with standard SVG attributes. */
export function G({ rotation, origin, transform, ...props }: SvgGroupProps) {
const rotationTransform = rotation ? `rotate(${rotation} ${origin ?? ''})`.trim() : undefined
const combinedTransform = [transform, rotationTransform].filter(Boolean).join(' ')

return <g {...props} transform={combinedTransform || undefined} />
}

/** Maps react-native-svg onPress to the browser SVG onClick event. */
export function Circle({ onPress, ...props }: SvgCircleProps) {
return <circle {...props} onClick={onPress} />
}

/** Static SVG primitives used by @tamagui/lucide-icons need no prop translation. */
function createPassthroughSvgPrimitive(tag: string) {
return function SvgPrimitive(props: React.SVGProps<SVGElement>) {
return React.createElement(tag, props)
}
}

export const Path = createPassthroughSvgPrimitive('path')
export const Line = createPassthroughSvgPrimitive('line')
export const Rect = createPassthroughSvgPrimitive('rect')
export const Polygon = createPassthroughSvgPrimitive('polygon')
export const Polyline = createPassthroughSvgPrimitive('polyline')
export const Ellipse = createPassthroughSvgPrimitive('ellipse')

export { Svg }
export default Svg
5 changes: 5 additions & 0 deletions examples/html/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { defineConfig } from 'vite'
import { fileURLToPath } from 'node:url'

const reactNativeSvgShim = fileURLToPath(new URL('./src/shims/reactNativeSvg.tsx', import.meta.url))

export default defineConfig({
define: {
Expand All @@ -8,6 +11,8 @@ export default defineConfig({
resolve: {
alias: {
'react-native': 'react-native-web',
// react-native-svg's Fabric native modules are not available in react-native-web.
'react-native-svg': reactNativeSvgShim,
},
},
build: {
Expand Down
49 changes: 49 additions & 0 deletions examples/react-web/src/shims/reactNativeSvg.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React from 'react'

type SvgElementProps = React.SVGProps<SVGSVGElement> & {
accessibilityRole?: string
}

type SvgGroupProps = React.SVGProps<SVGGElement> & {
rotation?: string | number
origin?: string
}

type SvgCircleProps = React.SVGProps<SVGCircleElement> & {
onPress?: () => void
}

/** Web implementation for the react-native-svg primitives used by GoodWidget dependencies. */
function Svg({ accessibilityRole: _accessibilityRole, ...props }: SvgElementProps) {
return <svg {...props} />
}

/** Mirrors react-native-svg's G transform props with standard SVG attributes. */
export function G({ rotation, origin, transform, ...props }: SvgGroupProps) {
const rotationTransform = rotation ? `rotate(${rotation} ${origin ?? ''})`.trim() : undefined
const combinedTransform = [transform, rotationTransform].filter(Boolean).join(' ')

return <g {...props} transform={combinedTransform || undefined} />
}

/** Maps react-native-svg onPress to the browser SVG onClick event. */
export function Circle({ onPress, ...props }: SvgCircleProps) {
return <circle {...props} onClick={onPress} />
}

/** Static SVG primitives used by @tamagui/lucide-icons need no prop translation. */
function createPassthroughSvgPrimitive(tag: string) {
return function SvgPrimitive(props: React.SVGProps<SVGElement>) {
return React.createElement(tag, props)
}
}

export const Path = createPassthroughSvgPrimitive('path')
export const Line = createPassthroughSvgPrimitive('line')
export const Rect = createPassthroughSvgPrimitive('rect')
export const Polygon = createPassthroughSvgPrimitive('polygon')
export const Polyline = createPassthroughSvgPrimitive('polyline')
export const Ellipse = createPassthroughSvgPrimitive('ellipse')

export { Svg }
export default Svg
5 changes: 5 additions & 0 deletions examples/react-web/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { fileURLToPath } from 'node:url'

const reactNativeSvgShim = fileURLToPath(new URL('./src/shims/reactNativeSvg.tsx', import.meta.url))

export default defineConfig({
plugins: [react()],
Expand All @@ -11,6 +14,8 @@ export default defineConfig({
resolve: {
alias: {
'react-native': 'react-native-web',
// react-native-svg's Fabric native modules are not available in react-native-web.
'react-native-svg': reactNativeSvgShim,
},
},
optimizeDeps: {
Expand Down
1 change: 1 addition & 0 deletions examples/storybook/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"@goodwidget/streaming-widget": "workspace:*",
"@goodwidget/staking-migration-widget": "workspace:*",
"@goodwidget/ai-credits-widget": "workspace:*",
"@goodwidget/superfluid-campaign-widget": "workspace:*",
"@goodwidget/embed": "workspace:*",
"react": "^18.3.0",
"react-dom": "^18.3.0",
Expand Down
26 changes: 24 additions & 2 deletions examples/storybook/src/shims/reactNativeSvg.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ type SvgCircleProps = React.SVGProps<SVGCircleElement> & {
onPress?: () => void
}

/** Storybook web shim for the react-native-svg primitives used by the donut chart. */
export default function Svg({ accessibilityRole: _accessibilityRole, ...props }: SvgElementProps) {
/** Storybook web shim for the react-native-svg primitives used by the donut chart and @tamagui/lucide-icons. */
function Svg({ accessibilityRole: _accessibilityRole, ...props }: SvgElementProps) {
return <svg {...props} />
}

Expand All @@ -30,3 +30,25 @@ export function G({ rotation, origin, transform, ...props }: SvgGroupProps) {
export function Circle({ onPress, ...props }: SvgCircleProps) {
return <circle {...props} onClick={onPress} />
}

/**
* @tamagui/lucide-icons' generated icon components import Path/Line/Rect/Polygon/
* Polyline/Ellipse by name from react-native-svg purely to render static shapes —
* unlike Circle/G above there are no react-native-specific props to translate, so
* one passthrough factory covers all of them instead of five near-identical wrappers.
*/
function createPassthroughSvgPrimitive(tag: string) {
return function SvgPrimitive(props: React.SVGProps<SVGElement>) {
return React.createElement(tag, props)
}
}

export const Path = createPassthroughSvgPrimitive('path')
export const Line = createPassthroughSvgPrimitive('line')
export const Rect = createPassthroughSvgPrimitive('rect')
export const Polygon = createPassthroughSvgPrimitive('polygon')
export const Polyline = createPassthroughSvgPrimitive('polyline')
export const Ellipse = createPassthroughSvgPrimitive('ellipse')

export { Svg }
export default Svg
Loading
Loading