diff --git a/app/api/aura-flow/live-svg/route.ts b/app/api/aura-flow/live-svg/route.ts index d1b9ebc..3d5f4ab 100644 --- a/app/api/aura-flow/live-svg/route.ts +++ b/app/api/aura-flow/live-svg/route.ts @@ -10,7 +10,7 @@ import { ACT_CONSCIOUS, ACT_UNCONSCIOUS, INTEGRATION_PAIRS, -} from '@/components/humanDesign/hd-chart-data' +} from '@/shared/humanDesign/hd-chart-data' // Lib CenterName uses 'ego' / 'solarPlexus'; chart data uses 'heart' / 'solar' const LIB_TO_CHART: Record = { ego: 'heart', solarPlexus: 'solar' } diff --git a/components/humanDesign/BodyGraph.tsx b/components/humanDesign/BodyGraph.tsx index 619c547..d79878c 100644 --- a/components/humanDesign/BodyGraph.tsx +++ b/components/humanDesign/BodyGraph.tsx @@ -12,7 +12,7 @@ import { ACT_CONSCIOUS, ACT_UNCONSCIOUS, type ChartChannel, -} from './hd-chart-data' +} from '@/shared/humanDesign/hd-chart-data' export type { GateActivation, Activations } diff --git a/components/humanDesign/ChartView.tsx b/components/humanDesign/ChartView.tsx index 59be5c4..73aef79 100644 --- a/components/humanDesign/ChartView.tsx +++ b/components/humanDesign/ChartView.tsx @@ -7,7 +7,7 @@ import PlanetIcon from '@/components/humanDesign/PlanetIcon' import { fmtGate, fmtCenterName } from '@/utils/format' import BodyGraph, { type SelectionPayload, type AnnotationLabels } from '@/components/humanDesign/BodyGraph' import DetailDrawer from '@/components/humanDesign/DetailDrawer' -import { HD_GATES, HD_CENTERS_INFO, HD_CHANNELS } from '@/components/humanDesign/hd-chart-data' +import { HD_GATES, HD_CENTERS_INFO, HD_CHANNELS } from '@/shared/humanDesign/hd-chart-data' import { CENTER_INFO, CHANNEL_DEFS, diff --git a/components/humanDesign/DetailDrawer.tsx b/components/humanDesign/DetailDrawer.tsx index 2cf56b9..e736291 100644 --- a/components/humanDesign/DetailDrawer.tsx +++ b/components/humanDesign/DetailDrawer.tsx @@ -2,10 +2,10 @@ import { useEffect, useState } from 'react' import { fmtGate } from '@/utils/format' -import { HD_GATES, HD_CENTERS_INFO, type ChartChannel } from './hd-chart-data' +import { HD_GATES, HD_CENTERS_INFO, HD_CHANNELS, INTEGRATION_PAIRS, type ChartChannel } from '@/shared/humanDesign/hd-chart-data' import type { SelectionPayload } from './BodyGraph' -import { HD_TYPE_CONTENT, HD_PROFILE_CONTENT, HD_AUTHORITY_CONTENT, HD_DEFINITION_CONTENT } from './hd-summary-data' -import type { GateCrossData } from './hd-cross-data' +import { HD_TYPE_CONTENT, HD_PROFILE_CONTENT, HD_AUTHORITY_CONTENT, HD_DEFINITION_CONTENT } from '@/shared/humanDesign/hd-summary-data' +import type { GateCrossData } from '@/shared/humanDesign/hd-cross-data' interface DetailDrawerProps { selection: SelectionPayload | null @@ -20,7 +20,7 @@ export default function DetailDrawer({ selection, onClose, onJumpToGate }: Detai useEffect(() => { if (selection?.kind !== 'cross' || crossContent) return let cancelled = false - import('./hd-cross-data').then(m => { + import('@/shared/humanDesign/hd-cross-data').then(m => { if (!cancelled) setCrossContent(m.HD_CROSS_CONTENT) }) return () => { cancelled = true } @@ -146,26 +146,25 @@ export default function DetailDrawer({ selection, onClose, onJumpToGate }: Detai ) } else if (kind === 'integration') { - const integrationList = [ - { a: 10, b: 20, name: { zh: '覺醒通道', en: 'Awakening' }, desc: { zh: '你對「真不真實」有一種近乎本能的敏感,要求自己活得誠實有原則,這種處世態度讓身邊的人不自覺開始思考「我是不是也可以更做自己一點」。你只在乎「當下」,這種活在當下的能量是你給周圍人最大的禮物之一。', en: 'Awakening to self — authentic expression in the now.' } }, - { a: 10, b: 34, name: { zh: '探索通道', en: 'Exploration' }, desc: { zh: '你就是要走自己的路,當你按照自己的感覺和直覺行動,你會感覺對了、有力量。這條通道有個特別能量:當你真的活出自己的樣子,你身邊的人也會被感染,開始有勇氣去做自己。', en: "Acting in accordance with one's own convictions." } }, - { a: 10, b: 57, name: { zh: '生存力通道', en: 'Perfected Form' }, desc: { zh: '你有一種很難用邏輯解釋的化險為夷能力,脾中心有一套超靈敏的生存雷達,在危險靠近之前就悄悄提醒你。你的直覺靠「聽起來對不對」來判斷,前提是你要願意相信它。', en: "Intuition of one's own survival and self-expression." } }, - { a: 20, b: 34, name: { zh: '忙碌通道', en: 'Charisma' }, desc: { zh: '當你找到一件真心喜歡的事,你會整個人燃起來,精力充沛停不下來,旁邊的人光看著你就會被帶動。但不是每一件事都值得你去忙——只為你愛的事忙,才是這條通道最美的狀態。', en: 'The present-moment exhibitor. The power of being busy in the now.' } }, - { a: 34, b: 57, name: { zh: '力量通道', en: 'Power' }, desc: { zh: '這條通道讓你天生精力充沛,在關鍵時刻反應特別快特別準,在危機處理上特別厲害。你很自然地想替人療傷解決問題,但要先照顧好自己才能照顧好別人,選擇值得你投入力量的人和事。', en: 'Archetypal existence — perfect survival intuition.' } }, - ] + // 六條整合通道皆已存在於 HD_CHANNELS,直接依 INTEGRATION_PAIRS 篩選, + // 不重複維護一份名稱/說明;20-57 是複合圖形的主幹(trunk),與其餘四條 + // 支線(10-20/10-34/10-57/20-34/34-57)並列顯示,不特別區分。 + const integrationChannels = Array.from(INTEGRATION_PAIRS) + .map(pairId => HD_CHANNELS.find(ch => `${ch.from}-${ch.to}` === pairId)) + .filter((ch): ch is ChartChannel => !!ch) kicker = '整合' title = '整合通道' - sub = '四條整合通道' + sub = `${integrationChannels.length} 條整合通道` body = ( <>

這些通道代表你整體的整合力量與表達方式。

-

四條主要通道

+

{integrationChannels.length} 條主要通道

- {integrationList.map(ch => ( -
+ {integrationChannels.map(ch => ( +
{pick(ch.name)} - CH.{ch.a}—{ch.b} + CH.{ch.from}—{ch.to}

{pick(ch.desc)}

diff --git a/components/humanDesign/hd-cross-data.ts b/components/humanDesign/hd-cross-data.ts deleted file mode 100644 index cdd2ba3..0000000 --- a/components/humanDesign/hd-cross-data.ts +++ /dev/null @@ -1,940 +0,0 @@ -// Auto-generated from data/輪迴交叉.md -// Maps gate number → { intro, RAC/JC/LAC: { title, body } } -// RAC = 右角度交叉 (個人人生主題), JC = 並列交叉 (固定人生主題), LAC = 左角度交叉 (人際人生主題) - -export interface CrossEntry { - title: string - body: string -} - -export interface GateCrossData { - intro: string - RAC: CrossEntry | null - JC: CrossEntry | null - LAC: CrossEntry | null -} - -export const HD_CROSS_CONTENT: Record = { - 1: { - intro: `閘門1是關於創造力與自我表達的能量。太陽落在這個閘門的人,身上天生帶著一股很難被忽視的原創性。你不太會循規蹈矩地照著別人的劇本走,你有你自己的方式。`, - RAC: { title: `方向(人面獅身)`, body: `你知道埃及的人面獅身像嗎?幾千年來它就那樣靜靜地坐在那裡,指向某個遠方,沉默地告訴每個路過的人——前進,那個方向是對的。 -你也是這樣的人。 -不管在生活裡、在關係裡,還是在工作裡,人們常常會自然而然地來問你:「你覺得我該怎麼辦?」你對方向有種直覺,有時候你給的方向跟大家想的完全不一樣,聽起來甚至有點奇怪——但如果你是忠於自己的感受去說的,那它就是對的。 -不過有一件事要記得:指引方向,不等於你要幫人走完全程。你可以告訴別人該往哪裡走,然後鼓勵他們自己走過去。如果你發現自己老是要扛著別人往前跑,那就要停下來想一想,這段關係是不是有點失衡了。 -最後,每個人終究要為自己的人生負責。你也是。` }, - JC: { title: `創意的自我表達`, body: `你的內心裡有一條河,一直在流、一直在流,那條河叫做「創造力」。 -你很難不把自己的想法說出來、表達出來。有時候你會發現,你在跟人聊天的過程中,忍不住就開始分享你對這件事的看法、你對那件事的觀察——對方可能還沒有準備好聽這麼多,但你就是忍不住。 -這不是壞事,這是你的能量在流動。 -你最舒服的狀態,是有一段獨處的時間,讓你可以安靜地深入那些屬於你的創意想法。然後,在對的時機、對的人面前,把這些想法分享出去。 -記住:表達這件事是有時機的。當你學會等到對的時機再說,你會發現人們願意認真聽你說的東西,而且你的表達也真的改變了他們看世界的方式。` }, - LAC: { title: `反抗`, body: `「我就是跟別人不一樣。」 -如果你的太陽在閘門1,而且是人際人生主題,你大概對這句話非常有共鳴。 -你不是那種會乖乖跟著大家走、人家叫你往東你就往東的人。當你覺得一件事的做法有問題,或者有更好的可能,你自然就會往那個方向走——就算旁邊所有人都還在原地。 -這不是叛逆,這是你的設計。你來這裡,本來就不是為了重複別人已經做過的事。 -你會被那些有自己原則、有自己底線的人深深吸引;你也會很自然地欣賞那些敢於忠於自己的人。而那些只想讓你照規矩來的人,嗯,你可能就……慢慢地、安靜地,繼續過你自己的日子了。 -你的存在本身,就是在告訴這個世界:活出真實的自己,是可能的。` }, - }, - 2: { - intro: `閘門2的能量,是關於接納與回應。太陽在這個閘門的人,就像一塊磁鐵,不需要主動追,對的事情自然就會被吸過來。你最大的功課,是學會信任這種「等待」的力量。`, - RAC: { title: `方向(人面獅身)`, body: `同樣是「人面獅身」的主題,但你跟閘門1的版本有點不一樣。 -閘門1的人面獅身是比較外放的,帶著創意的火花去指引方向;而你的方向感,更像是從靜默中浮現出來的。你不一定能解釋為什麼,但你就是知道哪條路是對的——對你自己,也常常對身邊的人。 -有時候你會指向一個讓人覺得「這說得通嗎?」的方向,但如果你是忠於自己內在那個聲音的,那它通常就是對的。你的挑戰是:不要因為別人覺得你的方向奇怪,就開始懷疑自己。 -另外,給方向和扛責任是兩回事。你可以幫人指路,但不用幫人走完全程。` }, - JC: { title: `接納`, body: `你這輩子最重要的功課,叫做接納。 -不是那種勉強自己「好吧,算了」的接納,而是真正從內心相信:生命知道它在幹嘛。你天生帶著一種接受的能力——接受人、接受事、接受那些你控制不了的發展。 -但這不代表你是個沒主見的人。你只是很清楚,有些事情硬推是沒用的,等它自然來比較有效率。 -問題在於,當你被身邊那些積極衝刺的人帶著跑,可能會覺得自己是不是太被動了、太消極了。其實不是。你的設計本來就不是靠主動出擊來贏得人生,而是靠讓正確的事情找到你。信任這個過程,是你這輩子最重要的事。` }, - LAC: { title: `無知(天真爛漫)`, body: `「無知」聽起來好像不是什麼好事,但在這裡,它的意思其實比較接近**「純真」**。 -你天生不帶太多成見,對生命有一種孩子般的開放態度。你不太會用舊的框架去套新的狀況,這讓你在面對變化的時候反而比很多人更靈活。 -不過,你也可能因為這種純真,有時候會被環境帶著走,不確定自己真正想要什麼。你的課題是:在保持開放的同時,也要知道自己的底線在哪裡。因為你帶來的那份清新和無預設立場,是這個世界真的需要的——只是你自己也得先站穩腳步。` }, - }, - 3: { - intro: `閘門3的能量,跟突破、混亂、新秩序有關。如果你的太陽在閘門3,你的人生大概沒什麼「平平淡淡就好」——你是那種在混亂裡找到突破口的人。`, - RAC: { title: `突變`, body: `你這輩子的任務,就是帶來改變。 -不是那種計畫好的、按部就班的改變,而是那種忽然就不一樣了的突變。你可能自己都沒有意識到,但你出現在某個地方、做了某件事,然後那個地方就不一樣了。有時候這讓人覺得驚喜,有時候這讓人覺得措手不及。 -你的人生路上會有很多「混亂期」——那些看起來亂七八糟、好像什麼都不對勁的時刻。但其實那是突變發生前的準備狀態,就像蝴蝶破繭之前,在繭裡看起來也是一片混亂的。 -給自己耐心,也給那些身邊被你「突變」到的人一點緩衝時間。` }, - JC: { title: `秩序`, body: `你天生有一種想要把混亂變成秩序的內在驅動力。 -你看到一個情況亂了,你就想進去整理它。看到有人搞不清楚方向,你就想幫他們理出一條路。這是你的天賦,但有時候也會變成你的負擔——因為不是所有的混亂都需要被整理,也不是所有人都想被你整理。 -你的功課是:學會分辨什麼時候該出手,什麼時候該讓混亂自己找到它的秩序。你的存在本身就已經帶來一種穩定的能量,不需要每次都積極介入,才能發揮影響力。` }, - LAC: { title: `艱難(混亂中的開始)`, body: `人生對你來說,從來就不是一條好走的路——但你也不是那種會被路況嚇跑的人。 -你的人生主題叫「艱難」,不是在說你命苦,而是說你帶著一種在困難裡照樣往前走的能量。你的存在本身就告訴別人:事情很難,但還是可以做到。這對那些正在掙扎中的人來說,是非常有力量的示範。 -不過要注意:因為你習慣在艱難裡撐下去,有時候你會把不必要的辛苦也扛下來,覺得「人生本來就很難嘛,所以這個也正常」。其實不是所有的苦都值得吃的。你也可以選擇輕鬆一點的路。` }, - }, - 4: { - intro: `閘門4的能量,是關於解答與智識。太陽在這個閘門的人,腦袋裡永遠有很多想法在跑,而且你特別想把這些想法說出來、讓別人也懂。`, - RAC: { title: `說明`, body: `你有一種非常強的衝動,想要「說清楚」。 -不管是什麼事,你都想把它解釋得讓對方能懂。你腦子裡跑出一個想法,就很想立刻講出來——有時候講得讓人覺得「哇,這個人怎麼想到這個」,有時候則讓人覺得「等等,你在說什麼?」 -這就是你的挑戰:你說的東西本身可能很有洞見,但你說出來的方式,不一定每次都讓人聽得懂。 -語調和時機,是你這輩子需要練習的功課。當你放鬆、有條理地表達,你真的可以改變一個人的想法。但如果你在不對的時間、用跳躍式的方式說出來,對方可能只是點頭,然後完全沒接收到你想說的。` }, - JC: { title: `解決問題(找公式)`, body: `你的腦袋,是一台專門用來解題的機器。 -給你一個問題,你的大腦就會自動開始運轉,找規律、找公式、找解法。這是你非常真實的天賦,很多人解決不了的事情,你搞不好三兩下就想出答案了。 -但問題是:不是所有人都在找你幫他們解題。 有時候朋友跟你說一件事,他只是想讓你聽,不一定需要你立刻給出解決方案。你要學著分辨:對方是真的想要答案,還是只是需要有人陪他坐在問題裡一會兒。 -另外,你的解法有時候會很迂迴——你的思路可以從A繞到Z再繞回B,最後給出一個讓大家都沒想到的答案。但在你把這個答案說出來之前,記得先確認對方有準備好接收這麼「有創意」的路徑。` }, - LAC: { title: `反叛者(革命)`, body: `你天生就對不公義的事情過敏。 -你不需要有人告訴你「這樣不對」,你自己就能感覺到——這個制度有問題、這個做法在傷害人、這件事不應該就這樣算了。然後你就會想出手,想要改變它。 -你的能量裡帶著一種「革命者」的特質。你不是為了反叛而反叛,你是真的在乎公義、在乎那些被遺忘的人。但你也需要學會的是:你的能量是有限的,不是每一場仗都值得你打。 -用你的智識去找出真正有效的解方,比衝動地站出來抗議更能帶來改變。你天生有這個能力,學會在對的時機用它,你就會發現自己的影響力比想像中大得多。` }, - }, - 5: { - intro: `閘門5的能量,是關於時間感與韻律。太陽在這個閘門的人,有一種跟大多數人不一樣的內在時鐘,你的步調是你自己的,而且往往跟宇宙的節拍更接近。`, - RAC: { title: `意識`, body: `你這輩子最大的任務,是搞清楚「我們到底為什麼在這裡」。 -這聽起來很哲學,但對你來說,這不是什麼空洞的問題,而是你真的會一直在找答案——透過觀察人、觀察歷史、觀察生命裡不斷重複的模式,試著找出那個貫穿一切的底層邏輯。 -你有種很特別的能力:當別人還在問「發生了什麼事」,你已經在看「為什麼這件事會這樣發展」了。你的覺察力,會在不知不覺中點醒身邊的人,讓他們開始想到以前從沒想過的問題。 -但要小心一個陷阱——你的腦袋可能會一直轉,說服你要更積極、更努力、要做更多。其實對你來說,耐心等待、靜靜觀察,才是更適合你的節奏。` }, - JC: { title: `儀式與習慣`, body: `你的生命,是圍繞著儀式和習慣在運行的。 -這不是說你很無聊或者不知變通,而是說你有一套屬於自己的生活節奏,而那個節奏對你來說非常重要。你的早晨要怎麼開始、你的工作流程是什麼樣的、你需要哪些固定的空間和時間——這些對你來說不是小事,這些是讓你能夠正常運作的基礎。 -當有人打亂你的步調,你不一定會發脾氣,但你內心確實會覺得「哎,我被拉出來了」,然後你會感到一種很奇怪的不自在。 -你的功課是:在不得不配合外在世界的同時,也要保護好你自己的韻律。當你能夠按照自己的節奏活著,你反而會發現自己跟整個大自然的時間感非常吻合——就像四季不需要時鐘也能輪替,你也有自己的宇宙時鐘。` }, - LAC: { title: `分離`, body: `有時候,你需要先把自己抽離出來,才能找到自己。 -「分離」聽起來有點孤獨,但其實它說的是一種清醒——你需要有足夠的距離和空間,才能真正知道自己是誰、自己想要什麼。當你太投入別人的世界、太急著幫人、太想配合所有人的期待時,你反而會迷失。 -你的耐心和你那種超越一般人限制的開闊視野,是你最大的禮物。但這個禮物要在你先照顧好自己的前提下,才能真正發揮作用。 -不要急著跳進每一個需要幫助的情況裡。你出現的時機,比你出現的頻率,更重要。` }, - }, - 6: { - intro: `閘門6的能量,是關於情緒、衝突與親密。太陽在這個閘門的人,天生就跟人的情緒世界有著非常深的連結,你不怕進入複雜的情感地帶,甚至在那裡你反而如魚得水。`, - RAC: { title: `伊甸園`, body: `你這輩子,一直在找一個地方——一個充滿愛、充滿光、讓你感覺完整的地方。 -你心裡某個深處,有一份記憶,覺得人生應該是美好的、溫暖的、充滿愛的。但你一出生就發現,現實世界跟你記憶裡的樣子差很多。這種落差,可能讓你從小就覺得這個世界有點讓你失望。 -為了找到那份失落的圓滿,你可能去過各種地方、進出過各種關係、嘗試過各種人生體驗——試圖在外面找到那個「伊甸園」。 -但你最終會發現,那個地方一直在你裡面。當你在自己內心找到了真正的平靜,你就回到了伊甸園。然後,你就可以把這份光和喜悅,帶給你遇見的每一個人。` }, - JC: { title: `衝突解決`, body: `你天生是個橋梁。 -人與人之間的摩擦、情緒上的誤解、關係裡的裂縫——你好像特別擅長走進這些地方,然後把它們修補起來。你不怕情緒,你不怕衝突,因為你知道衝突背後往往有著更深的連結渴望。 -你內心深處有一種很強的驅動力,想要讓人和人之間能夠好好相處。你相信,不管差異有多大,我們都是可以找到共同點的。 -但要注意:不是每一場衝突都需要你來解決。 有時候你太投入,連不是你的戰場也跑進去了,最後搞得自己很累。學會分辨哪些是你真的被召喚去的情境,哪些只是你習慣性地想要介入,這是你這輩子的重要功課。` }, - LAC: { title: `地球層面`, body: `你是那種能把苦難變成智慧的人。 -人生裡那些很難的事情——情感的受傷、體制的不公平、各種高峰和低谷——你不只是能撐過去,你還能在撐過去之後,幫助別人也找到走出來的路。 -你會吸引各種人到你身邊,不管是弱勢的、還是有能力的,你都能跟他們建立連結,然後在適當的時候,給他們一個新的視角,讓他們把自己的困境看得不一樣。 -你的挑戰是:在幫別人的同時,保持自己情緒上的清明。 你很容易被拉進別人的情緒漩渦裡,然後忘了自己也需要岸邊。找到那個平衡點,你就能成為這個世界真正需要的那種調停者。` }, - }, - 7: { - intro: `閘門7的能量,是關於領導與指引方向。太陽在這個閘門的人,有一種很自然的能力,能看到哪條路是對的、然後把人帶到那個方向去——不管他們自己有沒有意識到這件事。`, - RAC: { title: `方向(人面獅身)`, body: `你跟閘門1、閘門13一樣,也是人面獅身的主題。但你的版本,是透過邏輯和經驗來給方向的。 -你不太靠直覺說「就是這樣」,你是真的想清楚了、看清楚了,然後給出一個有根據的方向。對於那些擔心未來、搞不清楚該怎麼走的人來說,你就是一盞很可靠的燈。 -不過,有一件事你要常常提醒自己:給方向,不等於要帶人走完全程。 你指出了路,然後讓對方自己走——這才是健康的互動。如果你一直覺得要對別人的人生負責,最終你會把自己搞得很累,而且對方也沒有真正學到獨立。 -你的類型和內在權威,會告訴你什麼時候該出聲,什麼時候該退到旁邊讓別人找自己的路。` }, - JC: { title: `互動`, body: `你的人生,是在社交互動裡展開的。 -你走到哪裡,都能找到值得連結的人和值得討論的話題。你能傾聽別人說得很深,深到有時候你比他們自己更了解他們在說什麼。然後你會給出一個洞見,讓對方的眼睛突然亮起來。 -但你有個習慣:說完就走。你把火點起來,把人聚在一起,分享了你的觀點,然後就移動到下一個地方去了——讓大家自己繼續。這不是不負責任,這就是你的方式。 -要注意的是,你說話的語調跟時機,很重要。你有時候說的東西太跳躍了,或者太超前,讓聽的人沒跟上。放慢一點、有條理地說,你的洞見才能真正被接收到,而不是讓人聽完只有一個問號。` }, - LAC: { title: `裝模作樣(面具)`, body: `你這輩子,是來扮演很多角色的。 -不是說你假,而是你有一種非凡的適應力,能夠根據當下的情況,自然地扮演最需要的那個角色。有時候你是傾聽者,有時候你是引導者,有時候你是那個把大家凝聚在一起的人。你甚至常常不知道自己已經改變了別人的人生——你出現了,做了什麼,然後走了,對方的世界就不一樣了。 -但這裡有一個陷阱:如果你太習慣扮演「救世主」的角色,習慣到把它當成你的責任,你就會把自己困住。你的人生不是專職幫別人收拾爛攤子的。 -學會優雅地遊走在各種情境之間——該進就進,該退就退。那才是你這個主題真正的藝術。` }, - }, - 8: { - intro: `閘門8的能量,是關於貢獻與創意的連結。太陽在這個閘門的人,天生就有一種能力,能讓人們看見自己最好的樣子,然後把他們凝聚在一起,朝著共同的方向前進。`, - RAC: { title: `轉移(感染)`, body: `你是個天生的啟蒙者。 -那些讓你覺得興奮的想法、那些你深信有價值的理念——你有一種神奇的本事,能讓這些東西「傳染」給身邊的人。不是透過說教,而是透過你真實的熱情和分享,讓人自然而然就被感染了。 -你的驅動力,來自你對貢獻的渴望。你真的很想對人類做點什麼有意義的事。這份驅動力本身沒有問題,但它有時也會跟你的欲望拉扯——你要搞清楚,現在這份衝動是真的「被召喚」,還是只是一時的衝動。 -當你很清楚自己真正的動力來源,你分享出去的東西就會帶著一種不一樣的重量,讓人真的接收到。` }, - JC: { title: `貢獻`, body: `你的人生,就是以身作則。 -你不需要站上講台跟大家說「你們應該要怎樣怎樣」,你只要真實地活出你自己,就已經在影響別人了。你的真誠和素質本身,就是一種示範,讓人看了之後自然想要提升自己的標準。 -但有一個微妙的地方需要注意:你強烈渴望合作、渴望和人一起做事,這份渴望有時會讓你太容易被他人的意見左右,搞到最後妥協了你自己最在意的那些事情。 -忠於自己,是你貢獻的前提。你必須先是你自己,才能真正貢獻你最好的東西給這個世界。` }, - LAC: { title: `不確定`, body: `你的存在,會讓人在面對不確定的時候,感到安心。 -你不需要說什麼大道理,你只要在那裡,就能讓人感覺「沒事的,一定有辦法的」。你很清楚,生命本來就是一個需要去活出來的謎,不是一個需要被解決的問題——而且你能把這份理解傳遞給身邊的人。 -你的最大挑戰,是決定把自己的注意力和能量給誰。因為你這個能力,會讓很多人想靠近你、想被你鼓勵、想被你照亮。如果你對每個人都來者不拒,你很快就會把自己榨乾。 -選擇性地投入,才能讓你的光持續發亮。` }, - }, - 9: { - intro: `閘門9的能量,是關於專注與細節。太陽在這個閘門的人,有種很強的能力,能夠把注意力精準地集中在某件事上,然後把那件事做得非常到位。`, - RAC: { title: `計畫`, body: `你這輩子,是為了讓你最重要的人過得更好而來的。 -不管是家人、親密朋友、還是你的工作夥伴——你天生就會把這些人放在心上,然後想方設法替他們打算、替他們規劃。你最滿足的狀態,就是身邊的人都過得好,而且那是因為你的貢獻。 -制定計畫,對你來說是本能,不需要努力。你能注意到別人根本沒發現的細節,然後用這些細節構築出一個完整的計畫。 -但這條路上也有個陷阱:你可能會同時想顧好自己,又想顧好所有你在乎的人——這就像同時騎兩匹馬,很容易失去平衡。你需要學會的是,當你感到兩邊都在拉扯的時候,要怎麼回到自己的感覺裡,而不是硬撐。` }, - JC: { title: `聚焦`, body: `你的超能力,是雷射般的專注力。 -你能在一片雜亂中,迅速抓到那個最關鍵的細節,然後像雷射一樣鎖定它。這讓你在需要精準和計畫的場合裡,是無可取代的人。 -不過,這個超能力有一個副作用——你的腦袋非常善於分析,所以有時候你會陷入過度思考的漩渦,把一件事從正反兩面繞上好幾圈,最後反而做不了決定。 -要記得:你的頭腦是消化想法的好工具,但它沒辦法給你內心真正的答案。最終,你還是要回到你的內在權威,讓它告訴你什麼值得全力聚焦,什麼可以放下。` }, - LAC: { title: `辨識`, body: `你來這裡,是要先把自己搞清楚,然後才能清楚地跟世界互動。 -你有個聰明的腦袋,但光有聰明的腦袋是不夠的——你還需要時間讓這份聰明轉化成智慧。你的人生,會透過各種嘗試和修正,一點一點地積累出你真正的判斷力。 -你有能力在一個計畫裡,找出那個大家都沒注意到的漏洞,然後在它還沒變成災難之前,就先補起來。這是別人非常需要的能力,但你也要學會不急著把答案說出來——等到對方真的準備好聽,你的話才會有效果。 -你最強的時候,是當你腳踏實地、不是在滿足自我、也不是在取悅別人的時候。` }, - }, - 10: { - intro: `閘門10的能量,是關於自我之愛與真實的行為。太陽在這個閘門的人,有種很強的自我意識,你非常清楚「我是誰」,而且你很難接受要你違背自己的那種要求。`, - RAC: { title: `愛的化身`, body: `你這輩子,是來學習愛的——對生命的愛、對自己的愛、對身邊每一個人的愛。 -但不是那種犧牲自我的愛,而是那種從內心真正充盈、然後自然流出去的愛。 -你的存在本身,就會讓人感覺被看見、被接納。你會讓人們打開心房,提醒他們我們都是相連的。特別是那些在社會邊緣、感覺被遺棄的人,在你身邊會感受到一種久違的溫暖。 -你的功課是:先學會愛自己。你可能很容易把愛給出去,但接受愛、照顧自己,對你來說反而不那麼習慣。那個你一直在外面找的東西——那份充盈和完整——其實從來都在你自己裡面。` }, - JC: { title: `機會(行為)`, body: `你的人生,是在持續尋找能讓事情往前推進的機會。 -你對身邊的人有很大的影響力,你會很自然地去觀察別人的行為,然後想要提供一些改善的建議——就算對方沒有開口問你。這是你的天賦,但也是你需要管理的習慣。 -要記得,別人的行為是別人的事。你可以提供溫和的引導,但不能替別人負責、也不能替別人活。 -你真正的功課,是活出你自己——讓你的人生本身成為一個活生生的機會,讓身邊的人光是看著你,就知道原來可以這樣活。` }, - LAC: { title: `預防`, body: `你有一種本事,就是在問題還沒發生之前,就已經看到它了。 -你看到朋友要走一條彎路,你看到一個計畫有個漏洞,你看到某個人正在往一個不好的方向走——然後你就很想阻止它。 -這個能力很珍貴,但它有個副作用:你可能會因此捲入別人的事務太深,有時甚至連對方有沒有請你都不管。 -真正的智慧,是知道什麼時候說,什麼時候安靜。有些錯誤是別人必須要自己走過去的,你幫他們繞開了,他們反而少了一個必要的成長機會。退後一步觀察,有時比立刻出手,更有力量。` }, - }, - 11: { - intro: `閘門11的能量,是關於想法與啟蒙。太陽在這個閘門的人,腦袋裡永遠在醞釀各種想法和概念,而且你天生相信這個世界可以更好——如果大家願意敞開心胸的話。`, - RAC: { title: `伊甸園`, body: `你心裡有一份記憶,覺得人生應該是充滿愛和光的——結果你一睜眼,現實跟你想的差很多。 -這個落差,是你這輩子的起點。你可能從小就覺得這個世界讓你失望,然後開始不停地找:在感情裡找、在旅行裡找、在各種體驗裡找,找那個能讓你感覺完整的地方。 -你找了很久,最後你會發現——你一直在找的那個伊甸園,從來都在你裡面。 -當你在自己內心找到那份光和平靜,你就不再需要從外面找了。然後,那道光會透過你的眼神、你的話語、你的存在,自然地傳遞給身邊的人。你在外面找的那份圓滿,其實是你自己帶來的禮物。` }, - JC: { title: `想法`, body: `你是一個天生的思想家,而且是那種想法多到需要找出口的那種。 -你的腦袋會自動地把事情跟哲學、跟宇宙的道理連在一起,然後你就想把這些想法說出來、分享出去。你看見別人看不見的可能性,你想到別人還沒想到的連結,而且你真心認為這些想法能讓世界更好。 -不過你也知道——並不是所有人都準備好要聽。有些想法,你說出來反而會讓對方困惑甚至害怕。有些洞見,是你跟存在之間的祕密,不需要說給每個人聽。 -你的功課,是找到那些真的準備好聆聽的人,然後把最好的想法給他們。其他的,就保留在心裡,繼續讓它在你的內在醞釀成更深的智慧。` }, - LAC: { title: `教育`, body: `你這輩子,是來讓更多人的眼界被打開的。 -你天生有教師的氣質,但你最好的教學方式,不一定是站在台上講課,而是那種更自然的分享——透過聊天、透過你說的故事、透過你對生命的態度,讓對方在不知不覺中,對自己的人生有了新的看法。 -你深信知識和教育是每個人都應該有的權利,你也相信當一個人的眼界打開了,他的人生就不一樣了。這是你最大的驅動力。 -但要注意:不是所有人都在同一個時間點準備好了。你的想法可能超前,你的理念可能太新,有些人現在還沒辦法消化。這沒關係,種下種子,讓它自己去發芽。` }, - }, - 12: { - intro: `閘門12的能量,是關於聲音的力量與謹慎表達。太陽在這個閘門的人,說出去的話有一種特別的重量,能觸動人、能改變人——但你也知道,說話這件事,時機和方式比內容本身更重要。`, - RAC: { title: `伊甸園`, body: `跟閘門11很像,你心裡也有一份對「美好世界」的嚮往,覺得人生本來應該充滿愛和光明——但現實一直在潑你冷水。 -你可能從小就對人的不誠實、不正直特別敏感,那種落差讓你受傷過,也讓你渴望回到那個沒有被汙染的純粹狀態。你可能在各種親密關係裡、各種情感體驗裡,試圖尋找那份失落的完整。 -然後,在某個時間點,你會體悟到:那個你一直在找的伊甸園,從來都在你裡面。那道光,你自己就帶著。當你找到了,你就能把它帶給別人。 -特別的是,你的太陽在閘門12,意味著你有能力透過你說話的方式,把這份光傳遞出去。你的聲音,在你找到自己的光之後,會有一種讓人安靜下來聆聽的力量。` }, - JC: { title: `謹慎(清晰表達)`, body: `你能看見別人看不見的事情,但這件事本身,對你來說既是天賦也是挑戰。 -你看見的那些事,有些是別人根本還沒準備好要聽的。如果你把所有看見的都說出來,可能會嚇到人,甚至被誤解。所以你需要學會一種藝術:知道什麼時候說,什麼時候保持沉默。 -這不是叫你壓抑自己,而是讓你的表達更有力量。當你在對的時機、對準備好的人,說出你真正看見的東西,那個效果會是震撼性的——它能打開一個人的頭腦,改變他看世界的方式。 -保持謹慎,不等於縮小自己。它只是意味著,你的話語值得被放在最能發揮力量的地方。` }, - LAC: { title: `教育`, body: `你有一種能力,能用言語打開別人的心房。 -不只是給資訊,而是那種真的讓對方感覺「哦,原來人生可以這樣看」的那種開啟。你能看見別人卡住的地方,然後用一句話或一個故事,讓他突然看見一扇他以為不存在的門。 -你的聲音,是你最大的工具。當你平靜、當你清明、當你說話的語調是穩的,你說的話就能直接觸及人心。但當你受壓力、當你不在自己的狀態時,同樣的話說出來,效果就完全不一樣了。 -所以,照顧好自己的狀態,才能讓你的教育能量真正流動。` }, - }, - 13: { - intro: `閘門13的能量,是關於傾聽與見證。太陽在這個閘門的人,天生有一種讓人想要靠近、想要傾訴的磁場。你不需要做什麼,人們就是會想跟你說他們的故事。`, - RAC: { title: `方向(人面獅身)`, body: `這也是人面獅身的主題,但你給方向的方式,是透過深度的傾聽。 -你先聽,然後你才說。而且你聽的方式跟別人不一樣——你不只聽對方說了什麼,你還能感受到對方說的話背後有什麼、沒說出來的又是什麼。然後,從那個深度的理解裡,你給出的指引,往往精準到讓人覺得你是一面鏡子。 -你會吸引到很多在人生中感到迷惘的人,他們來找你,是因為你的存在讓他們感覺安全,感覺自己會被好好聆聽。 -但要注意:讓人們覺得你隨時可以聽,跟你真的有時間和能量去聽,是兩件不一樣的事。你要學會分辨哪些故事是你真的被召喚去接收的,哪些只是把你的能量消耗掉而已。` }, - JC: { title: `傾聽者`, body: `你這輩子,是來收集人類故事的。 -不管走到哪裡,人們就是會跟你說他們的事——他們的喜怒哀樂、他們的祕密、他們的掙扎。你不一定做了什麼,你只是在那裡,然後他們就開口了。 -這是你天生的磁場,也是你的功課。因為你接收了太多人的故事,你需要知道怎麼讓這些故事「流過去」,而不是讓它們積在你身上。你是見證者,不是儲藏室。 -你最珍貴的天賦,是你從所有這些故事裡,慢慢積累出的那份對人類的深度理解。那份理解,在對的時機,能讓你給出讓人茅塞頓開的指引。` }, - LAC: { title: `喜劇(祕密守護者)`, body: `人們就是會告訴你祕密。 -不是因為你問了,而是因為在你身邊,他們就是感覺可以說。你天生有一種讓人放鬆警戒的特質,讓人覺得「這個人會懂我的」。 -但這也帶來一個挑戰:你知道了太多人的事情,你要很清楚自己的角色是見證,而不是評判,更不是傳遞。你聽到的那些話,是別人給你的信任,要好好珍惜。 -另外,你有時候也需要讓自己從「傾聽者」的角色裡退出來喘口氣。你不是每個人的樹洞,你也有自己的故事需要被人聽見。學會在給予和接收之間取得平衡,你的能量才能持續流動。` }, - }, - 14: { - intro: `閘門14的能量,是關於豐盛與資源的流動。太陽在這個閘門的人,你跟「錢」和「資源」之間有一種很特殊的關係——不是說你一定很有錢,而是說豐盛的流動跟你的能量狀態息息相關,你在對的狀態時,資源就會往你這裡聚集。`, - RAC: { title: `轉移(感染)`, body: `你是個天生的啟蒙者,差別在於你特別擅長讓人對「物質豐盛」這件事產生新的理解。 -那些你深信有價值的資產、理念、機會——你有一種神奇的本事,能讓它們「感染」給身邊的人。你不是在推銷,而是因為你自己真的很投入、很熱情,讓別人自然而然就想跟進。 -但要注意:你的熱情有時候跑得比別人快。當你已經對一件事燃起熊熊烈火,身邊的人可能還在暖身,你可能會感到有點孤單。這不是說你錯了,只是節奏的差異。清楚你自己真正被召喚投入的是什麼,那份能量就會更有穿透力。` }, - JC: { title: `富足(賦予力量)`, body: `你這輩子的功課,是學會欣賞豐盛——你自己的豐盛,還有身邊每個人的豐盛。 -你和安全感之間的關係很微妙。你感到安心的時候,資源好像自然就來了;你感到不安的時候,又會覺得哪裡都不對勁、融不進去。所以搞清楚「什麼讓你有安全感」,是你人生裡非常重要的功課。 -你有種很強的能量,能激勵人們去嘗試他們原本不敢嘗試的事。你喜歡推動人,喜歡看到人因為你而打開了新的可能性。這是你的天賦,但前提是你自己要先穩下來,從一個穩固的地方去推動,而不是帶著焦慮去激勵別人。` }, - LAC: { title: `不確定`, body: `你的存在,能讓充滿恐懼的人感到安心。 -你知道「黑暗只是缺乏光明」——這不只是一句漂亮話,你是真的感受得到的。你能幫助人們看見,他們以為走投無路的地方,其實還有路。 -但你自己要先搞清楚你的資源要給誰。你這種磁性,會吸引很多人來找你、想要你的支持和力量。如果你對所有人都來者不拒,遲早會把自己榨乾。學會辨別哪些人真的跟你有能量共鳴,哪些只是暫時需要你照亮一下,然後就可以自己走了。` }, - }, - 15: { - intro: `閘門15的能量,是關於人類行為的流動與生命韻律。太陽在這個閘門的人,天生對「人應該怎麼活」有一種很敏銳的感受,而且你非常在意大家有沒有好好地跟著生命的節拍走。`, - RAC: { title: `愛的化身`, body: `你這輩子,是來散播愛的。 -不是那種喊口號的愛,而是那種存在本身就讓人感覺被看見、被接納的愛。你天生有一種人道主義的關懷,你真的在乎每個人,真的覺得每個人在這個世界上都有它的位置和重要性。 -你會讓人感覺到生命在流動——你出現在哪裡,哪裡就會有一種「還好有你在」的感覺。對那些感覺跟世界格格不入的人,你的存在就像一個錨。 -你的功課是:先給自己足夠的愛。你可能很容易把時間和空間給別人,但忘了也要給自己。那份愛,要先從你自己開始流,才能真正流向別人。` }, - JC: { title: `極端`, body: `你的人生,是在各種極端之間流動的。 -這不代表你情緒不穩定,而是說你天生就能接觸到人性和生命的各個面向——從最低谷到最高峰,從最邊緣到最主流,你都能看見,也都能跟。就像一條河流,兩邊都是岸,但你同時感受得到兩岸的存在。 -這讓你特別能夠跟那些「活在邊緣」的人連結——那些感覺自己不被主流接納的人,在你身邊往往感到被理解。 -你要記得的是:你眼中的「正常」,跟別人的「正常」可能差很多。這不是問題,這就是你的設計。別讓別人的標準來評判你的生活方式。` }, - LAC: { title: `預防`, body: `你有一種本事,就是在事情還沒出問題之前,就已經看到它要出問題了。 -你很難眼睜睜看著別人走錯路,你想要阻止、想要提醒、想要讓大家少走些彎路。你的出發點是好的,這點毋庸置疑。 -但有個很微妙的地方需要留意:犯錯,也是很多人成長的必要過程。你如果每次都衝出來幫他們繞開那些錯誤,他們可能就少了一個重要的學習機會。 -最好的方式,不是「照我說的做」,而是「你有沒有想過這樣也許會⋯⋯」溫和地提示,然後讓對方自己做決定。你能給建議,但結果是他們的。` }, - }, - 16: { - intro: `閘門16的能量,是關於技藝、熱忱與辨識力。太陽在這個閘門的人,有一種很強的美感直覺,你很清楚什麼是好的、什麼是有潛能的——而且你對於自己真心喜歡的事情,可以全身心投入、精益求精。`, - RAC: { title: `計畫`, body: `你是個天生的計畫者,而且你做計畫的出發點,是讓你最在意的那些人過得更好。 -你的眼光很細,能看見別人沒注意到的細節,然後把這些細節組合成一個完整的計畫。你最滿足的狀態,就是你的家人、你的夥伴、你的社群——因為你的安排而過得更順、更好。 -但這條路上有個陷阱:你既想顧自己,又想顧所有人,有時候會覺得自己在走鋼索,兩邊都要照顧,卻又不確定哪邊更重要。這時候,不要靠頭腦強行分析,要回到你的感覺——你的身體和內在權威,會告訴你當下最重要的是什麼。` }, - JC: { title: `實驗與熱忱`, body: `你是個天生會去嘗試、去實驗的人,而且你特別擅長辨識「這個值得繼續做」和「這個沒有前途」的差別。 -你的熱忱,是你最大的資產。當你對一件事真的燃起來,你可以把它做得非常好、非常精煉。但如果你對一件事的熱忱消退了,你也很快就會知道,然後轉向下一個讓你心動的事。 -要注意的是:過度思考是你的一個慣性。你的腦袋很容易在「這樣做對嗎?」「要不要繼續?」「還有沒有更好的方式?」這些問題裡打轉,結果反而讓你陷入猶豫、干擾了你對技藝的追求。記得,你的內在權威比你的頭腦更知道答案。` }, - LAC: { title: `辨識`, body: `你來這裡,是要先把自己搞清楚,才能清楚地跟世界連結。 -你有一種很強的辨識力——你能快速評估一個人、一個機會、一個計畫,然後直覺地知道「這個有搞頭」或是「這個算了」。這個能力很珍貴,但你也需要時間去培養這份辨識力,讓它從直覺升級成真正的智慧。 -你可能有時候會太急著給評論,在全貌還沒出來之前就下結論。放慢一點,讓事情多發展一下,你的判斷會更精準。 -你最強的時候,是當你完全不是為了滿足自我、也不是為了取悅別人的時候——那時候你看到的東西,才是最真實的。` }, - }, - 17: { - intro: `閘門17的能量,是關於意見與邏輯。太陽在這個閘門的人,腦袋裡永遠有觀點,而且你的觀點通常很有根據、很有條理——你就是那種能一眼看出「這個邏輯有問題」的人。`, - RAC: { title: `服務`, body: `你來這裡,是要讓社會變得更好的。 -你的天賦,是能夠冷靜、有條理地評估哪裡出了問題,然後找到可以改善的方向。你不只看到問題,你還能清楚地說出「應該這樣改」——而且你說的通常都挺有道理。 -但有個陷阱要小心:你可能太容易只看到問題,然後越看越挑剔,最後把周圍的人都嚇跑了,反而失去了原本能幫你推動改善的支持者。 -真正有效的服務,不是「我看到你哪裡不對」,而是「讓我們一起找到更好的方式」。你的智識是你最大的武器,但要在對的時機、對的方式下發揮,它才能真正派上用場。` }, - JC: { title: `意見`, body: `你天生有很強的見解,而且你的意見通常能在討論中被採納——因為你說的真的有道理。 -問題在於,當你發現自己的觀點老是被接受,你可能會開始覺得「我的意見一定是最對的」,然後不自覺地把「原則」看得比「人」更重要。這個傾向,如果不加以留意,會讓你周圍的人慢慢地開始保持距離。 -你真正的使命,不是讓別人接受你的觀點,而是幫助別人找到他們自己對是非對錯的判斷。你是來啟發人思考的,不是來替人想好答案的。在對的時機說出對的話,然後讓對方自己去消化——這才是你意見能量最有力量的展現方式。` }, - LAC: { title: `動盪`, body: `你天生對不公義、不合理的體制非常敏感,而且你忍不住要站出來說話。 -你可能常常被人說是「麻煩製造者」,但你心裡清楚,你不是要找麻煩,你是真的覺得這樣下去不行,必須有人說出來。你的挑戰不是在針對誰,而是針對做事的方式和運作的體制。 -要記得一件很重要的事:你是來挑戰體制的,不是來挑戰人的。當你能把這兩件事分清楚,你的能量就能發揮最大的影響力,而不是每次都變成人與人之間的衝突收場。你看見的那些不合理,是真實存在的——你需要學的,是找到最有效的方式去撼動它。` }, - }, - 18: { - intro: `閘門18的能量,是關於修正與改善。太陽在這個閘門的人,有一種幾乎停不下來的衝動,想要讓事情變得更好——你的眼睛就是設計來發現哪裡可以改進的。`, - RAC: { title: `服務`, body: `你的人生目的,是透過服務讓這個社會更好。 -你有一種很冷靜、很合乎邏輯的評估能力,能看出哪些地方需要改進、哪些地方卡住了、哪些做法根本行不通——然後你就很想去修正它。這是很珍貴的天賦,真的是很多人所需要的。 -但你要小心一個坑:服務這件事,如果變成「攸關個人」——你覺得自己有責任拯救某個人、某件事——那份服務的純粹性就消失了,你也會開始累積怨懟。 -服務的本質,是關於讓這個世界更好,不是關於滿足某個特定的人或期待被感謝。你的類型和內在權威,會告訴你什麼時候該投入、怎麼投入。聽它的。` }, - JC: { title: `修正`, body: `你天生就是個修正者。 -走進一個房間、加入一個團隊、進入一段關係——你的眼睛幾乎是自動掃描模式,會馬上發現哪裡有缺陷、哪裡可以更好。這不是你在找麻煩,這是你的設計。 -你能夠改善幾乎任何人的生活,但前提是:你沒有把「改善」搞成「批評」。你修正的是體制和做法,不是那個人本身。這條界線,你要時時清楚。 -另外,有時候不必刻意出手,事情也會自然找到它自己的秩序。學會「刻意的暫停」——先等一下,看看情況會不會自己解決,再決定要不要介入。你的能量,值得放在真正需要你的地方。` }, - LAC: { title: `動盪`, body: `你對任何缺乏基本人類價值的情況,都有一種發自內心的憤慨。 -你很難接受不公義被當成「就這樣吧」。你會阻撓、會挑釁、會讓事情動起來——即使這讓你看起來像個麻煩製造者,你也覺得這是你必須做的事。 -而且你做這些,真的不是針對人的。你在挑戰的是那個讓人無法好好發展的體制和模式。問題是,對方常常感受不到這個區別,他們只覺得你在攻擊他們。 -所以你的功課是:找到一種方式,讓你的挑戰被聽見,而不是讓對方立刻豎起防衛牆。你看到的問題是真實的,你帶來的動盪也是必要的——關鍵是怎麼讓這份能量真正產生改變,而不只是製造衝突。` }, - }, - 19: { - intro: `閘門19的能量,是關於感知需求與連結。太陽在這個閘門的人,有一種非常敏銳的感受力,你能感覺到身邊每個人需要什麼——有時甚至比他們自己更清楚。`, - RAC: { title: `四個方向`, body: `你的人生,是在不斷測試各種體驗的極限,然後找到內在的平靜來消化這一切。 -你有時候不太明白為什麼自己會被某些體驗吸引、又被某些排斥,要到很久之後才恍然大悟——哦,原來那段時間是有意義的。 -你是那種海浪型的人:有時候很外向,積極投入所有人事物;有時候又會突然想安靜下來,坐在那裡沉思生命的各種面向。這兩種狀態對你來說都是真實的,不用覺得哪個才是「對的你」。 -要小心的是:不要試圖用頭腦來引導你的人生。你的頭腦可以提供很棒的解釋,但它不是你最好的導航工具。你的身體感受和內在權威,才是真正帶你走對路的那個東西。` }, - JC: { title: `需求`, body: `你對周遭每個人的需求,有一種幾乎像天線一樣的敏銳度。 -走進一個空間,你能立刻感覺到誰需要什麼、哪裡的能量不對、什麼東西缺了。這是一種很特別的禮物,但它同時也很消耗你——因為你感受到的東西太多了。 -你很容易被這種敏銳帶著走,不自覺地就跑去滿足你感受到的每一個需求,然後回過神來發現自己的能量已經快見底了。 -你的功課是學會一個選擇:感受到,不代表你必須回應。你可以感受到需求存在,然後評估——這個是我真的被召喚去的,還是我只是習慣性地想去幫?選擇性地回應,才能讓你持續保有這份珍貴的感知力。` }, - LAC: { title: `精緻`, body: `你對環境有一種美感上的要求,你就是無法在混亂裡感到自在。 -不管走到哪裡,你都會很自然地想要讓那個地方變得更好——更有秩序、更有美感、更有活力。你有一種創意能量,讓你能把所在的環境「精緻化」,讓它比你來之前更充實。 -但這也是你的挑戰:你可能太容易把自己投入到你「看到的每一個需要被改善的地方」,然後很快就被壓垮——特別是當你覺得「只有我看到,只有我能做」的時候。 -停下來想一想:是真的有人需要你現在介入,還是你只是習慣性地想要把每個混亂都整理好? 你的存在本身,就是一種帶來精緻的能量。不需要每次都親自動手,你出現在那裡,有時候已經足夠了。` }, - }, - 20: { - intro: `閘門20的能量,是關於當下這一刻。太陽在這個閘門的人,天生就有一種強烈的感受:現在最重要。不是過去,不是未來,就是此時此地。`, - RAC: { title: `沉睡鳳凰(未來轉變)`, body: `你是個骨子裡的浪漫主義者,一直在找那種「跟生命真正親密接觸」的感覺。 -你會追著夢想跑,快要抓到的時候,發現它好像又溜走了。然後你墜落了一下,然後再爬起來,然後又去追下一個。這種一燃一滅、一落一起的循環,其實就是你人生蛻變的方式——每次從灰燼裡站起來,你都變得更不一樣了。 -你的重大挑戰是:不要只是為了忙碌而忙碌。你很容易保持活躍,但活躍的目的是什麼?當你知道你為什麼而忙,那份能量就會變得非常有力量。 -還有一件事——當你開始太嚴肅地看待生命,轉折點就快到了。這時候不要抵抗,笑著面對它。生命想給你新的東西,但前提是你得先放鬆下來,才能接住它。` }, - JC: { title: `當下`, body: `你的人生主題,就是把自己和周圍的人,都拉回到當下這個時刻。 -你到哪裡,哪裡就會變得更有活力,因為你的存在本身就有一種「活在當下」的能量場。你不太有耐心追憶過去或規劃遙遠的未來,你想要的,就是現在,這裡,這件事。 -但有個地方要留意:你可能會太投入活動、太忙碌,結果反而跟你最重要的那些人失去連結。當你發現自己到處都是但好像哪裡都不是,就是你該停下來的信號。 -在那些能量耗盡的時刻,讓自己真的休息——重新找回跟內在的連結。你有群體、有人際、有責任感,但你自己的當下感受,也同樣重要。` }, - LAC: { title: `二元性`, body: `你永遠在同時騎兩匹馬——一匹叫「我自己」,一匹叫「我的群體」。 -你有強大的個人影響力,同時又深切渴望成為某個群體有貢獻的一部分。這兩種需求都是真實的,但它們有時候會拉扯你往不同的方向走,讓你覺得很分裂。 -你的功課,不是選邊站,而是學會在這兩者之間找到平衡。當你清楚自己的承諾——知道自己為什麼要這樣做、要跟哪些人做——你就能同時兼顧個人成就和群體貢獻。 -要當心一件事:如果你遭遇了失望和背叛,那通常是個訊號,說明你可能在試圖「拯救」某些人,或接管了不屬於你的責任。退後一步,讓每個人都為自己的人生負責。` }, - }, - 21: { - intro: `閘門21的能量,是關於控制與掌控。太陽在這個閘門的人,有一種非常強烈的內在衝動,想要讓身邊的事情按照你認為正確的方式運作。你不是愛管閒事,你只是真的覺得你知道怎樣最好。`, - RAC: { title: `緊張`, body: `你的存在本身,就會帶來一種緊張感——就像樂器上的弦,需要有適當的張力,才能發出正確的聲音。 -你能敏銳地察覺到身邊的人有哪裡沒有活出自己的真實,然後你就忍不住想要去推他們、去激怒他們做出改變。你這麼做的出發點通常是好的,但對方不一定這樣感受。 -你有憂鬱的傾向——這不是壞事,這是你探索自己內在深度的一個通道。當你允許你的創意能量流動,當你做你真心喜愛的事,那份沉重感就會轉化成深度的成就和滿足。 -最終的功課是:先從控制你自己能控制的事情開始——你住哪、你吃什麼、你的態度、你怎麼看待生命。這些你真的能掌握的事情,做好了,外在的平衡自然會跟著來。` }, - JC: { title: `控制`, body: `你天生就有一股衝動,想要在所有情況中取得控制——不管那個情況實際上需不需要你來控制。 -你的腦袋通常比別人快半步,在大家還沒動的時候,你已經評估完策略了。這是你的強項,但它也可能變成你的阻礙——當你太堅持要掌控一切,你不只把自己搞得很累,也把周圍的人搞得很累。 -你真正的天賦,其實是在謀略和評估:什麼行動是最好的,而且誰最有資格去執行它。有時候,你能做的最有創意的事,就是把控制權交給對的人。 -當你找到那個清明,知道什麼時候該出手、什麼時候該放手,你就成了那個在所有人都慌了的時候,能夠穩住場面的人。` }, - LAC: { title: `努力(先鋒)`, body: `你是個天生的先鋒。 -你不需要等到一切都準備好,你就是會先動起來——催化它、啟動它、讓它跑起來。你有一種天生的驅動力,要去帶領、要去推動事情往前走。 -你不一定需要待到最後才離開。你的角色,有時候就是點燃引信,然後讓事情自己發展。放手,把責任交給有能力的人繼續做,對你來說是個練習——但這是值得的。 -要小心「控制狂」模式。你真的有能力把事情做好,但緊緊抓著不放,只會消磨你和你身邊的人。保持客觀,相信對的做法會帶來對的盟友,然後你就能在更大的格局裡看到事情如何自然成形。` }, - }, - 22: { - intro: `閘門22的能量,是關於優雅、情緒與溝通。太陽在這個閘門的人,帶著一種內在的光輝,能夠深深地影響別人——透過你說的話、你的存在、甚至只是你的語調。`, - RAC: { title: `統領`, body: `人們會自然而然地看向你,覺得你有知識、有能力、可以擔起重責大任。 -你的領導力,不是強壓型的,而是那種有魅力、有智慧、讓人信服的那種。你的智慧很大一部分來自你對過去的廣闊視野——你知道什麼做法行得通、什麼不行。 -但有一個很重要的功課:謙遜。當你試圖強加你的意志給所有人,即使你的出發點是好的,最終也會遭到抵制。真正的領導者,是那個能讓人們心甘情願跟著走的人,而不是那個把所有人推著走的人。 -還有,優雅——這是你的力量。你越優雅、越慷慨,你的影響力就越大。用美來帶領人——不管是音樂、藝術、語言,還是你待人處事的方式。` }, - JC: { title: `優雅`, body: `你的人生,是要體現優雅的所有面向——身體的、情緒的、心靈的。 -你能看見別人看不見的東西。在其他人只看到牆的地方,你能看見門。在大家都覺得不可能的地方,你能看見潛能。這是很珍貴的天賦,但它也意味著你常常走在別人理解的前面,而且喜歡走自己的路。 -你是個浪漫的人,可以無來由地愛上一個人、一件事、一個地方。這不是衝動,這是你的天性——你對生命有一種很深的開放性和感受力。 -當你在面對他人感到挫折的時候,記得去找自然界作伴。大自然永遠接納你,動物永遠能感受到你內在的光和優雅。讓那份連結,滋養你繼續前行。` }, - LAC: { title: `告知`, body: `你是個天生的傳訊者——透過你的話語、你的情感,你能讓人看見他們原本看不見的東西。 -你說話的方式裡帶著情緒,而且這些情緒是真實的、豐沛的。你說的話不一定每次都符合邏輯,但它們可能是很有詩意的、很能觸動人的。你會讓人感覺到「哦,原來可以這樣看這件事」。 -你能夠在混亂中帶來和諧,能夠幫助受壓迫的人找到一種新的力量感。你的存在,本身就是一種安定。 -但要記得:說完了、分享完了,然後踏上你自己的路。你不需要永遠留在那裡當對方的支柱——給他們力量,然後讓他們自己站起來。你的能量,要流向下一個真正需要你的地方。` }, - }, - 23: { - intro: `閘門23的能量,是關於化繁為簡的洞見力。太陽在這個閘門的人,腦袋裡有一種很特別的能力,能夠把複雜、深奧的事情,用很直接的方式表達出來。但這個天賦有個前提——時機和語調,跟你說了什麼,同樣重要。`, - RAC: { title: `說明`, body: `你有一種忍不住要「說清楚」的衝動,腦袋裡冒出一個洞見,就想立刻說出來。 -你說的東西本身,可能真的很有穿透力,能讓人對自己的人生有全新的看法。問題在於,你有時候說話太跳躍、太超前,對方還沒準備好就接到了你的結論,他們聽完只有一個問號。 -你的聲音,是你最強的工具。當你放鬆、有條理的時候,你的語調本身就有一種讓人想聽下去的魔力。但當你太急著說、太想讓對方懂,語調一緊,那個吸引力就消失了。 -你這輩子最值得練習的事,就是:知道什麼時候說,對誰說,怎麼說。找到那個對的時機,你說出去的話,真的能改變一個人的人生軌跡。` }, - JC: { title: `同化`, body: `你的洞見,常常是走在別人前面的。 -你很清楚這件事,因為你說過幾次「這個道理你懂嗎」,然後對方給你的表情是茫然的、甚至是退縮的。這不是你的洞見有問題,而是他們還沒準備好消化你要說的東西。 -你不需要為了「融入」而說出低於你認知水準的話,但你需要的是慎選措辭、時機和聽眾。把你最深刻的洞見,留給真正能夠接收的人,在那個對的時機輕輕說出——那個效果,會讓你自己都嚇一跳。 -你的聲音放鬆的時候,人們會想靠近你聽;你緊繃的時候,就算你說的再有道理,別人也接收不進去。好好照顧你自己的狀態,就是在照顧你這份珍貴天賦的品質。` }, - LAC: { title: `奉獻`, body: `你是來提升人類的。 -聽起來很大,但就是這樣——你天生有一種想要讓所有人都變得更好的驅動力。你說出洞見,讓人看見他們自己看不到的角落;你奉獻精力,讓身邊的人能夠成長。 -但這份奉獻,有時候會讓你走得太前面,變成想幫對方「接管」他們的人生——替他們做決定、幫他們安排、甚至替他們煩惱。這不是奉獻,這是你在越界。 -你真正能做的,是指引他人找到他們自己的力量和資源,而不是幫他們扛。說出你的洞見,幫他們打開一扇門,然後讓他們自己走進去。那才是真正的提升。` }, - }, - 24: { - intro: `閘門24的能量,是關於回顧與合理化。太陽在這個閘門的人,有一顆停不下來的腦袋,一直在回顧、審視、重新思考——試圖找出那個終極的答案。這既是你最大的天賦,也是你最需要管理的習慣。`, - RAC: { title: `四個方向`, body: `你來這裡,是為了測試所有體驗的極限,然後在反思中找到更新自己的力量。 -你的人生模式,就像潮汐一樣——有時候你非常外向,積極投入所有遇到的人事物;有時候你又突然想退回來,靜靜地坐在那裡消化一切。這兩種狀態對你來說都是真實的,不是矛盾,是你的節奏。 -你的腦袋很強,但它有一個習慣——它會試圖「合理化」你的所有決定,然後告訴你「按照這個邏輯走就對了」。問題是,真正的領悟不是靠腦袋想出來的,它只會在你靜下來的那一刻,悄悄出現。 -學會讓腦袋暫停,是你這輩子最重要的功課之一。冥想、耐心、觀察自己腦袋的運作——這些都是你的工具。` }, - JC: { title: `合理化`, body: `你的腦袋,是一台設計來不斷回顧和重新評估的機器。 -你會把一件事翻來覆去地想,從正面看、從反面看、從斜面看,然後在某個時間點,突然——清明出現了。那個「哦,原來是這樣」的瞬間,就是你腦袋運作最有價值的產出。 -你的獨特觀點和創新思考,是這個世界真的需要的。你看事情的角度跟大多數人不一樣,而這份不一樣,能夠幫助那些卡住的人看見他們沒想到的出路。 -但有個陷阱:你可能會過度思考,然後陷入沒有結論的迴圈裡。你的腦袋永遠都找不到它想要的那個靜止點,因為真理不是靠分析得出來的。偶爾讓腦袋停下來,去感受,去等待——那個真正的領悟才會來。` }, - LAC: { title: `體現`, body: `你來這裡,是要透過你活生生的存在,示範給別人看:每個人都應該忠於自己的內在真實來生活。 -你有一種很強的觀察力,能迅速看出一個人被什麼東西卡住了、他的需求是什麼、他在恐懼什麼。然後你能夠預先想出解方,用一種讓對方意想不到的方式,幫他打開一個新的可能性。 -你走到哪裡,都會自然地進入別人的生命,讓他們對自己的處境有新的覺察。你可能自己都不知道你做了什麼,但你離開之後,那個人的世界就不一樣了。 -要記得的是:你進入別人生命的出發點,一定要是誠實和愛,而不是想要操弄或控制。從那個清明的地方出發,你的影響力才是真正有益的。` }, - }, - 25: { - intro: `閘門25的能量,是關於純真與普世之愛。太陽在這個閘門的人,帶著一種非常特別的清澈——你對生命有一種孩子般的信任和開放,你真的相信萬物都值得被愛。這份純真,是你最珍貴的禮物,也是你最需要保護的東西。`, - RAC: { title: `愛的化身`, body: `你來這裡,是要散播愛的——那種超越了人們一般對愛的認知的、更廣大的愛。 -你有時候非常無私,幾乎忘了自己;有時候又帶著一種很堅定的勇氣,讓人感覺到一種穿透力很強的愛。你會讓人們看見,這個世界上的萬物都是值得被愛的,而這個示範本身,就在改變人們看世界的方式。 -你也會遭遇很沉重的考驗——那些讓你心碎的時刻。但每次心碎之後,你還是站起來了,還是帶著那份光繼續前行。 -如果你找不到可以擁抱你的人,大自然永遠在那裡等你。地球,是你的後盾。信任這個設計,你就會知道在什麼地方、什麼時機,你的愛能真正被接住。` }, - JC: { title: `純真`, body: `你的純真,是一種非常罕見的特質。 -就算所有人都放棄了,你還是能保持樂觀,還是能相信最好的事情會發生。而且不只是相信——你通常就是那個帶來最好事物的人。你有一種奇特的「因緣際會」,總是在對的時間出現在對的地方,透過你的純真,觸發不尋常的機遇。 -你的功課,是不要讓別人的批評和意見侵蝕你的自信。那些沒能看見你內在品質的人,可能會試著打擊你,讓你懷疑自己。但只要你信任自己那個確知是對的感受,你就能安然度過這一切。 -你的人生有多麼獨特,有時候你自己都感受不到。但退後一步客觀地看,你會發現,即使是最平凡的時刻,你的人生也充滿了廣泛的冒險和意義。` }, - LAC: { title: `療癒`, body: `你是個天生的療癒者——就算你自己不知道。 -有時候你只是走進一個房間,那個房間裡的人就感覺輕鬆了一些。有時候你只是陪在某人身旁,他就覺得好一點了。這不是你說了什麼或做了什麼,這是你帶著的那種愛和平靜,自然而然地流出來的。 -但這也帶來一個你需要重視的責任:你必須先照顧好自己的健康和能量,才能繼續帶給別人療癒。如果你持續把自己榨乾,你什麼也帶不出去。 -有時候,你能給人最簡單的療癒,就是一個愉快的心情和一陣開懷的笑。不需要做什麼偉大的事——你的存在本身,就已經是禮物了。` }, - }, - 26: { - intro: `閘門26的能量,是關於說服、行銷與意志力。太陽在這個閘門的人,天生就有一種強大的說服力——你很清楚怎麼讓人說「好」,怎麼讓人看見你想讓他們看見的東西。這是一種非常強大的能力,但同時也帶來一個不得不面對的問題:你要拿這份能力來做什麼?`, - RAC: { title: `統領`, body: `人們自然而然地就會看向你,覺得你有能力、有資源、可以扛起事情。 -你說話有說服力,站出來帶領是你的本能,而且你真的做得到。你的智慧來自你對過去的廣闊視野——你很清楚什麼做法行得通、什麼不行。 -但有一件事你要時時提醒自己:謙遜。當你開始強加你的意志給所有人,就算你出發點是好的,遲早也會遭到反彈。真正讓人長久跟隨的領導者,是讓人心甘情願的那種,不是被強押著走的那種。 -最後,要記得你真正在「銷售」的,其實是你自己。你的誠信和你所代表的價值,才是你最大的資產。忠於這個,你的影響力才是真實且長久的。` }, - JC: { title: `獲取(詭計者)`, body: `你有一種別人搞不太清楚的本事——就是不知道用了什麼方法,事情就成了。 -你能夠找到「正常」方式之外的路徑,達成別人做不到的事。這讓你在某些人眼中是個天才,在某些人眼中卻帶著一點「詭計」的味道。 -你確實很容易找出交易中的漏洞、看到別人沒看到的機會,而且你有能力在各方需求中找到平衡點。但在這個過程中,你的道德感會一再被測試——什麼是你可以接受的方式?什麼是你過了線的地方? -忠於你自己的標準,比什麼都重要。那份內在的清明,是你所有成就的基礎。一旦你偏離了它,你建立起來的一切都會變得不穩固。` }, - LAC: { title: `對抗`, body: `你天生有一種改變局面的驅動力,特別是在物質層面上。 -你看到一個情況亂了、不對了、需要改變,你就會有一股強烈的衝動想要跳進去。你有很強大的意志力,能夠帶動整個環境的能量,讓所有人都感受到「事情要變了」。 -但你的重大功課是:區分「讓你看不順眼的事」和「真的需要你來介入的事」。不是所有亂象都在等你出手,有些是別人自己的功課,你介入反而剝奪了他們成長的機會。 -當你能做到這個區分,你的出手就會精準有力;你帶來的那種「對抗」,就會真正成為改變的開端,而不是一場讓大家都累的消耗戰。` }, - }, - 27: { - intro: `閘門27的能量,是關於滋養與照顧。太陽在這個閘門的人,有一種幾乎像天線一樣的感知力,能立刻察覺到周圍誰需要被照顧、什麼地方有缺口。你的慷慨是真實的,你的同理心是真實的——而你最大的挑戰,就是學會不要把自己也一起榨乾。`, - RAC: { title: `校準`, body: `你這輩子,是來讓自己和周圍的人都回到一種「有在好好照顧彼此」的狀態。 -你能直覺地感受到什麼時候應該積極投入、什麼時候應該退後去蒐集更多觀點。你看到缺口,你看到什麼地方只需要小小的調整就能帶來大幅改善。然後你就很想伸手。 -但有一點要非常小心:你的能量是有限的。讓太多人依賴你,最終會耗盡你的能量,而且對那些依賴你的人來說,其實也不是好事——他們會失去獨立的能力和自信。 -你要做的,是照顧,而不是「包辦」。把人帶到他們能夠照顧自己的地方,然後讓他們自己走。` }, - JC: { title: `照顧`, body: `你這輩子,是一個天生的照顧者。 -不需要有人告訴你,你就知道誰需要什麼。你會在還沒被邀請之前,就已經開始給支持了。在這個人們和自然都承受著許多挑戰的世界裡,你這份照顧的天性,真的是很被需要的。 -但這裡有一個你一定要記住的真相:你能做的是有限的。你不是每個人的救生圈,也不需要把全世界都扛在肩上。讓太多人養成對你的依賴,不只會消磨你,也會讓他們失去為自己負責的能力。 -照顧自己,也是一種照顧。你先照顧好自己,才有力氣真正照顧別人。` }, - LAC: { title: `對齊`, body: `你有一種很敏銳的能力,能感受到在重大試煉和動盪的時刻,誰最需要資源、滋養和協助。 -你不需要等到情況完全爆發,你就已經看見了。但這份洞察力有時也會讓你陷入一個模式——「補救者」的模式。你不斷地跳進去解決、跳進去修補,最後搞得自己筋疲力竭,還沒得到什麼回報。 -你的智慧,是要學會辨識什麼時候是真的需要你,什麼時候只是讓你感覺有義務介入。有時候,退後一步,重新評估,然後在真正對的時機精準出手——這樣的你,比起每次都衝第一個,要有力量得多。` }, - }, - 28: { - intro: `閘門28的能量,是關於冒險、意義與生死邊界。太陽在這個閘門的人,帶著一種很深的驅動力,想要確認自己的存在是有意義的。你不會輕易滿足於平淡,你需要的是那種能讓你感覺到「活著值得」的體驗和連結。`, - RAC: { title: `挑戰(對抗)`, body: `你天生就是要來挑戰極限的。 -你會被那些有深度的體驗吸引,那些能讓你感覺到生命厚度的事情,不管是高風險的冒險、深刻的關係、還是對抗不公義的事情。你有一種本能,想要知道什麼是真正值得的,然後全力投入。 -但你要非常注意一件事:你內在有潛能會走向非常極端的狀態——有時甚至會挑戰到生死的邊界。當你發現自己陷入了一種非常極端的狀態,請深呼吸,然後退後一步。 -你的功課不是逃避冒險,而是學會辨識哪些冒險是真正值得你投入的,哪些只是你在用行動來確認自己的存在感。找到那個真正呼喚你的事情,然後義無反顧地去。` }, - JC: { title: `困境(玩家)`, body: `你這輩子,一直在測試生命的邊界。 -你有一種很強的直覺,知道哪些冒險值得承擔風險,哪些不值得。你能感受到一個情況的「重量」——哪些事情是真的有意義的,哪些只是表面上看起來很刺激。 -隨著年紀漸長,你的這份判斷力會越來越精準。你會從過去所有走過的高峰和低谷裡,積累出一種獨特的智慧——一種關於什麼是真正值得、什麼是空洞浮誇的智慧。 -這份智慧,當你選擇在對的時機分享給對的人,能夠深深地撼動他們的人生。你走過的那些困境,不是白走的——它們是你最珍貴的資產。` }, - LAC: { title: `遊戲玩家(挑釁)`, body: `你走進任何一個情境,都會帶來一種動盪——不是因為你想找麻煩,而是因為你天生就能看到那個情境裡沒被誠實面對的事情。 -你用的方式有時候會讓人不舒服、會讓人被迫直視他們不想看的東西。但如果你的出發點是真誠的,這份「不舒服」往往就是那個情境真正需要的一帖藥。 -你的挑戰是:在帶來這份衝擊的同時,保持愛在其中。不是為了讓自己爽、不是為了破壞,而是因為你真的在乎那個人、那個情境,可以變得更真實、更健康。 -當你從那個地方出發,你的「挑釁」就會成為一種禮物。那些被你搖醒過的人,通常後來都會感謝你的。` }, - }, - 29: { - intro: `閘門29的能量,是關於承諾與深度投入。太陽在這個閘門的人,有一種天生就想說「好」的衝動——不管是什麼事情,只要有人邀請,你就很容易就投入了。你的能量很強,而你最大的功課,就是學會把這股能量用在真正值得的地方。`, - RAC: { title: `轉移(感染)`, body: `你是那種能讓人感染到你熱情的人。 -你心裡有一股很強烈的衝動,想要對人類做出有意義的貢獻。你把讓你振奮的事情分享給身邊每個人,而且你的熱情是真實的——那種「這個東西真的很棒,你也來試試看」的感染力,是你天生的能力。 -但你的欲望有時候會跑得比清明還快。你投入了一件事,全力以赴,結果發現身邊的人沒有你想的那樣全心投入,然後你覺得孤單或失望。 -先搞清楚你自己真正的動力來源,再決定要把熱情傳遞給誰。當你從真正清明的地方出發,你傳遞出去的東西就會帶著一種不一樣的重量,讓人真正被撼動。` }, - JC: { title: `承諾`, body: `你這輩子最大的功課,就是學會承諾這件事的藝術。 -你對任何人、任何事幾乎都會自動說「好!」這不是壞事——你確實有強大的能量和耐力去完成你承諾的事。問題在於,你的承諾有時候是在還沒有內在清明的狀態下做出的,結果就是你過度承諾、筋疲力竭,然後覺得被生活壓垮。 -你是那種能夠達成凡人覺得不可能的事的人,這是真的。但達成什麼事,跟達成對的事,是兩回事。 -在每次說「好」之前,停一下,問問自己:這個承諾真的是我被召喚去做的,還是只是習慣性的答應?你的內在權威,就是你最好的過濾器。` }, - LAC: { title: `勤奮(勤勉)`, body: `你是這個世界上最忙碌的那群人之一——而且你覺得你有義務把這份忙碌的感覺也傳遞給大家。 -你有驚人的能力和耐力,可以完成別人覺得做不到的事情。人們看到你,就會想找你加入他們的企劃,因為有你在,他們會感覺到「這件事真的會往前走」。 -但這裡有一個陷阱:為了忙碌而忙碌,跟為了真正值得的事而忙碌,完全是兩件不同的事。當你只是因為習慣性的責任感而讓自己一直動個不停,那份忙碌反而會成為你的枷鎖。 -停下來,問問驅動你的那個欲望或動機是什麼。當你從真正清明的地方出發去忙,那份成就感是完全不一樣的。` }, - }, - 30: { - intro: `閘門30的能量,是關於欲望與情感的深度。太陽在這個閘門的人,骨子裡燃燒著一種對「深度體驗」的渴望——你不滿足於表面,你想要真正碰觸到生命的核心。這份熱情是你最強大的燃料,但它同時也需要被智慧地引導。`, - RAC: { title: `轉移(感染)`, body: `你的欲望,是你最大的動力引擎。 -你一旦被某件事點燃了,你就會以一種讓人嘆為觀止的方式全力投入——然後你分享出去的那份熱情,會讓身邊的人也被你感染到。你描述體驗的方式,讓人光是聽你說,就已經想要去嘗試了。 -但你的欲望就像口渴——唯有在你真正、完整地投入一個體驗之後,那份渴望才能平息。如果你帶著百分之百的承諾去投入,你就能完全體悟那段體驗,然後把它說給每個你遇見的人聽。 -你的挑戰,是學會辨別哪些欲望值得全力追逐,哪些只是一時的衝動。你的內在權威,是幫你做這個區別最好的工具。` }, - JC: { title: `欲望(命運)`, body: `你被一條固定的軌道推著走,那個軌道叫做「欲望」。 -你有一種很強的內在驅動力,想要盡可能用最直接的方式去體驗和完成任何事。你討厭拖拖拉拉,討厭有人在你前進的路上設置障礙。你的人生就是來實現一個只有你知道的命運——而你就是要以你自己的方式去走。 -你的功課是:辨別哪些欲望是你真的必須去實現的,哪些只是幻想。不是所有的渴望都值得追逐,也不是所有出現在你面前的體驗都是召喚你去的。 -當你跳進去的時候是因為內在的清明,而不是因為你習慣性地跳進每一個體驗,那種投入帶來的滿足感,是完全不同等級的。讓自己深度放鬆、欣賞整個體驗的過程,就是你打開自我實現大門的方式。` }, - LAC: { title: `勤奮(勤勉)`, body: `你屬於那種停不下來的人,而且你覺得你有義務把這份忙碌傳遞給身邊每個人。 -你有一種幾近無窮的驅動力,讓你不斷投入、不斷行動。你的欲望推動著你,然後你周圍的人看到你,也被你帶動。你對任何承諾都能全心全意地投入,而這就是你的強大之處。 -但這裡有個你需要面對的現實:你的欲望是否來自於清明,還是只是你習慣性地向前衝? 兩者帶來的結果是非常不一樣的。 -停下來,確認你在某個承諾裡是不是真的能得到成就和滿足,再跳進去。每當你這樣做,你的忙碌就不再只是忙碌——而是真正有意義的投入。` }, - }, - 31: { - intro: `閘門31的能量,是關於影響力與領導。太陽在這個閘門的人,有一種幾乎是天生的影響力——你到哪裡,哪裡的人就自然地會想聽你說話,自然地把眼光投向你。你不需要努力爭取這份影響力,它本來就在那裡。你的功課,是學會有智慧地運用它。`, - RAC: { title: `意料之外`, body: `你的人生,是一連串出乎意料的轉折。 -你不只是「接受」意外,你其實是那個帶來意外的人——你出現在一個地方,然後那個地方就不一樣了。有時候是讓人驚喜的改變,有時候是讓人措手不及的翻轉,但不管是哪種,你的存在都會讓那個情境充滿了某種能量,讓原本停滯的事情動起來。 -你有一種天生的能力,讓那些覺得人生無聊、沒有意義的人,突然看見了一扇他們以前沒有注意到的門。你不需要做什麼大事,你只要忠實地做你自己,那份衝擊就會自然地產生。 -接受並擁抱生命帶給你的一切,帶著開放的態度迎接每一個挑戰,你就不會被任何意外給打倒——因為你本來就是那個在意外裡如魚得水的人。` }, - JC: { title: `影響`, body: `幾乎你做的每一件事、說的每一句話,都會對別人產生影響——就算你自己沒有意識到這件事。 -你能夠扮演很多角色:有時候你展開你那廣闊的想像力,帶人進入他們從沒想過的可能性;有時候你很實際,一針見血地找出情境裡最關鍵的元素;有時候你說的一句話,就讓某個人的看法整個翻轉了。 -你的挑戰,是帶著覺察去使用這份影響力——去搞清楚你自己的動機是什麼,你是在為所有相關的人提供平衡的引導,還是只是在滿足某種你沒有意識到的需求? -當你清楚了自己的動機,你帶出去的那份影響力,就會是真正有建設性的力量,讓你走到哪裡,都能點燃人們對生命的想像。` }, - LAC: { title: `領頭者(Alpha)`, body: `你就是那個群體裡的領頭者。 -不是因為你爭來的,而是因為人們就是自然而然地把眼光投向你,期待你帶領方向、解決問題、點燃他們的想像力。你可能只是在進行一個私下的對話,卻發現旁邊的人都不自覺地豎起耳朵在聽。 -你有著很廣泛的想像力,讓你能從幻想到務實都游刃有餘。你能夠去承接那些讓別人望而卻步的挑戰,然後找到穿越它的方法。 -但你要留意一個狀況:當你的領導力太強,有時人們會變成「拖油瓶」,想讓你拉著他們過完整段人生。這對你的吸引力不會持續太久,而且你也清楚地知道——有所貢獻的追隨者,跟只想被拉著走的追隨者,是完全不同的。 -清楚你的類型和內在權威,你就能知道哪些人和情境是真的在召喚你提供領導,而不是把每個看起來需要你的地方都扛上身。` }, - }, - 32: { - intro: `閘門32的能量,是關於持續性與存活本能。太陽在這個閘門的人,有一種深植在骨子裡的直覺,能感受到哪些事情會成功、哪些會失敗,哪些值得持續投入、哪些該放手。你就像一個天生的守門員,守護著那些真正值得延續下去的東西。`, - RAC: { title: `馬雅(表象與真相)`, body: `你這輩子,是來描述這個世界的——不是表面上看起來的樣子,而是它真正運作的方式。 -你的腦袋會自動在事物的表象之下找連結、找規律,然後你就能看見別人看不到的那個底層邏輯。你知道描述同一件事情的方式不只一種,你也清楚地知道,很多我們以為是「事實」的東西,其實只是某一個時代的詮釋而已。 -你有一種很珍貴的幽默感,讓你在面對生命的荒誕時,不會被它壓垮,而是能退後一步,帶著一種輕鬆的清醒繼續看下去。 -別把自己困在太嚴肅的狀態裡。生命本來就是個謎,你的任務不是要解開所有謎題,而是帶著開放和彈性,去觀察那個謎題一直在轉變的樣貌。` }, - JC: { title: `保存`, body: `你來這裡,是要在一個快速改變的世界裡,守住那些真正值得守住的東西。 -你天生就能感受到哪些方式能夠增進並改善人的生命體驗,同時也能評估哪些情況正在威脅人們的成長。你不是保守主義的那種「不要改變」,你是那種清楚知道改變的代價,然後決定哪些值得改變、哪些需要被保存的人。 -但你的挑戰是:當你的觀點太過嚴肅或激進,你可能就找不到願意支持你的人了。你對改變的看法越務實、越能讓人理解,你在保存上的努力就越有效果。 -你有熱情,這是好事。但怎麼把這份熱情轉化成別人也能接受的語言和方式,是你一輩子都在練習的功課。` }, - LAC: { title: `侷限`, body: `你有一種能力,能看見一個計畫或一段關係裡,那個可能會失敗的地方。 -你不是在唱衰,你是在務實地評估。你能感受到生命各種情境裡的限制,然後讓人們意識到「這裡有個坑」,而不是讓他們在不知情的狀況下跌進去。 -但這裡有個微妙之處你需要留意:有時候別人需要親自走進那個坑,才能真正學到某些東西。你指出了限制,然後讓對方自己決定要不要繼續——這才是你最有力量的位置。 -你心裡清楚地知道生命的神聖。就算遇到再難處理的情況,只要你退後一步客觀地評估,你就能找到出路——而且那個出路通常比大家想像的要好走得多。` }, - }, - 33: { - intro: `閘門33的能量,是關於隱遁、反思與記憶。太陽在這個閘門的人,有一種很深的需要——你需要空間,需要安靜,需要讓所有的體驗在你內心沉澱,然後才能把它們變成有意義的智慧。你是一個天生的說故事的人,但那些故事,必須先在你的內心成熟才能說出去。`, - RAC: { title: `四個方向`, body: `你的人生,是在測試所有體驗的極限,然後在反思中找到更新自己的力量。 -你有時候非常外向,積極地投入所有你遇見的人事物;有些時候你又突然需要完全抽離,靜靜地坐在那裡,消化發生的一切。這兩種狀態對你來說都是真實的、都是必要的。 -你對平靜有著非常深切的需求。你需要那段不受打擾的時間,去思索你見證過的一切,去讓那些體驗轉化成屬於你的智慧。這不是逃避,這是你補充能量的方式。 -不要讓外在的忙碌和別人的期待,搶走了你的靜默時間。你說出去的那些話、你分享出去的那些故事,它們的深度和力量,直接來自你給自己多少靜默和反思的空間。` }, - JC: { title: `隱遁`, body: `你需要隱遁——不是因為你怕人,而是因為你對生命的感受太深了,你必須要有時間去消化。 -你走到哪裡,就會吸收那個地方的能量、情緒、人們的意圖和活動。你通常沒有意識到這件事,但它一直在發生。慢慢地,你的能量就被消耗掉了,你開始感覺到某種說不清楚的疲憊。 -這時候你需要的,是一段真正的退隱——讓自己重新找回內在的創造力和接受力。大自然,是你最好的充電地方。 -隱遁,不是你的弱點,是你的必需品。當你走出隱遁的時候,你會帶著很棒的故事回來,那些故事能讓聽的人沉浸其中——因為它們是你從那段安靜裡真正提煉出來的智慧。` }, - LAC: { title: `精緻`, body: `你對你所在的環境,有一種近乎本能的美感要求——你就是沒辦法在混亂裡感到自在。 -你走進一個地方,你就會感受到它的能量,然後你的內在就會開始想:「這裡可以更好。這裡缺了什麼。這裡如果調整一下會更對。」你有一種天賦,能把所到之處變得更充實、更有活力、更精緻。 -但這也是你的陷阱:你可能讓自己投入你遇到的任何情境,然後快速就被壓垮了——尤其是當你認定「只有我看到這裡的問題,只有我有能力改善它」的時候。 -停下來問自己:這是我真的被召喚去的地方,還是只是我的習慣性反應? 你的存在本身,就能讓環境變得更好——有時候你只需要在那裡,不需要動手做任何事。` }, - }, - 34: { - intro: `閘門34的能量,是關於強大的生命力與行動力。太陽在這個閘門的人,有一種幾乎停不下來的內在動能——你就是想動,想做事,想讓事情發生。你的能量幾乎是無窮盡的,而你最大的功課,就是把這股能量用在真正對的地方。`, - RAC: { title: `沉睡鳳凰(未來轉變)`, body: `你是個骨子裡的浪漫主義者,一直在尋找那種「跟生命真正親密接觸」的感覺。 -你追著夢想跑,快要抓到的時候它又溜走了,然後你墜落了一下,然後又爬起來,繼續追下一個。這種一燃一滅、一落一起的循環,就是你人生蛻變的節奏——每次從灰燼裡站起來,你都更不一樣了。 -你的挑戰,是要清楚你為什麼而忙。你的能量很強,停不下來幾乎是你的本能——但為了忙碌而忙碌,跟為了真正有意義的事而忙碌,帶來的感受完全不同。 -當你開始太嚴肅地看待生命,那通常是一個轉折點快到了的信號。這時候,笑著面對它,比抵抗它更有效。生命想給你新的東西——但前提是你得先放鬆下來,才能接住它。` }, - JC: { title: `力量(強大)`, body: `你帶著幾乎無窮的能量來到這裡。 -你想動,你想做事,你想讓事情前進——這是你最真實的本質。問題不是你有沒有能量,問題是你把能量給誰、給什麼。 -你的能量是如此強大,讓你很容易就被各種方向拉扯——有人需要你,你就過去了;有事情需要被推動,你就出手了;但最後你回過神來,發現自己筋疲力竭,而且不確定那些事情是不是真的值得你這樣投入。 -你的祕訣,是在情緒和意圖上保持清明,然後從那個清明的狀態出發去行動。當你這樣做,每一個進入你影響力範圍的人,都會被你提升——不是因為你做了什麼偉大的事,而是因為你的能量本身就帶著那份力量。` }, - LAC: { title: `二元性`, body: `你永遠在同時騎兩匹馬——一匹叫「我自己的成就」,一匹叫「我的群體和家人」。 -你有強大的個人能量,想要有所作為、想要在這個世界上留下什麼;但你同時又深切渴望成為某個群體裡,真正有貢獻的一部分。這兩種需求都是真實的,都是你的。 -你的功課,不是選邊站,而是學會在這兩者之間找到平衡。當你清楚自己為什麼而承諾,你就能同時兼顧個人成就和群體貢獻。 -要小心一個訊號:如果你遭遇了失望和背叛,那通常是在告訴你,你可能在試圖「拯救」某些人,或接管了不屬於你的責任。退後一步,讓每個人都為自己的人生負責——這才是真正的愛,也才是你的能量能夠持續發光的方式。` }, - }, - 35: { - intro: `閘門35的能量,是關於體驗與進步。太陽在這個閘門的人,有一種停不下來的渴望——想體驗更多、想前進、想知道生命還能給你什麼更深刻的東西。你來到這裡,是要把自己徹底地活過一遍。`, - RAC: { title: `意識`, body: `你這輩子,是來探詢「我們為什麼在這裡」這個問題的。 -你透過親身體驗,累積對生命的觀察和理解,然後從那些體驗的模式裡,找到支撐所有生命的底層邏輯。你會觸發身邊的人去質問,讓他們開始思考他們從來沒有想過的事情。 -你有種強烈的前進感驅動著你——你就是想看到進展,想感受自己在往前走。這種渴望,會讓你積極地投入各種挑戰,不管那個挑戰有多困難。 -但要記得:真理就存在你裡面。你最終的追尋,不是要在外面找到什麼,而是在所有這些體驗之後,回到你自己,找到那個一直都在的真實。` }, - JC: { title: `前進(經歷)`, body: `你的人生,就是一場不停歇的體驗之旅。 -你被驅動著要去嘗試生命帶給你的一切——那份驅動力有時候讓你完全不顧代價,就是要去親身感受,就是要去知道那是什麼感覺。你就是那個把人生極限測試得最徹底的人。 -最後你會體悟到,體驗的價值,不在體驗本身,而在於你帶給那個體驗的你是誰——你作為一個有意識的人,在那段經歷裡,到底感受到了什麼、學到了什麼。 -不要期待別人能夠理解你心裡燃燒的那份熱情。那份火,是你的。你不需要解釋它,也不需要等別人懂了才去體驗。跟隨你的內在權威,它會告訴你哪些體驗是真正在召喚你的。` }, - LAC: { title: `分離`, body: `你需要先讓自己和人群分離,才能真正找到你自己。 -你有很強的能力,知道自己能夠為一個情境做出多大的貢獻——而這有時反而讓你很難抽身,因為你就是忍不住想投入、想幫忙、想讓事情更好。但習慣性地去拯救別人,會讓你分心,讓你無法專注在你自己的人生目的上。 -你的耐心、你在正確時機出手的能力、你那超越一般人理解的廣闊視野——這些都是你帶來的真正天賦。但它們必須在你有足夠的客觀距離時,才能真正發揮作用。 -先讓自己穩定,再決定要不要進入那個情境。你的存在本身,就已經能帶來巨大的效益——不需要每次都衝第一個進去。` }, - }, - 36: { - intro: `閘門36的能量,是關於情緒深度與危機中的成長。太陽在這個閘門的人,人生裡從來不缺衝突和情緒的起伏——但也正是這些高低起伏,讓你成為了一個非常深刻的人,而且你有能力把這份深度轉化成幫助別人渡過難關的力量。`, - RAC: { title: `伊甸園`, body: `你心裡帶著一份記憶,覺得人生應該是充滿愛和光的——然後你出生在這個世界,發現現實跟你記憶裡的樣子差太多了。 -童年的某些體驗,可能讓你對人的不誠實或不正直非常敏感。你花了很長的時間,試圖在外面的世界找回那份失落的完整——透過關係、透過體驗、透過不斷的嘗試。 -然後,在某個時間點,你會發現:你一直在找的那個地方,從來都在你裡面。那道光,你自己就帶著。當你在內心找到它,你就能把它帶給你遇到的每一個人。 -你的聲音,在你找到那道光之後,會有一種讓人想靜下來聆聽的力量——那是你從所有情緒體驗裡提煉出來的,別人學不來的深度。` }, - JC: { title: `危機處理`, body: `你是個危機處理的專家——不是因為你特別喜歡危機,而是因為危機就是一直在找你。 -衝突和情緒的動盪,是你生命裡的常態。久而久之,你發展出一種能力:在事件結果還不明朗、其他人還看不清楚的時候,你已經能預見可能的挑戰,而且你有方法應對。這讓人在危機中非常非常地依賴你。 -但這裡有一個重要的功課:唯有當你能夠從那些強烈的情緒中抽離,你才能真正地感受到成長和進步。當你過度投入在情緒裡,你的判斷力就會被掩蓋;當你能帶著一點距離去看,你的那份「額外的感官」才能真正發揮作用。 -讓自己有空間退後一步,然後帶著清明回來——那才是你真正的超能力。` }, - LAC: { title: `地球層面`, body: `你是那個能把苦難變成智慧的人。 -生命裡那些很難的事情——情感的受傷、體制的不公平、各種的高峰和低谷——你不只是能撐過去,你還能在撐過去之後,幫助別人也找到走出來的路。 -你天生能吸引各種不同的人到你身邊,不管是弱勢者還是有能力的人,你都能跟他們建立連結。然後在對的時刻,你會給他們一個新的視角,讓他們對自己的困境有全然不同的看法。 -你的重大挑戰,是在幫助別人的過程中,保持自己情緒的清明。你很容易被拉進別人的情緒漩渦,忘了自己也需要一個岸邊。找到那個平衡點,你就能成為這個世界真正需要的那種調停者——不是因為你救了誰,而是因為你陪著他們找到了他們自己的出路。` }, - }, - 37: { - intro: `閘門37的能量,是關於家庭、協議與友誼。太陽在這個閘門的人,有一種非常深刻的群體意識——你最在乎的,就是你的「家人」,不管那個「家人」是血緣上的還是你自己選的。你會為你愛的人竭盡所能,而你最不能接受的,就是背叛和不守信用。`, - RAC: { title: `計畫`, body: `你天生就是為了你最在乎的人在計畫的。 -不管是家人、親密的朋友、工作夥伴、還是你的社群——你最大的滿足,就是看著這些人因為你的安排和照顧,過得更好、更安心。你有能力覺察他們的需求,然後想辦法滿足那些需求。這不是你努力培養出來的能力,這是你與生俱來的。 -但有個你一定遇過的困境:你既想照顧自己,又想照顧所有你在乎的人,兩邊都要顧,有時候真的像在走鋼索。 -信任你的感受,而不是靠頭腦強行分析哪邊更重要。你的情緒,是你最可靠的內在指引。當你從情緒清明的地方做出決定,那個計畫就會對所有人都是好的。` }, - JC: { title: `議價`, body: `你心裡有一個很深的承諾,要盡一切可能服務你的朋友、家人和社群。 -你是天生的交涉者。你知道怎麼讓各方的需求都能被滿足,你也很清楚什麼是公平的協議。對你來說,最重要的事情就是信守承諾——你自己說到做到,你也期待別人這樣對你。 -你最不能接受的,就是有人把你的付出當作理所當然,或者做出承諾卻沒有遵守。當這種事發生,你不一定會大發雷霆,但你可能就此切斷連結,轉身離去——讓對方突然意識到,他們失去了什麼。 -你的天賦是把人聚集在共同的目標下。當你能用你的影響力和可靠的典範來激勵別人一起貢獻,整個群體就會因為你而變得更強大。` }, - LAC: { title: `進步社區(遷徙)`, body: `你來這裡,是要帶領、珍愛、保護你的家庭或社區——不計一切代價。 -你對家庭的進展有一種非常敏銳的感知,你天生就知道什麼時候需要推進、什麼時候需要等待。你的時間感幾乎跟四季同步,你會不斷確認你的群體是不是走在正確的方向上。 -你最重視的,是忠誠。 -那些真的跟你站在同一陣線的人,你會為他們做任何事;而那些背叛你、忽視你、或持續占你便宜的人——你可能有一天就突然消失了,完全切斷連結。對方可能還搞不清楚發生了什麼事,但你心裡清楚:那個時機到了。 -你的情緒,是你最重要的指南針。在做出承諾之前,一定要等到情緒清明的那一刻——那個清明,會告訴你誰真的是你的人,以及什麼時候該走下一步。` }, - }, - 38: { - intro: `閘門38的能量,是關於鬥士精神與對意義的追尋。太陽在這個閘門的人,有一種鋼鐵般的意志——你絕對不會接受那些跟你感覺不對的事情,就算整個世界都說沒問題,你就是沒辦法。你是來找到生命真正有意義的東西,然後為它而戰的人。`, - RAC: { title: `緊張`, body: `你的存在,會讓周圍的生命保持在正確的頻率上——就像樂器的弦,需要適當的張力才能發出正確的聲音。 -你能夠敏銳地察覺到身邊的人哪裡和他們的人生不同調,然後你就忍不住要去戳它、去挑戰它,讓他們面對那個他們選擇忽略的地方。這對他們來說不舒服,但往往也是他們真正需要的。 -你有憂鬱的傾向——這不是壞事,這是你探索自己內在深度的通道。當你允許創意能量流動,那份沉重感就會轉化成深度的成就感。 -最重要的一條線:你的挑戰是針對情況和體制,不是針對人。當你能清楚分辨這兩者,你帶來的那份「緊張」才是真正有建設性的力量,而不是讓人感覺被攻擊。` }, - JC: { title: `反對`, body: `你有一種無法接受的本能——無法接受任何跟你感覺正確的事物不共鳴的東西。 -你不是那種「算了算了,就這樣吧」的人。如果你的標準沒有被滿足,你就準備好去挑戰所有人——不管那讓你看起來多麼不通情達理。你深思熟慮、有熱情,有時候甚至激烈,讓人感到震驚。 -你是人權的倡議者。你欣賞那些對不公義的看法跟你一樣的人,你也有更強大的毅力去把「糾正錯誤」這件事做到底。 -但這裡有個你需要時時提醒自己的事:你是來挑戰體制和情境,不是來挑戰人。把對方的「錯」掛在嘴邊,跟去真正解決他們所面對的體制問題,是完全不同的兩件事。後者才是你真正能發揮影響力的地方。` }, - LAC: { title: `個人主義`, body: `你這輩子,是來示範「忠於自己」這件事是可以做到的。 -你對他人來說通常都很特異,甚至因此被嘲笑或被排斥。要融入那些世俗規範和大家覺得理所當然的東西,對你來說幾乎是不可能的——不是因為你比別人厲害,而是你對生命有一種完全不同的視角。 -當你忠於自己的本質,你就能把前所未見的改革力量帶進每個人的生命裡。你讓人看見做自己的自由是可能的——但你也體悟到,就算把牢籠的門打開,有些人還是不願意走出去。 -這不是你的失敗,也不是你的責任。你能做的,就是繼續做自己——那本身就是這個世界最需要的一種示範。` }, - }, - 39: { - intro: `閘門39的能量,是關於挑釁與喚醒活力。太陽在這個閘門的人,有一種天生的能力——你就是能把人身上沉睡的那份活力給喚醒。你不一定是刻意的,但你到哪裡,哪裡就會有能量波動,有人被你攪動,有人被你點燃。`, - RAC: { title: `緊張`, body: `就像閘門38,你也是那個帶來緊張、讓人面對自己人生失調之處的人。 -你輕而易舉地就能激怒他人——不是因為你想找麻煩,而是你就是能看見對方哪裡沒有活出真實的自己,然後那個地方就會自動對你起反應。有些人被你觸動之後會憤怒,有些人會震驚,有些人最後會感謝你。 -你也有憂鬱的傾向,而你的功課是:不要只是對這些情緒做出反應,不管是別人的反應,還是你自己內在被觸發的狀態。 -當你能在內心找到那個平靜點,然後從那個基礎上清明地回應——你就能避開那些讓你和別人都耗費大量時間和精力的惱怒狀態。你追尋的,是在別人身上找到真誠和有力的特質。但不是每個人身上都有。放過那些沒有的人,跟著你的內在權威走。` }, - JC: { title: `挑釁`, body: `你的人生主題,就是要捍衛個人表達的重要性。 -你能夠看穿大多數隱藏在表象之下的不真誠。當你發現有什麼規範不合理地阻礙了真實的生命表達,你就會介入,去干擾那個狀態,直到它恢復到更合理、更真實的樣子。 -有些人認同你這種單刀直入的方式,有些人不認同——但很多人最後還是能看見你的行為背後的善意。 -你倡議每個人體驗自由的權利。你的目標,是要立下典範,展示「做自己」這件事本來就是每個人與生俱來的權利。 -但要記得:當有人試著說服你「你不需要這麼特立獨行」的時候,不要讓那些聲音動搖你。找到真正懂你、能完全欣賞你充滿活力本質的人——那些才是你應該連結的人。` }, - LAC: { title: `個人主義`, body: `你很輕易就能挑釁他人——有時候你甚至還沒有做什麼,對方就已經被你惹到了。 -這不是你的錯,這是你帶著的能量。你能帶出別人身上那份他們已經遺失或遺忘的活力,而「再次甦醒」這個過程,常常讓他們感到震驚、不舒服,甚至憤怒。 -但你也能做到讓人以他們通常不會考慮的方式去行動,然後讓他們對過程中發現的自由感到驚奇。 -你的挑戰是要記得:不是所有人都已經準備好被你喚醒。有些人,你再怎麼苦口婆心,他們就是堅持要停留在困住的狀態裡。不要浪費你的能量在那裡。你的類型和內在權威,會告訴你哪些人真的準備好了,何時要介入,何時要保持距離,好好過自己的人生。` }, - }, - 40: { - intro: `閘門40的能量,是關於意志力、獨立與清楚的協議。太陽在這個閘門的人,有一種很強的意志力,能夠達成任何你承諾要做的事——但前提是,那個承諾是在清明的狀態下做出的。你最不能接受的,就是付出之後發現自己被視為理所當然。`, - RAC: { title: `計畫`, body: `你為了你最在乎的人在計畫——你最大的滿足,就是你的家人和社群因為你的安排,過得更好、更安心。 -你有意志力去達成任何想做的事,特別是在支持你在乎的人的時候。但這裡有一個微妙的地方:你的情緒是會上下起伏的,某個當下看起來完美的安排,到了下一個時間點可能就完全不一樣了。 -在做出任何承諾之前,等到你情緒清明的那一刻。那個清明,會告訴你什麼是真正值得你投入的,什麼是你在情緒高峰時衝動做出的決定。你有能力做到很多,但你的耐心和情緒清明,才是讓一切發揮最大效果的關鍵。` }, - JC: { title: `拒絕`, body: `你有一種很強的能力,能察覺出哪些人對你的福祉有貢獻,哪些人沒有。 -你很清楚誰真的跟你站在同一陣線,而且你也會毫不猶豫地切斷那些你覺得不對的連結——有時候是以一種讓對方完全猝不及防的方式。你就這樣轉身離開了,然後把注意力和能量轉移到其他地方。 -你喜歡清楚的協議。你願意為了清楚約定的事情全力以赴,但你不喜歡開放式的、讓你不確定自己能不能脫離的承諾。 -要留意一件事:你在私人關係裡選擇抽離的方式,有時可能會傷到真心珍惜你的人。那一條線——給出個人承諾,和為了自身的成長而抽離——非常細微。找到這裡面快樂的平衡點,是你一輩子的課題。` }, - LAC: { title: `進步社區(遷徙)`, body: `你的人生目的,是要不計代價帶領、珍愛、保護你的家庭或社區。 -你天生對家庭的進展有非常敏銳的感知,你有強大的意志力去消弭任何干預你計畫的因素。你總是在確認:我的群體,有沒有走在對的方向上? -你最重視的是忠誠——那些真的跟你站在同一陣線的人,你會為他們做所有的事;而那些違背承諾、占你便宜的人,你可能有一天就突然消失了,再也不回頭。 -你有強大的意志力,但那份意志力,是建立在你感覺「協議有被遵守、我的付出有被尊重」的基礎上的。如果這個基礎被破壞,你就會把注意力轉向他處——沒有眼淚,沒有爭吵,就是轉身。 -密切留意你的情緒權威,在做出任何承諾前等到清明的那一刻。那個清明,會告訴你誰是真的值得你的心意和力氣的人。` }, - }, - 41: { - intro: `閘門41的能量,是關於想像力與渴望。太陽在這個閘門的人,有一種豐沛到幾乎擋不住的想像力——你的腦袋會把各種可能性、夢想和體驗的畫面,一幅一幅地呈現給你看,然後你就燃起了那份渴望,想要把它們變成真實。`, - RAC: { title: `意料之外`, body: `你的人生,就是一連串意料之外的改變。 -你不是只被動地接受意外,你本身就是那個帶來意外的人——你出現在某個地方,那個地方就不一樣了。你能夠用新鮮且出乎意料的可能性,去取代那些讓人覺得生活無聊和沒有意義的自滿感。 -你的想像力是你最大的資產——一個起初只是「些微的可能性」,在你的腦袋裡可能會慢慢成形,最後變成一個改變你和他人人生的真實經歷。 -信任你自身獨特的能力,就算這個能力不遵循任何人對生命應該如何運行的概念。在你採取任何行動之前,確認那個行動百分之百符合你的內在本質——這樣,你的夢想和幻想,才能以帶來成就和滿足的方式在現實中展開。` }, - JC: { title: `幻想`, body: `你能夠想像任何事情。 -你的腦袋總是在預期——你會根據自己設想會發生的事情,來形塑你的人生旅程,還有和你最親近的人的旅程。你能夠讓責任聽起來很有趣,讓不可能聽起來像是輕易可達到的事,然後激起人們的好奇心,說服他們投入你的努力。 -但這裡有個你需要面對的現實:伴隨想像而來的,也可能是難以實現的結果。期望越大,失望也越大。當結果不如你預期,有時甚至可能導致危機。 -專注在那些真正足夠、真正有創意的幻想上,它們能帶來滿足感,而不是那些空洞的、只讓你自我感覺良好的幻想。信任你的內在權威,它會讓你知道你何時在正確的軌道上,何時已經超出了能帶來真正滿足的範圍。` }, - LAC: { title: `領頭者(Alpha)`, body: `你來這裡,是要去帶領——影響那些在人生中尋找務實影響力的人。 -你有廣泛的想像力,能夠從純粹的幻想到全然務實的現實都游刃有餘。你能夠帶領人們進入新的冒險和體驗,讓他們確信會得到有意義的經歷,就算他們沒有像你一樣確定。 -你最強大的能力,在於你能承接並超越讓別人望而卻步的挑戰。你不需要輕率莽撞地去爭取領導力,而是要擁抱你天生的潛能,然後找到方法穿越你所遭遇到的所有限制。 -要注意:不要認定你應該為所有前來尋求指引的人提供協助,或去帶領所有在人生中看起來有些迷失的人。當你記得遵循自身的類型和內在權威,你才能真正地在對的地方,對對的人,帶來真正有意義的領導。` }, - }, - 42: { - intro: `閘門42的能量,是關於成長、完成與成熟。太陽在這個閘門的人,是個天生的成長催化劑——你走進一個人的生命,那個人就開始改變了。你帶來的那份完滿,是暫時的,因為生命要繼續前進,你也要繼續前進。`, - RAC: { title: `馬雅(表象與真相)`, body: `你是來描述這個世界的——不是它表面看起來的樣子,而是它真正的底層邏輯。 -你的腦袋天生會把事情和宇宙的基本原則連結,然後找到那個支撐所有生命歷程的模式。你知道描述同一件事的方法不只一種,你也知道很多我們以為的「事實」,其實只是某個時代的詮釋。 -你是個成長的催化劑。不論你是否意識到,你總是會成為展開體驗的媒介,給每個參與的人帶來潛在的助益。然後你又轉移到其他的觀點和覺察,繼續前進。 -保持健康的幽默感。生命不需要你一直嚴肅地看待,有時退後一步,用輕鬆的清醒繼續觀察生命正在變化的樣貌,反而能帶給你最深的洞見。` }, - JC: { title: `完成`, body: `你的天賦,是為你所投入的每一個體驗帶來完結。 -你不只是讓事情啟動和前進,你還能讓事情圓滿地結束。你能扮演顧問、提倡者或推廣者的角色,提供有建設性的建議,讓每件事都能以對眾人有益的方式發展。 -你很清楚那個分界:什麼東西是可以維持的,什麼東西已經到達了它的自然終點。你能夠警覺地感受到衰退出現的時機,然後縮減或重新調整資源。 -但要留意一件事:你很容易在沒有得到自己應得的回報的情況下,就帶領別人往前走。如果你沒有把自身的成就和滿足納入協議裡,你最終將會感到失望。你值得得到雙贏的結果,不只是把你的能量全部給出去。` }, - LAC: { title: `侷限`, body: `你有一種能力,能讓他人意識到生命的許多自然侷限。 -你務實地看待成長的潛能,你能感受到所有情境中的限制,你能評估哪些事情真的可以達成、哪些只是幻想。因此人們期盼你提供可靠的參考依據——你成了那個說「這個可行」或「這個行不通」的人。 -你的功課是在兩端之間取得平衡:一端是積極支持擴張和成長,另一端是務實地看待失敗的可能性。有時你可能過度謹慎,有時又可能衝動地去突破不必要的限制——找到中間那條路,是你一生的藝術。 -要記得,對你而言最好的互動,是那些雙贏的承諾——讓你帶領別人前進的同時,你自己也能從中獲得真正的成就和滿足。` }, - }, - 43: { - intro: `閘門43的能量,是關於獨特的洞見與突破性的理解。太陽在這個閘門的人,腦袋裡會自發性地冒出讓人驚奇的洞見——那些洞見往往超越了大多數人目前能理解的層次,而你的功課,就是找到方式讓它們被聽見。`, - RAC: { title: `說明`, body: `你有一種強烈的衝動,想要說清楚你看見的事情。 -那些你接收到的洞見,往往是出自新穎的來源,超越了人們通常聽過的一般看法和信念。你的挑戰,不是你說了什麼,而是你怎麼說,以及什麼時候說。 -你說話的語調和確定性,決定了你是否被人聽見。如果你的話語和音調沒有表達出個人的確定性,你就會遭到忽視;如果你在錯誤的時機或以跳躍的方式說出,對方可能只是點頭,卻完全沒有接收到。 -磨練你的說話技巧,是你一生的課題——但當你找到用最簡單的方式表達最深刻洞見的能力時,你說的話真的能夠轉變一個人看世界的方式。那份影響力,遠比你想像中的要大得多。` }, - JC: { title: `同化`, body: `你腦袋裡有很多東西,而且你很容易發現自己處於孤立的狀態——因為很多人並不希望自己的人生因為你所表達的洞見而出現大幅度的轉變。 -這不是你的洞見有問題,而是你表達的時機和方式,決定了它能不能真正被接收到。人們希望在生命中有確定感,如果你的話讓他們感到困擾或不安,他們的第一反應是防衛,而不是接受。 -你需要發展出一種藝術:辨別哪些朋友和夥伴能夠真正聽見你要表達的事情,找到那些準備好聆聽的人,然後在對的時機說出你的洞見。 -當你的聲音放鬆、你的語調是穩定舒適的,人們就更容易接收到你想說的東西。聆聽自己講話,注意你的話語對他人造成的效果——這是你這輩子非常值得練習的事。` }, - LAC: { title: `奉獻`, body: `你來這裡,是要提供有影響力的溝通——那種真正能讓人們成長和被賦予力量的溝通。 -你有驚人的洞見,而且你迫切地想要表達出來。你說話的方式可能很深奧,帶著一種不容置疑的權威感。但除非你以他人能夠聽得進去的方式表達,否則你的聽眾只會離你越來越遠。 -你有時會對改善他人的人生變得很執迷——幾乎把它當成是你的職責,然後你就開始想要拯救他人、為他們安排所有的事情。 -你真正的奉獻,是指引他人找到他們自身的力量和資源,讓他們有自信地在自己的人生道路上前進——而不是你替他們扛著走。有時候你需要親力親為協助;有時候,你必須退居一旁,讓人們以自己的方式成長。知道什麼時候做哪件事,是你一生都在練習的智慧。` }, - }, - 44: { - intro: `閘門44的能量,是關於模式偵測與直覺記憶。太陽在這個閘門的人,有一種與生俱來的直覺,能感受到那些看不見的模式和趨勢——你像是天生的「雷達」,能在別人還沒意識到之前,就已經偵測到某件事正在形成。`, - RAC: { title: `體現(化身)`, body: `你來這裡,是要透過你真實存在的方式,示範給別人看:每個人都應該根據自己內在的真實來生活。 -你有時候會連結到另一個時代或維度的感受——你能看見生命如何在一種更大的演化脈絡裡持續運行,而這讓你對人生有一種很難用語言解釋的深刻覺察。 -透過你強大的觀察力,你能預見人們的需求以及讓他們困擾的問題,然後在他們開口之前,你就已經在想解方了。你能夠成為很棒的聆聽者,在對的時刻提供極有創意的方式幫助別人找到出路。 -當你過度思考,或者讓自己困在過去久遠的情境裡,你就會限制了自己在當下有效發揮的能力。讓自己活在當下,讓那份直覺在當下流動——那才是你最有力量的狀態。` }, - JC: { title: `警覺`, body: `你的人生主題,就是持續保持警覺——對周遭的環境,也對你自己的內在環境。 -你的感官就像一個精密的偵測系統,讓你知道你的世界是不是處於「一切安好」的狀態。你對當下環境的直覺,會自動把眼前的事連結到過去的模式,然後讓你對可能的未來有所感知。你能看見被別人忽視的機會,而且通常在別人還在猶豫的時候,那個機會在你眼中已經是再明顯不過的事。 -你喜歡把自己的能力和別人的努力結合在一起,你真的很樂於合作——但要記得,你需要清楚地傳達你的觀點,讓對方找到屬於他們的清明,而不是你說了什麼、他們就自動理解了。 -要小心過度思考的傾向——你把太多人的觀點都納入考量,反而給自己和周圍的人製造了困惑。最重要的是,先找到並信任你自身的清明,然後再出手。` }, - LAC: { title: `體現(化身)`, body: `你到哪裡,都能把人聚集在一起。 -你接近人和事的方式,是透過一種超越邏輯的直覺記憶——你無法完全解釋你是怎麼感知到的,你就是知道。你對自然和大自然的產物可能有著很深的興趣,因為那些代表著人類世界之外的維度,而你天生就和那個維度很接近。 -你就像個嚮導,迅速觀察並衡量每一個情境,感受生命的模式如何在那個情境裡流動,以及它們往哪個方向去。然後你就知道要怎麼幫忙了。 -過度思考或執著於久遠以前的事情,是你最大的限制。把注意力帶回當下——當你活在當下,你那份連接過去和未來的直覺,才能真正發揮它的力量。` }, - }, - 45: { - intro: `閘門45的能量,是關於聚集資源與領導群體。太陽在這個閘門的人,天生就有一種統領的氣質——你知道如何把資源集中起來,然後讓整個群體都受益。你是個自然的領導者,但你最好用的領導方式,不是命令,而是分享。`, - RAC: { title: `統治者(國王/女王)`, body: `人們自然就會看向你,認為你有知識、有資源,能夠扛起重責大任。 -你的智慧,大多來自對過去什麼行得通、什麼行不通的廣闊視野。你瞭解到,要得到持久的解決方案,需要時間、毅力和決心。就算你找到了解決方案,大家也不一定立刻認同——這可能會讓你在堅持你感覺正確的立場時,有點猶豫。 -培養魅力和優雅,會讓你的努力加倍有效。身為領導者,你最喜歡的狀態是大家百分之百達成共識——但這不總是可能的,所以謙遜就變得非常重要。 -你最終的功課是:真正的領導,不是強加你的意志,而是讓人心甘情願地跟隨。那種領導,才是長久的。` }, - JC: { title: `統治者(獲取)`, body: `你有一種很強的能力,能夠聚集人們和資源,然後讓整個群體有所進展。 -你的驅動力,是要擔負起責任——特別是在物質層面上。你有一種急迫感,想要大幅改變那些侷限的環境,把所有人帶向更好的狀態。但這份急迫感,有時也讓你很難配合那些需要慢慢走的人的步調。 -你的挑戰,是要分辨兩種狀況:一種是真的需要你介入、做出改變的,另一種只是讓你看不順眼、但其實不需要你出手的。當你能夠清楚地做出這個區分,你帶出去的改革力量就會真正有效,而不是引發一場讓大家都累的摩擦。` }, - LAC: { title: `統領(對抗)`, body: `你是個天生的資源聚集者,你知道怎麼讓人相信你、跟隨你。 -你很擅長說服別人——你能提出許多跟隨你的好處,讓人不得不點頭。但要記得一件事:你真正在銷售的,其實是你自己。你的誠信、你所代表的價值,才是你最大的資產。 -有時你可能會誇大自己能提供的東西,特別是在需要說服別人的時候。這很容易,但也會讓你付出代價。當你帶著責任感去運用你的影響力,忠於你說出的承諾——那份影響力才是真實且長久的。 -你必須遵守你所代表的一切,而不是去利用他人的純真。這是你一生中最重要的道德功課。` }, - }, - 46: { - intro: `閘門46的能量,是關於身體的愛與因緣際會。太陽在這個閘門的人,有一種奇特的天賦——你總是在對的時間出現在對的地方。這不是運氣,這是你帶著的能量場。你對生命和身體有一種非常深切的愛,而這份愛,就是你給世界最大的禮物。`, - RAC: { title: `愛的化身`, body: `你來這裡,是要散播愛的。 -你熱愛你的身體,知道照顧好身體有多重要——因為你的身體,是帶領你充分體驗人生的載體。你走到哪裡,都能全然地活在當下,隨時準備好接受生命帶給你的一切。 -你非常感官——你喜歡接觸、質感和美感,你欣賞身體能讓你與人們、環境和生命中眾多奇蹟直接連結的那份能力。你到哪裡,就能把愛帶到哪裡。 -留意你的類型和內在權威,它們會告訴你,哪些地方最需要你的存在和參與。你不需要到處跑,只要出現在對的地方,那份愛就會自然流動。` }, - JC: { title: `因緣際會`, body: `你有一種讓人驚奇的特質:你總是在對的時間出現在對的地方。 -這不只是運氣,這是你的態度創造出來的。當你心存信任、當你準備好接受生命要給你的禮物,機會就自然而然地出現了。你透過你純真的方式,加上一點聰明的判斷,把自己移動到有著各種機會的境遇中。 -你的存在和活力,能帶領你進入具有重大影響力的情境,然後你在那裡激勵人們採取新的觀點,讓他們開始欣賞自己的人生。你可能自己都搞不清楚,為什麼你老是會進入這些不尋常的情況裡——但最重要的是,不要偏離你內在權威的指引。 -你越清楚自己身體的需求,越好好照顧它,你那個「總是在對的地方」的能力就越強。身體是你的工具,你的使者,也是你最重要的盟友。` }, - LAC: { title: `療癒`, body: `你走進任何一個房間,就能觸發療癒。 -不是因為你做了什麼,而是因為你帶著的那份愛和平靜,自然就流了出去。有時候,你自己甚至不知道你做了什麼,但你離開之後,那個地方就不一樣了。 -你能帶給那些標準化程序無法觸及的人,一份幸福和撫慰。你不需要去挑戰任何醫療體系,你只需要做你自己——帶著那份愛出現,就夠了。 -但有一個你一定要記住的原則:「醫生,請先醫好自己。」 你必須先照顧好自己的健康和能量,才有辦法繼續帶給別人療癒。如果你不保護好自己,你會過度承載別人的重量,然後把自己也搞垮。 -有時候,你能帶來最簡單也最有效的療癒,就是一個愉快的心情,和一陣開懷大笑。別忘了這件事。` }, - }, - 47: { - intro: `閘門47的能量,是關於領悟與突破困境。太陽在這個閘門的人,有一種很深的驅動力,想要找出生命所有事情背後的「道理」。你不喜歡讓事情懸在那裡沒有解答,你的腦袋會不停地試著找出那個讓一切說得通的邏輯——但你慢慢會發現,真正的領悟,往往是在你的腦袋放鬆下來的那一刻才出現的。`, - RAC: { title: `統領`, body: `人們自然就會看向你,認為你有知識和資源,能夠承擔起重責大任。 -你的智慧,大多來自你對過去做法的廣闊視野——你向過去尋找引據,用歷史和前例來支撐你目前的立場。你的腦袋可能會跟一些看似簡單的議題拉扯很久,試著找到一個讓你完全滿意的解決方式。 -有趣的是,唯有當你不再讓你的頭腦與這個急迫的問題角力,你才能真正有所頓悟。放鬆下來、讓自己沉浸在不同的活動裡,反而能讓你做出最明智的決定。 -培養魅力和謙遜,是你這個人生主題裡最重要的兩個關鍵字。當你宣告一個決定的時候,要清楚且堅定——但在那之前,給你的頭腦足夠的空間去消化,然後放它一馬,讓頓悟自然來到。` }, - JC: { title: `領悟(壓抑)`, body: `你這輩子,是來找出「什麼對你來說是合理的」,然後把它維持住的。 -你的腦袋非常活躍,充滿各式各樣的想法,有些很務實,有些不然。你很容易迷失在自己的思緒裡,不停地篩選概念和前例,試著找到能用在當下的東西。 -當你有所突破、有所領悟,那一瞬間你能放鬆下來,享受一份短暫的巨大成就感。但這種滿足感通常很短暫,因為你的腦袋很快就會開始考量更多的面向,然後又開始轉了。 -要記得一件事:你看待生命的方式非常獨特,你看見的事情往往超越了他人的視野。不是你的想法有問題,而是你需要耐心,等到對的時機再說出來。當你的情緒是穩定清明的,你說出去的東西才能真正被聽見。` }, - LAC: { title: `告知`, body: `你有一種天賦,能解決那些別人解決不了的懸而未決的難題。 -你能在他人認為不可能的地方,為他們指出一條路。你走的路,往往是較少人走過的那條——你避開不必要的阻礙,然後透過你的話語和行動,讓人們知道,用一種全然不同的方式去面對挑戰,是可行的。 -但你有一個非常重要的事情要記得:你最終只是個傳訊者。你的靈感和洞見,透過你傾洩而出——但你不是來拯救所有人的,也不是來替所有人解決所有問題的。 -無畏地表達你的情緒,這是你生命裡很關鍵的元素。你天生是感情豐沛的人,你說的話可能不總是符合邏輯,但它們常常是很有詩意的,能讓受壓迫的人感受到一種新的力量。在混亂中散播和諧,是你的天賦。` }, - }, - 48: { - intro: `閘門48的能量,是關於深度、才能與對不足的恐懼。太陽在這個閘門的人,有一種非常深厚的內在資源——你的知識和能力,就像一口深井,人們能從中汲取智慧。但你自己往往不相信這口井有多深。你最大的功課,是學會信任你已經擁有的一切。`, - RAC: { title: `緊張`, body: `你的存在,讓周圍的生命保持在正確的頻率上。 -你能察覺到身邊的人哪裡和他們的人生不同調,然後你就忍不住想要去挑戰它——用一種讓對方不自在的方式,觸及他們生命中那個一直沒被面對的地方。你帶來的那份「緊張」,就像樂器需要適當的張力才能發出正確的聲音。 -你有憂鬱的傾向。當你真正理解並順從這個特質,它就會成為你探索內在深度的通道,讓你的創意能量以意想不到的方式流動出來。 -最重要的是:先滋養你自己的能力。你需要耐心,等到你真正精通你的天賦,並且找到那份清明——然後你才能知道什麼時候該行動,什麼時候該有覺知地停下來。` }, - JC: { title: `新鮮(深度)`, body: `你的人生主題,就是不斷重新評估並更新你自己和這個世界。 -你是個深度的人——不論走到哪裡,你都在蒐集知識,然後把它們提煉成內在的智慧,然後你想把這份智慧與世界分享。你可能有一堆讀到一半的書,有各種你已經不再感興趣的計畫和連結——這不是你的問題,這是你設計的一部分,你天生就是要廣泛涉獵、持續更新的。 -你的足智多謀,給人們和環境帶來很大的影響。但當你在尋求夥伴和支持時,一定要記得運用你的內在權威——不是因為某件事看起來很有趣你就跳進去,而是要確認那個召喚是真實的。 -你的深度,是你最大的資產。讓自己深入探索生命,解答才會在你全然投入之後自然出現。` }, - LAC: { title: `努力(先鋒)`, body: `你是那種天生就停不下來的人——而且你最擅長的,是讓事情從零開始動起來。 -你走進一個地方,如果發現沒什麼事情在發生,你就會開始想辦法讓它動起來。你有一種內建的驅動力,推著你去帶領、去催化、去讓別人也跟著行動。這不是你刻意為之,這就是你的本能。 -你不一定需要從頭陪到最後。你的角色,有時候就是點燃引信、讓火車開動,然後把接力棒交給有能力繼續跑的人。這件事說起來容易,對你來說卻是真正需要練習的功課——因為你很難放手,很難相信「沒有你在盯著,事情也能繼續往前走」。 -緊抓著一切不放,會把你和周圍的人都磨垮;學會放手,你反而能在更大的格局裡看到更多事情成形。在做出任何承諾之前,先讓你的內在權威告訴你:這個,是真的在召喚我的嗎?當你從那個清明的地方出發去推動事情,你帶出去的能量,才是真正能讓人跟著動起來的那種。` }, - }, - 49: { - intro: `閘門49的能量,是關於原則、革命與有意識的選擇。太陽在這個閘門的人,天生就有一種強烈的正義感,你非常在乎原則是否被遵守,在乎人們是否被公平對待。你是那種「不!這樣不對」的人——但你慢慢會發現,如何表達這份「不」,比你說什麼更重要。`, - RAC: { title: `說明`, body: `你有很多洞見想說,而且你有一種說清楚的衝動——把你看見的、知道的,一股腦地說出來。 -你帶著一種驅動力,想要表達那些你認為對世界很重要的原則。你的聲音,是你最強大的工具——但不只是你說了什麼,而是你怎麼說、你的語調是什麼。 -當你放鬆、按部就班地陳述,你的聲音能清楚傳遞資訊;當你急著想說、跳躍式地傾吐,對方就會迷失。磨練你的說話技巧和時機,是你一生都在練習的功課。 -你有三個層次的表達:反應(習慣性地說「不!」)、改革(有原則地反對),以及反叛者(選擇自己的道路,符合自身的清明和原則)。最後這個層次,才是你真正帶來轉變的方式。` }, - JC: { title: `原則`, body: `你是個有著堅定原則的人,對社會是否公平對待每個人,非常敏感。 -你是最快注意到不公義的人,也是最快想要出聲指出它的人。你有一種天賦,能夠看穿人們是否擁有適當的資源,能夠看見人們的基本需求有沒有被滿足。 -但這裡有一個你需要小心的地方:不是每一場你感覺到的「不對」,都需要你去打這場仗。有些是真正需要你的能量的,有些只是在消耗你。 -冷靜地採取預防性的措施,讓人們知道他們可以採取哪些簡單的步驟來提升生活——這樣的方式,比全面的反應和改革更有長遠的影響力。遵循你的內在權威,它會告訴你何時要出手,何時讓世界自行釐清。` }, - LAC: { title: `反叛者(革命)`, body: `你天生就在為那些比你不幸的人爭取權益。 -你忠於自己的原則,而且你不只是說說而已——你會真的採取行動,為那些被社會拋棄或遺忘的人找到有助益的解決方案。你讓人們看見,每個人與生俱來的自由,是可以被找回的。 -但你需要覺察到一件事:你的人生,不是要去對每件事做出反應,而是要辨別哪些才真正值得你的關注和投入。你很容易被各種「需要被拯救」的情況吸引,然後投入其中,最後卻偏離了你自己的人生軌道。 -先照顧好你自己的需求,再去滿足他人的需求——當你這樣做,你的努力會更有效益。你帶來的革命,是透過有意識的選擇和個人成長,而不是大規模的動盪。信任你的內在權威,它會告訴你哪一場仗是真正在召喚你的。` }, - }, - 50: { - intro: `閘門 50 的能量,是關於價值觀、道德感,還有對這個世界「應該要怎樣」的強烈渴望。太陽在這個閘門的人,天生就有一種對「對與錯」的高度敏感——不是那種說說而已的,而是真的放在心裡、認真在乎的那種。你就像一個用來熬湯的大鍋,把生命中重要的道德和價值,都慢慢煮進去,熬出味道來分享給大家。`, - RAC: { title: `律法`, body: `你來到這世上,是要在混亂裡建立秩序的。 -這件事聽起來好像很重,但其實不是那種敲法槌的嚴肅感——更像是你身邊的人會在不知不覺間,因為你的存在,開始思考:「欸,我這樣做,對嗎?」 -你一生都在評估環境,觀察哪些規則和習俗已經過時、哪些還值得守護。當你發現有不公平、不合理的地方,你不一定會大聲嚷嚷,但你有辦法從自己的角度,為它帶來一點改變。 -有個要注意的地方:你自己也是會「轉變」的人,有時候甚至是很大幅度的轉變。所以有些人會覺得你善變,但其實你只是一直在更新自己對這個世界的理解而已。 -最重要的是:記得用你的類型和內在權威來確認方向——當你清楚自己的底線是什麼,行動起來才會讓你真的有成就感,而不只是累。` }, - JC: { title: `價值`, body: `你的人生核心,是覺察這個社會裡哪些東西「失衡了」。 -你不是那種愛批評的人,但你的眼睛很準——你能看出周圍哪些人的態度、哪些環境的狀態,已經偏離了應該有的樣子。而且你不只是看,你有那個影響力,能讓人開始跟著調整。 -你身邊的人會受到你標準的感染——有些人很感激,覺得有了新方向;也有些人會覺得跟你在一起,怎麼壓力好大。這都是正常的,不是你的問題。 -你需要時常回頭問問自己:我現在待的環境,有沒有在滋養我?還是我一直在「輸出」,卻沒有被補充?` }, - LAC: { title: `希望`, body: `你帶著一個對這個世界的烏托邦願景——你相信人可以更好,規則可以更公平,生活可以更有尊嚴。 -你不是那種只會說「世界應該要怎樣」的嘴砲派,你真的有辦法讓人看到那個可能性,而且是用他們聽得懂、跟得上的方式。 -但這裡有個小提醒:你不可能同時救所有人。試圖幫每一個過得不好的人,最後只會把你自己燒乾。記得選擇你真的能夠投入的地方,其他的,就先放手。` }, - }, - 51: { - intro: `閘門 51 的能量,是關於震盪、突破,以及把人從半夢半醒中叫醒的那種「砰」的力量。太陽在這個閘門的人,你的存在本身就像是一道閃電——你不見得刻意想嚇人,但就是會讓人突然有所覺察,開始動起來。你天生膽識過人,就算事情超出預期,你也知道怎麼應對。`, - RAC: { title: `滲透`, body: `你來到哪裡,就滲透進哪裡。 -不是說你很難纏——而是你有一種很特別的能力,能在極短的時間內直接進入一個人生命的核心。你不用問很多問題,不用做很多分析,就能感覺到對方的動機、恐懼,甚至他們自己都還沒搞清楚的東西。 -你能讓人受到衝擊,然後對自己的生活有全新的覺察——這是一種很稀有的天賦,只是用起來要小心。 -有個功課要記著:你進入別人的生命時,動機必須是真誠的,而不是好奇、操控,或只是想試試看自己的「滲透力」有多強。從愛出發去接觸人,跟從想要證明什麼的角度去接觸人,結果會差很多。你的類型和內在權威,永遠是你最好的指南針——它會告訴你,什麼時候真的該介入,什麼時候只是旁觀就好。` }, - JC: { title: `震驚`, body: `你是這個世界的避雷針。 -不是說你很危險——而是那些突如其來、讓人措手不及的事情,往往會透過你作為媒介,以某種方式在這個世界留下痕跡。你有一種能力,能跳出大家習慣的思考框架,對繁雜的難題提出根本沒人想到的解法。 -你喜歡鑽研生命的謎題,也很享受在別人毫無防備的時候,給他們一個讓他們從此想法不一樣的刺激。 -有個功課要記著:你帶來的震盪,最好是跟著你的內在權威走的。如果只是為了好玩或想證明自己,有時候會踩到別人,然後搞不清楚為什麼大家突然對你有情緒。` }, - LAC: { title: `號角`, body: `你是個傳訊者。 -你的任務,是把那些「看不見的東西」,變成人們能夠聽懂、能夠接收的訊息。你能喚醒別人的直覺、讓人打開心胸,去看到他們自己本來看不到的可能性。 -不過你有時候說話很直,而且說了就說了,不太在乎對方有沒有「準備好接收」。這樣的方式有人很喜歡,覺得你說到心坎裡;也有人會覺得被嚇到,然後跟你保持距離。 -怎麼把「有用的真話」包裝得讓人聽得進去,是你這輩子一直在練習的功課。帶著同理心說話,效果差很多。` }, - }, - 52: { - intro: `閘門 52 的能量,是關於靜止、沉澱,以及那種「山一樣穩」的從容。太陽在這個閘門的人,你身上有一種很難得的特質——當周圍所有人都開始慌的時候,你還是能保持清醒,告訴大家:「冷靜,這一切都會過去的。」你不是不在乎,而是你看事情的視野,天生就比別人高一點點。`, - RAC: { title: `服務`, body: `你的人生方向,是讓這個世界變得更好。 -你對「哪裡出了問題」的感覺特別敏銳,而且你能用冷靜、有條理的方式去分析,這是很多人求都求不來的天賦。 -但有個陷阱要小心:你很容易把服務變成一種「個人任務」,開始覺得每個問題都要靠你解決,每個需要幫助的人都是你的責任。這樣走下去,不只你會被榨乾,還會開始有怨氣。 -記得:服務這件事,不是關於你,而是關於這個世界。你只要在「對的時機、對的地方」發揮,就夠了。完美是不可能的,盡力做好當下的那一步,就是你最重要的事。` }, - JC: { title: `靜止`, body: `你的人生主題,就是體現那種「亂中有定」的狀態。 -你不是那種靜如死水的人,你也有欲望、也想動——但你知道,在真正行動之前,需要先讓自己的內在沉澱。那個靜,不是懶,是一種儲能。 -當你真正準備好動的時候,會帶著一股很確定的力量出發,而且很難被阻擋。 -你給身邊的人帶來的,是一種「穩定的錨」的感覺。當大家都焦慮、都在轉圈,你的存在本身就能讓氣氛安定下來。這個特質比你想像中珍貴很多。` }, - LAC: { title: `要求`, body: `你對這個社會有要求——不是對身邊的個人,而是對整個社會運作的方式。 -你看得到哪裡不對勁,也很想推動改善。但這件事需要極大的耐心,因為社會的慣性很重,不是你一出手就馬上有反應的。 -如果你發現自己越來越悲觀、越來越失去幽默感,那是一個信號:停下來,先照顧自己。喜悅和平靜,是你最重要的資源。沒有這兩樣,你的「要求」就會變成抱怨,效果完全不一樣。` }, - }, - 53: { - intro: `閘門 53 的能量,是關於啟動、開始,以及那種「讓事情動起來」的推力。太陽在這個閘門的人,你天生就有一種衝勁——不管走到哪裡,你都會讓身邊停滯的東西開始動起來。你不一定要親自完成每件事,但你就是有辦法讓一切從零變成有。`, - RAC: { title: `滲透`, body: `你來到哪裡,就滲透進哪裡。 -你有一種很自然的方式,能夠在不知不覺間進入別人的生命核心——你不用刻意做什麼,就能感受到對方卡在哪裡,也能啟動那個讓他們動不了的開關。你經常會在別人的人生裡,把那些停在那邊很久的事情推動向前。 -但這裡有個要注意的地方:你不需要對每一件事都出手。你有很強的衝動想要介入、想要讓事情有所突破,但不是每個情境都需要你。在做任何承諾之前,先問問你的內在——這真的是你該進去的嗎?還是你只是習慣性地想出手而已?` }, - JC: { title: `開始`, body: `你是最會起頭的人。 -你觸碰到的每一件事,都有擴張和成長的可能性。你很容易讓一個企劃從無到有,讓一段關係從陌生到熟悉,讓一個團隊從鬆散到開始有方向。這個能力很稀有,也非常珍貴。 -但有個你需要知道的事:你的驅動力很強,有時候你會在還沒完全搞清楚規模的時候就一頭栽進去,等到發現比你想的大很多,可能會有點措手不及。這不是你的問題,而是你的本質。解法是:在答應任何事之前,先用你的內在權威確認一下,這真的是你被召喚去做的嗎?還是只是一時衝動?` }, - LAC: { title: `循環`, body: `你的人生是一個又一個的循環——每個循環都帶來成長和轉變,不只影響你自己,也影響身邊跟著你走的人。 -你很自然地能夠靠近那些有影響力的人,也很擅長建立人脈、把對的人連在一起。這個能力在對的時機發揮,威力驚人。 -但你心裡其實藏著一股對失敗的恐懼,這讓你有時候會在還沒準備好的時候就過度承諾,或是相反地,明明有機會卻因為太怕搞砸而動彈不得。當你發現自己陷入這兩個極端,先停下來——記得生活隨時都可以重新出發。` }, - }, - 54: { - intro: `閘門 54 的能量,是關於企圖心、往上攀升,以及對成功的強烈渴望。太陽在這個閘門的人,你身上有一股很強的驅動力——不管是在事業、社交還是心靈層面,你都想要爬到更高的位置,找到更好的夥伴,讓自己和家人的生活更好。這不是貪心,這是你的本質。`, - RAC: { title: `滲透`, body: `你來到哪裡,就有一股力量往裡面滲。 -你能夠非常快速地讀懂一個環境裡的人——誰有能力、誰有資源、誰值得你花時間。這種眼光是天賦,不是算計。你天生就知道要去哪裡找到能夠推動自己前進的能量。 -但你要小心的是:你進入別人的生命時,要確定你的出發點是真誠的,而不只是「這個人對我有用」。從愛和真誠出發的連結,才能走得長久,也才能帶給你真正想要的那種成就感。` }, - JC: { title: `企圖心`, body: `你對自己有很高的期待,對物質和心靈層面的成就都很在乎。 -你對機會的嗅覺很靈敏,常常在別人還沒看到之前,就已經看出哪裡有潛力、哪裡值得投入。這是你很強的一面。 -有個功課要記著:不是每一個看起來很吸引人的機會都是你的。貿然跳入只因為它看起來很誘人,有時候只會讓你陷入一個很難脫身的循環。每一次的承諾,都先讓你的內在權威說話——它比你的頭腦更知道哪些事情真的適合你。` }, - LAC: { title: `循環`, body: `你的人生不斷地在循環——每一個階段都帶來轉變,帶你進入不同的圈子、不同的夥伴、不同的挑戰。 -你很自然地能夠靠近有能力的人,也能為身邊的人帶來很大的機會。你的能量和能力是真實的,很多人想要你成為他們團隊的一部分,正是因為你一出現,事情就會開始動起來。 -但這裡有個陷阱要注意:你的能量很容易被別人借用,最後發現自己把所有人都推往前了,自己卻遺落在後頭,然後感到疲憊和失落。在做每一個承諾之前,先問問自己:我這樣做,自己也能得到滿足嗎?` }, - }, - 55: { - intro: `閘門 55 的能量,是關於情緒、豐盛,以及靈性的深度連結。太陽在這個閘門的人,你對生命有著比一般人更強烈的感受——高興的時候是真的很高興,低落的時候也是真的很低落。你的情緒不是問題,而是你認識這個世界的方式。當你學會尊重自己的情緒起伏,它會成為你最強大的創造力來源。`, - RAC: { title: `沉睡鳳凰(未來轉變)`, body: `你是個無可救藥的浪漫主義者。 -你一直在追尋某種深刻的連結——不管是愛情、友情,還是和生命本身的親密感。你比一般人更早感受到時代的變化,也總是略微超前你所處的世界。你會跌倒、會燃燒、然後從灰燼裡再次升起——這不是悲劇,這就是你的旅程。 -你身邊的人,往往因為靠近你而得到轉變。你不一定知道自己是怎麼做到的,但你的存在本身就有那個力量。 -有個提醒:當你開始把生命看得太嚴肅的時候,通常是一個新的啟發即將到來的訊號。記得保留那份幽默感——它不只能讓你輕鬆一點,也是讓生命繼續向你揭露更多的通行證。` }, - JC: { title: `情緒`, body: `你的情緒就是你的創意引擎。 -你比任何人都更能感受情緒的低谷和高點——那種深深的悲傷,那種莫名其妙的喜悅,都是你的。這不是你情緒管理不好,而是你的本質就是要去體驗這些。 -當你允許自己真實地活在情緒裡,而不是壓抑它、或是為它道歉,你的創造力就會從那裡流出來,讓人驚訝。 -要小心的是:你渴望自由,非常不喜歡被框住。當你感覺被限制、被誤解,憂鬱可能會跑進來。接受它,而不是對抗它——那是你內在正在整理的信號,不是你哪裡出了問題。` }, - LAC: { title: `心靈`, body: `你渴望和生命有深刻的連結——不只是人與人之間的連結,而是那種靈魂層面的、不用語言解釋的感受。 -你能夠看到人們被傳統和框架困住的地方,然後用你的方式,讓他們看到另一種可能性。你的靈性本質是真實的,而且很難被否認——就算有人想說服你「別想太多」,你也感覺得出來那不是真的。 -你的挑戰是要在「完全的自由」和「深度的連結」之間找到平衡——你想要的是兩者都有,而且你值得擁有這兩樣。當你遵循你的內在權威,它會帶你找到那些真正能讓你靈魂感到自在的人和事。` }, - }, - 56: { - intro: `閘門 56 的能量,是關於說故事、追尋意義,以及把生命中各種體驗轉化成值得分享的東西。太陽在這個閘門的人,你是天生的說書人——不管是親身經歷的、道聽塗說的,還是腦袋裡憑空冒出來的,你都有辦法讓人聽得入迷。你對這個世界充滿好奇,一輩子都在透過各種體驗搜集關於生命意義的拼圖。`, - RAC: { title: `律法`, body: `你來到這世上,是要在混亂裡找到屬於這個時代的秩序感。 -你的信念不是固定不動的——它們會隨著你的經歷一直在更新、在調整。這很正常,這就是你的本質。你是一個理想主義者,心裡一直有一個「世界應該要是什麼樣子」的畫面,而且你有辦法把這個畫面說給別人聽,讓他們也開始想像。 -要注意的是:你的信念系統是很個人的,不要試著去迎合別人的原則來調整自己。你越忠實地活出自己對這世界的理解,你說的話就越有力量。` }, - JC: { title: `激勵(信念)`, body: `你對刺激和體驗的熱愛,幾乎沒有上限。 -旅行、文化、宗教、藝術、美食、人群……你什麼都想試,什麼都想感受,而且你蒐集到的每一個故事,最終都會變成你理解生命的素材。你的蠟燭是兩頭燒的那種,而且連中間都一起點著——精力驚人,讓人看了都累。 -不過正因為你這麼容易被吸引進各種事情裡,有時候也會一個不小心就過度承諾,或是跑進不適合你的狀況裡出不來。記得讓你的內在權威幫你篩選——不是每個刺激都值得你投入,但那些真的適合你的,會讓你的人生變得非常精采。` }, - LAC: { title: `分心`, body: `你是個天生的生命讚頌者,走到哪裡都能帶起一種「欸這個也好有趣」的氛圍。 -你很容易吸引別人的注意,也很容易被別人的需求或有趣的事物吸引過去。有時你是讓人分心的那個,有時你自己就先分心了。 -這裡有個挑戰:你需要很清楚自己的目的是什麼,否則你可能會在別人的需求和各種有趣的事情之間打轉,最後發現自己做了很多,但真正滿足的卻不多。你是說書人,你的故事是你的禮物——但要說什麼故事、對誰說,讓內在權威來告訴你。` }, - }, - 57: { - intro: `閘門 57 的能量,是關於直覺、聆聽,以及那種不需要理由就能感覺到「這裡不對」或「這個可以」的本能。太陽在這個閘門的人,你像一陣溫柔但穿透力極強的風——你能感知到環境裡別人感知不到的東西,而且你的聽覺和直覺,幾乎就像是內建的聲納系統。`, - RAC: { title: `滲透`, body: `你走到哪裡,就滲透進哪裡。 -你的直覺讓你能夠極快地讀懂一個人——他的動機、他的恐懼、他現在卡在哪裡。你不需要問很多問題,你就是能感覺到。這種能力讓你能在很深的層面影響別人,甚至比他們自己意識到的還要深。 -功課是:你進入別人生命的方式,很重要。如果你留意自己怎麼傳達你的直覺洞見,人們會非常感激你;但如果你直接就把感受到的東西說出來,不管對方有沒有準備好,有時候人們會退縮,把距離拉開。先感覺一下對方是否已經準備好,再開口。` }, - JC: { title: `直覺`, body: `你的觀察入微,常常遠遠超過一般人能做到的程度。 -你有一種很獨特的「跳脫框架」的感知方式,能看見別人看不到的東西、聽見別人聽不到的頻率。問題是,這些洞見有時候很難被表達出來——不是因為你的觀點有問題,而是因為你感知到的東西往往超出了一般人的理解框架。 -有時候你找不到聽眾,然後可能選擇乾脆保持沉默。但要記得:那些真正準備好接收你的人,是真實存在的。讓你的類型和內在權威帶你找到他們,不要因為被誤解幾次就把自己的洞見藏起來了。` }, - LAC: { title: `號角`, body: `你是個傳訊者,你的任務是讓崇高的理念變得務實,讓看不見的東西能被人看見。 -你有方法喚醒別人的直覺,讓他們開始對自己的生命有全新的覺察。但你有時候說話很直接,資訊量也很大,對方可能還沒準備好就已經被你說的話淹沒了。 -你需要學習的,是要先感受一下你的聽眾能接收多少——不是每個人都能在同一時間消化你所知道的一切。帶著耐心和同理心去傳遞,是你這輩子持續在磨練的功課。` }, - }, - 58: { - intro: `閘門 58 的能量,是關於喜悅、活力,以及那種「生命本來就應該要更好」的天生信念。太陽在這個閘門的人,你就像一個永遠充飽電的人——你對生命有一種真誠的熱忱,這種熱忱有傳染力,讓你走到哪裡,那裡的氣氛就會跟著活起來。你不是在表演開心,你是真的相信這世界可以更好。`, - RAC: { title: `服務`, body: `你的人生方向,是讓這個社會變得更好。 -你有一種很冷靜、很有條理的眼光,能夠看出哪裡出了問題、需要改進。這不是找碴,而是你天生的感知能力。你想要貢獻,想要讓事情往更好的方向走。 -但這裡有個容易踩到的坑:你很容易在不完全清楚自己是否真心投入的情況下就答應做某件事,帶著一種「總得有人來做」的勉強感。這樣的服務,通常走不遠,也讓你自己感到空洞。每一次新的承諾之前,先停下來問自己:我是真的想做這件事,還是只是覺得應該要做?` }, - JC: { title: `活力`, body: `你的人生主題,是讓自己持續活在那個能觸發喜悅和活力的狀態裡。 -你是第一個看到機會的人,而且你很容易就跳進去——有時候跳進去了才發現比想像的大很多,然後開始喘不過氣。這是你需要注意的地方。 -每天早上醒來,如果你能停下來一下,看看今天哪些事情最可能帶給你喜悅,然後有意識地選擇怎麼投入,你會發現整天的能量狀態都不一樣。你的喜悅不是表演出來的——它是真實的,而且會感染身邊每一個人。保護好這份喜悅,是你最重要的功課。` }, - LAC: { title: `要求`, body: `你對這個社會有要求——不是對身邊的個人,而是對整個社會運作的方式。 -你有那個精力,能把幾乎無法運作的狀況翻轉成令人驚奇的事情。你的活力和帶動力是真實的,很多人都能感受到你出現之後帶來的那種「欸,好像可以動起來了」的感覺。 -但這件事要記著:在真的投入之前,先確認你的需求也在這個承諾裡被滿足了。如果你只是一直在付出,卻沒有得到相應的滿足和回饋,你的熱忱會慢慢消耗掉的。而失去了喜悅的你,就失去了你最強大的武器。` }, - }, - 59: { - intro: `閘門 59 的能量,是關於親密、連結,以及那種打破人與人之間隔閡的力量。太陽在這個閘門的人,你身上有一種很自然的磁吸力——你走進一個場合,就會讓那裡的氛圍變得更親近、更有溫度。你天生懂得怎麼讓人卸下防備,這不是技巧,是你本來就有的頻率。`, - RAC: { title: `沉睡鳳凰(未來轉變)`, body: `你是個無可救藥的浪漫主義者。 -你一直在尋找某種深刻的連結——不管是在愛情、友誼,還是和生命本身的親密感。你比同時代的人都略微超前一點,總是在追求那些別人還沒準備好擁抱的夢想。你會跌倒、燃燒,然後從灰燼裡再次升起,繼續出發——這個循環對你來說不是悲劇,這就是你的人生旅程。 -你不一定意識到,但你身邊的人往往因為靠近你而發生了一些轉變。你有的時候會和人非常親密,有的時候卻又刻意疏遠——這兩種都是你,不需要為此感到矛盾。 -最重要的是:記得保留你的幽默感。當你開始把生命看得太嚴肅,通常就是一個新的啟發即將到來的訊號。` }, - JC: { title: `策略`, body: `你天生就是個連結者——把人聚在一起,讓他們彼此看見彼此最好的那一面,是你最自然的狀態。 -你對親密關係有一種策略性的感知,你知道誰跟誰在同一個頻率上,也知道怎麼創造那個讓人靠近的空間。你享受建立連結的過程,有時甚至比連結本身更享受規劃的部分。 -要小心的是:你有強烈的驅動力想要突破隔閡、建立親密,有時候可能在對方還沒準備好的時候就衝過去了。先感受一下對方的節奏,讓你的內在權威告訴你什麼時候進、什麼時候退。` }, - LAC: { title: `心靈`, body: `你的人生目的,是完全地擁抱生命——讓生命能量能夠不受阻礙地在你體內流動。 -你能夠啟發並引導他人用他們自己想不到的方式去看待自己的生命,把他們從固有的框架和限制裡釋放出來。你渴望絕對的自由,同時也渴望深度的連結——而且你覺得這兩件事應該可以同時存在,你是對的。 -有時候這種自由與親密的拉扯,會讓身邊的人有點摸不透你。這沒有問題。當你遵循你的內在權威,你會自然知道什麼時候該往前靠近,什麼時候需要自己的空間。` }, - }, - 60: { - intro: `閘門 60 的能量,是關於限制、接受,以及在現實的框架裡找到突破口。太陽在這個閘門的人,你對「這世界有哪些限制」有非常清醒的感知——不是悲觀,而是務實。你能夠在別人還在對著牆壁硬衝的時候,就先看清楚哪裡有縫。`, - RAC: { title: `律法`, body: `你來到這個世界,是要在混亂裡建立屬於這個時代的秩序感。 -你從自己的生命經歷中一點一滴累積出對「什麼對、什麼錯」的判斷,然後把這個判斷用在你身處的世界裡。你有時候會顯得比較保守,不太容易被新穎的事物輕易動搖——除非那個改變有非常清楚的實質意義。 -但你也很清楚,好的規則需要與時俱進。當改變的理由夠充分,你會是那個願意帶頭調整的人。你本身就是一個轉變的媒介——只是你需要先確認那個轉變是值得的。` }, - JC: { title: `限制`, body: `你對生命中各種可能的限制和不公義,感知得非常清楚。 -你不只是看到問題,你還能夠在任何限制裡找到有創意的方式建立新的起點。你知道哪裡是真正無法跨越的牆,哪裡只是看起來像牆但其實是可以繞過去的。 -有個功課是:你對這些限制的感知很強烈,有時候可能會讓你看起來像是在「踩煞車」,讓身邊的人覺得你在妨礙前進。其實你是在幫大家確認地基穩不穩。記得溫和地說出你所看見的,而不是直接說「這樣不行」。` }, - LAC: { title: `分心`, body: `你是一個天生的生命讚頌者,但你也很容易被各種有意思的事物或他人的需求帶偏。 -你有方法帶領自己和他人經歷愉悅的人生,在各種體驗裡找到意義、找到故事、找到值得分享的東西。只是你有時候會突然「不見了」——因為當你發現一個情境對你不再有意義,你會逃,而且是逃得很乾淨,有時甚至連告別都沒有。 -這不是你的問題,這是你的本質。但記得:讓你的內在權威幫你在一開始就篩選好哪些投入是真的對你有意義的,這樣後來就不需要那麼常跑路了。` }, - }, - 61: { - intro: `閘門 61 的能量,是關於對生命奧祕的著迷,以及那種永遠想搞清楚「到底是怎麼回事」的內在驅動力。太陽在這個閘門的人,你的頭腦從來不停——它不斷在拆解、在重組、在尋找那個終極的答案。你不只是在思考,你是真的對宇宙的運作方式著迷,而且願意用一生的時間去追尋。`, - RAC: { title: `馬雅`, body: `你的人生主題,是去描述你所看到的世界——而且你從來不只有一種描述方式。 -你能夠看見同一件事情的至少兩個面向,這讓你很難輕易說「就是這樣」,因為你知道換個角度看又會不一樣。你對科學、哲學、靈性,都有一種開放的好奇心,也有能力在這些領域之間自由穿梭。 -但這裡有個要注意的:你對真理的追尋可能讓你走進一個很深的思考迷宮,不斷地問問題,卻很難找到讓自己滿足的答案。記得偶爾讓頭腦休息一下——真理往往不是靠努力想出來的,而是在你放鬆的時候突然跑進來的。` }, - JC: { title: `真理(思考)`, body: `你一輩子都在追尋真理,而且你知道真理是存在的,只是從來沒有辦法完全抓住它。 -你能夠很快辨認出謊言和虛假——不管是從話語裡,還是從一個人的聲音和態度裡。你有時候甚至不知道自己是怎麼感覺到的,就是知道「這不對」。 -你的腦袋喜歡在一個議題的兩面之間游移,一下往這邊,一下往那邊。這不是優柔寡斷,這是你在尋找更完整的真相。當你學會讓腦袋服務你,而不是被腦袋帶著跑,那些深刻的洞見就會在最意想不到的時候悄悄降臨。` }, - LAC: { title: `遮蔽(隱藏)`, body: `你的人生,是以一種讓人不容易看透的方式在運作的。 -你有方法帶來改變和轉化,但你的過程和意圖通常不是那麼容易被別人理解——有時候連你自己也說不太清楚自己是怎麼做到的。你能夠跳脫框架思考,用別人沒想到的角度切入,找到讓事情向前走的路。 -你有一種自然的吸引力,讓人想要接近你、想要跟隨你。這很好,但也要小心:如果你對每個人的需求都來者不拒,你會發現自己偏離了自己真正的興趣和靈感。用你的內在權威選擇要對誰投入,讓你的路保持一點神祕感,這不是在拒絕人,而是在保護你自己最珍貴的能量來源。` }, - }, - 62: { - intro: `閘門 62 的能量,是關於細節、邏輯,以及那種把事情說清楚、說明白的天賦。太陽在這個閘門的人,你天生就是個非常有條理的人——你能夠把複雜的事情整理成清晰的步驟,讓別人一聽就懂。你不喜歡模糊,你喜歡把話說準確。這個特質在對的地方,是無比珍貴的能力。`, - RAC: { title: `馬雅`, body: `你的人生主題,是去描述這個世界——而且你知道同一件事情至少有兩種說法。 -你能夠觀察成長和改變的過程,然後用你清晰的語言能力,把這些觀察整理成讓人聽懂的描述。你有能力看穿不正確的「事實」和說法,也能夠幾乎立刻察覺到什麼東西是荒謬的。 -要記住的是:追求真理這件事,需要你同時保持一份幽默感。生命不一定要你把每一個細節都搞得清清楚楚才能繼續前進。有時候後退一步,讓自己從直接的參與中抽離,反而能讓你得到更真實的觀點。` }, - JC: { title: `細節`, body: `你的人生主題,是去檢視並表達你在生命中遭遇的所有事物的細節。 -你能夠把幾乎任何事情說得頭頭是道,組織出非常有說服力的論述。你對細節的掌握,讓你能夠在各種情境裡快速辨別哪裡有問題、哪裡有漏洞。 -但有個平衡很重要:你不是去批評別人、批評別人的價值觀,而是在分享你對生命的理解。如果你只執著在邏輯和細節上,有時候會讓人感覺很有壓迫感。記得把你的洞見和生命真實的動能連結在一起,才能讓你的細節真正發揮影響力。` }, - LAC: { title: `遮蔽(隱藏)`, body: `你的人生,是以一種讓人不容易完全看透的方式在進行的。 -你有能力用邏輯清楚說明生命中的幾乎任何事,但你的方法和意圖有時候並不是一眼就能被看穿的。你能夠跳脫框架思考,用別人沒想到的方式切入問題、找到出路。 -要注意的是:你不喜歡別人強力反駁你的觀點,特別是當對方的邏輯站不住腳的時候。這沒有問題,但記得有時候讓別人有空間自己想清楚,比你直接推翻他們更有效果。你的方式,要讓人得到力量,而不是讓人產生依賴。` }, - }, - 63: { - intro: `閘門 63 的能量,是關於懷疑、質疑,以及那種「這樣真的對嗎?」的內在驅動力。太陽在這個閘門的人,你的頭腦天生就會去尋找事物的漏洞和不合理之處——不是為了找麻煩,而是因為你真的很想搞清楚什麼才是真的。你是那種讓周圍的人開始思考的人。`, - RAC: { title: `意識`, body: `你的人生目的,是去探詢我們來到這世界是為了什麼,然後慢慢地、真實地喚醒你自己的意識。 -你不是那種只把道理說給別人聽的人——你是透過自己的生命體驗,一次次地調整、一次次地更新,然後把這個過程中看到的東西傳遞給身邊的人。你會讓別人開始問問題,讓他們發現自己原本以為已經想清楚的事,其實還有沒看到的部分。 -記得:你是用質疑作為工具,去尋找答案——不是為了質疑而質疑。當你保持這個清醒,你就會成為一個真正有力量的見證者。` }, - JC: { title: `證實(懷疑)`, body: `你對任何事情,都不會輕易說「好,我相信你」。 -你需要先質疑、先測試,確認漏洞都被考量到了,才會給出你的認可。這讓有些人覺得你很難搞,但說真的,你的存在就是在幫這個世界避免許多不必要的錯誤。 -有個很重要的事:當你發現沒人對你的擔憂感興趣,或者你覺得自己的質疑沒有被認真對待,你可能會開始懷疑自己。這時候要記得,你的質疑能力本身是一種天賦,不需要每個人都懂得欣賞它,你才能繼續使用它。信任你的內在權威,它會告訴你什麼時候值得繼續問,什麼時候可以放下。` }, - LAC: { title: `主控`, body: `你是個天生的領導者,而且你的領導力來自你對事情的深度理解和合乎邏輯的分析能力。 -你的頭腦非常善於找到最好的說服方式,讓那些一開始對你的觀點有抗拒的人,慢慢地被你說服。你能夠快速看出別人的缺口在哪裡,也能夠提出讓情況改善的方向。 -但這裡有個要小心的地方:你很可能會根據對未來的承諾來過生活,而且會大膽地說服別人也跟著你這樣做。要記得讓自己也在當下扎根,不要讓頭腦的懷疑或對未來的預測,變成你和別人之間的距離。用智慧和謙遜去服務那些向你尋求指引的人,這才是你這輩子能帶來的最大價值。` }, - }, - 64: { - intro: `閘門 64 的能量,是關於困惑、靈感,以及那種腦袋裡突然閃過一道光的感覺。太陽在這個閘門的人,你的頭腦像一個巨大的資料庫,裡面裝著各種可能性、各種歷史的例子、各種「如果是這樣的話呢?」——它們同時在你腦袋裡運轉,有時候讓你很興奮,有時候讓你有點不知道該從哪裡開始。`, - RAC: { title: `意識`, body: `你的人生目的,是去探詢生命的意義,然後把你喚醒的意識傳遞給身邊的人。 -你會常常感覺到一道閃耀的靈感衝進來,讓你想要去追它、去搞清楚它從哪裡來、它代表什麼。你能夠點出別人看不到的可能性,讓他們的思考過程往前跳一步。 -有個要記住的事:你對自己的人生可能仍然處於困惑的狀態——即使你能為別人看得很清楚。這不是矛盾,這就是你的本質。讓你的內在權威引導你接近能帶給你真正滿足的人和環境,而不是一直試圖用頭腦搞清楚所有事情。` }, - JC: { title: `多樣性(困惑)`, body: `你的腦袋能夠往非常多不同的方向奔馳——你就像一座圖書館,裡面藏著各種生命的可能性,而且你隨時都準備好要和人分享。 -你很容易追著一個又一個讓你興奮的想法跑,然後在追了很久之後才發現,你有點不確定自己現在在哪裡。這不是你的問題,而是這個閘門本來就帶著一種「困惑是必要過程」的特質——因為你需要在各種可能性裡游泳,才能最後找到那個真正有意義的東西。 -允許自己偶爾退後一步,透過冥想或靜下來,讓你的心智稍微休息一下。你會發現,那些最好的洞見,往往不是在你拼命想的時候出現的,而是在你放鬆下來之後,悄悄地跑進來的。` }, - LAC: { title: `主控`, body: `你是個很善於影響他人的人,而且你的影響力是透過擴展別人的視野來發揮的。 -你能夠輕易就讓人看到他們自己原本沒想到的可能性,把他們帶進一個從沒去過的思考領域。你有把歷史的例子帶進當下對話的能力,讓你的論述有一種讓人信服的厚度。 -要小心的是:你很容易以過去作為基礎來為當下辯證,有時候這會讓你的注意力放在驗證你的觀點上,而不是放在真正去服務眼前那個人的需求上。記得讓你的影響力是賦予人力量的,而不是讓人依賴你才能思考。你的類型和內在權威永遠是你最好的指引。` }, - }, -} diff --git a/components/humanDesign/hd-summary-data.ts b/components/humanDesign/hd-summary-data.ts deleted file mode 100644 index fc3f973..0000000 --- a/components/humanDesign/hd-summary-data.ts +++ /dev/null @@ -1,347 +0,0 @@ -// Detail content for type, profile, authority, definition drawers -// Extracted from data/ MD files - -export interface SummaryHighlight { - label: string - text: string -} - -export interface SummaryContent { - title: string - subtitle?: string - intro: string - paragraphs: string[] - highlights?: SummaryHighlight[] -} - -// ─── 五大類型 ──────────────────────────────────────────────────────────────── - -export const HD_TYPE_CONTENT: Record = { - 'Manifestor': { - title: '顯示者', - subtitle: 'Manifestor', - intro: '想到就做,不需要人批准。佔全球約 8%。', - paragraphs: [ - '如果你認識一個人,他腦子裡一有想法就直接去做、不愛跟人解釋太多、很難被別人拉著走——那他很可能是顯示者。顯示者是五種類型裡最有「我說了算」氣場的一種。他們天生有一股衝勁,不需要別人來推他們一把,因為他們本來就在衝了。', - '但這也常常讓身邊的人覺得「欸你幹嘛不先說一聲?」所以顯示者最需要練習的一件事,就是在行動之前,告知身邊的人。不是要你去問人家的意見,只是讓大家知道一下你的打算。這樣一來,別人不會覺得莫名其妙,你也會少很多不必要的阻力。', - ], - highlights: [ - { label: '最怕的事', text: '被管、被限制、凡事都要得到同意' }, - { label: '最幸福的事', text: '按自己的節奏做自己想做的事' }, - ], - }, - 'Generator': { - title: '生產者', - subtitle: 'Generator', - intro: '只要做對的事,精力無限;做錯的事,累到你懷疑人生。佔全球約 37%。', - paragraphs: [ - '生產者是五種類型裡人數最多的,他們是這個世界真正的「能量來源」。做自己喜歡的事時,他們可以全力以赴、樂此不疲;但如果逼自己去做不喜歡的事,那才叫做真的累——不是身體累,是靈魂累。', - '生產者的最大天賦,是身體裡那個直覺的「腹部感應」——碰到對的事,身體會自然想動;碰到不對的,身體就會莫名抗拒。他們的功課是:先等,等到有真實感應再出發,不要只靠頭腦想「這個應該對我好」就硬做。', - ], - highlights: [ - { label: '快樂的狀態', text: '做著讓自己興奮的事,精力怎麼用都用不完' }, - { label: '不快樂的狀態', text: '每天很忙,但不知道在忙什麼,做了很多卻沒有成就感' }, - ], - }, - 'Manifesting Generator': { - title: '顯示生產者', - subtitle: 'Manifesting Generator', - intro: '什麼都想試、反應超快,但選錯了就跑得也快。佔全球約 33%。', - paragraphs: [ - '顯示生產者是生產者和顯示者的混合體,但他們有自己獨特的魅力——他們的速度比任何人都快,對很多事情同時感興趣,而且常常走「非線性」路線,別人看起來像在繞路,他們自己卻覺得每一步都是必要的體驗。', - '他們最常被誤解的地方是「三分鐘熱度」或「說話不算數」。其實不是啦,他們只是需要用「實際行動測試」才能知道自己到底喜不喜歡。先試試看,再決定要不要繼續,這才是他們的真實運作方式。如果你身邊有顯示生產者,你會發現他們有時候答應得很快,但後來又改變主意——這不是不誠信,只是他們在做「動態校準」。', - ], - highlights: [ - { label: '快樂的狀態', text: '在多件事情之間靈活穿梭,每一件都做得精彩' }, - { label: '不快樂的狀態', text: '被要求只能做一件事、不能改變,覺得窒息' }, - ], - }, - 'Projector': { - title: '投射者', - subtitle: 'Projector', - intro: '不是沒意見,是在等對的時機說。佔全球約 21%。', - paragraphs: [ - '投射者可能是五種類型裡最常被誤解的。他們天生有一種穿透力,能看見別人看不到的東西——你的盲點、你的潛力、整個局勢的走向。他們是超棒的引導者和分析者。', - '但問題來了:投射者沒有持續穩定的能量來源,沒辦法像生產者那樣一天到晚衝。他們需要的是被看見、被邀請,才能把自己的能量用在對的地方,發揮最大的效果。如果沒有等到邀請就強行衝進去,往往會得到相反的結果——不被重視、精疲力竭,然後心裡冒出那個很熟悉的感覺:「苦」。', - ], - highlights: [ - { label: '快樂的狀態', text: '才華被看見,被邀請加入,整個人閃閃發光' }, - { label: '不快樂的狀態', text: '一直主動卻被忽視,感覺付出得不到回應' }, - ], - }, - 'Reflector': { - title: '反映者', - subtitle: 'Reflector', - intro: '像一面鏡子,照出周圍的一切,也最容易被環境影響。佔全球約 1%。', - paragraphs: [ - '反映者是五種類型裡最少見的,每一百個人裡大概只有一個。他們整張圖裡沒有任何固定填滿的能量中心,意思是——他們的狀態會隨著身邊的人、所在的環境,每天有很大的變化。', - '這聽起來好像很不穩定,但其實這就是他們的超能力:他們能感受到別人感受不到的細微能量,像雷達一樣準確。反映者最需要的是一個讓自己舒服的環境和足夠的獨處時間。他們不適合做決定太快,最好等一個月亮週期(大約二十八天)讓自己沉澱,才會知道什麼是真的適合自己的。', - ], - highlights: [ - { label: '快樂的狀態', text: '有好的環境、好的人圍繞,生活按自己的節奏走' }, - { label: '不快樂的狀態', text: '被不好的環境或人拉著跑,不知道哪個感覺是自己的' }, - ], - }, -} - -// ─── 人生角色 ───────────────────────────────────────────────────────────────── - -export const HD_PROFILE_CONTENT: Record = { - '1/3': { - title: '1/3', - subtitle: '調查者/殉道者', - intro: '什麼都想搞清楚,然後親自去撞牆。', - paragraphs: [ - '你是那種「先把資料查齊了再說」的人,不把某件事摸透了,你根本沒辦法放心往前走。但另一方面,你骨子裡又有一股「管他的,先試試看」的衝動——結果就是你的人生充滿了各種嘗試、失敗,然後再爬起來的故事。', - '聽起來很辛苦?其實還好,因為你每次跌倒都學到真東西,不是那種只讀書沒有實戰的空洞知識。你很會看人、很有同理心,也很能辨別誰是真心的。只是你有時候要注意:搞清楚一件事「不值得繼續」,跟「懶得負責任地收尾」,是不一樣的事。', - ], - highlights: [{ label: '你的強項', text: '打好基礎 + 親身實驗,最後成為真正懂行的人' }], - }, - '1/4': { - title: '1/4', - subtitle: '調查者/機會主義者', - intro: '我要先調查清楚,但我也超想跟你分享!', - paragraphs: [ - '你很好奇、很想把什麼都搞清楚,但你不是那種悶著頭自己研究的人——你喜歡把學到的東西跟你在意的人分享。你天生就很暖,讓人覺得親切、自在,很容易建立真誠的關係。', - '不過你有個小矛盾:1爻的你需要安全感、想把事情搞透,4爻的你又怕被拒絕、想跟朋友在一起——這兩股力量有時候會讓你有點拉鋸,一下想衝、一下又縮回去。但只要找到讓你感到安心的人和環境,你可以成為最貼心、最真誠的那個人。', - ], - highlights: [{ label: '你的強項', text: '溫暖好相處,而且分享知識這件事你做得非常自然' }], - }, - '2/4': { - title: '2/4', - subtitle: '隱士/機會主義者', - intro: '我只是想好好一個人待著,但你們幹嘛一直找我?', - paragraphs: [ - '你有天生的才能,但有趣的是,你自己常常沒意識到。別人總是比你更先看見你的厲害之處,然後跑來「邀請」你出來發揮。你其實不太愛社交,需要很多獨處時間來充電,但你又天生暖心、好相處,讓人自然而然想靠近你。', - '這種一半想躲、一半又擋不住人情的感覺,你大概很熟悉。關鍵在於:真正適合你的機會,不是你主動衝出去找的,而是在你身邊的人自然帶來的。所以好好珍惜你的人際圈,那是你最重要的資源。', - ], - highlights: [{ label: '你的強項', text: '讓人放鬆、直覺感受別人需要什麼,而且不費力就能做得很好' }], - }, - '2/5': { - title: '2/5', - subtitle: '隱士/異端者', - intro: '我只想安靜做自己的事,但怎麼大家都覺得我是救星?', - paragraphs: [ - '你喜歡一個人待著,偶爾會覺得自己跟這個世界有點格格不入。但偏偏你一開口,就有種說服力;一出現,就有種氣場——讓人覺得「這個人一定有辦法」。', - '問題在於,別人眼中的你,跟你眼中的自己,差很多。你常常覺得自己沒那麼厲害,但旁人早就被你吸引了。你不需要一直符合所有人對你的期待,真正重要的是找到自己真心想做的事,然後去做——那才是讓你最有光彩的狀態。', - ], - highlights: [{ label: '你的強項', text: '不費力就吸引人,而且天生就有解決問題的直覺' }], - }, - '3/5': { - title: '3/5', - subtitle: '殉道者/異端者', - intro: '我這輩子大概沒辦法走一條直線。', - paragraphs: [ - '你是真的吃過苦、跌過跤的那種人。你的人生不是規規矩矩的劇本,而是充滿了「這次試試看」、「這次又炸了」、「不過我學到了超多」的循環。你對苦難的承受力驚人,幽默感也是被現實逼出來的防身工具。', - '你很有魅力,很能帶動氣氛,但你也不輕易做承諾——因為你知道,承諾是有重量的,要確認這件事真的值得,你才會全力投入。你這輩子累積的故事,最後會變成你最大的寶藏,也是你最能幫助別人的地方。', - ], - highlights: [{ label: '你的強項', text: '超強的適應力,在混亂中仍能找出方向,然後把智慧傳給別人' }], - }, - '3/6': { - title: '3/6', - subtitle: '殉道者/角色模範', - intro: '年輕時我是衝衝衝,後來我學會了站在高處看。', - paragraphs: [ - '你的人生有點像是分了好幾個章節在演。年輕的時候你是行動派,什麼都要試、什麼都要體驗,難免也撞了不少牆。但大約過了三十歲,你開始有個轉變——從「衝」變成「觀察」,從「參與者」變成「指揮官」。', - '你不是變保守了,而是你的眼界變寬了。你能看到別人看不到的全局,然後把這個視角帶給周圍的人。你天生就有成為眾人榜樣的潛質,只是這件事通常要等你吃過夠多苦頭之後,才會真正發光。', - ], - highlights: [{ label: '你的強項', text: '有實戰經驗的智慧,加上長遠的眼光,讓你說的話特別有份量' }], - }, - '4/6': { - title: '4/6', - subtitle: '機會主義者/角色模範', - intro: '我既想衝,又想退後看,到底哪個才是真正的我?', - paragraphs: [ - '你腦袋裡常常有兩把聲音在吵架:一把說「去做!這個機會很好!」另一把說「等等,先想清楚,萬一被拒絕了怎麼辦?」這種「心」跟「腦」的拉鋸,是你人生中很熟悉的功課。', - '你有豐富的情感、真誠的人道關懷,也有很強的社群意識——你希望大家都好,不只是你自己。你天生適合扮演引導者、顧問的角色,只是你要先學會信任自己的直覺,別在被拒絕之前,先把自己縮起來。', - ], - highlights: [{ label: '你的強項', text: '溫暖、有遠見、真心在乎身邊的人,一旦放開來,影響力很可觀' }], - }, - '4/1': { - title: '4/1', - subtitle: '機會主義者/調查者', - intro: '我走的路跟別人不一樣,但我真的只能這樣走。', - paragraphs: [ - '你是十二種人生角色裡最特別的一個——因為你有一種「固定命運」的特質。說起來有點哲學,但簡單說就是:你天生就有一個核心方向,只要你不偏離這個方向,你走得越來越穩;一旦被外力強迫偏離,你就會渾身不對勁。', - '你需要別人的理解和接受,但不需要他們的同意。你喜歡研究人、觀察生命,對人類行為有種天然的好奇心。如果有人試圖改變你的生活節奏或核心價值,你不用勉強配合——做你自己,才是你最有力量的狀態。', - ], - highlights: [{ label: '你的強項', text: '對人際和人性有深刻的洞察,忠於自己的路,有著別人難以複製的定力' }], - }, - '5/1': { - title: '5/1', - subtitle: '異端者/調查者', - intro: '我看起來好像什麼都懂,但其實我只是不想讓人看見我的脆弱。', - paragraphs: [ - '你有種天然的領袖氣場,人們遇到問題就想找你,覺得你一定有辦法。但你自己心裡清楚:你在外面呈現的那個形象,跟你真正的樣子,中間有一段距離。', - '你很努力、很負責,但也很怕被看穿。你把很多不安藏在心裡,讓外在的你顯得雲淡風輕。其實你不需要一直維持那個「什麼都搞定」的人設——讓自己真實一點,你的名聲反而更穩。真正的領導力,不是來自形象,而是來自真實。', - ], - highlights: [{ label: '你的強項', text: '解決問題的能力一流,學習慾強,而且天生就知道怎麼帶領別人' }], - }, - '5/2': { - title: '5/2', - subtitle: '異端者/隱士', - intro: '我有自己的一套,但你們幹嘛一直要我出來表演?', - paragraphs: [ - '你和5/1人有點像,也有那個吸引別人的氣場,但你更需要獨處——不是因為不喜歡人,而是你的靈感和能量,需要在安靜中才能生長。', - '你天生有才華,但你常常不知道怎麼跟別人解釋你在做什麼,或者其實你也不太想解釋。你只是想照自己的方式做,做出你覺得對的成果。最重要的事:只有在你真心有動力的時候去做,那個成果才會是你真正驕傲的東西。', - ], - highlights: [{ label: '你的強項', text: '有想法、有創意、有獨立執行的能力,一旦認真起來沒人擋得住你' }], - }, - '6/2': { - title: '6/2', - subtitle: '角色模範/隱士', - intro: '從小就覺得自己跟別人有點不一樣,好像看事情的角度就是不同。', - paragraphs: [ - '你有種老靈魂的感覺,從小就比同齡人成熟——不是老氣,而是你看事情的眼光本來就更深、更遠。你是別人眼中可以信賴的那個人,是朋友圈裡那個「問他就對了」的存在。', - '你人生會經歷幾個明顯的轉折點,大約在十八歲、三十歲、五十歲附近各一次,每次轉折都像是升了一個等級。你有2爻的獨立性格,需要你自己的空間和時間;但你也有6爻的使命感,最終你是來做別人學習榜樣的。', - ], - highlights: [{ label: '你的強項', text: '洞察力強、眼界開闊,而且不用刻意為之,你就是會讓人覺得「跟這個人在一起很安心」' }], - }, - '6/3': { - title: '6/3', - subtitle: '角色模範/殉道者', - intro: '我一半想要安定,一半又靜不下來。', - paragraphs: [ - '你跟6/2有點像,但你多了一股3爻的不安分。你既渴望有個穩定的家、一段可以信任的關係,同時又想往外闖、體驗新的事物,搞得自己常常在「想安定」跟「想出走」之間來回擺盪。', - '這不是什麼缺點,而是你天生就是要從這種「動」跟「靜」的張力之間,找到屬於自己的平衡。你年輕時累積的那些折騰和體驗,到後來會變成你最有說服力的東西——因為你說的,都是你真的活過的。', - ], - highlights: [{ label: '你的強項', text: '有冒險精神但不失責任感,等你找到自己的節奏,你就是那種既能帶頭又讓人放心的人' }], - }, -} - -// ─── 內在權威 ───────────────────────────────────────────────────────────────── - -export const HD_AUTHORITY_CONTENT: Record = { - 'Emotional': { - title: '情緒型權威', - subtitle: 'Emotional Authority', - intro: '你的情緒會像海浪一樣,一波一波地起伏——這不是情緒不穩定,這就是你的設計。', - paragraphs: [ - '大約一半的人都是情緒型權威。如果你的人類圖裡,情緒中心是有顏色的,你就是情緒型權威。', - '最重要的一件事:永遠不要在情緒高點或低點做重大決定。情緒高點的時候一興奮就答應,隔天冷靜下來馬上後悔;情緒低落的時候接到好機會直接回絕,事後又唉唉叫——這些都是沒等到中性狀態就決定的結果。', - '你的原則就一個:等到情緒回到「普普通通、不特別好也不特別差」的中性狀態,那個時候做出來的決定,才是最接近你真實想法的答案。在中性狀態下,閉上眼睛想像自己已經做了那個決定,如果心裡有種「對,就是這個」的踏實感,那就去做。給自己至少一天到一週的時間。你不是在拖延,你是在找清晰。', - ], - highlights: [{ label: '核心原則', text: '情緒清晰後才決定——不在高點承諾,不在低點拒絕' }], - }, - 'Sacral': { - title: '薦骨型權威', - subtitle: 'Sacral Authority', - intro: '你的身體比你的腦袋更誠實。', - paragraphs: [ - '如果你的薦骨中心有顏色、但情緒中心是空白的,你就是薦骨型權威,通常是生產者或顯示生產者。薦骨在哪裡?就是你肚子下方那個位置。', - '你有沒有遇過一種感覺——某件事問你,你還沒想清楚,但身體就已經有反應了?有種「唔!」的莫名興奮,或者「啊……感覺不對」的直覺?那就是你的薦骨在說話。薦骨型權威的人,做決定的方式其實很直接:在當下的瞬間,身體有沒有興奮感?有 → 做!沒感覺或者感覺很疲 → 不要。', - '記住,你的薦骨只活在「當下」。它不會為你分析未來,也不管過去。所以如果你把一件事放在腦子裡想了三天還在繞圈,那個不是薦骨,那是頭腦在跑。', - ], - highlights: [{ label: '核心原則', text: '當下身體有興奮感 → 做;沒感覺或很疲 → 不要' }], - }, - 'Splenic': { - title: '脾中心權威', - subtitle: 'Splenic Authority', - intro: '你是全宇宙做決定最快的人——你的直覺只說一次,就一次。', - paragraphs: [ - '如果你有顏色的是脾中心,而情緒中心和薦骨中心都是空白,你就是直覺型權威(脾權威)。這個「脾中心」是身體裡最古老的感知系統,它的工作就是在每一個當下即時掃描:這個人安全嗎?這件事對我好嗎?', - '你有沒有過這種經驗?走進一間餐廳,環境、氣味、整體感覺讓你說不上來哪裡不對,但你就是想走。或是認識一個人,幾秒內你就知道這個人跟你合不合。那個第一反應,就是你的直覺在說話。如果你忽視那個第一感覺,開始想:「但是理性上來說……」,通常就要開始後悔了。', - '別人勸你「想清楚再決定」?這句話對你最沒用。你不是倉促,你的設計本來就是這樣。唯一要注意的是:如果你發現自己猶豫不決、一直在那裡想,那就是頭腦跑出來干擾了,先暫停,等那個清晰的直覺再次浮現。', - ], - highlights: [{ label: '核心原則', text: '相信第一反應,直覺只說一次——忽視它通常就要後悔' }], - }, - 'Ego': { - title: '意志力權威', - subtitle: 'Ego Authority', - intro: '你問的問題很直接:「這對我有什麼好處?」', - paragraphs: [ - '如果你的心臟中心有顏色、並且連結到喉嚨中心,你就是意志型權威(心臟權威)。你做決定的方式,是靠你心臟那個位置傳來的感受——這件事對我好不好?我真的想要這個嗎?', - '有個很特別的地方:錢的考量對你來說,是完全合理的決策依據。接一份工作,問自己薪水值不值得,對你來說不是自私,是誠實。如果你心裡有一種「好,我要這個!」的篤定感,那就做。如果感覺是「嗯……還可以吧」,那通常代表這個機會其實不適合你,遲早你會後悔答應。', - '很多有這個權威的人,都被說成「太計較」或「太以自己為中心」。但人類圖的觀點是:當你做的決定真的對你有利,你的狀態會是最好的,這樣你才有能力真正地幫助別人。', - ], - highlights: [{ label: '核心原則', text: '只承諾你真心想要且能兌現的事,「這對我好嗎?」是合理的決策依據' }], - }, - 'Self-Projected': { - title: '自我投射權威', - subtitle: 'Self-Projected Authority', - intro: '你要說出來,才知道自己真正在想什麼。', - paragraphs: [ - '如果你有定義的自我定位中心連接到喉嚨中心,但其他決策中心都是空白的,那你就是自我型權威,通常是投射者。', - '你的特色很有趣:你要先開口說話,才能聽到自己的真實想法。不是在腦子裡想,是真的說出來。當你面對一個決定,試著把你所有的想法、顧慮、感受都大聲說出來,不用整理,不用邏輯,隨便說。說著說著,你會在某個瞬間突然聽到自己說了一句話,讓你覺得「欸,對,就是這個!」——那就是你的真實感受。', - '可以對自己說,可以說給宇宙聽,也可以找一個你信任的朋友當聽眾。但注意,你不是要聽他的意見,你只是需要他在旁邊讓你有開口的機會。語氣是個很好的指標——說到某件事時語調是興奮的,那通常是對的方向。', - ], - highlights: [{ label: '核心原則', text: '說出來才知道答案——找信任的人傾聽自己說話的過程' }], - }, - 'Mental': { - title: '邏輯權威', - subtitle: 'Mental / No Inner Authority', - intro: '你需要先分析,再去「感覺」答案。', - paragraphs: [ - '這個權威只存在於特定的投射者。如果你的人類圖顯示「無內在權威」,你很可能就是頭腦型權威。', - '你的做決定過程分三步走:第一步,讓頭腦做它最擅長的事,把所有資訊蒐集好,好好分析,列個優缺點比較;第二步,身體離開原地,換個環境,去你喜歡的地方待一下,讓新的環境帶來新的能量;第三步,找信任的朋友聊聊,不是要聽對方的意見,而是在說的過程中,讓自己的感受更清晰。', - '重複這三步,直到你的身體裡有種「啊,我知道了」的清晰感——像是全身突然鬆了口氣,或是有種「對,就是這樣」的篤定。如果做完這個過程還是覺得不清楚,那個「不清楚」本身就是你的答案:暫時說不。', - ], - highlights: [{ label: '核心原則', text: '分析 → 換環境 → 說出來,等待那個「全身鬆了口氣」的感覺' }], - }, - 'Lunar': { - title: '月亮週期權威', - subtitle: 'Lunar Authority', - intro: '你跟別人不一樣,你需要等待整個月亮循環。', - paragraphs: [ - '這個權威只有反映者才有,反映者是人口中最稀少的類型,大約只佔 1%。你的九個能量中心全部都是空白的,這意味著你每天都在接收周圍環境和人們的能量,每天的你都會有一點點不一樣。', - '因為你每天都在變化,所以在做重大決定的時候,你需要給自己足夠的時間——至少二十八天,也就是一個月亮循環。在這二十八天裡,每天問自己:「我今天對這件事的感覺是什麼?」記錄下來,然後放下,不要執著。', - '在這段時間,可以和不同的朋友聊聊這件事。不是要收集意見,而是在說話的過程中,讓自己看清楚自己的感受。身邊的人可能覺得你很難搞——但你不需要解釋,你只需要知道,這是你最自然的節奏,強迫自己快速決定,才是對自己最不公平的事。', - ], - highlights: [{ label: '核心原則', text: '等待完整的月亮週期(28天),每天記錄感受,等待清晰感浮現' }], - }, -} - -// ─── 五大定義 ───────────────────────────────────────────────────────────────── - -export const HD_DEFINITION_CONTENT: Record = { - 'None': { - title: '無定義', - subtitle: '反映者', - intro: '九個中心全白,沒有任何一個是有顏色的。佔全人口約 2%。', - paragraphs: [ - '反映者是人類圖五種類型中唯一沒有任何「固定」能量的人,所有中心都是開放的,就像一面超靈敏的鏡子,隨時在反映、感受周遭環境的能量狀態。你可以把反映者想成是某種「空氣品質偵測器」,他們能感知一個環境、一個群體裡的整體狀態,而且往往比其他人更早發現哪裡不對勁。', - '不過正因為沒有固定的能量錨點,反映者特別需要給自己充裕的時間做決定——至少要等一個月亮循環(約二十八天),才能知道什麼對自己是真正正確的。不是拖延,是本來就需要這個時間來沉澱。', - ], - highlights: [{ label: '你的設計', text: '流動如鏡,對環境能量有超強感知力——等待月亮週期才做重大決定' }], - }, - 'Single': { - title: '單一定義人', - subtitle: 'Single Definition', - intro: '所有有顏色的中心串在一起,是一個完整的大區塊。佔全人口約 41%。', - paragraphs: [ - '一分人是那種很「自給自足」的存在。他們消化資訊通常很快,不太需要別人來幫他們補完什麼感覺,本身就是個穩定、持續、可靠的能量體。', - '如果你是一分人,你不太需要某個特定的人陪在旁邊才覺得完整,你的核心能量本來就是連貫的。你可以專注在某個方向上、單一聚焦,不容易被外界拉著跑。', - ], - highlights: [{ label: '你的設計', text: '能量自給自足、穩定持續,不需要外界補完就能清晰做決定' }], - }, - 'Split': { - title: '二分定義人', - subtitle: 'Split Definition', - intro: '有定義的中心分成兩個獨立區塊,中間沒有連起來。佔全人口約 46%。', - paragraphs: [ - '二分人是比例最高的,將近一半的人都是這種設計。這兩個區塊之間有個「缺口」,而那個缺口就是二分人一生中最容易被吸引、最容易感到「少了什麼」的地方。', - '你可能會常常覺得人生好像缺了一塊,或是特別被某類型的人吸引——其實不是巧合,就是因為那個缺口會自動去找能「接通」的人。二分人有兩種:簡易型(只需一個閘門橋接,缺口感較小)和遠距型(需要多個閘門串接,缺口感比較強)。不管哪種,你都不需要真的去找誰來「完成你」,重要的是順著自己的策略和內在權威,對的人自然會出現。', - ], - highlights: [{ label: '你的設計', text: '兩個能量區塊各有其功,缺口不是缺陷——而是你與他人連結的磁力' }], - }, - 'Triple Split': { - title: '三分定義人', - subtitle: 'Triple Split Definition', - intro: '有定義的中心分成三個獨立區塊,三塊之間都沒有相互連接。佔全人口約 11%。', - paragraphs: [ - '三分人的能量結構比較複雜,他們需要更多不同的「橋梁」才能讓各個區塊感覺統整。也因為這樣,三分人在消化資訊的時候,需要比一分人和大多數二分人更多的時間。沒有定義的中心是三分人最主要的「制約來源」——那些白色的中心,最容易讓他們被外界影響。', - '三分人如果可以多接觸不同的人和環境,反而比固定跟同一個人膩在一起更健康,因為單一的人容易成為固定的制約,而多元的互動能幫助他們更靈活地整合自己的能量。', - ], - highlights: [{ label: '你的設計', text: '三個能量區塊需要時間整合——多元人際互動比固定關係更有助於你找到清晰' }], - }, - 'Quadruple Split': { - title: '四分定義人', - subtitle: 'Quadruple Split Definition', - intro: '有定義的中心分成四個獨立區塊,四塊都沒有相互連接。佔全人口約 0.5%。', - paragraphs: [ - '四分人超稀有,通常人體圖會有八個或九個中心都有定義,但中間的連接方式讓它們各自獨立。這樣的設計讓四分人在消化資訊和做決定上,往往需要最多時間,彈性和快速應變本來就不是他們的強項。', - '如果有人一直逼四分人要立刻決定、快點配合,這對他們來說不但沒有幫助,反而是一種壓力。四分人需要按照自己的節奏來,從容不迫地把資訊一點一點吸收進去,才能做出真正對自己好的選擇。', - ], - highlights: [{ label: '你的設計', text: '需要最多時間整合能量——拒絕催促,按自己節奏才能做出最正確的決定' }], - }, -} diff --git a/docs/tech-debt.md b/docs/tech-debt.md index 687cfe4..363fb7e 100644 --- a/docs/tech-debt.md +++ b/docs/tech-debt.md @@ -31,25 +31,21 @@ ## Mobile(Expo/React Native, `mobile/`) ### High -- [ ] **`Pressable` 包住 `ScrollView`,重犯已知手勢問題** — `mobile/components/BirthProfilePickerModal.tsx:16` 的 `Pressable` 直接包住 `ScrollView`,是先前在 `DetailBottomSheet.tsx` 已經修正過的「touchable 搶走 iOS 捲動手勢」同一類問題,這裡沒套用已知修法(背景 Pressable 與卡片要是手足關係,不是父子,見全域 CLAUDE.md 的 2026-07-13 追記)。 - → 修法:比照 `DetailBottomSheet.tsx:59-60` 的手足結構重寫。 -- [ ] **未追蹤的大型二進位檔案** — `mobile/bugreport-sdk_gphone16k_arm64-*.zip`(5.3MB)不在 `mobile/.gitignore` 規則內,一次 `git add -A` 就會被永久提交進歷史。 - → 修法:加進 `.gitignore` 或直接刪除本機檔案。 +- [x] **`Pressable` 包住 `ScrollView`,重犯已知手勢問題**(2026-07-21,待實機驗證)— `mobile/components/BirthProfilePickerModal.tsx` 改成 `DetailBottomSheet.tsx` 的手足結構:`backdrop`(`flex:1` 的 `Pressable`,無子元素)與 `sheet`(純 `View`,內含 `ScrollView`)在 `Modal` 底下是同層手足,靠 column flex 排版天然不重疊,不再有任何 Pressable 包住 ScrollView。`tsc --noEmit` 確認沒有新增型別錯誤(`app/_layout.tsx` 既有的一個錯誤跟這次改動無關,在 stash 前就存在)。**這是 iOS 手勢層級的修正,這個環境無法啟動 app 實機測試,請在裝置上確認清單真的能捲動、點卡片空白處不會誤觸關閉背景。** +- [x] **未追蹤的大型二進位檔案**(2026-07-21)— 在 `mobile/.gitignore` 加入 `bugreport-*.zip` 規則,避免以後 `git add -A` 誤把此類 adb bugreport 檔案提交進歷史。**本機殘留的 `mobile/bugreport-sdk_gphone16k_arm64-*.zip` 沒有直接刪除**(不確定是否還在用來排查問題),需要的話請自行刪除或告知我刪。 - [ ] **無測試/lint 設定** — `mobile/package.json` 完全沒有測試或 lint 腳本。 ### Medium -- [ ] **顯示邏輯與 web 端重複實作** — `mobile/lib/hd-type-meta.ts` 重複了 web 端 `lib/humanDesign/constants.ts` 已有的中文標籤資料;mobile 端 `hd-*.ts` 系列(`hd-cross-data.ts`、`hd-chart-data.ts`、`hd-summary-data.ts`、`hd-sheet-builders.ts`,共約 2150 行)整體都在重新實作 web 已有的顯示邏輯,而非共用一份。 - → 修法:評估抽成 shared package 或至少共用資料來源,避免兩邊各自維護、容易分歧(尤其命理正確性要求高)。 -- [ ] **舊格式判斷邏輯散落 4 處** — `mobile/app/chart/[id].tsx` 中 pipe 分隔的 legacy composite 格式偵測(`birthDate?.includes('|')`)在約 93、150、202、241 行各自出現一次,沒有抽成 helper。 - → 修法:抽成單一函式集中判斷。 -- [ ] **API 層缺重試機制、timeout 一體適用** — `mobile/lib/api.ts:74` 的共用 `request()` 沒有重試邏輯,且所有 endpoint(含較慢的星曆計算 endpoint)共用固定 10 秒 timeout。 - → 修法:依 endpoint 類型調整 timeout,考慮加輕量重試(例如網路暫時性錯誤)。 -- [ ] **`mobile/app/chart/[id].tsx` 是 723 行的巨型元件** — 混雜 fetch、legacy 格式遷移、三種圖表(個人/合圖/流日)渲染邏輯,第 203 行註解承認過去曾誤判圖表類型的 bug。 - → 修法:拆成 fetch hook + 各圖表類型的獨立元件。 +- [x] **顯示邏輯與 web 端重複實作(大宗資料檔部分,2026-07-22)** — 逐行 diff 確認 `hd-cross-data.ts`(940 行輪迴交叉長文案)、`hd-summary-data.ts`(347 行類型/人生角色/權威說明)在 web(原 `components/humanDesign/`)與 mobile(原 `mobile/lib/`)兩邊逐字相同;`hd-chart-data.ts` 除了 web 多出 13 行 mobile 沒用到的 `LEGEND_ITEMS` 圖例資料外也逐字相同。三份檔案搬到新的 repo-root `shared/humanDesign/`,web 用既有 `@/*` alias(`@/shared/humanDesign/...`)匯入,mobile 新增 `@shared/*` alias。 + **共用機制的坑(供之後在 shared/ 加新檔案時參考)**:這個 repo 不是 yarn workspaces monorepo,web 在 root、mobile 在 `mobile/` 子目錄各自獨立 package.json。原本想用 Metro 的 `watchFolders` 指向 repo root 或 `shared/`,讓 Metro 直接讀到 `mobile/` 以外的檔案——**實測踩到 Metro 的 bug**:用 `watchman` 直接查詢可以正常列出 `shared/humanDesign/` 底下的檔案,但 Metro 用同一組 `roots`(`projectRoot` + `watchFolders`,兩者有巢狀關係)建立的 file-map 就是解析不到,一路丟 `Unable to resolve module` → 換成手動 `resolver.resolveRequest` 攔截也一路查到 `Failed to get the SHA-1 for: ... (file not watched)`,換過「只 watch shared/」「watch 整個 repo root」「先裝 watchman(原本沒裝)」都一樣。**最後改用 symlink 解決**:`mobile/shared -> ../shared`(symlink 落在 `mobile/` 這個 projectRoot 裡面,Metro 原生就認得,不用碰 `watchFolders`),`mobile/tsconfig.json` 的 `@shared/*` 指到 `./shared/*`,不需要任何 `metro.config.js`(試過保留一份只呼叫 `getDefaultConfig` 的 no-op 版本,bundle 輸出 hash 跟完全不放這個檔案時逐位元組相同,所以直接沒建立這個檔案)。 + **驗證範圍**:`tsc --noEmit`(web + mobile)、`next build --webpack`(production build 成功,`DetailDrawer.tsx` 對 `hd-cross-data` 的 dynamic import 確認仍會被拆進獨立 chunk)、`npx expo export --platform ios` 與 `--platform android`(非互動式打包成功,1426 個模組全部解析成功,反編譯後的 bundle 內容含有 `HD_CROSS_CONTENT`/`CENTERS_GEOM` 等來自 shared 檔案的識別字,確認真的打包進去而不是空模組)。**這個環境沒有模擬器/實機,`expo export` 只能確認打包能成功、資料有進去,無法確認 `expo start` 開發模式(含 Fast Refresh)、實際畫面渲染、以及 iOS/Android 兩個平台的實機/模擬器行為——這幾項麻煩你實際跑一次確認。** + **保留原狀(未動)**:`mobile/lib/hd-type-meta.ts` 與 `lib/humanDesign/constants.ts` 之間的 `TYPE_LABELS`/`STRATEGY_MAP`/`SIGNATURE_MAP` 也是逐字重複(各自幾十行),但 mobile 端資料結構跟 key 命名方式不同(例如 Authority 提示 mobile 用中文名稱當 key、web 用英文 enum 當 key),不是單純搬檔案就能做完的機械式重構,這次沒有動,需要另外排時間評估怎麼統一資料結構。`hd-sheet-builders.ts`(mobile 專屬的 UI 組裝邏輯,非資料)維持原狀。 +- [x] **舊格式判斷邏輯散落多處**(2026-07-21)— 在 `mobile/lib/api.ts` 加入共用 helper `isLegacyPipeComposite()` / `isCompositeChart()`,取代 `mobile/app/chart/[id].tsx`(4 處)與 `mobile/components/ChartListView.tsx`(1 處)裡各自重複的 `birthDate?.includes('|')` / `type === '合圖'` 判斷。 +- [x] **API 層缺重試機制、timeout 一體適用**(2026-07-21)— `mobile/lib/api.ts` 的 `request()` 加上 `timeoutMs`/`retries` 選項:星曆計算類 endpoint(個人圖/合圖/流日的算圖與 preview)timeout 從 10 秒延長為 20 秒;只對讀取/preview/idempotent 的 PATCH、DELETE 端點加上 1 次輕量重試(只重試逾時或網路層失敗,不重試已收到的 HTTP 錯誤回應),會建立新資料的 create 類 endpoint(`createChart`/`createCompositeChart`/`createTransitChart`/`createBirthProfile`/`importBirthProfiles`)跟帳號刪除刻意不加重試,避免逾時後重送造成重複建立或非預期的重試行為。 +- [x] **`mobile/app/chart/[id].tsx` 是 723 行的巨型元件**(2026-07-21)— 拆成三部分:`mobile/lib/useChartDetail.ts`(fetch/自動補算合圖流日的資料 hook)、`mobile/components/chart/PersonalChartDetails.tsx`(個人圖專屬的類型/設計/九大中心/通道/行星/激活閘門/輪迴交叉/四箭頭區塊)、原檔案降到 443 行,只保留 BodyGraph/出生資訊/流日/合圖區塊組裝與下載/複製按鈕。純搬移程式碼,`activations`/`definedCenterIds` 等命理計算邏輯本身沒有改動,`tsc --noEmit` 確認無新增型別錯誤。 ### Low -- [ ] **`ErrorBoundary` 只掛在 root layout** — `mobile/app/_layout.tsx:68`,任何畫面層級的 crash 會讓整個 app 白屏,而非只降級單一畫面。 - → 修法:評估在關鍵畫面(如圖表詳情頁)各自包一層區域性 ErrorBoundary。 +- [x] **`ErrorBoundary` 只掛在 root layout**(2026-07-21)— 在 `mobile/app/chart/[id].tsx` 與 `mobile/app/chart/preview.tsx` 這兩個複雜度最高、資料流最容易因為邊界資料(舊格式合圖/流日、缺欄位)而在 render 階段丟例外的畫面,各自包一層區域性 `ErrorBoundary`(把原本的畫面本體改成內部的 `...Content` 元件,預設匯出的元件只負責包 `ErrorBoundary`),單一畫面 crash 不會再讓整個 app 白屏。其餘畫面(`profile.tsx`、`create.tsx` 等)風險較低,暫不處理。 --- diff --git a/mobile/.gitignore b/mobile/.gitignore index d914c32..4386e7d 100644 --- a/mobile/.gitignore +++ b/mobile/.gitignore @@ -30,6 +30,9 @@ yarn-error.* .DS_Store *.pem +# ADB bug reports +bugreport-*.zip + # local env files .env*.local diff --git a/mobile/app/(tabs)/create.tsx b/mobile/app/(tabs)/create.tsx index 6b79d5d..d4a1c32 100644 --- a/mobile/app/(tabs)/create.tsx +++ b/mobile/app/(tabs)/create.tsx @@ -123,6 +123,13 @@ function CreatePersonalView() { setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 80) } + // 只清掉「套用時自動帶入」的名稱;如果使用者已經手動改成別的名字,視為自訂名稱予以保留, + // 避免下次套用另一筆出生資料時,殘留的舊名稱被誤帶進新的圖表 + function clearAppliedProfile() { + setName(n => (appliedProfile && n === appliedProfile.label) ? '' : n) + setAppliedProfile(null) + } + function handleCityFocus() { if (Platform.OS === 'android') { setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 350) @@ -159,7 +166,7 @@ function CreatePersonalView() { {appliedProfile ? ( - setAppliedProfile(null)} /> + ) : ( <>
diff --git a/mobile/app/(tabs)/profile.tsx b/mobile/app/(tabs)/profile.tsx index e80a38f..fe9873c 100644 --- a/mobile/app/(tabs)/profile.tsx +++ b/mobile/app/(tabs)/profile.tsx @@ -1,5 +1,5 @@ import { useAuth, useUser } from '@clerk/expo' -import { useLocalSearchParams } from 'expo-router' +import { useFocusEffect, useLocalSearchParams } from 'expo-router' import * as ImagePicker from 'expo-image-picker' import * as WebBrowser from 'expo-web-browser' import { useCallback, useEffect, useRef, useState } from 'react' @@ -37,6 +37,22 @@ function PersonalView() { const { user } = useUser() const getTokenRef = useRef(getToken) useEffect(() => { getTokenRef.current = getToken }, [getToken]) + // user.reload() 成功後會換一個新的 user 物件參照;若把 user 放進下面 useFocusEffect + // 的 deps,reload 完成 → user 參照變了 → callback 參照跟著變 → 畫面仍在 focus 中 + // 會被 useFocusEffect 判定成「callback 變了」再次觸發 → 又呼叫一次 reload(), + // 形成不會停的無限重刷迴圈(背景瘋狂 re-render 造成畫面持續晃動)。 + // 比照上面 getTokenRef 的作法,用 ref 讀取 user,deps 留空,只在真正「切回這個分頁」 + // 時執行一次,不會因為 user 物件本身更新而重新觸發。 + const userRef = useRef(user) + useEffect(() => { userRef.current = user }, [user]) + + // Clerk 的 user 物件是各裝置各自快取的本地副本,不會因為網頁版或其他裝置改了名稱/大頭貼 + // 就即時推播更新——每次切回這個分頁時強制向 Clerk 重新抓一次最新資料,避免顯示過期名稱 + useFocusEffect( + useCallback(() => { + userRef.current?.reload().catch(err => console.warn('[PersonalView] user.reload 失敗:', err)) + }, []), + ) const [signingOut, setSigningOut] = useState(false) const [deletingAccount, setDeletingAccount] = useState(false) @@ -194,6 +210,9 @@ function PersonalView() { if (!asset.base64 || !user) return setUploadingAvatar(true) try { + // 強制刷新 session,避免 Clerk client 端 session 快取過期導致 + // 直接呼叫 user.setProfileImage() 時噴 "no active session" 錯誤 + await getTokenRef.current({ skipCache: true }) const mimeType = asset.mimeType ?? 'image/jpeg' await user.setProfileImage({ file: `data:${mimeType};base64,${asset.base64}` }) } catch (err) { @@ -213,6 +232,9 @@ function PersonalView() { if (!trimmed || !user) return setSavingName(true) try { + // 強制刷新 session,避免 Clerk client 端 session 快取過期導致 + // 直接呼叫 user.update() 時噴 "no active session" 錯誤 + await getTokenRef.current({ skipCache: true }) const spaceIdx = trimmed.indexOf(' ') const firstName = spaceIdx === -1 ? trimmed : trimmed.slice(0, spaceIdx) const lastName = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1).trim() diff --git a/mobile/app/chart/[id].tsx b/mobile/app/chart/[id].tsx index 23b0a96..5972022 100644 --- a/mobile/app/chart/[id].tsx +++ b/mobile/app/chart/[id].tsx @@ -1,6 +1,5 @@ -import { useAuth } from '@clerk/expo' import { useLocalSearchParams } from 'expo-router' -import { useEffect, useState } from 'react' +import { useState } from 'react' import { Alert, Clipboard, @@ -12,10 +11,10 @@ import { } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' import { Circle, Defs, Pattern, Rect, Svg } from 'react-native-svg' -import { type Chart, type StoredPlanet, type CreateCompositeResult, type CreateTransitResult, getChart, previewCompositeChart, previewTransitChart } from '@/lib/api' -import { HD_CENTERS_INFO, ACT_CONSCIOUS, ACT_UNCONSCIOUS } from '@/lib/hd-chart-data' -import { normalizeCenterId, normalizeChannelId, findChannelById } from '@/lib/hd-normalizers' -import { getTypeMeta, getTypeLabel } from '@/lib/hd-type-meta' +import { type StoredPlanet, isCompositeChart, isLegacyPipeComposite } from '@/lib/api' +import { ACT_CONSCIOUS, ACT_UNCONSCIOUS } from '@shared/humanDesign/hd-chart-data' +import { normalizeCenterId, normalizeChannelId } from '@/lib/hd-normalizers' +import { useChartDetail } from '@/lib/useChartDetail' import { downloadChartAsPdf, generateAiPrompt, @@ -26,28 +25,16 @@ import { } from '@/lib/chartPdf' import BodyGraph from '@/components/BodyGraph' import DetailBottomSheet, { type SheetTarget } from '@/components/DetailBottomSheet' -import { SectionCard, Row, Tag } from '@/components/chart/ChartPrimitives' +import { SectionCard, Row } from '@/components/chart/ChartPrimitives' +import PersonalChartDetails from '@/components/chart/PersonalChartDetails' import TransitAnalysis from '@/components/chart/TransitAnalysis' import CompositeInfo from '@/components/chart/CompositeInfo' import { LoadingView, ErrorView } from '@/components/StateViews' import { NavBackHeader } from '@/components/NavBackHeader' +import { ErrorBoundary } from '@/components/ErrorBoundary' import { Colors, Radius, Spacing } from '@/constants/tokens' type ActionState = 'idle' | 'loading' -type TransitSnapshot = NonNullable['transitSnapshot']> - -/** 把 previewTransitChart 回傳的巢狀結果轉成 chart.meta.transitSnapshot 的扁平格式 */ -function toTransitSnapshot(r: CreateTransitResult): TransitSnapshot { - return { - computedAt: r.transit.computedAt, - planets: r.transit.planets, - allGates: r.transit.allGates, - definedCenterIds: r.transit.definedCenterIds, - definedChannels: r.transit.definedChannels, - combinedDefinedCenterIds: r.combined.definedCenterIds, - combinedDefinedChannelIds: r.combined.definedChannelIds, - } -} /** 圖例用的黑紅相間條紋色點,對應 BodyGraph「個人+流日共有」的條紋填色 */ function StripeLegendDot() { @@ -93,143 +80,32 @@ function ActionButton({ ) } -// 合圖補算所需的出生資料 payload(與自動補算 useEffect 共用邏輯) -function buildCompositePayload(chart: Chart): Parameters[0] | null { - if (chart.meta?.personA && chart.meta?.personB) { - const pA = chart.meta.personA - const pB = chart.meta.personB - if (pA.birthDate && pA.birthTime && pA.timezone && pB.birthDate && pB.birthTime && pB.timezone) { - return { - personA: { name: pA.name ?? undefined, birthDate: pA.birthDate, birthTime: pA.birthTime, birthCity: pA.birthCity, timezone: pA.timezone }, - personB: { name: pB.name ?? undefined, birthDate: pB.birthDate, birthTime: pB.birthTime, birthCity: pB.birthCity, timezone: pB.timezone }, - } - } - return null - } - if (chart.birthDate?.includes('|') && chart.timezone) { - const [dateA, dateB] = chart.birthDate.split('|') - const [timeA, timeB] = chart.birthTime.split('|') - const [cityA, cityB] = chart.birthCity.split('|') - const [tzA, tzB] = chart.timezone.split('|') - if (dateA && dateB && timeA && timeB && tzA && tzB) { - return { - personA: { birthDate: dateA, birthTime: timeA, birthCity: cityA ?? '', timezone: tzA }, - personB: { birthDate: dateB, birthTime: timeB, birthCity: cityB ?? '', timezone: tzB }, - } - } - } - return null -} - -export default function ChartDetailScreen() { +function ChartDetailScreenContent() { const { id } = useLocalSearchParams<{ id: string }>() - const { getToken } = useAuth() - const [chart, setChart] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) + const { + chart, + loading, + error, + reload, + compositeFetched, + compositeFetchLoading, + transitFetched, + transitFetchLoading, + getCompositeResult, + getTransitResult, + } = useChartDetail(id) const [sheetTarget, setSheetTarget] = useState(null) - const [compositeFetched, setCompositeFetched] = useState(null) - const [compositeFetchLoading, setCompositeFetchLoading] = useState(false) - const [transitFetched, setTransitFetched] = useState(null) - const [transitFetchLoading, setTransitFetchLoading] = useState(false) const [pdfState, setPdfState] = useState('idle') const [copyState, setCopyState] = useState('idle') - // 切換圖表時清除舊的合圖/流日補算結果,避免渲染過期資料 - useEffect(() => { setCompositeFetched(null); setTransitFetched(null) }, [id]) - - const loadChart = async () => { - setLoading(true) - setError(null) - try { - const token = await getToken() - if (!token) { setError('未登入,請重新登入'); return } - const data = await getChart(token, id) - const c = data.chart - if (!c.meta?.incarnationCross) console.warn('[ChartDetail] ⚠️ meta.incarnationCross 不存在,輪迴交叉無法顯示') - if (!c.meta?.variables || !c.meta?.arrows) console.warn('[ChartDetail] ⚠️ meta.variables/arrows 不存在,四箭頭無法顯示') - setChart(c) - } catch (err) { - console.error(err) - const msg = err instanceof Error ? err.message : String(err) - setError(msg.includes('401') || msg.includes('Unauthorized') ? '認證失敗,請重新登入' : `載入失敗:${msg}`) - } finally { - setLoading(false) - } - } - - useEffect(() => { loadChart() }, [id]) - - // 自動補算舊格式 / 缺少 meta.compositeResult 的合圖 - useEffect(() => { - if (!chart) return - const isOldComposite = chart.type === '合圖' || chart.birthDate?.includes('|') - const needsFetch = (chart.chartKind === 'composite' || isOldComposite) && !chart.meta?.compositeResult - if (!needsFetch) return - - const payload = buildCompositePayload(chart) - if (!payload) return - - async function run() { - setCompositeFetchLoading(true) - try { - const token = await getToken() - if (!token) return - if (!payload) return - const r = await previewCompositeChart(payload) - setCompositeFetched(r) - } catch (e) { - console.warn('[CompositeInfo] previewCompositeChart failed:', e) - } finally { - setCompositeFetchLoading(false) - } - } - run() - }, [chart]) - - // 自動補算缺少 meta.transitSnapshot 的流日圖(舊格式或存檔失敗殘留)。 - // - // 兩種來源存檔格式並不相容,本人真實出生資料的位置不一樣: - // - mobile 存的(meta.transitSnapshot 存在):頂層 birthDate/birthTime/birthCity/timezone - // 本身就是本人出生資料,不需要這個補算。 - // - web 存的(meta.transitMeta 存在):頂層欄位存的是流日計算時刻的佔位資料 - // (birthCity 甚至固定是字串 "流日"),本人出生資料在 meta.transitMeta.personalXxx。 - // 可直接餵給 previewTransitChart 重算,但流日行星會是「現在」而非當初存檔當下,僅為盡量還原。 - useEffect(() => { - if (!chart) return - if (chart.chartKind !== 'transit' || chart.meta?.transitSnapshot) return - - const webMeta = chart.meta?.transitMeta - const birthDate = webMeta?.personalBirthDate ?? chart.birthDate - const birthTime = webMeta?.personalBirthTime ?? chart.birthTime - const birthCity = webMeta?.personalBirthCity ?? chart.birthCity - const timezone = webMeta?.personalTimezone ?? chart.timezone - if (!timezone) return - - async function run() { - setTransitFetchLoading(true) - try { - if (!timezone) return - const r = await previewTransitChart({ birthDate, birthTime, birthCity, timezone }) - setTransitFetched(toTransitSnapshot(r)) - } catch (e) { - console.warn('[TransitAnalysis] previewTransitChart failed:', e) - } finally { - setTransitFetchLoading(false) - } - } - run() - }, [chart]) - if (loading) return - if (error || !chart) return + if (error || !chart) return - const typeMeta = getTypeMeta(chart.type) const isTransit = chart.chartKind === 'transit' const transitIsRebuilt = isTransit && !chart.meta?.transitSnapshot && !!transitFetched const transitSnapshot = isTransit ? (chart.meta?.transitSnapshot ?? transitFetched ?? undefined) : undefined // 舊格式合圖:type='合圖' 或 birthDate 含 '|'(網頁端舊儲存方式) - const isComposite = chart.chartKind === 'composite' || chart.type === '合圖' || !!(chart.birthDate?.includes('|')) + const isComposite = isCompositeChart(chart) // 修正:舊格式流日圖缺少 meta.transitSnapshot 時,不能只靠 transitSnapshot 存在與否 // 判斷是不是個人圖,否則會誤顯示成個人圖版面(chartKind 才是可靠依據) const isPersonal = !isTransit && !isComposite @@ -268,7 +144,7 @@ export default function ChartDetailScreen() { integrationTheme: string compositeDefinedCount: number compositeOpenCount: number - } | null = (isComposite && !chart.meta?.personA && chart.birthDate?.includes('|')) ? (() => { + } | null = (isComposite && !chart.meta?.personA && isLegacyPipeComposite(chart)) ? (() => { const [dateA = '', dateB = ''] = chart.birthDate.split('|') const [cityA = '', cityB = ''] = chart.birthCity.split('|') const [authA = '', authB = ''] = (chart.authority ?? '').split(' / ') @@ -339,26 +215,6 @@ export default function ChartDetailScreen() { const personalChartCenterIds = new Set(chart.centers.map(normalizeCenterId)) const open = (target: SheetTarget) => setSheetTarget(target) - async function getCompositeResult(): Promise { - if (compositeFetched) return compositeFetched - const payload = buildCompositePayload(chart!) - if (!payload) return null - const result = await previewCompositeChart(payload) - setCompositeFetched(result) - return result - } - - async function getTransitResult() { - const c = chart! - if (!c.timezone) return null - return previewTransitChart({ - birthDate: c.birthDate, - birthTime: c.birthTime, - birthCity: c.birthCity, - timezone: c.timezone, - }) - } - async function handleDownload() { setPdfState('loading') try { @@ -527,169 +383,13 @@ export default function ChartDetailScreen() { {/* 以下區塊只對個人圖顯示 */} {isPersonal && ( - <> - - open({ kind: 'type', typeKey: chart.type })} /> - - - - - - - open({ kind: 'authority', authorityKey: chart.authority })} /> - open({ kind: 'profile', profile: chart.profile })} /> - open({ kind: 'definition', definitionKey: chart.definition })} /> - - - - - {Object.keys(HD_CENTERS_INFO).map((chartKey) => { - const info = HD_CENTERS_INFO[chartKey] - const defined = personalChartCenterIds.has(chartKey) - return ( - open({ kind: 'center', id: chartKey, defined })} - /> - ) - })} - - - - {chart.channels.length > 0 && ( - - - {chart.channels.map((rawCh) => { - const ch = findChannelById(rawCh) - const label = ch ? `${ch.from}–${ch.to}` : rawCh - return ( - open({ kind: 'channel', channel: ch }) : undefined} /> - ) - })} - - - )} - - {planets.length > 0 && ( - - - 行星 - ● 意識(黑) - ● 潛意識(紅) - - {planets.map((p, i) => ( - - {p.name} - {p.blackGate}.{p.blackLine} - {p.redGate}.{p.redLine} - - ))} - - )} - - - - {[...chart.gates].sort((a, b) => a - b).map((g) => { - const state = activations[g] - const isDual = !!(state?.c && state?.u) - const soloFill = isDual ? null : state?.c ? ACT_CONSCIOUS : state?.u ? ACT_UNCONSCIOUS : null - const isActive = isDual || !!soloFill - return ( - open({ kind: 'gate', num: g })} - > - {({ pressed }) => ( - <> - {isDual && } - - {g} - - - )} - - ) - })} - - - - {/* 輪迴交叉 */} - {chart.meta?.incarnationCross && (() => { - const ic = chart.meta!.incarnationCross! - const sheetTarget = { - kind: 'incarnationCross' as const, - crossType: ic.crossType, - crossTypeLabel: ic.crossTypeLabel, - crossBaseName: ic.crossBaseName, - variant: ic.variant, - gatesLabel: ic.gatesLabel, - sunGate: ic.sunGate, - } - return ( - open(sheetTarget)} style={({ pressed }) => [styles.crossCard, pressed && styles.crossCardPressed]}> - 輪迴交叉 - - {ic.crossTypeLabel}之{ic.crossBaseName}{ic.variant} - - 閘門組合:{ic.gatesLabel} - 點擊查看說明 › - - ) - })()} - - {/* 四箭頭 */} - {chart.meta?.variables && chart.meta?.arrows && ( - - - - ← Design(紅) - - {chart.meta.arrows.topLeft ? '←' : '→'} - - 飲食(Digestion) - {chart.meta.variables.digestion.label} - {chart.meta.variables.digestion.description} - - - - {chart.meta.arrows.bottomLeft ? '←' : '→'} - - 環境(Environment) - {chart.meta.variables.environment.label} - {chart.meta.variables.environment.description} - - - - - Personality(黑)→ - - {chart.meta.arrows.topRight ? '←' : '→'} - - 動機(Motivation) - {chart.meta.variables.motivation.label} - {chart.meta.variables.motivation.description} - - - - {chart.meta.arrows.bottomRight ? '←' : '→'} - - 觀點(Perspective) - {chart.meta.variables.perspective.label} - {chart.meta.variables.perspective.description} - - - - - - )} - + )} {/* ─── 下載/複製按鈕 ─── */} @@ -708,6 +408,14 @@ export default function ChartDetailScreen() { ) } +export default function ChartDetailScreen() { + return ( + + + + ) +} + const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.bg }, inner: { padding: Spacing.lg, paddingBottom: Spacing.xxl, rowGap: Spacing.md }, @@ -724,34 +432,6 @@ const styles = StyleSheet.create({ transitTime: { fontSize: 12, color: Colors.transit }, transitRebuiltNote: { fontSize: 12, color: Colors.sub, marginTop: 4 }, - tagRow: { flexDirection: 'row', flexWrap: 'wrap', columnGap: 6, rowGap: 6 }, - - gateGrid: { flexDirection: 'row', flexWrap: 'wrap', columnGap: Spacing.sm, rowGap: Spacing.sm }, - gate: { backgroundColor: Colors.gateBg, borderRadius: Radius.sm, width: 40, height: 40, justifyContent: 'center', alignItems: 'center', borderWidth: 1, borderColor: Colors.gateBorder, overflow: 'hidden' }, - gateDualOverlay: { position: 'absolute', top: 0, right: 0, bottom: 0, width: '50%', backgroundColor: Colors.designRed }, - gateText: { color: Colors.accent, fontSize: 13, fontWeight: '600' }, - gateTextActive: { color: '#ffffff' }, - gateTextPressed: { fontSize: 17, fontWeight: '800' }, - - planetHeader: { flexDirection: 'row', paddingBottom: 6, borderBottomWidth: 1, borderBottomColor: Colors.border, marginBottom: Spacing.xs }, - planetHeaderText: { fontSize: 11, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0.5, color: Colors.sub }, - planetRow: { flexDirection: 'row', paddingVertical: 5 }, - planetRowAlt: { backgroundColor: Colors.altRowBg, marginHorizontal: -Spacing.lg, paddingHorizontal: Spacing.lg, borderRadius: 6 }, - planetCol: { flex: 1.2, fontSize: 13, color: Colors.sub }, - planetGateCol: { flex: 1, fontSize: 14, fontWeight: '700', fontVariant: ['tabular-nums'] }, - planetBlack: { color: Colors.text }, - planetRed: { color: Colors.planetRedText }, - - arrowsGrid: { flexDirection: 'column', gap: Spacing.lg, padding: Spacing.md }, - arrowsCol: { gap: Spacing.md }, - arrowsSide: { fontSize: 14, color: Colors.muted, fontWeight: '600', marginBottom: 2 }, - arrowItem: { flexDirection: 'row', gap: Spacing.sm, alignItems: 'flex-start' }, - arrowDir: { fontSize: 22, color: Colors.accent, fontWeight: '700', width: 24, lineHeight: 26 }, - arrowInfo: { flex: 1, gap: 3 }, - arrowCategory: { fontSize: 12, color: Colors.sub, fontWeight: '600', textTransform: 'uppercase', letterSpacing: 0.4 }, - arrowLabel: { fontSize: 17, color: Colors.text, fontWeight: '700' }, - arrowDesc: { fontSize: 13, color: Colors.sub, lineHeight: 18 }, - actionSection: { gap: Spacing.sm, marginTop: Spacing.sm }, actionBtn: { paddingVertical: 14, borderRadius: Radius.lg, alignItems: 'center' }, actionBtnPrimary: { backgroundColor: Colors.accent }, @@ -760,11 +440,4 @@ const styles = StyleSheet.create({ actionBtnText: { fontSize: 15, fontWeight: '600' }, actionBtnTextPrimary: { color: Colors.bg }, actionBtnTextOutline: { color: Colors.accent }, - - crossCard: { backgroundColor: Colors.surface, borderRadius: Radius.lg, padding: Spacing.lg, borderWidth: 1, borderColor: Colors.border, gap: 6 }, - crossCardPressed: { borderColor: Colors.accent, backgroundColor: Colors.accentD }, - crossCardTitle: { color: Colors.sub, fontSize: 12, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 1 }, - crossFullName: { color: Colors.accent, fontSize: 16, fontWeight: '700' }, - crossGates: { color: Colors.sub, fontSize: 13 }, - crossHint: { color: Colors.muted, fontSize: 12, alignSelf: 'flex-end' } as const, }) diff --git a/mobile/app/chart/preview.tsx b/mobile/app/chart/preview.tsx index 547a314..c663c65 100644 --- a/mobile/app/chart/preview.tsx +++ b/mobile/app/chart/preview.tsx @@ -14,13 +14,14 @@ import { SafeAreaView } from 'react-native-safe-area-context' import { getPendingChart, clearPendingChart, type PendingChart } from '@/lib/pendingChart' import { createChart } from '@/lib/api' import { downloadChartAsPdf, generateAiPrompt } from '@/lib/chartPdf' -import { HD_CENTERS_INFO, ACT_CONSCIOUS, ACT_UNCONSCIOUS } from '@/lib/hd-chart-data' +import { HD_CENTERS_INFO, ACT_CONSCIOUS, ACT_UNCONSCIOUS } from '@shared/humanDesign/hd-chart-data' import { normalizeCenterId, normalizeChannelId, findChannelById } from '@/lib/hd-normalizers' import { getTypeMeta, getTypeLabel } from '@/lib/hd-type-meta' import BodyGraph from '@/components/BodyGraph' import DetailBottomSheet, { type SheetTarget } from '@/components/DetailBottomSheet' import { SectionCard, Row, Tag } from '@/components/chart/ChartPrimitives' import { NavBackHeader } from '@/components/NavBackHeader' +import { ErrorBoundary } from '@/components/ErrorBoundary' import { Colors, Radius, Spacing } from '@/constants/tokens' // ─── Action buttons ─────────────────────────────────────────────────────────── @@ -62,7 +63,7 @@ function ActionButton({ // ─── Main screen ────────────────────────────────────────────────────────────── -export default function ChartPreviewScreen() { +function ChartPreviewScreenContent() { const { isSignedIn, getToken } = useAuth() const router = useRouter() const [chart, setChart] = useState(null) @@ -389,6 +390,14 @@ export default function ChartPreviewScreen() { ) } +export default function ChartPreviewScreen() { + return ( + + + + ) +} + const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Colors.bg }, inner: { padding: Spacing.lg, paddingBottom: Spacing.xxl, rowGap: Spacing.md }, diff --git a/mobile/app/learn/[topic].tsx b/mobile/app/learn/[topic].tsx index d40e9a9..1acfb98 100644 --- a/mobile/app/learn/[topic].tsx +++ b/mobile/app/learn/[topic].tsx @@ -6,7 +6,7 @@ import { HD_AUTHORITY_CONTENT, HD_PROFILE_CONTENT, HD_DEFINITION_CONTENT, -} from '@/lib/hd-summary-data' +} from '@shared/humanDesign/hd-summary-data' import { SummaryList } from '@/components/learn/SummaryList' import { CenterList } from '@/components/learn/CenterList' import { ChannelList } from '@/components/learn/ChannelList' diff --git a/mobile/components/BirthProfilePickerModal.tsx b/mobile/components/BirthProfilePickerModal.tsx index 38973a8..2ac34d5 100644 --- a/mobile/components/BirthProfilePickerModal.tsx +++ b/mobile/components/BirthProfilePickerModal.tsx @@ -12,8 +12,9 @@ type Props = { export function BirthProfilePickerModal({ visible, profiles, onSelect, onClose }: Props) { return ( - - {}}> + + + 選擇出生資料 @@ -28,15 +29,16 @@ export function BirthProfilePickerModal({ visible, profiles, onSelect, onClose } ))} - - + + ) } const s = StyleSheet.create({ - overlay: { flex: 1, backgroundColor: Colors.overlay, justifyContent: 'flex-end' }, - sheet: { backgroundColor: Colors.surface, borderTopLeftRadius: Radius.xl, borderTopRightRadius: Radius.xl, padding: Spacing.xl, paddingBottom: 48, maxHeight: '60%' }, + container: { flex: 1, justifyContent: 'flex-end' }, + backdrop: { ...StyleSheet.absoluteFill, backgroundColor: Colors.overlay }, + sheet: { backgroundColor: Colors.surface, borderTopLeftRadius: Radius.xl, borderTopRightRadius: Radius.xl, padding: Spacing.xl, paddingBottom: 48, maxHeight: '60%' }, handle: { width: 40, height: 4, borderRadius: 2, backgroundColor: Colors.border, alignSelf: 'center', marginBottom: Spacing.md }, title: { color: Colors.text, fontSize: 16, fontWeight: '700', marginBottom: Spacing.sm }, row: { paddingVertical: Spacing.md }, diff --git a/mobile/components/BodyGraph.tsx b/mobile/components/BodyGraph.tsx index bff8fde..ef14319 100644 --- a/mobile/components/BodyGraph.tsx +++ b/mobile/components/BodyGraph.tsx @@ -21,7 +21,7 @@ import { HD_PALETTE, INTEGRATION_PAIRS, type ChartChannel, -} from '@/lib/hd-chart-data' +} from '@shared/humanDesign/hd-chart-data' export interface GateActivation { c?: boolean // Personality / conscious (黑) diff --git a/mobile/components/ChartListView.tsx b/mobile/components/ChartListView.tsx index b2f8188..db8dc90 100644 --- a/mobile/components/ChartListView.tsx +++ b/mobile/components/ChartListView.tsx @@ -11,7 +11,7 @@ import { TextInput, View, } from 'react-native' -import { type Chart, deleteChart, getCharts, renameChart } from '@/lib/api' +import { type Chart, deleteChart, getCharts, renameChart, isCompositeChart } from '@/lib/api' import { SubTabBar } from '@/components/SubTabBar' import { InputModal } from '@/components/InputModal' import { LoadingView, ErrorView } from '@/components/StateViews' @@ -31,9 +31,8 @@ const KIND_CFG: Record = { } function kindOf(c: Chart): string { - if (c.chartKind === 'composite' || c.chartKind === 'transit') return c.chartKind - // 舊格式合圖:網頁端存 type='合圖' 但沒有設 chartKind - if (c.type === '合圖' || c.birthDate?.includes('|')) return 'composite' + if (c.chartKind === 'transit') return 'transit' + if (isCompositeChart(c)) return 'composite' return c.chartKind ?? 'personal' } @@ -88,7 +87,7 @@ function ChartFlatList({ if (error) return const showMenu = (item: Chart) => - Alert.alert(item.name ?? '未命名圖表', undefined, [ + Alert.alert(item.name ?? '未命名圖表', '選擇要執行的操作', [ { text: '重新命名', onPress: () => onRename(item) }, { text: '刪除圖表', style: 'destructive', onPress: () => onDelete(item) }, { text: '取消', style: 'cancel' }, diff --git a/mobile/components/CompositeView.tsx b/mobile/components/CompositeView.tsx index a92fcab..6269e57 100644 --- a/mobile/components/CompositeView.tsx +++ b/mobile/components/CompositeView.tsx @@ -92,11 +92,11 @@ export default function CompositeView() { const [hour, minute] = p.time.split(':').map(Number) const patch = { date: { year, month, day }, time: { hour, minute }, city: p.location, timezone: p.timezone } if (pickerTarget === 'A') { - setFormA(f => ({ ...f, ...patch, name: f.name || p.label })) + setFormA(f => ({ ...f, ...patch, name: p.label })) setErrorA(null) setAppliedA(p) } else if (pickerTarget === 'B') { - setFormB(f => ({ ...f, ...patch, name: f.name || p.label })) + setFormB(f => ({ ...f, ...patch, name: p.label })) setErrorB(null) setAppliedB(p) } diff --git a/mobile/components/DetailBottomSheet.tsx b/mobile/components/DetailBottomSheet.tsx index 5d3954c..d6a51fb 100644 --- a/mobile/components/DetailBottomSheet.tsx +++ b/mobile/components/DetailBottomSheet.tsx @@ -6,7 +6,7 @@ import { Text, View, } from 'react-native' -import { type ChartChannel } from '@/lib/hd-chart-data' +import { type ChartChannel } from '@shared/humanDesign/hd-chart-data' import { buildCenterContent, buildGateContent, diff --git a/mobile/components/InputModal.tsx b/mobile/components/InputModal.tsx index 1756685..dc6d90c 100644 --- a/mobile/components/InputModal.tsx +++ b/mobile/components/InputModal.tsx @@ -33,10 +33,16 @@ export function InputModal({ transparent animationType="fade" onRequestClose={onCancel} + onShow={() => setTimeout(() => inputRef?.current?.focus(), 100)} > + {/* Android 的 windowSoftInputMode 預設是 resize(Expo 56 文件註明),整個視窗(含這個 + Modal 本身)在鍵盤跳出時已經由系統原生 resize 過一次;這裡如果還用 behavior="height" + 再手動補一次高度補償,等於跟系統的 resize 互相打架,兩邊都在搶同一段高度變化的計算, + 會造成畫面/輸入框反覆跳動。Android 交給系統原生 resize 處理就好,不需要 KeyboardAvoidingView + 介入;iOS 沒有這種原生 resize 行為,仍要靠 padding 手動避開鍵盤。 */} {}}> @@ -48,7 +54,6 @@ export function InputModal({ onChangeText={onChange} placeholder={placeholder} placeholderTextColor={Colors.muted} - autoFocus returnKeyType="done" onSubmitEditing={() => { if (!loading) onConfirm() }} /> diff --git a/mobile/components/TransitView.tsx b/mobile/components/TransitView.tsx index c34f44a..76526aa 100644 --- a/mobile/components/TransitView.tsx +++ b/mobile/components/TransitView.tsx @@ -19,7 +19,7 @@ import { type CreateTransitResult, previewTransitChart, createTransitChart } fro import { ScrollLockContext, useScrollLockState } from '@/contexts/ScrollLockContext' import { downloadTransitPdf, generateTransitAiPrompt } from '@/lib/chartPdf' import { buildTransitBodyGraphProps } from '@/lib/hd-bodygraph-utils' -import { HD_GATES } from '@/lib/hd-chart-data' +import { HD_GATES } from '@shared/humanDesign/hd-chart-data' import { useBirthProfiles } from '@/hooks/useBirthProfiles' import { useKeyboardHeight } from '@/hooks/useKeyboardHeight' import BirthDataForm, { type BirthFormData, defaultBirthFormData } from '@/components/BirthDataForm' @@ -80,7 +80,7 @@ export default function TransitView() { function applyProfile(p: BirthProfile) { const [year, month, day] = p.date.split('-').map(Number) const [hour, minute] = p.time.split(':').map(Number) - setForm(f => ({ ...f, date: { year, month, day }, time: { hour, minute }, city: p.location, timezone: p.timezone, name: f.name || p.label })) + setForm(f => ({ ...f, date: { year, month, day }, time: { hour, minute }, city: p.location, timezone: p.timezone, name: p.label })) setFieldError(null) setAppliedProfile(p) setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 80) diff --git a/mobile/components/chart/PersonalChartDetails.tsx b/mobile/components/chart/PersonalChartDetails.tsx new file mode 100644 index 0000000..b75f0a9 --- /dev/null +++ b/mobile/components/chart/PersonalChartDetails.tsx @@ -0,0 +1,226 @@ +import { Pressable, StyleSheet, Text, View } from 'react-native' +import { type Chart, type StoredPlanet } from '@/lib/api' +import { HD_CENTERS_INFO, ACT_CONSCIOUS, ACT_UNCONSCIOUS } from '@shared/humanDesign/hd-chart-data' +import { findChannelById } from '@/lib/hd-normalizers' +import { getTypeMeta, getTypeLabel } from '@/lib/hd-type-meta' +import { type SheetTarget } from '@/components/DetailBottomSheet' +import { SectionCard, Row, Tag } from '@/components/chart/ChartPrimitives' +import { Colors, Radius, Spacing } from '@/constants/tokens' + +type Activations = Record + +type Props = { + chart: Chart + personalChartCenterIds: Set + activations: Activations + planets: StoredPlanet[] + open: (target: SheetTarget) => void +} + +/** 個人圖專屬區塊:類型/設計/九大中心/通道/行星閘門對照/激活閘門/輪迴交叉/四箭頭 */ +export default function PersonalChartDetails({ chart, personalChartCenterIds, activations, planets, open }: Props) { + const typeMeta = getTypeMeta(chart.type) + + return ( + <> + + open({ kind: 'type', typeKey: chart.type })} /> + + + + + + + open({ kind: 'authority', authorityKey: chart.authority })} /> + open({ kind: 'profile', profile: chart.profile })} /> + open({ kind: 'definition', definitionKey: chart.definition })} /> + + + + + {Object.keys(HD_CENTERS_INFO).map((chartKey) => { + const info = HD_CENTERS_INFO[chartKey] + const defined = personalChartCenterIds.has(chartKey) + return ( + open({ kind: 'center', id: chartKey, defined })} + /> + ) + })} + + + + {chart.channels.length > 0 && ( + + + {chart.channels.map((rawCh) => { + const ch = findChannelById(rawCh) + const label = ch ? `${ch.from}–${ch.to}` : rawCh + return ( + open({ kind: 'channel', channel: ch }) : undefined} /> + ) + })} + + + )} + + {planets.length > 0 && ( + + + 行星 + ● 意識(黑) + ● 潛意識(紅) + + {planets.map((p, i) => ( + + {p.name} + {p.blackGate}.{p.blackLine} + {p.redGate}.{p.redLine} + + ))} + + )} + + + + {[...chart.gates].sort((a, b) => a - b).map((g) => { + const state = activations[g] + const isDual = !!(state?.c && state?.u) + const soloFill = isDual ? null : state?.c ? ACT_CONSCIOUS : state?.u ? ACT_UNCONSCIOUS : null + const isActive = isDual || !!soloFill + return ( + open({ kind: 'gate', num: g })} + > + {({ pressed }) => ( + <> + {isDual && } + + {g} + + + )} + + ) + })} + + + + {/* 輪迴交叉 */} + {chart.meta?.incarnationCross && (() => { + const ic = chart.meta!.incarnationCross! + const sheetTarget = { + kind: 'incarnationCross' as const, + crossType: ic.crossType, + crossTypeLabel: ic.crossTypeLabel, + crossBaseName: ic.crossBaseName, + variant: ic.variant, + gatesLabel: ic.gatesLabel, + sunGate: ic.sunGate, + } + return ( + open(sheetTarget)} style={({ pressed }) => [styles.crossCard, pressed && styles.crossCardPressed]}> + 輪迴交叉 + + {ic.crossTypeLabel}之{ic.crossBaseName}{ic.variant} + + 閘門組合:{ic.gatesLabel} + 點擊查看說明 › + + ) + })()} + + {/* 四箭頭 */} + {chart.meta?.variables && chart.meta?.arrows && ( + + + + ← Design(紅) + + {chart.meta.arrows.topLeft ? '←' : '→'} + + 飲食(Digestion) + {chart.meta.variables.digestion.label} + {chart.meta.variables.digestion.description} + + + + {chart.meta.arrows.bottomLeft ? '←' : '→'} + + 環境(Environment) + {chart.meta.variables.environment.label} + {chart.meta.variables.environment.description} + + + + + Personality(黑)→ + + {chart.meta.arrows.topRight ? '←' : '→'} + + 動機(Motivation) + {chart.meta.variables.motivation.label} + {chart.meta.variables.motivation.description} + + + + {chart.meta.arrows.bottomRight ? '←' : '→'} + + 觀點(Perspective) + {chart.meta.variables.perspective.label} + {chart.meta.variables.perspective.description} + + + + + + )} + + ) +} + +const styles = StyleSheet.create({ + tagRow: { flexDirection: 'row', flexWrap: 'wrap', columnGap: 6, rowGap: 6 }, + + gateGrid: { flexDirection: 'row', flexWrap: 'wrap', columnGap: Spacing.sm, rowGap: Spacing.sm }, + gate: { backgroundColor: Colors.gateBg, borderRadius: Radius.sm, width: 40, height: 40, justifyContent: 'center', alignItems: 'center', borderWidth: 1, borderColor: Colors.gateBorder, overflow: 'hidden' }, + gateDualOverlay: { position: 'absolute', top: 0, right: 0, bottom: 0, width: '50%', backgroundColor: Colors.designRed }, + gateText: { color: Colors.accent, fontSize: 13, fontWeight: '600' }, + gateTextActive: { color: '#ffffff' }, + gateTextPressed: { fontSize: 17, fontWeight: '800' }, + + planetHeader: { flexDirection: 'row', paddingBottom: 6, borderBottomWidth: 1, borderBottomColor: Colors.border, marginBottom: Spacing.xs }, + planetHeaderText: { fontSize: 11, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0.5, color: Colors.sub }, + planetRow: { flexDirection: 'row', paddingVertical: 5 }, + planetRowAlt: { backgroundColor: Colors.altRowBg, marginHorizontal: -Spacing.lg, paddingHorizontal: Spacing.lg, borderRadius: 6 }, + planetCol: { flex: 1.2, fontSize: 13, color: Colors.sub }, + planetGateCol: { flex: 1, fontSize: 14, fontWeight: '700', fontVariant: ['tabular-nums'] }, + planetBlack: { color: Colors.text }, + planetRed: { color: Colors.planetRedText }, + + crossCard: { backgroundColor: Colors.surface, borderRadius: Radius.lg, padding: Spacing.lg, borderWidth: 1, borderColor: Colors.border, gap: 6 }, + crossCardPressed: { borderColor: Colors.accent, backgroundColor: Colors.accentD }, + crossCardTitle: { color: Colors.sub, fontSize: 12, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 1 }, + crossFullName: { color: Colors.accent, fontSize: 16, fontWeight: '700' }, + crossGates: { color: Colors.sub, fontSize: 13 }, + crossHint: { color: Colors.muted, fontSize: 12, alignSelf: 'flex-end' } as const, + + arrowsGrid: { flexDirection: 'column', gap: Spacing.lg, padding: Spacing.md }, + arrowsCol: { gap: Spacing.md }, + arrowsSide: { fontSize: 14, color: Colors.muted, fontWeight: '600', marginBottom: 2 }, + arrowItem: { flexDirection: 'row', gap: Spacing.sm, alignItems: 'flex-start' }, + arrowDir: { fontSize: 22, color: Colors.accent, fontWeight: '700', width: 24, lineHeight: 26 }, + arrowInfo: { flex: 1, gap: 3 }, + arrowCategory: { fontSize: 12, color: Colors.sub, fontWeight: '600', textTransform: 'uppercase', letterSpacing: 0.4 }, + arrowLabel: { fontSize: 17, color: Colors.text, fontWeight: '700' }, + arrowDesc: { fontSize: 13, color: Colors.sub, lineHeight: 18 }, +}) diff --git a/mobile/components/chart/TransitAnalysis.tsx b/mobile/components/chart/TransitAnalysis.tsx index e208317..5584543 100644 --- a/mobile/components/chart/TransitAnalysis.tsx +++ b/mobile/components/chart/TransitAnalysis.tsx @@ -1,6 +1,6 @@ import { StyleSheet, Text, View } from 'react-native' import { type Chart } from '@/lib/api' -import { CENTER_ORDER, HD_CHANNELS, HD_GATES } from '@/lib/hd-chart-data' +import { CENTER_ORDER, HD_CHANNELS, HD_GATES } from '@shared/humanDesign/hd-chart-data' import { normalizeCenterId } from '@/lib/hd-normalizers' import { Colors, Radius, Spacing } from '@/constants/tokens' diff --git a/mobile/components/learn/CenterList.tsx b/mobile/components/learn/CenterList.tsx index a7ab0a4..50f79af 100644 --- a/mobile/components/learn/CenterList.tsx +++ b/mobile/components/learn/CenterList.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native' -import { HD_CENTERS_INFO } from '@/lib/hd-chart-data' +import { HD_CENTERS_INFO } from '@shared/humanDesign/hd-chart-data' import { Colors, Radius, Spacing } from '@/constants/tokens' import { ls } from './learnStyles' diff --git a/mobile/components/learn/ChannelList.tsx b/mobile/components/learn/ChannelList.tsx index 9a517fb..827ab10 100644 --- a/mobile/components/learn/ChannelList.tsx +++ b/mobile/components/learn/ChannelList.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from 'react' import { Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native' -import { HD_CHANNELS, type ChartChannel } from '@/lib/hd-chart-data' +import { HD_CHANNELS, type ChartChannel } from '@shared/humanDesign/hd-chart-data' import { Colors } from '@/constants/tokens' import { ls } from './learnStyles' diff --git a/mobile/components/learn/GateList.tsx b/mobile/components/learn/GateList.tsx index 77e8c15..6a17c92 100644 --- a/mobile/components/learn/GateList.tsx +++ b/mobile/components/learn/GateList.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from 'react' import { Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native' -import { HD_GATES } from '@/lib/hd-chart-data' +import { HD_GATES } from '@shared/humanDesign/hd-chart-data' import { CENTER_ZH } from '@/lib/hd-normalizers' import { Colors, Radius } from '@/constants/tokens' import { ls } from './learnStyles' diff --git a/mobile/components/learn/SummaryList.tsx b/mobile/components/learn/SummaryList.tsx index 120873d..db823fe 100644 --- a/mobile/components/learn/SummaryList.tsx +++ b/mobile/components/learn/SummaryList.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { Pressable, ScrollView, Text, View } from 'react-native' -import { type SummaryContent } from '@/lib/hd-summary-data' +import { type SummaryContent } from '@shared/humanDesign/hd-summary-data' import { ls } from './learnStyles' interface Props { diff --git a/mobile/lib/api.ts b/mobile/lib/api.ts index a1ab2c0..13192a9 100644 --- a/mobile/lib/api.ts +++ b/mobile/lib/api.ts @@ -71,43 +71,72 @@ export type Chart = { createdAt: string } +/** 網頁端舊格式合圖偵測:出生資料(birthDate/birthTime/birthCity/timezone)用 '|' 分隔兩人資料 */ +export function isLegacyPipeComposite(c: Pick): boolean { + return !!c.birthDate?.includes('|') +} + +/** 判斷圖表是否為合圖,涵蓋網頁端舊格式(沒有 chartKind,靠 type='合圖' 或 pipe 分隔出生資料判斷) */ +export function isCompositeChart(c: Pick): boolean { + return c.chartKind === 'composite' || c.type === '合圖' || isLegacyPipeComposite(c) +} + +const DEFAULT_TIMEOUT_MS = 10_000 +// 星曆計算類 endpoint(個人圖/合圖/流日 的算圖與 preview)比較慢,給更長的 timeout +const EPHEMERIS_TIMEOUT_MS = 20_000 +const RETRY_DELAY_MS = 600 + +/** 只重試網路層失敗(連線中斷、逾時),不重試已收到的 HTTP 錯誤回應,避免對有副作用的請求重複送出 */ +function isTransientError(err: unknown): boolean { + if (err && typeof err === 'object' && (err as { name?: unknown }).name === 'AbortError') return true + return err instanceof TypeError +} + async function request( path: string, - options: RequestInit & { token?: string } = {}, + options: RequestInit & { token?: string; timeoutMs?: number; retries?: number } = {}, ): Promise { - const { token, ...init } = options - const controller = new AbortController() - const timer = setTimeout(() => controller.abort(), 10_000) - try { - const res = await fetch(`${BASE_URL}${path}`, { - ...init, - signal: controller.signal, - headers: { - 'Content-Type': 'application/json', - ...(token ? { Authorization: `Bearer ${token}` } : {}), - ...init.headers, - }, - }) - const contentType = res.headers.get('content-type') ?? '' - if (!res.ok) { - let msg = `HTTP ${res.status}` - if (contentType.includes('application/json')) { - try { msg = (await res.json())?.error ?? msg } catch { /* ignore */ } + const { token, timeoutMs = DEFAULT_TIMEOUT_MS, retries = 0, ...init } = options + for (let attempt = 0; ; attempt++) { + const controller = new AbortController() + const timer = setTimeout(() => controller.abort(), timeoutMs) + try { + const res = await fetch(`${BASE_URL}${path}`, { + ...init, + signal: controller.signal, + headers: { + 'Content-Type': 'application/json', + ...(token ? { Authorization: `Bearer ${token}` } : {}), + ...init.headers, + }, + }) + const contentType = res.headers.get('content-type') ?? '' + if (!res.ok) { + let msg = `HTTP ${res.status}` + if (contentType.includes('application/json')) { + try { msg = (await res.json())?.error ?? msg } catch { /* ignore */ } + } + throw new Error(msg) } - throw new Error(msg) - } - if (!contentType.includes('application/json')) { - throw new Error(`Unexpected response (${contentType || 'no content-type'}) from ${path}`) + if (!contentType.includes('application/json')) { + throw new Error(`Unexpected response (${contentType || 'no content-type'}) from ${path}`) + } + return (await res.json()) as T + } catch (err) { + if (attempt < retries && isTransientError(err)) { + await new Promise((r) => setTimeout(r, RETRY_DELAY_MS * (attempt + 1))) + continue + } + throw err + } finally { + clearTimeout(timer) } - return (await res.json()) as T - } finally { - clearTimeout(timer) } } // GET /api/charts export function getCharts(token: string) { - return request<{ charts: Chart[] }>('/api/charts', { token }) + return request<{ charts: Chart[] }>('/api/charts', { token, retries: 1 }) } // POST /api/charts — server 端自動計算人類圖,mobile 只需傳出生資料 @@ -142,36 +171,42 @@ export function previewChart(payload: CreateChartPayload) { return request('/api/charts', { method: 'POST', body: JSON.stringify(payload), + timeoutMs: EPHEMERIS_TIMEOUT_MS, + retries: 1, }) } +// 有寫入副作用(會建立圖表),不重試,避免逾時後重送造成重複建立 export function createChart(token: string, payload: CreateChartPayload) { return request<{ chartId: string }>('/api/charts', { method: 'POST', body: JSON.stringify(payload), token, + timeoutMs: EPHEMERIS_TIMEOUT_MS, }) } // GET /api/charts/[id] export function getChart(token: string, id: string) { - return request<{ chart: Chart }>(`/api/charts/${id}`, { token }) + return request<{ chart: Chart }>(`/api/charts/${id}`, { token, retries: 1 }) } -// PATCH /api/charts/[id] +// PATCH /api/charts/[id](idempotent,可安全重試) export function renameChart(token: string, id: string, name: string) { return request<{ ok: true }>(`/api/charts/${id}`, { method: 'PATCH', body: JSON.stringify({ name }), token, + retries: 1, }) } -// DELETE /api/charts/[id] +// DELETE /api/charts/[id](idempotent,可安全重試) export function deleteChart(token: string, id: string) { return request<{ ok: true }>(`/api/charts/${id}`, { method: 'DELETE', token, + retries: 1, }) } @@ -228,15 +263,18 @@ export function previewCompositeChart(payload: CreateCompositePayload) { return request('/api/composite/create', { method: 'POST', body: JSON.stringify({ ...payload, previewOnly: true }), + timeoutMs: EPHEMERIS_TIMEOUT_MS, + retries: 1, }) } -/** 帶 token — 計算合圖並存 DB,chartId 回傳儲存後的 id */ +/** 帶 token — 計算合圖並存 DB,chartId 回傳儲存後的 id。有寫入副作用,不重試 */ export function createCompositeChart(token: string, payload: CreateCompositePayload) { return request('/api/composite/create', { method: 'POST', body: JSON.stringify(payload), token, + timeoutMs: EPHEMERIS_TIMEOUT_MS, }) } @@ -278,10 +316,12 @@ export function previewTransitChart( return request('/api/transit/create', { method: 'POST', body: JSON.stringify(payload), + timeoutMs: EPHEMERIS_TIMEOUT_MS, + retries: 1, }) } -/** 帶 token — 計算流日並存 DB,chartId 回傳儲存後的 id */ +/** 帶 token — 計算流日並存 DB,chartId 回傳儲存後的 id。有寫入副作用,不重試 */ export function createTransitChart( token: string, payload: { birthDate: string; birthTime: string; birthCity: string; timezone: string; name?: string }, @@ -290,6 +330,7 @@ export function createTransitChart( method: 'POST', body: JSON.stringify(payload), token, + timeoutMs: EPHEMERIS_TIMEOUT_MS, }) } @@ -305,7 +346,7 @@ export type TransitData = { } export function getTransit(token: string) { - return request('/api/transit', { token }) + return request('/api/transit', { token, retries: 1 }) } export type ImpactLayer = { @@ -319,6 +360,7 @@ export function getTransitImpact(token: string, chartId: string) { method: 'POST', body: JSON.stringify({ chartId }), token, + retries: 1, }) } @@ -352,6 +394,7 @@ export function getComposite(token: string, chartAId: string, chartBId: string) method: 'POST', body: JSON.stringify({ chartAId, chartBId }), token, + retries: 1, }) } @@ -370,7 +413,7 @@ export type RemoteBirthProfile = { } export function getBirthProfiles(token: string) { - return request<{ profiles: RemoteBirthProfile[] }>('/api/birth-profiles', { token }) + return request<{ profiles: RemoteBirthProfile[] }>('/api/birth-profiles', { token, retries: 1 }) } export type BirthProfilePayload = { @@ -398,18 +441,22 @@ export function importBirthProfiles(token: string, profiles: BirthProfilePayload }) } +// PATCH 是完整覆寫同一組欄位,重送一次結果相同,可安全重試 export function updateBirthProfile(token: string, id: string, payload: Partial) { return request<{ ok: true }>(`/api/birth-profiles/${id}`, { method: 'PATCH', body: JSON.stringify(payload), token, + retries: 1, }) } +// 刪除本來就是 idempotent,重送一次結果相同,可安全重試 export function deleteBirthProfile(token: string, id: string) { return request<{ ok: true }>(`/api/birth-profiles/${id}`, { method: 'DELETE', token, + retries: 1, }) } @@ -428,7 +475,7 @@ export type AppNotification = { // GET /api/notifications — 公開端點,不需 token export function getNotifications() { - return request<{ notifications: AppNotification[] }>('/api/notifications') + return request<{ notifications: AppNotification[] }>('/api/notifications', { retries: 1 }) } // ─── Account ────────────────────────────────────────────────────────────────── diff --git a/mobile/lib/chartPdf.ts b/mobile/lib/chartPdf.ts index df188cb..63405ce 100644 --- a/mobile/lib/chartPdf.ts +++ b/mobile/lib/chartPdf.ts @@ -9,7 +9,7 @@ import { HD_GATES, HD_PALETTE, INTEGRATION_PAIRS, -} from './hd-chart-data' +} from '@shared/humanDesign/hd-chart-data' import { findChannelById } from './hd-normalizers' import { STRATEGY_MAP, diff --git a/mobile/lib/hd-chart-data.ts b/mobile/lib/hd-chart-data.ts deleted file mode 100755 index 8b20010..0000000 --- a/mobile/lib/hd-chart-data.ts +++ /dev/null @@ -1,379 +0,0 @@ -// Human Design chart geometry and descriptive data for the BodyGraph SVG. - -export const HD_PALETTE = { - mustard: '#e6c542', - olive: '#9bbf52', - tan: '#c69a5d', - crimson: '#d04830', - ink: '#2b1f14', - paper: '#efe5d0', -} - -// Activation colours -export const ACT_CONSCIOUS = '#000000' // Personality / 意識 = 黑 -export const ACT_UNCONSCIOUS = '#d04830' // Design / 非意識 = 紅 - -// Center geometry — viewBox 700 × 920 -// gateAnchors: gate number → [x, y] on the center's perimeter -export const CENTERS_GEOM: Record -}> = { - head: { - shape: 'tri-up', - color: HD_PALETTE.mustard, - points: '350,10 290,115 410,115', - gateAnchors: { 64: [320, 115], 61: [350, 115], 63: [380, 115] }, - }, - ajna: { - shape: 'tri-down', - color: HD_PALETTE.olive, - points: '290,175 410,175 350,275', - gateAnchors: { - 47: [320, 175], 24: [350, 175], 4: [380, 175], - 17: [332, 252], 43: [350, 263], 11: [368, 252], - }, - }, - throat: { - shape: 'square', - color: HD_PALETTE.tan, - rect: [300, 325, 100, 100], - points: '300,325 400,325 400,425 300,425', - gateAnchors: { - 62: [320, 325], 23: [350, 325], 56: [380, 325], - 35: [400, 345], 12: [400, 370], 45: [400, 400], - 16: [300, 348], 20: [300, 378], - 33: [332, 425], 31: [350, 425], 8: [368, 425], - }, - }, - g: { - shape: 'diamond', - color: HD_PALETTE.mustard, - points: '350,470 425,540 350,610 275,540', - gateAnchors: { - 13: [332, 488], 7: [350, 478], 1: [368, 488], - 25: [410, 553], - 10: [288, 533], - 15: [332, 592], 2: [350, 600], 46: [368, 592], - }, - }, - // 意志力中心 — "heart" in chart data, "ego" in lib types - heart: { - shape: 'tri-left', - color: HD_PALETTE.crimson, - points: '475,575 475,640 410,607', - gateAnchors: { - 21: [472, 579], - 26: [415, 606], - 51: [438, 595], - 40: [472, 600], - }, - }, - spleen: { - shape: 'tri-right', - color: HD_PALETTE.tan, - points: '120,630 120,710 200,670', - gateAnchors: { - 48: [140, 640], - 57: [160, 650], - 44: [195, 665], - 50: [184, 678], - 18: [164, 688], - 28: [148, 696], - 32: [132, 704], - }, - }, - sacral: { - shape: 'square', - color: HD_PALETTE.crimson, - rect: [300, 655, 100, 100], - points: '300,655 400,655 400,755 300,755', - gateAnchors: { - 5: [330, 655], 14: [350, 655], 29: [370, 655], - 34: [300, 655], 27: [300, 710], - 59: [400, 700], - 42: [320, 755], 3: [350, 755], 9: [380, 755], - }, - }, - // 情緒中心 — "solar" in chart data, "solarPlexus" in lib types - solar: { - shape: 'tri-left', - color: HD_PALETTE.tan, - points: '580,630 580,710 500,670', - gateAnchors: { - 36: [568, 636], - 22: [544, 648], - 37: [520, 660], - 6: [502, 669], - 49: [520, 680], - 55: [544, 692], - 30: [568, 704], - }, - }, - root: { - shape: 'square', - color: HD_PALETTE.tan, - rect: [300, 815, 100, 100], - points: '300,815 400,815 400,915 300,915', - gateAnchors: { - 58: [300, 828], 38: [300, 858], 54: [300, 888], - 53: [320, 815], 60: [350, 815], 52: [380, 815], - 19: [400, 828], 39: [400, 858], 41: [400, 888], - }, - }, -} - -export const CENTER_ORDER = ['head', 'ajna', 'throat', 'g', 'heart', 'spleen', 'sacral', 'solar', 'root'] - -// Integration channel pairs — rendered as trunk + spur, not individual lines -export const INTEGRATION_PAIRS = new Set(['10-20', '10-34', '10-57', '20-34', '34-57', '20-57']) - -// Channel data -export interface ChartChannel { - id: string - from: number - to: number - name: { zh: string; en: string } - desc: { zh: string; en: string } -} - -export const HD_CHANNELS: ChartChannel[] = [ - { id: 'c64-47', from: 64, to: 47, name: { zh: '抽象思考通道', en: 'Abstract Thinking' }, desc: { zh: '你的邏輯思維很享受和深奧問題搏鬥,對哲學、歷史、意識這些「太虛」的東西感到真正有趣。你的頓悟通常在放鬆時出現——發呆的瞬間突然就通了;你幫別人解決問題的能力往往比解決自己問題的能力還強。', en: 'The mental pattern of finding meaning in chaos. Distilling stories from past experiences.' } }, - { id: 'c61-24', from: 61, to: 24, name: { zh: '思想家通道', en: 'The Thinker' }, desc: { zh: '你的腦袋是一台永遠在轉的思考機器,想要把人生每一件事都搞清楚、都合理化。你的頓悟通常不在用力想的時候出現,而是放鬆的瞬間突然「叮」一聲就通了;你幫別人解決問題的能力往往比解決自己問題的能力還強。', en: "The thinker's channel. A persistent curiosity about the unknown." } }, - { id: 'c63-4', from: 63, to: 4, name: { zh: '邏輯思考通道', en: 'The Logical Mind' }, desc: { zh: '你的腦袋是一台永遠關不掉的分析機器,天生就愛用邏輯拆解問題、推敲可能性。你幫別人解問題往往比解決自己的問題還順手,最重要的功課是在「認真分析」和「享受當下」之間找到平衡。', en: 'The mental rhythm of doubt and answers. Requires time to verify.' } }, - { id: 'c17-62', from: 17, to: 62, name: { zh: '組織力通道', en: 'The Organizer' }, desc: { zh: '你天生善於把各種資訊、事實、細節整合在一起變成有說服力的論點,在需要策略、分析、說服人的場合特別能發揮。但你的腦袋不會停,要學會選擇時機,在真正想清楚且對方需要聽的時候再開口,影響力才能最大化。', en: "The organizer's channel. Turning opinions into facts and details." } }, - { id: 'c43-23', from: 43, to: 23, name: { zh: '建構通道', en: 'Structuring' }, desc: { zh: '你腦袋裡有別人沒有的東西,洞見常常比周圍人超前好幾步,同樣一句話從你嘴裡說出來,有人覺得天才也有人困惑,差別在時機和對象對不對。在開口之前先問自己「現在是說這個的時機嗎?對方聽得進去嗎?」', en: 'Genius or eccentric. Must be heard at the right moment.' } }, - { id: 'c11-56', from: 11, to: 56, name: { zh: '好奇心通道', en: 'Curiosity' }, desc: { zh: '你是個天生的故事收集者,對人和各種觀念感興趣,能把複雜的事情說得生動有趣,讓人聽完有「哦!原來是這樣」的感覺。要注意你分享的是觀點和詮釋,不是放諸四海皆準的真理,找到輕鬆分享但不強迫別人接受的平衡點。', en: "The storyteller's channel. Turning ideas into stories that stimulate others." } }, - { id: 'c20-34', from: 20, to: 34, name: { zh: '忙碌通道', en: 'Keeping Busy' }, desc: { zh: '當你找到一件真心喜歡的事,你會整個人燃起來,精力充沛停不下來,旁邊的人光看著你就會被帶動。但不是每一件事都值得你去忙——你的能量是真正的資源,只為你愛的事忙才是這條通道最美的狀態。', en: 'The present-moment exhibitor. The power of being busy in the now.' } }, - { id: 'c34-57', from: 34, to: 57, name: { zh: '力量通道', en: 'Power' }, desc: { zh: '這條通道讓你天生精力充沛,在關鍵時刻反應特別快特別準,在危機處理上特別厲害。你很自然地想替人療傷解決問題,但要先照顧好自己才能照顧好別人,選擇值得你投入力量的人和事,全力以赴。', en: 'Archetypal existence. Perfect survival instinct.' } }, - { id: 'c20-57', from: 20, to: 57, name: { zh: '衝動通道', en: 'Involuntary' }, desc: { zh: '你有一種X光眼,能分辨一個人說的話是不是真心的、一個計畫方向對不對,而且你的話常常是不由自主蹦出來的直覺反應。要練習的不是壓住直覺,而是給直覺一個緩衝——感受到了先在心裡確認,這是說出來的時機嗎?', en: 'Intuitive insight in the present moment — instantaneous.' } }, - { id: 'c10-20', from: 10, to: 20, name: { zh: '覺醒通道', en: 'Awakening' }, desc: { zh: '你對「真不真實」有一種近乎本能的敏感,要求自己活得誠實有原則,這種處世態度讓身邊的人不自覺開始思考「我是不是也可以更做自己一點」。你只在乎當下,這種活在當下的能量是你給周圍人最大的禮物之一。', en: 'Authentic expression in the now — true to oneself.' } }, - { id: 'c10-34', from: 10, to: 34, name: { zh: '探索通道', en: 'Exploration' }, desc: { zh: '你就是要走自己的路,當你按照自己的感覺和直覺行動,你會感覺對了、有力量;但如果為了配合別人而偏離自己的方向,你會迷失。這條通道有個特別能量:當你真的活出自己的樣子,你身邊的人也會被感染,開始有勇氣去做自己。', en: "Acting in accordance with one's own convictions." } }, - { id: 'c10-57', from: 10, to: 57, name: { zh: '生存力通道', en: 'Survival' }, desc: { zh: '你有一種很難用邏輯解釋的化險為夷能力,脾中心有一套超靈敏的生存雷達,在危險靠近之前就悄悄提醒你。你的直覺靠「聽起來對不對」來判斷,前提是你要願意相信它——壓住直覺,是你最可惜的事。', en: "Intuition of one's own survival and self-expression." } }, - { id: 'c16-48', from: 16, to: 48, name: { zh: '才華通道', en: 'Talent' }, desc: { zh: '你對「把事情做好」有一種近乎執著的渴望,天生就有深度,有強烈的動力把自己的才華磨到極致。要小心的陷阱是變成永遠在「準備中」的人——才華需要被使用,不是被囤積,你已經比你以為的更有能力了。', en: 'Deep talent expressed through dedicated practice.' } }, - { id: 'c12-22', from: 12, to: 22, name: { zh: '開放通道', en: 'Openness' }, desc: { zh: '你情緒豐沛且充滿熱情,你的情緒場域有很強的感染力,你開心周圍人也輕鬆,你悶悶不樂整個空間氣氛也會跟著沉。要學會的不是壓下情緒,而是知道什麼時候適合跟人互動、什麼時候需要先給自己一點空間。', en: 'Graceful expression of social and emotional experience.' } }, - { id: 'c21-45', from: 21, to: 45, name: { zh: '金錢通道', en: 'Money' }, desc: { zh: '你對金錢和資源有天生的嗅覺,對怎麼讓資源流動這件事有很強的本能,喜歡掌控局面並讓資源發揮最大效益。照顧自己利益的同時也真心在意周圍人的需求,才能得到錢和人心;貪得無厭是這條通道最大的暗礁。', en: 'Control and management in the material world.' } }, - { id: 'c26-44', from: 26, to: 44, name: { zh: '進取通道', en: 'Enterprise' }, desc: { zh: '你有一種讓人願意買單的能力,不管是賣產品、推動計畫還是說服別人接受你的想法,你都有辦法讓對方覺得合理並支持你。你同時有商業嗅覺和化解衝突的社交天賦,幫助別人變好的同時也讓自己得到應得的,才是最能持續發光的模式。', en: 'Memory, transmission, and commercial instinct.' } }, - { id: 'c40-37', from: 40, to: 37, name: { zh: '社群通道', en: 'Community' }, desc: { zh: '你心目中理想的世界是大家像家人一樣彼此信任共同努力,你有凝聚力,當你在場一群人會開始有向心力和歸屬感。你對誠信有清楚的底線,說話不算話的人你無法忍受——你就像群體裡的黏著劑,讓大家聚在一起不散掉。', en: 'The tribal promise and emotional contract.' } }, - { id: 'c51-25', from: 51, to: 25, name: { zh: '開創通道', en: 'Initiation' }, desc: { zh: '你有一種擋不住的開拓精神,喜歡把自己和別人推進新的領域和可能性,第一個衝出去證明現況是可以被突破的。你對「無條件的愛」有很深的嚮往,是一種更大的、對所有人都開放的心靈層次的愛。', en: 'Shock and awakening. Initiating others for a higher purpose.' } }, - { id: 'c2-14', from: 2, to: 14, name: { zh: '煉金士通道', en: 'The Alchemist' }, desc: { zh: '你有一種點石成金的本事,能把搖搖欲墜的爛攤子讓它重新站起來。你有強烈的個人節奏感和財務嗅覺,但要把能量放在真正值得的事上——當你全心投入和你頻率對的事,身邊的人都會被感染、跟著被帶動。', en: 'The helmsman of life direction and resources.' } }, - { id: 'c1-8', from: 1, to: 8, name: { zh: '靈感通道', en: 'Inspiration' }, desc: { zh: '你天生就是那種走進房間讓人自然看過來的人,不是刻意表現,而是你身上有說不清楚的氣場——創意、自信與說話方式讓人不自覺想跟著你走。你的天賦在等待邀請後才能真正發光,等人來找你,才是你最省力也最有影響力的方式。', en: 'A model of creativity. The display of uniqueness.' } }, - { id: 'c13-33', from: 13, to: 33, name: { zh: '浪蕩子通道', en: 'The Prodigal' }, desc: { zh: '你是一個天生的故事收藏家,走過很多路看過很多事,每一段經歷都變成了你的智慧庫。你是個很好的傾聽者,讓人有「跟你說話很安全」的感覺;但要注意白天的事容易帶到睡眠裡,給自己多一點安靜的時間沉澱。', en: 'The witness. Carrying secrets and stories.' } }, - { id: 'c7-31', from: 7, to: 31, name: { zh: '首領通道', en: 'The Alpha' }, desc: { zh: '你不需要大聲宣告「我是老大」,人們就是會自動把你當成領頭的那個人,靠邏輯、方向感和讓人信任的氣質讓大家願意跟著你走。最理想的狀態是等人們真的認同你、主動邀請你來領導的時候再出手。', en: 'The future leader. Chosen, not self-appointed.' } }, - { id: 'c15-5', from: 15, to: 5, name: { zh: '韻律通道', en: 'Rhythm' }, desc: { zh: '你有一種天生的時間感,知道什麼時候該開始、什麼時候該等待,這感覺不是用腦袋算出來的,是從身體裡感受到的。當你真的進入自己的韻律,你總能在對的時間點出現在對的地方——你就像一條有生命力的河流,帶著身邊的人一起往前走。', en: 'Extremes and love within the rhythms of nature.' } }, - { id: 'c46-29', from: 46, to: 29, name: { zh: '發現通道', en: 'Discovery' }, desc: { zh: '你是那種先跳進去再說的人,而且神奇的是通常都成功了——你投入之後才慢慢搞清楚這件事的意義。但前提是要把這股能量放在對的事情上,每次承諾投入之前先讓直覺說話,一次只專注在一件真正對的事上。', en: 'The commitment that requires deep reflection before saying yes.' } }, - { id: 'c42-53', from: 42, to: 53, name: { zh: '循環通道', en: 'Cycles' }, desc: { zh: '你的人生是一本一本寫完再換下一本的書,成長和改變有週期——工作、感情、居住地、人生方向都會歷經完整的開始、過程和結束。要把心力投注在對的週期裡,在一開始選擇的時候讓直覺帶你選,你的薦骨能量會在你承諾之後把你固定住直到週期走完。', en: 'The energy of completing cycles and finding balance.' } }, - { id: 'c9-52', from: 9, to: 52, name: { zh: '專注力通道', en: 'Concentration' }, desc: { zh: '你一旦決定要做一件事,就會把所有心力都壓在上面直到做到位為止。你的能量像一匹蓄勢待發的馬,要等到資源到位、計畫完整才會放開韁繩——讓直覺帶你找到值得全力投入的事,然後就放心地專注下去。', en: 'The determination to focus on details.' } }, - { id: 'c3-60', from: 3, to: 60, name: { zh: '突變通道', en: 'Mutation' }, desc: { zh: '你的成長和改變常常是突然發生的——某一天睡一覺起來就覺得要換個方向,某個契機一出現整個人就開始大轉彎。這種飛躍式的變化是你前進的方式,當你卡關時,音樂和大自然是你最好的朋友,讓自己慢下來,給事情一點時間發酵。', en: 'Innovation arising from the energy within limitation.' } }, - { id: 'c27-50', from: 27, to: 50, name: { zh: '守護通道', en: 'Preservation' }, desc: { zh: '你天生就有照顧別人的本能,看到有需要的人會自然地想伸出手,願意把別人的需求放在自己前面。但你必須正視一個課題:你太容易忽略自己的需求——在伸出手幫助別人之前,先聽一下直覺:這個人、這件事,真的值得我投入嗎?', en: 'Maintaining and nurturing values.' } }, - { id: 'c19-49', from: 19, to: 49, name: { zh: '敏感通道', en: 'Sensitivity' }, desc: { zh: '你對別人的感受靈敏得有點不可思議,光是你在場很多人就覺得安心,你有一種讓人感覺「被照顧到」的能力。但你太容易感受到別人的需求,卻很容易忘記自己也有需求——你要愛自己,才能持續愛別人。', en: 'Sensing needs and cultivating sensitivity.' } }, - { id: 'c39-55', from: 39, to: 55, name: { zh: '感性通道', en: 'Emoting' }, desc: { zh: '你的情緒從來不是淺嚐即止的那種,感受到的開心是真的很開心,感受到的難過也是真的很難過。你低潮的時候真的沒有人能替你開燈,只有你自己準備好了才會亮起來;音樂是你最好的朋友,而你最低潮的時候往往也是能創作出最觸動人心的東西的時候。', en: 'Emotional provocation and the fullness of feeling.' } }, - { id: 'c41-30', from: 41, to: 30, name: { zh: '夢想通道', en: 'Recognition' }, desc: { zh: '你心裡永遠裝著一個大夢想,使命感強,看事情的視角通常比周圍人更遠更寬,有辦法讓別人也看到那個藍圖和感受到那個熱情。用清明的情緒去追夢,找到真心認同你的人一起走,夢想才有辦法真正落地。', en: 'The energy of feeling driving experience.' } }, - { id: 'c6-59', from: 6, to: 59, name: { zh: '親密通道', en: 'Connecting' }, desc: { zh: '你身上有一種天生的吸引力,讓你走進一個場合,人們就會被你吸引過來。這條通道的能量關於連結與創造,你有從無到有的創作力;但在感情上要讓情緒先沉澱,等心裡真的清明了再做決定——不要在情緒最高點的時候做選擇。', en: 'The energy of reproduction and breaking down barriers.' } }, - { id: 'c36-35', from: 36, to: 35, name: { zh: '萬事通通道', en: 'Versatility' }, desc: { zh: '你對新鮮感有一種停不下來的渴望,一件事做久了就開始想下一個,你就是需要不斷體驗不斷前進才覺得自己是活著的。你在乎的是過程不是結果,有帶頭體驗人生的本事,很多人跟在你後面才敢去試那些自己不敢試的事。', en: 'The jack-of-all-trades seeking all manner of experiences.' } }, - { id: 'c18-58', from: 18, to: 58, name: { zh: '評判通道', en: 'Judgement' }, desc: { zh: '你眼睛很利,什麼地方不對勁一眼就看出來,而且通常也知道怎麼解決,非常適合做顧問、評論、稽核這類型的工作。但要注意對家人朋友說出的「建議」,在對方耳裡很可能聽起來像「你哪裡不好」——把批判力用在值得改善的制度或系統上,效果最好。', en: 'The energy to challenge and improve the existing order.' } }, - { id: 'c28-38', from: 28, to: 38, name: { zh: '掙扎通道', en: 'Struggle' }, desc: { zh: '你有一種骨子裡的反骨,只要覺得某件事不公平或有人說這樣做不可能,你就會燃起鬥志。你的人生有點像一直在逆風走路,這種韌性是真正的天賦,最大的功課是學會分辨哪些值得堅持、哪些應該放手。', en: 'Fighting for what is worth fighting for.' } }, - { id: 'c32-54', from: 32, to: 54, name: { zh: '轉化通道', en: 'Transformation' }, desc: { zh: '你有強烈的想要往上走的驅動力,會主動尋找能幫助你成長的人和機會,對哪個計畫會成哪個不會成有很準的直覺感。但這股驅動力容易讓你變成工作狂——成功要帶著人一起走才能走得長遠。', en: 'Driving ambition and material ascent.' } }, -] - -// Gate descriptive data -export interface ChartGate { - name: { zh: string; en: string } - center: string // chart center key (heart/solar, not ego/solarPlexus) - desc: { zh: string; en: string } -} - -export const HD_GATES: Record = { - 1: { name: { zh: '創意表達', en: 'The Creative' }, center: 'g', desc: { zh: '你就是那種「我要做自己」說得最理直氣壯的人。你的想法、你的創意、你看世界的角度,就是你跟別人最不一樣的地方。別人可能不懂你在做什麼,但等到成果出來,大家才發現你早就走在前面了。\n你的功課:把創意真正活出來,而不只是停在腦袋裡想。', en: 'The role of creativity: leading others through uniqueness.' } }, - 2: { name: { zh: '高我的方向感', en: 'The Receptive' }, center: 'g', desc: { zh: '你是那種會莫名「知道」資源在哪、方向在哪的人,像是內建了一個隱形的 GPS。你不一定能解釋為什麼,但你就是感覺得到什麼東西是對的、什麼資源是該用上的。\n你的功課:信任你那個說不清楚的「感覺」,它通常是對的。', en: 'Mastery of direction: knowing where you are headed.' } }, - 3: { name: { zh: '新開端', en: 'Ordering' }, center: 'sacral', desc: { zh: '你是那種最擅長把「爛攤子」整理好、重新開始的人。不管是一段新關係、新計畫還是新的人生階段,你都很懂得怎麼打底、建立基礎。但記住,種子種下去之後,得等它自己長,你急也急不來。\n你的功課:學會等待,把舊的怨氣先放下,新的東西才進得來。', en: 'The mutative force that births new order from chaos.' } }, - 4: { name: { zh: '解題達人', en: 'Formulization' }, center: 'ajna', desc: { zh: '你的腦袋就是一台停不下來的解題機器。朋友說個困擾,你馬上就有三個方案。但有時候,人家只是想找人聊聊,不一定真的要你出解法。\n你的功課:先問問「你需要我幫你想辦法,還是只是說說?」這一句話會讓你受益無窮。', en: 'The youthful formula: proposing possible answers.' } }, - 5: { name: { zh: '等待時機', en: 'Fixed Rhythms' }, center: 'sacral', desc: { zh: '你跟宇宙的時鐘是同步的,只要你耐得住性子。你有一種天生的節奏感,什麼時候該動、什麼時候該等,你的身體其實都知道,只是你的腦袋常常想提早開跑。\n你的功課:建立一些固定的生活習慣,讓自己跟上那個自然的節奏,別催自己。', en: 'The rhythm of waiting and the sense of ritual.' } }, - 6: { name: { zh: '親密關係的試金石', en: 'Friction' }, center: 'solar', desc: { zh: '你對親密關係的嗅覺特別靈敏,你天生就在測試——這個人值不值得讓我靠近?不是故意要挑剔,只是你需要先確認「門」開不開,才願意真正走進去。\n你的功課:讓連結自然發生,不用硬闖,也不用躲。', en: 'The regulating gate of intimate relationships.' } }, - 7: { name: { zh: '指引方向', en: 'The Role of Self' }, center: 'g', desc: { zh: '你身上有種領導的氣質,不是那種發號施令的,而是讓人「莫名就覺得跟著你沒問題」的那種。你能看到方向,也能帶大家往那走。但帶路不等於替人過生活,別忘了這個界線。\n你的功課:指出方向就好,讓別人自己走那條路。', en: 'Behind-the-scenes leadership and guidance.' } }, - 8: { name: { zh: '貢獻', en: 'Contribution' }, center: 'throat', desc: { zh: '你最怕閒著沒事做,一定要覺得自己有在貢獻什麼才踏實。你天生就是那種主動問「需要我幫忙嗎」的人,而且你的想法通常很有創意,幫了忙還能順帶帶動整個氣氛。\n你的功課:幫忙是你的天性,但記得「幫忙」跟「全部扛下來」是兩件事。', en: 'Showing uniqueness and inviting others to join.' } }, - 9: { name: { zh: '細節控', en: 'Focus' }, center: 'sacral', desc: { zh: '你是那種看合約會一行一行讀完的人,別人忽略的小細節,你都看得到。你不是在雞蛋裡挑骨頭,你只是真的覺得細節很重要——而且你通常是對的。\n你的功課:把你的細節力用在真正值得的事上,別為了不重要的小事鑽牛角尖。', en: 'Focus on details and patient perseverance.' } }, - 10: { name: { zh: '愛自己', en: 'Behavior of the Self' }, center: 'g', desc: { zh: '你來這裡,就是要做個「愛自己」的活生生示範。當你真的活出自己的樣子,不演給別人看、不配合別人期待,你的存在本身就會讓周圍的人鬆動、有所啟發。\n你的功課:忠於自己,不要因為別人的眼光就改變你走路的姿態。', en: 'Love for oneself and persistence in self-expression.' } }, - 11: { name: { zh: '各種點子的大富翁', en: 'Ideas' }, center: 'ajna', desc: { zh: '你的腦袋每天都有新想法進駐,而且這些想法都是為了讓大家更和諧、更好的那種。你對「一起比較好」這件事有天生的信仰,總是在想怎麼讓大家更團結。\n你的功課:想法很多很好,但先找到願意聽的人再分享,不然說得再精彩也白費。', en: 'Receiving and organizing inspiration.' } }, - 12: { name: { zh: '謹慎發言', en: 'Caution' }, center: 'throat', desc: { zh: '你說話很謹慎,常常想了很久才開口。有時候別人等得有點焦,但你說出來的東西,通常都是仔細考慮過的,很有分量。你心裡其實有很多話,只是你要確定「現在說對嗎」。\n你的功課:找到感覺對的時機說話,別逼自己配合別人的節奏開口。', en: 'The ability to speak at the right moment.' } }, - 13: { name: { zh: '默默蒐集故事', en: 'The Listener' }, center: 'g', desc: { zh: '你特別會聽人說話,而且是那種讓人「說著說著就把心裡話都講出來」的那種。你聽到的故事、秘密、人生經歷,在你這裡都被好好保存著,等待某天轉化成智慧。\n你的功課:聽別人說話是你的天賦,但也要有人聽你說,別把自己變成無底洞。', en: "The witness who holds others' stories in memory." } }, - 14: { name: { zh: '財富磁鐵', en: 'Power Skills' }, center: 'sacral', desc: { zh: '你身上有一種自然吸引資源的能量,不是說你天生財運好,而是你做事的方式很容易帶來豐盛的結果。重點是,你得把這些資源用對地方——用在你真正熱愛的事上面。\n你的功課:清楚自己真正想要什麼,財富才會流向對的方向。', en: 'The power to accumulate resources through work.' } }, - 15: { name: { zh: '擁抱各種人', en: 'Extremes' }, center: 'g', desc: { zh: '你天生對「人跟人之間的差異」有一種很高的包容度。你可以和各種不同背景的人相處,而且很自然。你的存在讓周圍的人感覺「做自己是被允許的」。\n你的功課:你的日常節奏可能跟別人不一樣,接受這件事,別替自己覺得奇怪。', en: 'Love for the full range of human behavior.' } }, - 16: { name: { zh: '熱情選手', en: 'Enthusiasm' }, center: 'throat', desc: { zh: '你有很強的鑑賞力,你能一眼看出什麼東西有潛力、什麼值得支持。而且你不只看,你還會大聲說出來,帶動大家一起燃起熱情。\n你的功課:你的熱情很有感染力,但注意別因為太投入就對別人期望過高。', en: 'Achieving mastery through practice and enthusiasm.' } }, - 17: { name: { zh: '觀點大師', en: 'Opinions' }, center: 'ajna', desc: { zh: '你的腦袋裡常常有很清晰的想法和意見,而且你能有條有理地說出來。你不只願意說,你也願意聽別人的反駁——因為你相信辯論是讓真相更清楚的方式。\n你的功課:有時候「我有個想法」比「我告訴你應該怎麼做」更容易讓人接受。', en: 'Logical observation and the formation of arguments.' } }, - 18: { name: { zh: '想把事情做更好', en: 'Correction' }, center: 'spleen', desc: { zh: '你天生就有一雙找問題的眼睛,不是要挑毛病,而是因為你相信「東西可以更好」。你對舊習慣、舊傳統很敏感,總是在想有沒有更進步的做法。\n你的功課:對自己寬容一點,你不用把每件事都修到完美,包括自己。', en: 'Keen sensitivity to imperfection and the drive to correct it.' } }, - 19: { name: { zh: '渴望連結', en: 'Wanting' }, center: 'root', desc: { zh: '你需要被需要,也需要去需要別人。聽起來有點繞,但就是這樣——你的幸福感跟「歸屬感」高度相關。你比別人更早感受到周圍的人需要什麼,常常在對方說出口之前你就懂了。\n你的功課:照顧別人之前,先確認自己的需求有沒有被照顧到。', en: 'A sensitive radar for fundamental needs.' } }, - 20: { name: { zh: '活在當下', en: 'The Now' }, center: 'throat', desc: { zh: '你最真實的力量,來自你能不能完全活在「這一刻」。不帶著昨天的遺憾,不掛念明天的計畫,就是現在、此刻、這裡。聽起來簡單,但你知道這其實是最難的修煉。\n你的功課:少想一點過去和未來,把注意力收回到現在正在發生的事。', en: 'Expression of this very present moment.' } }, - 21: { name: { zh: '掌控資源', en: 'The Hunter' }, center: 'heart', desc: { zh: '你對「誰管什麼、怎麼管」這件事很在意,因為你天生就有管理資源、掌控局面的能力。你不是控制狂,你只是清楚知道事情要怎麼跑才順。\n你的功課:學習放手讓別人也有控制權,合作比單打獨鬥更長遠。', en: 'Control over territory and resources.' } }, - 22: { name: { zh: '優雅開口', en: 'Grace' }, center: 'solar', desc: { zh: '你說話有一種時機感,你不是那種隨時隨地都要發表意見的人。你等到對的時刻,用對的方式說,說出來的話就特別有分量、特別動人。\n你的功課:情緒好的時候才分享,情緒不對的時候先等等,效果會差很多。', en: 'Open and graceful expression of emotions.' } }, - 23: { name: { zh: '說破舊觀念', en: 'Assimilation' }, center: 'throat', desc: { zh: '你說話常常讓人嚇一跳——不是因為你粗魯,而是你說的東西太直接、太新、太不按牌理出牌。你天生就是要打破舊思維、引進新觀念的那個人。\n你的功課:等到別人真的願意聽你說,再開口——你的話很有力,要用在對的時機。', en: 'Voicing insight at the right moment.' } }, - 24: { name: { zh: '反覆思考', en: 'Rationalization' }, center: 'ajna', desc: { zh: '你的腦袋有個特別的模式:同一件事你會想很多次,從不同角度想、想到出現新答案為止。旁人可能覺得「好了啦你想太多」,但你就是需要這個過程。\n你的功課:接受自己就是這樣運作的,別為了「想太多」而自責。', en: 'Returning again and again to a thought until understanding emerges.' } }, - 25: { name: { zh: '純粹之愛', en: 'Spirit of the Self' }, center: 'g', desc: { zh: '你對生命有一種很純粹、很乾淨的愛——不是那種浪漫的愛,而是一種「萬物皆可被愛」的感覺。你不太計較,你相信每個人都值得被善待。\n你的功課:這份純粹的愛是你最珍貴的東西,好好保護它,別讓它被消耗殆盡。', en: 'The purity of unconditional love.' } }, - 26: { name: { zh: '說服高手', en: 'The Egoist' }, center: 'heart', desc: { zh: '你天生就知道怎麼讓人聽進去你說的話。你不是在耍手段,你只是真的很懂怎麼把一件事說得讓人安心、讓人覺得「好像真的是這樣耶」。\n你的功課:用這份說服力去做對的事,別讓它變成你騙自己的工具。', en: 'The gift of persuasion and presentation.' } }, - 27: { name: { zh: '天生滋養者', en: 'Caring' }, center: 'sacral', desc: { zh: '你就是那種會在大家聚餐時自動多點一道菜、朋友難過時自動遞衛生紙的人。照顧別人對你來說很自然,幾乎是本能反應。\n你的功課:照顧人是你的天賦,但先照顧好自己,你才能持續給出這份溫暖。', en: 'Nurturing values and life itself.' } }, - 28: { name: { zh: '玩家', en: 'The Game Player' }, center: 'spleen', desc: { zh: '你把人生當成一場遊戲——不是說你不認真,而是你很清楚每場遊戲都有結束的那天,所以你想要活得盡興。你有種「來都來了,不如豁出去」的勇氣。\n你的功課:勇氣很好,但也要問問自己:這個冒險,有意義嗎?', en: 'The instinct to take risks in pursuit of meaning.' } }, - 29: { name: { zh: '什麼都說好', en: 'Saying Yes' }, center: 'sacral', desc: { zh: '你的嘴巴跟你的理智不一定同步,別人還沒說完你就點頭說「好」了。你喜歡投入、喜歡參與、喜歡承諾——但有時候這些「好」會把你累垮。\n你的功課:在說「好」之前,先停一秒問自己「我真的想做這件事嗎」。', en: 'The power of committing to an experience.' } }, - 30: { name: { zh: '情感的深水區', en: 'Feelings' }, center: 'solar', desc: { zh: '你對情緒的感受特別深刻,喜悅、渴望、失落——你都能感受到很完整。你不只是「有感覺」,你是那種會把感覺活得非常徹底的人。\n你的功課:感受力是你的禮物,別壓抑它,但也不用讓情緒把你淹沒。', en: 'The burning desire for and longing of experience.' } }, - 31: { name: { zh: '天然領袖', en: 'Influence' }, center: 'throat', desc: { zh: '你說話就是有種讓人想聽的質感,不是因為你說話大聲,而是你說的東西有邏輯、有方向感,讓人覺得「跟著這個人感覺不會走偏」。\n你的功課:等到別人邀請你說話,效果會比你主動「我來告訴你們」好得多。', en: 'The voice of the democratically chosen leader.' } }, - 32: { name: { zh: '只投入長遠', en: 'Continuity' }, center: 'spleen', desc: { zh: '你是個非常重視「這能不能持久」的人。你不喜歡短暫的東西,不管是工作、感情還是投資,你都想確認「這能走多遠」再決定投不投入。\n你的功課:穩定是你的強項,但別讓「害怕失敗」變成你不敢嘗試新事物的理由。', en: 'Recognizing what is worth preserving.' } }, - 33: { name: { zh: '收集故事的旅人', en: 'Privacy' }, center: 'throat', desc: { zh: '你就是那種「我曾經……」開頭講起來能講三個小時的人。你的人生經歷豐富,而且你特別懂得從這些經歷裡提煉出智慧。你需要定期從人群中抽身,閉關整理自己,然後再以更有力量的姿態回來。\n你的功課:知道什麼時候該退場休息,別把自己操壞了,充飽電才能繼續說好故事。', en: 'Distilling stories through retreat.' } }, - 34: { name: { zh: '我靠自己', en: 'Power' }, center: 'sacral', desc: { zh: '你身上有一種純粹的力量,不靠別人、完全從自己來的那種。你投入一件事的時候,爆發力驚人,存在感超強,整個場子的能量都會因為你的出現而提升。\n你的功課:這股力量很強大,別把它浪費在不值得的事情上,先確認方向對了再全力衝。', en: 'A pure burst of energy in the present moment.' } }, - 35: { name: { zh: '什麼都想試試', en: 'Change' }, center: 'throat', desc: { zh: '你是天生的體驗主義者,你想把人生每種滋味都嚐一遍。工作、感情、旅行、生活方式——你都想親身感受,而不是只聽別人說。你的故事多、閱歷豐,是朋友圈裡最有話題的那個人。\n你的功課:體驗很好,但挑對時機再投入,期望越高的地方,失望也容易越大。', en: 'The jack-of-all-trades who seeks to experience everything.' } }, - 36: { name: { zh: '情緒轉化大師', en: 'Crisis' }, center: 'solar', desc: { zh: '你的人生不缺戲劇性,各種情緒高潮低潮你都經歷過。但正因為你走過那些坑,你才有能力幫別人找到出路。你是那種「我懂那種感覺」說出來最有說服力的人。\n你的功課:要從情緒裡走出來,而不是一直待在裡面。你的功能是引導,不是陪人一起困住。', en: 'Growing through new experiences and crisis.' } }, - 37: { name: { zh: '家庭黏著劑', en: 'Friendship' }, center: 'solar', desc: { zh: '你天生就是把大家凝聚在一起的那個人。一頓飯、一個擁抱、一個溫暖的眼神——你就是這樣把關係牢牢黏住的。對你來說,「大家好才是真的好」不是口號,是你真實的生活態度。\n你的功課:照顧別人是你的天賦,但先確認彼此的承諾是對等的,別讓自己一直付出卻換來理所當然。', en: 'The warmth of tribal bargains and bonds.' } }, - 38: { name: { zh: '天生反骨', en: 'The Fighter' }, center: 'root', desc: { zh: '你看到不公平、不合理的事情,就是會忍不住站出來說話。你天生對「強權」很敏感,有種為弱勢發聲的衝動。你的戰鬥力很強,但有時候也會不小心為了吵架而吵架。\n你的功課:選擇值得你戰鬥的戰場,不然可能花了一輩子精力,卻搞不清楚自己在為什麼而戰。', en: 'The determination to fight for what is meaningful.' } }, - 39: { name: { zh: '天生愛挑釁', en: 'Provocation' }, center: 'root', desc: { zh: '你的存在就會讓人「有反應」,不管你想不想。你喜歡試探、喜歡逗弄,看看能從別人那裡激發出什麼。你就像一根能讓人驚醒的棍子,戳對了地方,能讓沉睡的人活過來。\n你的功課:你的挑釁力道很猛,要懂得選時機,不然對方還沒被激活,就先被嚇跑了。', en: 'Stirring emotions in search of clarity.' } }, - 40: { name: { zh: '做完事要放鬆', en: 'Aloneness' }, center: 'heart', desc: { zh: '你意志力很強,答應的事一定做到,而且做得很好。但你同時也需要大量的獨處時間來恢復能量——不是因為你內向,而是你的電池就是這樣充的。\n你的功課:做完事、付出之後,要學會跟別人說「我需要一個人待一下」,這不是自私,這是必要。', en: 'The balance between work and time alone.' } }, - 41: { name: { zh: '想像力超豐富', en: 'Contraction' }, center: 'root', desc: { zh: '你的腦袋就是一部電影製作機,不斷產出各種畫面、故事和可能性。你的幻想超真實,有時候連你自己都會信以為真。你是那種能把普通的事情說得精彩萬分的人。\n你的功課:想像力是天賦,但要放在可以實現的目標上,別讓自己活在一個沒有出口的幻想世界裡。', en: 'The starting point for imagining all possibilities.' } }, - 42: { name: { zh: '有頭有尾', en: 'Growth' }, center: 'sacral', desc: { zh: '你相信「種什麼就收什麼」,所以你做事很認真,也很在意付出有沒有得到應有的回報。你特別擅長幫別人把事情做完整、做到收尾,是個很好的合作夥伴。\n你的功課:不要什麼都自己扛,量力而為,一次做好一件事比同時做很多件半吊子的事更有意義。', en: 'The energy to complete a cycle.' } }, - 43: { name: { zh: '突然就懂了', en: 'Insight' }, center: 'ajna', desc: { zh: '你的洞見很特別,常常是一種「突然就想通了」的感覺,說不清楚從哪來,但就是很確定。問題是你很清楚,但說出來別人不一定聽得懂,因為你想到的東西往往超前了大家一截。\n你的功課:等到對的時機再說出你的洞見,說早了沒人懂,說對了時機就會有人說「對!就是這樣!」', en: 'Sudden flashes of individual understanding.' } }, - 44: { name: { zh: '偵測趨勢的天線', en: 'Alertness' }, center: 'spleen', desc: { zh: '你對「模式」特別敏感——什麼事情在重複、什麼趨勢要來了、什麼行為背後有隱藏的問題——你都能聞出來。這個本能可以用在商業、人際關係,或是任何需要看出規律的地方。\n你的功課:你是個警報器,負責發出訊號,但不用每個警報都親自去處理,引導別人去行動就好。', en: 'Memory of people and intuitive judgment of others.' } }, - 45: { name: { zh: '帶領大家走向豐盛', en: 'The Gatherer' }, center: 'throat', desc: { zh: '你有一種自然的影響力,能帶著一群人朝同一個方向走。你關心大家有沒有足夠的資源、有沒有被照顧好,這不是管太多,這就是你天生的領導方式。\n你的功課:帶領是你的天賦,但要帶真正需要你帶的人,不是每個人都適合跟著你,也不是每個群體都值得你付出。', en: 'The tribal king and integrator of resources.' } }, - 46: { name: { zh: '運氣其實是準備好了',en: 'Love of the Body' }, center: 'g', desc: { zh: '你常常在「不對的時間找對的東西」,但最後都找到意外的好東西。這不是單純的好運,而是你的心態讓你隨時對美好的事物保持開放,機會才能進來。\n你的功課:放下執著,別執著一定要找到什麼,反而有時候放鬆了,更好的東西自己就來了。', en: 'Dedication to the experience of the body.' } }, - 47: { name: { zh: '答案會自己來', en: 'Realization' }, center: 'ajna', desc: { zh: '你的腦袋裡常常有很多還沒解開的謎題,那種「想了很久、還沒想通」的感覺你很熟悉。但有意思的是,你的答案常常不是「想」出來的,而是在某個放鬆的瞬間突然就出現了。\n你的功課:不要強迫自己想出答案,放輕鬆,靈感通常在你不刻意追的時候才會來找你。', en: 'Extracting insight from chaos.' } }, - 48: { name: { zh: '深不見底的智慧之井',en: 'Depth' }, center: 'spleen', desc: { zh: '你是個有深度的人,你對事情的理解常常比別人深很多層。人們喜歡來找你,因為你能提供別處找不到的洞見。但你有時候會擔心自己「懂的不夠多」——其實你的深度已經夠了。\n你的功課:停止等到「準備好了」再分享,你現在知道的,就已經是別人需要的了。', en: 'The source and foundation of deep talent.' } }, - 49: { name: { zh: '堅守底線的改革者', en: 'Principles' }, center: 'solar', desc: { zh: '你對「對的事情」很有感覺,一旦感覺不對,你說「不」的速度比誰都快。你不是在挑剔,你只是有明確的人道主義原則,不符合的你就是沒辦法接受。\n你的功課:你的底線是值得尊重的,但偶爾也要問自己——是真的不對,還是還沒到你想要的那樣?', en: 'Revolutionary sensitivity to tribal principles and contracts.' } }, - 50: { name: { zh: '價值觀的守護者', en: 'Values' }, center: 'spleen', desc: { zh: '你對「什麼是對的、什麼是重要的」有非常強烈的感受,而且你希望自己做的每一件事都和這些價值觀一致。公平、誠信、對大家好——這些不是你掛在嘴上說的,是你活出來的。\n你的功課:別讓外界的期待把你的責任感壓垮,你不用扛起所有人的道德重量。', en: 'The custodian of tribal values and laws.' } }, - 51: { name: { zh: '給人驚嚇', en: 'Shock' }, center: 'heart', desc: { zh: '你的言行有時會讓人大吃一驚,但往往就是這個「驚嚇」讓人清醒過來,開始改變。你就是那種說出一句話讓全場安靜、然後大家開始認真思考的人。\n你的功課:電光石火的能量很強,選好時機用,效果最大,不然嚇到的人還沒醒,關係就先破裂了。', en: 'Awakening others through surprise and shock.' } }, - 52: { name: { zh: '安靜如山', en: 'Stillness' }, center: 'root', desc: { zh: '就算外面再亂,你有一種能讓自己靜下來的能力,像一座山一樣——不動如山那種。這種安定感讓周圍的人光是靠近你,就覺得踏實很多。\n你的功課:你的靜也需要空間,找到讓你真正能做喜歡的事、進入心流狀態的方式,那才是你最充電的時刻。', en: 'The energy of stillness and focus on the task at hand.' } }, - 53: { name: { zh: '永遠在起跑線上', en: 'Beginnings' }, center: 'root', desc: { zh: '你最擅長「開始」,任何新計畫、新嘗試、新連結,你都能帶起一股新鮮的能量推動大家起頭。但起頭之後要維持下去,對你來說就比較困難了——這沒什麼問題,起跑本來就是一種天賦。\n你的功課:接受自己是「開端型」的人,找到能接力的夥伴,你負責點火,別人負責燒下去。', en: 'The pressure that initiates new cycles.' } }, - 54: { name: { zh: '野心勃勃', en: 'Ambition' }, center: 'root', desc: { zh: '你有很強烈的「想往上走」的欲望——不只是物質上,心靈上、社會地位上也一樣。你擅長建立有用的連結、尋找能幫助你前進的盟友,而且你清楚知道欲望本身就是你最大的動力。\n你的功課:野心是好的,但不要同時追太多目標,有時候貪多嚼不爛,先把眼前一件事做好更重要。', en: 'The drive to ascend materially and spiritually.' } }, - 55: { name: { zh: '情緒豐盛的靈魂', en: 'Abundance' }, center: 'solar', desc: { zh: '你的情緒世界非常飽滿,高興起來可以整個人都在發光,低落的時候也是低到讓旁人擔心。這兩種狀態都是真實的你,而且你的創造力往往在情緒最深的時候,迸發出最亮的光。\n你的功課:尊重自己的情緒起伏,找到你自己的節奏,音樂、獨處都是你最好的朋友。', en: 'The emotional sense of abundance or lack.' } }, - 56: { name: { zh: '說故事', en: 'Stimulation' }, center: 'throat', desc: { zh: '你有一種把生活中的細節說成有趣故事的天賦,你對人生意義的觀察很獨到,說出來的東西常常讓人會心一笑、又覺得有點道理。你是人群裡最有趣的那個講者。\n你的功課:你分享的是觀點,不是真理,別要求大家都認同你,讓對的人自然被你吸引就好。', en: 'Stimulating others through storytelling.' } }, - 57: { name: { zh: '瞬間直覺', en: 'Intuitive Clarity' }, center: 'spleen', desc: { zh: '你有一種很細膩的直覺,就像一陣風悄悄告訴你「這不太對」或「這個人可以信任」。這份直覺很真實,只是你有時候不確定要不要相信它。\n你的功課:相信那個第一秒的感覺,它通常比你想了三天之後的結論更準。', en: 'The deepest intuitive insight of the present moment.' } }, - 58: { name: { zh: '天生充電寶', en: 'Vitality' }, center: 'root', desc: { zh: '你的活力和對生命的熱情是真實的,不是裝出來的。你就是那種走進房間,整個氣氛都會亮起來的人。你相信事情可以更好,這份相信本身就已經讓旁邊的人感覺好多了。\n你的功課:不是每個場合都需要你的能量,選擇你真心想投入的地方,別把自己散得到處都是。', en: 'The joy of improvement and vitality.' } }, - 59: { name: { zh: '建立親密連結', en: 'Sexuality' }, center: 'sacral', desc: { zh: '你天生會發出某種「靠近我吧」的訊號,讓人感覺想跟你親近。不管是工作上的合作還是私下的感情,你都有能力迅速拉近距離、打破隔閡。\n你的功課:親密感是你的天賦,但讓連結自然發生,不要每次都主動出擊,等對方也準備好了再走近。', en: 'The reproductive power to break down barriers between people.' } }, - 60: { name: { zh: '在限制裡找出路', en: 'Limitation' }, center: 'root', desc: { zh: '你比任何人都懂得「就這樣」的生活哲學——不是認命,而是你有本事把手上的牌打到最好。你不跟現實硬幹,你找縫隙、找可能,在規則裡找到屬於自己的空間。\n你的功課:接受「有些限制無法突破」這件事,反而能讓你把能量用在真正可以改變的地方。', en: 'Cultivating mutation within limitation.' } }, - 61: { name: { zh: '熱愛思考宇宙謎題', en: 'Inner Truth' }, center: 'head', desc: { zh: '「為什麼」是你最常問的問題。你對生命的意義、宇宙的運作方式、人存在的原因,充滿了好奇。你的頭腦喜歡去那些大部分人懶得想的地方探索。\n你的功課:真理不是靠不斷追問「想」出來的,有時候放空、放鬆,答案反而會自己冒出來找你。', en: 'The mysterious pressure to explore the unknown.' } }, - 62: { name: { zh: '把複雜說清楚', en: 'Details' }, center: 'throat', desc: { zh: '你最厲害的地方,就是能把很複雜的東西整理成清楚、有條理的資訊,讓別人一聽就懂。你重視細節、重視事實,說話有根有據,很有說服力。\n你的功課:細節固然重要,但有時候說太多會讓人抓不到重點,試著先說結論,再補細節。', en: 'Naming things precisely with language.' } }, - 63: { name: { zh: '懷疑一切', en: 'Doubt' }, center: 'head', desc: { zh: '你是天生的質疑者,「這樣真的對嗎?」「有沒有更好的辦法?」是你腦袋裡常常跑出來的問題。你不是故意難搞,你只是習慣先懷疑,確認沒問題之後才放心。\n你的功課:懷疑是好工具,但別讓它變成你什麼都無法相信的障礙,有些事可以先試了再確認。', en: 'The logical starting point: reasonable doubt.' } }, - 64: { name: { zh: '腦子裡永遠有很多畫面',en: 'Confusion' }, center: 'head', desc: { zh: '你的頭腦就像一個不停播放的電影院,各種畫面、可能性、想法輪番上陣。你常常感覺靈感來了,但又說不清楚它意味著什麼。沒關係,你的工作不是把它全部解開,而是成為那個在混沌裡保持好奇的人。\n你的功課:接受腦袋不一定能理解所有的事,讓內在的指引來帶路,而不是讓腦袋一直轉。', en: 'Reflecting on the past to piece together meaning.' } }, -} - -// Center descriptive data -export interface ChartCenter { - id: string - name: { zh: string; en: string } - type: { zh: string; en: string } - color: string - summary: { zh: string; en: string } - description: { zh: string; en: string } - definedContent: { zh: string; en: string } - openContent: { zh: string; en: string } - gates: number[] - keywords: { zh: string[]; en: string[] } -} - -export const HD_CENTERS_INFO: Record = { - head: { - id: 'head', - name: { zh: '頭腦中心', en: 'Head Center' }, - type: { zh: '靈感中心', en: 'Pressure Center' }, - color: 'mustard', - summary: { zh: '靈感的接收天線,驅動你不斷追問的壓力源頭。', en: 'The source of inspiration, questions, and mental pressure.' }, - description: { zh: '頭頂中心在人類圖的最頂端,是靈感的來源地。它就像一根天線,負責從外頭接收靈感和各種「突然想通了!」的瞬間。真理、懷疑、天馬行空的念頭,都是從這裡冒出來的。', en: 'The Head Center sits at the top and acts like an antenna, receiving inspiration, sudden insights, and existential questions. It pushes the Ajna downward with pressure to think and find answers.' }, - definedContent: { zh: '你是個靈感製造機!腦袋裡永遠在轉,想法一個接一個,而且你有辦法啟發身邊的人一起動腦。不過要小心——想法太多,有時候會讓自己壓力爆表,甚至覺得要把每個靈感都實現才行。其實不是每個靈感都值得追,學會篩選,才是真正厲害的地方。', en: 'You are an inspiration machine — ideas constantly flow in. You have the ability to spark curiosity in others. But watch out: too many ideas can become overwhelming pressure. Not every inspiration needs to be pursued; learning to filter is your real superpower.' }, - openContent: { zh: '你對各種想法都很開放,走進哪個圈子就能被那個環境啟發,博物館、電影院、跟聰明人喝咖啡,都能讓你靈感大爆發。但這也是個小陷阱——你可能會不小心把別人的問題當成自己的在煩惱,忙了半天,解決的其實是別人的人生課題。下次腦袋轉不停的時候,先問問自己:「這是我的問題,還是我在替別人煩惱?」', en: "You are highly open to all kinds of ideas. Any environment can spark inspiration in you. But the trap is absorbing others' questions and worrying about problems that aren't yours. When your mind won't stop, ask: \"Is this my question, or am I solving someone else's life?\"" }, - gates: [64, 61, 63], - keywords: { zh: ['靈感', '壓力', '提問', '想像'], en: ['Inspiration', 'Pressure', 'Questioning', 'Imagination'] }, - }, - ajna: { - id: 'ajna', - name: { zh: '邏輯中心', en: 'Ajna Center' }, - type: { zh: '覺察中心', en: 'Awareness Center' }, - color: 'olive', - summary: { zh: '分析、思考與概念建構的腦袋運作中樞。', en: 'The hub of conceptualization, analysis, and meaning-making.' }, - description: { zh: '邏輯中心負責把接收到的靈感不斷過濾、消化、拆解,試著搞清楚「這到底是什麼意思」。邏輯中心就是「腦袋轉不停」的來源地,過去、現在、未來都想串在一起。', en: 'The Ajna organizes inspiration into thoughts, concepts, and beliefs. It constantly filters, digests, and deconstructs incoming information, trying to make sense of everything.' }, - definedContent: { zh: '你有固定的思考模式,做事條理分明,很適合做需要動腦的工作。但問題是,你的腦袋幾乎沒有休息的時候,甚至會拿一些根本還沒發生的事來煩惱——「萬一這樣怎麼辦?萬一那樣又怎麼辦?」那些事還沒發生耶。試試靜坐或冥想,讓腦袋稍微喘口氣,你會更清醒。', en: 'You have consistent thinking patterns and work methodically. But your brain almost never fully shuts off — you worry about things that haven\'t happened yet. Try meditation to give your mind breathing room. You\'ll think even more clearly when you do.' }, - openContent: { zh: '你比較沒有固定的思考框架,反而能看到更多可能性,常常讓別人驚訝:「你怎麼知道我在想什麼!」這是你的超能力,因為你很能感受別人的思維。但也因為太開放,容易分心、健忘,記事本真的很重要。(愛因斯坦也是邏輯中心開放,所以你在很好的同伴裡。)', en: "You have no fixed thinking framework, which lets you see more possibilities. Others often wonder how you know what they're thinking — that's your gift. But this openness can make you scattered and forgetful. A notebook is your best friend." }, - gates: [47, 24, 4, 17, 43, 11], - keywords: { zh: ['思考', '理解', '概念', '邏輯'], en: ['Thinking', 'Understanding', 'Concepts', 'Logic'] }, - }, - throat: { - id: 'throat', - name: { zh: '喉嚨中心', en: 'Throat Center' }, - type: { zh: '表達 · 行動', en: 'Manifestation' }, - color: 'tan', - summary: { zh: '說出來、做出來——把內在轉化為語言與行動的出口。', en: 'The crucial gateway that transforms inner life into language and action.' }, - description: { zh: '喉嚨中心是整個人類圖裡的「表達樞紐」。所有中心最終都想透過這裡發聲——不管是你的想法、情緒、還是行動力,都想借喉嚨說出來、表現出來。', en: 'The Throat is the central hub of expression in Human Design. Every center ultimately wants to speak through it — whether thoughts, emotions, or actions, all seek to be voiced and manifested here.' }, - definedContent: { zh: '你表達能力很穩定,有自己的節奏和風格。你很會說故事,也很適合領導、教學、或任何需要「讓人聽進去」的工作。不過要注意,你的喉嚨像個出口,很多話想說出去,有時候可能說得太多反而失去重點。', en: 'Your expression is consistent — you have your own rhythm and style. You are great at storytelling and suited for leadership or teaching. Just watch out for saying too much and losing the point.' }, - openContent: { zh: '你不是不會講話,而是需要對的氛圍和對象。一旦碰到有定義的人,話匣子可能就開了,而且停不下來!但要留意:有時候話說出口,前後可能不太一致,因為你的表達方式很受當下的人和環境影響。這不是你的問題,這是你的設計。', en: "You speak best with the right people in the right atmosphere. With a defined-Throat person nearby, you might not be able to stop talking. Just know: your expression shifts with your environment — inconsistency isn't a flaw, it's your design." }, - gates: [62, 23, 56, 35, 12, 45, 33, 8, 31, 16, 20], - keywords: { zh: ['表達', '顯化', '行動', '聲音'], en: ['Expression', 'Manifestation', 'Action', 'Voice'] }, - }, - g: { - id: 'g', - name: { zh: 'G 中心', en: 'Identity / G Center' }, - type: { zh: '身份與方向', en: 'Identity & Direction' }, - color: 'mustard', - summary: { zh: '身份認同、人生方向與愛的內在羅盤。', en: 'The compass of love, direction, and identity.' }, - description: { zh: '自我定位中心是關於「我是誰」以及「我要往哪裡去」的中心。愛的能量、方向感、跟靈性的連結,都在這裡。它是一個菱形,位在人類圖的中間偏上方。', en: 'The G Center is about "who am I" and "where am I going." Love, direction, and spiritual connection all live here. It is the diamond-shaped center in the upper-middle of the bodygraph.' }, - definedContent: { zh: '你很清楚自己是誰,目標感強,不容易被旁人帶偏。你的人生方向很穩定,而且一旦找到自己的路,就能走得非常堅定。唯一要注意的是,你可能太想幫別人指路,結果自己分心了。', en: 'You know who you are and have a strong sense of direction. Once you find your path, you walk it with conviction. Just watch out for getting so focused on guiding others that you lose your own focus.' }, - openContent: { zh: '你非常有彈性,能適應不同的人和環境,有很強的同理心。但也因為沒有固定的「自我方向感」,容易受身邊的人影響。如果跟到一個很有方向感的夥伴,你會跟著一起飛;但如果身邊都是迷路的人,你可能也會跟著打轉。慎選你的圈子,真的很重要。', en: 'You are highly adaptable with strong empathy. But without a fixed sense of direction, you absorb the identity and direction of those around you. With a grounded partner you soar; with lost ones you drift. Choosing your environment and circle is essential.' }, - gates: [7, 1, 13, 25, 46, 2, 15, 10], - keywords: { zh: ['方向', '愛', '身份', '磁場'], en: ['Direction', 'Love', 'Identity', 'Magnetic Field'] }, - }, - heart: { - id: 'heart', - name: { zh: '意志力中心', en: 'Heart / Will' }, - type: { zh: '能量中心', en: 'Motor Center' }, - color: 'crimson', - summary: { zh: '意志力、承諾與物質追求的驅動引擎。', en: 'The small but powerful engine of willpower, courage, and commitment.' }, - description: { zh: '心臟中心負責的是意志力和自我意識,也和物質世界的追求有關——財富、名望、成就感,都是這裡在驅動。', en: 'The Heart Center is about willpower, self-worth, and the drive for material achievement — wealth, recognition, and accomplishment all originate here.' }, - definedContent: { zh: '你意志力超強,一旦決定要做,很少有人攔得住你。你天生就有一股「我就是要搞定它」的氣場,讓人信服。但也要學著讓自己「放鬆一下」,因為你很容易親力親為,而且對別人的效率沒耐心,很想自己來。慢下來,讓別人有追上你的機會。', en: "Once you decide to do something, almost nothing stops you. You carry a compelling \"I will get it done\" energy. But learn to rest — you tend to do everything yourself and have little patience for others' pace. Slow down and let others catch up." }, - openContent: { zh: '大部分的人都是這樣!意志力不是你的強項,這不代表你沒能力,只是你做事可能比較難持之以恆。最大的陷阱是:很容易被身邊意志力強的人「激勵」,然後跟著做一些超出自己負荷的承諾,最後搞得很累又後悔。記得,你不需要證明什麼。', en: "Most people have an open Heart. Sustained willpower isn't your strength — and that's fine. The trap is getting swept up by someone else's drive and over-committing. You have nothing to prove to anyone." }, - gates: [21, 40, 26, 51], - keywords: { zh: ['意志', '承諾', '價值', '勇氣'], en: ['Willpower', 'Commitment', 'Value', 'Courage'] }, - }, - spleen: { - id: 'spleen', - name: { zh: '脾中心', en: 'Spleen' }, - type: { zh: '覺察中心 · 即時', en: 'Awareness · Intuitive' }, - color: 'tan', - summary: { zh: '瞬時的生存直覺、健康本能與安全感偵測器。', en: 'Present-moment intuition, health, and survival instinct.' }, - description: { zh: '脾中心是生存本能的中心,它像一套內建雷達,隨時在掃描周圍的環境,幫你判斷哪些東西安不安全、對不對勁。它不靠邏輯,純粹靠本能,反應極快。', en: "The Spleen is the center of survival instinct — a built-in radar constantly scanning the environment for what's safe and what isn't. It operates purely on instinct, not logic, and reacts in an instant." }, - definedContent: { zh: '你有很強的直覺力,而且那個直覺幾乎都是對的——只是它只說一次,不重複。你走進一家餐廳,可能瞬間就知道今天要不要留下來;見到一個人,幾秒內就有感覺。這個警報器很珍貴,要相信它。你身體的免疫系統通常也比較強。', en: 'Your intuition is strong and reliable — it just speaks once and never repeats. You can walk into a place and instantly know whether to stay. This inner alarm is precious. Trust it. Your immune system tends to be robust too.' }, - openContent: { zh: '你容易被別人的恐懼或不安感染,有時候會莫名地緊張,其實那不是你的感受,是你吸收了旁邊的人。你對靈性的感應力很敏銳,但也因為沒有穩定的「內建雷達」,對某些情況的判斷會比較猶豫。對外來刺激可能也比較敏感,可以留意這一點。', en: "You easily absorb others' fears and anxieties — that vague unease you feel is often not yours. You're highly sensitive to spiritual and energetic states. Without a stable built-in radar, you may hesitate in some judgments. You may also be more sensitive to external stimuli." }, - gates: [48, 57, 44, 50, 32, 28, 18], - keywords: { zh: ['直覺', '當下', '本能', '健康'], en: ['Intuition', 'Present', 'Instinct', 'Health'] }, - }, - sacral: { - id: 'sacral', - name: { zh: '薦骨中心', en: 'Sacral' }, - type: { zh: '能量中心', en: 'Motor Center' }, - color: 'crimson', - summary: { zh: '生命力、創造力與持續工作能量的引擎。', en: 'The engine of life force, work capacity, and response.' }, - description: { zh: '薦骨中心大約有70%的人是有定義的,是人類圖裡最重要的能量來源之一,也是「生產者」類型的核心。它像一台發電機,給你源源不絕的動力去做、去創造。', en: 'About 70% of people have a defined Sacral. It is one of the most powerful energy sources in Human Design and the core of the Generator type — a generator that gives you endless motivation to do and create.' }, - definedContent: { zh: '你就是那種能把事情做完的人,不管是工作還是生活,都有用不完的勁。你的直覺反應也很可靠——當薦骨說「好」,你會感覺到內心有股力量往前推;當它說「不」,你會莫名覺得哪裡怪怪的。學會聽這個信號,是你這輩子最值得學的功課。', en: 'You are someone who gets things done — in work and life, your energy seems endless. Your gut response is highly reliable: a "yes" feels like a push forward; a "no" feels subtly off. Learning to listen to this signal is your most important life skill.' }, - openContent: { zh: '你的能量有點像手機電池,不像別人那樣可以一直充電一直用。你更適合短跑而不是馬拉松,工作的方式建議不要硬撐,懂得找人幫忙、分工合作才是王道。你的厲害在於:你可以客觀地看出別人能量用在哪裡最值,然後幫大家導流。', en: "Your energy is more like a phone battery than a power plant — finite, not sustainable all day. You're built for sprints, not marathons. Learning to delegate and collaborate is your wisdom. Your gift: you can objectively see where others' energy is best spent." }, - gates: [5, 14, 29, 59, 9, 3, 42, 27, 34], - keywords: { zh: ['回應', '生命力', '工作', '繁衍'], en: ['Response', 'Life Force', 'Work', 'Reproduction'] }, - }, - solar: { - id: 'solar', - name: { zh: '情緒中心', en: 'Solar Plexus' }, - type: { zh: '能量中心 · 覺察', en: 'Motor · Awareness' }, - color: 'tan', - summary: { zh: '情緒波動、感受敏銳與情感清明的能量中心。', en: 'The source of emotional waves, sensitivity, and emotional truth.' }, - description: { zh: '情緒中心是九大中心裡影響力最大的一個,它像海浪一樣,有高有低,不停起伏。它同時是「覺察中心」也是「動力中心」,情緒不只是感受,它還有推動力。', en: 'The Solar Plexus is the most influential of the nine centers. Like ocean waves, it rises and falls constantly. It is both an awareness center and a motor — emotions are not just feelings, they carry driving force.' }, - definedContent: { zh: '你的情緒就像浪潮,一波接一波。你常常上一秒開心到飛起來,下一秒又不知道為什麼低落。這不是你的毛病,這是你的設計。最重要的原則就是:情緒高漲的時候,不要做重大決定。等浪潮平靜下來再說,你的判斷才會清晰。你的情緒也有很強的感染力,你開心的話周圍的人都會跟著輕鬆,你悶的話整個空間的氣氛也會跟著沉。', en: 'Your emotions move like tides. One moment soaring, next moment inexplicably low — this is your design, not a flaw. The golden rule: never make important decisions when emotions are high. Wait for the wave to settle. Your emotional state is highly contagious; when you\'re light, others lift too.' }, - openContent: { zh: '你不是沒感情,只是你的情緒大多來自「吸收」了別人的感受。獨處的時候,你通常很平靜;一旦進入人群,你可能馬上被旁邊那個人的焦慮或興奮給帶走。學著區分「這是我的情緒,還是別人的?」是你的必修課。', en: "You're not emotionless — you just tend to absorb others' feelings. Alone, you're usually calm. In a crowd, you quickly catch whoever's anxiety or excitement is nearby. Learning to ask \"Is this my emotion or someone else's?\" is your essential practice." }, - gates: [36, 22, 37, 6, 49, 55, 30], - keywords: { zh: ['情緒', '波', '清明', '感受'], en: ['Emotions', 'Wave', 'Clarity', 'Feelings'] }, - }, - root: { - id: 'root', - name: { zh: '根部中心', en: 'Root' }, - type: { zh: '能量中心 · 壓力', en: 'Motor · Pressure' }, - color: 'tan', - summary: { zh: '腎上腺素驅動的行動壓力與生存節奏。', en: 'The foundation of adrenaline-driven momentum and survival pressure.' }, - description: { zh: '根中心在人類圖最下方,是壓力中心之一,它儲存的是腎上腺素,讓你有動力去「動起來」、去面對截止日期、去完成事情。', en: 'The Root Center sits at the bottom of the bodygraph. It is a pressure center that stores adrenaline — driving you to act, meet deadlines, and get things done.' }, - definedContent: { zh: '你是那種「壓力越大、越有勁」的人,天生就能在混亂中找到節奏。就算身邊一片兵荒馬亂,你還是能穩穩處理。但要小心的是,你容易腎上腺素飆高就衝進去,有時候沒評估清楚就行動,反而造成失衡。你腳下可能一直在打節拍,那是腎上腺素在叫你動的信號。', en: "You thrive under pressure — the more chaotic, the more grounded you feel. You can handle a crisis others would flee from. But watch out: adrenaline rushes can push you into action before you've fully assessed the situation. That restless energy in your legs? That's your signal to move." }, - openContent: { zh: '你一個人的時候很放鬆,什麼事都不能逼你;但一旦有人施壓、趕截止日期,你就容易被推著走,然後壓力大到喘不過氣。你做事的節奏是「等到感覺對了才動」,旁人可能覺得你在拖,但其實那就是你的方式。對自己好一點,別讓別人的急迫感變成你的壓力。', en: "Alone, you're completely at ease. But add external pressure or a deadline and you can quickly get swept into overwhelm. Your natural rhythm is \"move when it feels right.\" Others may see this as procrastination — but it's your design. Don't let others' urgency become your stress." }, - gates: [53, 60, 52, 19, 39, 41, 58, 38, 54], - keywords: { zh: ['壓力', '驅動', '節奏', '腎上腺'], en: ['Pressure', 'Drive', 'Rhythm', 'Adrenaline'] }, - }, -} diff --git a/mobile/lib/hd-normalizers.ts b/mobile/lib/hd-normalizers.ts index 0fbc900..354b76e 100644 --- a/mobile/lib/hd-normalizers.ts +++ b/mobile/lib/hd-normalizers.ts @@ -1,4 +1,4 @@ -import { HD_CHANNELS, type ChartChannel } from '@/lib/hd-chart-data' +import { HD_CHANNELS, type ChartChannel } from '@shared/humanDesign/hd-chart-data' // lib uses 'ego' / 'solarPlexus'; hd-chart-data uses 'heart' / 'solar' const LIB_TO_CHART: Record = { diff --git a/mobile/lib/hd-sheet-builders.ts b/mobile/lib/hd-sheet-builders.ts index ff62686..fe10936 100644 --- a/mobile/lib/hd-sheet-builders.ts +++ b/mobile/lib/hd-sheet-builders.ts @@ -3,14 +3,14 @@ import { HD_CHANNELS, HD_GATES, type ChartChannel, -} from '@/lib/hd-chart-data' +} from '@shared/humanDesign/hd-chart-data' import { HD_TYPE_CONTENT, HD_AUTHORITY_CONTENT, HD_PROFILE_CONTENT, HD_DEFINITION_CONTENT, -} from '@/lib/hd-summary-data' -import { HD_CROSS_CONTENT } from '@/lib/hd-cross-data' +} from '@shared/humanDesign/hd-summary-data' +import { HD_CROSS_CONTENT } from '@shared/humanDesign/hd-cross-data' import { centerZh } from '@/lib/hd-normalizers' export interface SheetContent { diff --git a/mobile/lib/useChartDetail.ts b/mobile/lib/useChartDetail.ts new file mode 100644 index 0000000..20b9c27 --- /dev/null +++ b/mobile/lib/useChartDetail.ts @@ -0,0 +1,247 @@ +import { useAuth } from '@clerk/expo' +import { useEffect, useRef, useState } from 'react' +import { + type Chart, + type CreateCompositeResult, + type CreateTransitResult, + getChart, + previewCompositeChart, + previewTransitChart, + isCompositeChart, + isLegacyPipeComposite, +} from '@/lib/api' + +export type TransitSnapshot = NonNullable['transitSnapshot']> + +/** 把 previewTransitChart 回傳的巢狀結果轉成 chart.meta.transitSnapshot 的扁平格式 */ +function toTransitSnapshot(r: CreateTransitResult): TransitSnapshot { + return { + computedAt: r.transit.computedAt, + planets: r.transit.planets, + allGates: r.transit.allGates, + definedCenterIds: r.transit.definedCenterIds, + definedChannels: r.transit.definedChannels, + combinedDefinedCenterIds: r.combined.definedCenterIds, + combinedDefinedChannelIds: r.combined.definedChannelIds, + } +} + +// 合圖補算所需的出生資料 payload(與自動補算 useEffect 共用邏輯) +function buildCompositePayload(chart: Chart): Parameters[0] | null { + if (chart.meta?.personA && chart.meta?.personB) { + const pA = chart.meta.personA + const pB = chart.meta.personB + if (pA.birthDate && pA.birthTime && pA.timezone && pB.birthDate && pB.birthTime && pB.timezone) { + return { + personA: { name: pA.name ?? undefined, birthDate: pA.birthDate, birthTime: pA.birthTime, birthCity: pA.birthCity, timezone: pA.timezone }, + personB: { name: pB.name ?? undefined, birthDate: pB.birthDate, birthTime: pB.birthTime, birthCity: pB.birthCity, timezone: pB.timezone }, + } + } + return null + } + if (isLegacyPipeComposite(chart) && chart.timezone) { + const [dateA, dateB] = chart.birthDate.split('|') + const [timeA, timeB] = chart.birthTime.split('|') + const [cityA, cityB] = chart.birthCity.split('|') + const [tzA, tzB] = chart.timezone.split('|') + if (dateA && dateB && timeA && timeB && tzA && tzB) { + return { + personA: { birthDate: dateA, birthTime: timeA, birthCity: cityA ?? '', timezone: tzA }, + personB: { birthDate: dateB, birthTime: timeB, birthCity: cityB ?? '', timezone: tzB }, + } + } + } + return null +} + +// 流日圖本人出生資料解析:mobile 存檔格式頂層欄位即是本人資料, +// web 存檔格式頂層欄位是流日計算時刻的佔位資料,本人資料在 meta.transitMeta。 +// getTransitResult 與自動補算 effect 共用同一份 fallback 邏輯,避免兩處算出不同結果。 +function resolveTransitBirthInfo(chart: Chart) { + const webMeta = chart.meta?.transitMeta + return { + birthDate: webMeta?.personalBirthDate ?? chart.birthDate, + birthTime: webMeta?.personalBirthTime ?? chart.birthTime, + birthCity: webMeta?.personalBirthCity ?? chart.birthCity, + timezone: webMeta?.personalTimezone ?? chart.timezone, + } +} + +/** + * 圖表詳情頁的資料層:載入圖表、自動補算舊格式/缺欄位的合圖與流日資料。 + * 純資料邏輯,不含任何渲染,讓 chart/[id].tsx 專注在畫面呈現。 + */ +export function useChartDetail(id: string) { + const { getToken } = useAuth() + const [chart, setChart] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + const [compositeFetched, setCompositeFetched] = useState(null) + const [compositeFetchLoading, setCompositeFetchLoading] = useState(false) + const [transitFetched, setTransitFetched] = useState(null) + const [transitFetchLoading, setTransitFetchLoading] = useState(false) + const [transitResultFetched, setTransitResultFetched] = useState(null) + + // 目前有效的圖表 id,供非同步流程在 await 之後判斷自己是否已經過期。 + // react-compiler 不允許 render 期間讀寫 ref.current,改在 effect 裡同步; + // 這個 effect 宣告在其他依賴 [id] 的 effect 之前,確保它們執行時 ref 已更新。 + const currentIdRef = useRef(id) + useEffect(() => { currentIdRef.current = id }, [id]) + // unmount 之後任何非同步流程都不可以再 setState + const aliveRef = useRef(true) + useEffect(() => { + aliveRef.current = true + return () => { aliveRef.current = false } + }, []) + + // 切換圖表時同步清除舊的合圖/流日補算結果,避免下一張圖表的第一次渲染 + // 還沿用上一張圖表的結果。用 state(而非 ref)記錄上一個 id 並在 render 期間 + // 比對/setState,是 React 官方建議的「render 期間調整 state」寫法 + // (ref 不能在 render 期間讀寫,state 可以)。 + const [prevId, setPrevId] = useState(id) + if (prevId !== id) { + setPrevId(id) + setCompositeFetched(null) + setTransitFetched(null) + setTransitResultFetched(null) + } + + const loadChart = async () => { + const requestedId = id + const stillCurrent = () => aliveRef.current && currentIdRef.current === requestedId + setLoading(true) + setError(null) + try { + const token = await getToken() + if (!stillCurrent()) return + if (!token) { setError('未登入,請重新登入'); return } + const data = await getChart(token, requestedId) + if (!stillCurrent()) return + const c = data.chart + if (!c.meta?.incarnationCross) console.warn('[ChartDetail] ⚠️ meta.incarnationCross 不存在,輪迴交叉無法顯示') + if (!c.meta?.variables || !c.meta?.arrows) console.warn('[ChartDetail] ⚠️ meta.variables/arrows 不存在,四箭頭無法顯示') + setChart(c) + } catch (err) { + if (!stillCurrent()) return + console.error(err) + const msg = err instanceof Error ? err.message : String(err) + setError(msg.includes('401') || msg.includes('Unauthorized') ? '認證失敗,請重新登入' : `載入失敗:${msg}`) + } finally { + if (stillCurrent()) setLoading(false) + } + } + + // loadChart 也做為 reload 對外曝露(供手動重試/下拉刷新呼叫)。 + // react-compiler 的 set-state-in-effect 檢查只會沿著「effect callback 自己 + // 那層」直接呼叫的具名函式往回追 setState,不會往下鑽進 effect 內部另外定義、 + // 立即呼叫的區域函式;用區域函式包一層呼叫 loadChart,即可避免被判定為 + // 「effect 內同步 setState」,行為跟直接呼叫完全一樣。 + useEffect(() => { + async function run() { await loadChart() } + run() + }, [id]) + + // 自動補算舊格式 / 缺少 meta.compositeResult 的合圖 + useEffect(() => { + if (!chart) return + const needsFetch = isCompositeChart(chart) && !chart.meta?.compositeResult + if (!needsFetch) return + + const payload = buildCompositePayload(chart) + if (!payload) return + + const requestedId = id + const stillCurrent = () => aliveRef.current && currentIdRef.current === requestedId + + async function run() { + setCompositeFetchLoading(true) + try { + const token = await getToken() + if (!token) return + if (!payload) return + const r = await previewCompositeChart(payload) + if (!stillCurrent()) return + setCompositeFetched(r) + } catch (e) { + if (!stillCurrent()) return + console.warn('[CompositeInfo] previewCompositeChart failed:', e) + } finally { + if (stillCurrent()) setCompositeFetchLoading(false) + } + } + run() + }, [chart]) + + // 自動補算缺少 meta.transitSnapshot 的流日圖(舊格式或存檔失敗殘留)。 + // + // 兩種來源存檔格式並不相容,本人真實出生資料的位置不一樣: + // - mobile 存的(meta.transitSnapshot 存在):頂層 birthDate/birthTime/birthCity/timezone + // 本身就是本人出生資料,不需要這個補算。 + // - web 存的(meta.transitMeta 存在):頂層欄位存的是流日計算時刻的佔位資料 + // (birthCity 甚至固定是字串 "流日"),本人出生資料在 meta.transitMeta.personalXxx。 + // 可直接餵給 previewTransitChart 重算,但流日行星會是「現在」而非當初存檔當下,僅為盡量還原。 + useEffect(() => { + if (!chart) return + if (chart.chartKind !== 'transit' || chart.meta?.transitSnapshot) return + + const { birthDate, birthTime, birthCity, timezone } = resolveTransitBirthInfo(chart) + if (!timezone) return + + const requestedId = id + const stillCurrent = () => aliveRef.current && currentIdRef.current === requestedId + + async function run() { + setTransitFetchLoading(true) + try { + if (!timezone) return + const r = await previewTransitChart({ birthDate, birthTime, birthCity, timezone }) + if (!stillCurrent()) return + setTransitFetched(toTransitSnapshot(r)) + setTransitResultFetched(r) + } catch (e) { + if (!stillCurrent()) return + console.warn('[TransitAnalysis] previewTransitChart failed:', e) + } finally { + if (stillCurrent()) setTransitFetchLoading(false) + } + } + run() + }, [chart]) + + async function getCompositeResult(): Promise { + if (compositeFetched) return compositeFetched + if (!chart) return null + const payload = buildCompositePayload(chart) + if (!payload) return null + const result = await previewCompositeChart(payload) + setCompositeFetched(result) + return result + } + + async function getTransitResult(): Promise { + if (transitResultFetched) return transitResultFetched + if (!chart) return null + const requestedId = id + const { birthDate, birthTime, birthCity, timezone } = resolveTransitBirthInfo(chart) + if (!timezone) return null + const result = await previewTransitChart({ birthDate, birthTime, birthCity, timezone }) + if (currentIdRef.current === requestedId) { + setTransitResultFetched(result) + setTransitFetched(toTransitSnapshot(result)) + } + return result + } + + return { + chart, + loading, + error, + reload: loadChart, + compositeFetched, + compositeFetchLoading, + transitFetched, + transitFetchLoading, + getCompositeResult, + getTransitResult, + } +} diff --git a/mobile/shared b/mobile/shared new file mode 120000 index 0000000..8fba6b6 --- /dev/null +++ b/mobile/shared @@ -0,0 +1 @@ +../shared \ No newline at end of file diff --git a/mobile/tsconfig.json b/mobile/tsconfig.json index 909e901..1380057 100644 --- a/mobile/tsconfig.json +++ b/mobile/tsconfig.json @@ -5,6 +5,9 @@ "paths": { "@/*": [ "./*" + ], + "@shared/*": [ + "./shared/*" ] } }, diff --git a/components/humanDesign/hd-chart-data.ts b/shared/humanDesign/hd-chart-data.ts similarity index 98% rename from components/humanDesign/hd-chart-data.ts rename to shared/humanDesign/hd-chart-data.ts index 7e2b5e0..e16ca48 100644 --- a/components/humanDesign/hd-chart-data.ts +++ b/shared/humanDesign/hd-chart-data.ts @@ -380,13 +380,13 @@ export const HD_CENTERS_INFO: Record = { // Legend items for the left column export const LEGEND_ITEMS = [ - { id: 'head', cls: 'tri-up', color: '#d9c25e', cn: '頭腦', en: 'Head', code: 'I' }, - { id: 'ajna', cls: 'tri-down', color: '#a8c065', cn: '邏輯', en: 'Ajna', code: 'II' }, - { id: 'throat', cls: 'square', color: '#b89968', cn: '喉嚨', en: 'Throat', code: 'III' }, - { id: 'g', cls: 'diamond', color: '#d9c25e', cn: 'G 中心', en: 'Identity', code: 'IV' }, - { id: 'heart', cls: 'tri-left', color: '#c8553d', cn: '意志力', en: 'Will', code: 'V' }, - { id: 'spleen', cls: 'tri-right', color: '#b89968', cn: '直覺', en: 'Spleen', code: 'VI' }, - { id: 'sacral', cls: 'square', color: '#c8553d', cn: '薦骨', en: 'Sacral', code: 'VII' }, - { id: 'solar', cls: 'tri-left', color: '#b89968', cn: '情緒', en: 'Solar Plexus', code: 'VIII' }, - { id: 'root', cls: 'square', color: '#b89968', cn: '根部', en: 'Root', code: 'IX' }, + { id: 'head', cls: 'tri-up', color: HD_PALETTE.mustard, cn: '頭腦', en: 'Head', code: 'I' }, + { id: 'ajna', cls: 'tri-down', color: HD_PALETTE.olive, cn: '邏輯', en: 'Ajna', code: 'II' }, + { id: 'throat', cls: 'square', color: HD_PALETTE.tan, cn: '喉嚨', en: 'Throat', code: 'III' }, + { id: 'g', cls: 'diamond', color: HD_PALETTE.mustard, cn: 'G 中心', en: 'Identity', code: 'IV' }, + { id: 'heart', cls: 'tri-left', color: HD_PALETTE.crimson, cn: '意志力', en: 'Will', code: 'V' }, + { id: 'spleen', cls: 'tri-right', color: HD_PALETTE.tan, cn: '直覺', en: 'Spleen', code: 'VI' }, + { id: 'sacral', cls: 'square', color: HD_PALETTE.crimson, cn: '薦骨', en: 'Sacral', code: 'VII' }, + { id: 'solar', cls: 'tri-left', color: HD_PALETTE.tan, cn: '情緒', en: 'Solar Plexus', code: 'VIII' }, + { id: 'root', cls: 'square', color: HD_PALETTE.tan, cn: '根部', en: 'Root', code: 'IX' }, ] diff --git a/mobile/lib/hd-cross-data.ts b/shared/humanDesign/hd-cross-data.ts similarity index 99% rename from mobile/lib/hd-cross-data.ts rename to shared/humanDesign/hd-cross-data.ts index cdd2ba3..7014e42 100644 --- a/mobile/lib/hd-cross-data.ts +++ b/shared/humanDesign/hd-cross-data.ts @@ -44,7 +44,7 @@ export const HD_CROSS_CONTENT: Record = { 不是那種勉強自己「好吧,算了」的接納,而是真正從內心相信:生命知道它在幹嘛。你天生帶著一種接受的能力——接受人、接受事、接受那些你控制不了的發展。 但這不代表你是個沒主見的人。你只是很清楚,有些事情硬推是沒用的,等它自然來比較有效率。 問題在於,當你被身邊那些積極衝刺的人帶著跑,可能會覺得自己是不是太被動了、太消極了。其實不是。你的設計本來就不是靠主動出擊來贏得人生,而是靠讓正確的事情找到你。信任這個過程,是你這輩子最重要的事。` }, - LAC: { title: `無知(天真爛漫)`, body: `「無知」聽起來好像不是什麼好事,但在這裡,它的意思其實比較接近**「純真」**。 + LAC: { title: `無知(天真爛漫)`, body: `「無知」聽起來好像不是什麼好事,但在這裡,它的意思其實比較接近「純真」。 你天生不帶太多成見,對生命有一種孩子般的開放態度。你不太會用舊的框架去套新的狀況,這讓你在面對變化的時候反而比很多人更靈活。 不過,你也可能因為這種純真,有時候會被環境帶著走,不確定自己真正想要什麼。你的課題是:在保持開放的同時,也要知道自己的底線在哪裡。因為你帶來的那份清新和無預設立場,是這個世界真的需要的——只是你自己也得先站穩腳步。` }, }, diff --git a/mobile/lib/hd-summary-data.ts b/shared/humanDesign/hd-summary-data.ts similarity index 99% rename from mobile/lib/hd-summary-data.ts rename to shared/humanDesign/hd-summary-data.ts index fc3f973..273bba7 100644 --- a/mobile/lib/hd-summary-data.ts +++ b/shared/humanDesign/hd-summary-data.ts @@ -297,7 +297,7 @@ export const HD_DEFINITION_CONTENT: Record = { 'None': { title: '無定義', subtitle: '反映者', - intro: '九個中心全白,沒有任何一個是有顏色的。佔全人口約 2%。', + intro: '九個中心全白,沒有任何一個是有顏色的。佔全人口約 1%。', paragraphs: [ '反映者是人類圖五種類型中唯一沒有任何「固定」能量的人,所有中心都是開放的,就像一面超靈敏的鏡子,隨時在反映、感受周遭環境的能量狀態。你可以把反映者想成是某種「空氣品質偵測器」,他們能感知一個環境、一個群體裡的整體狀態,而且往往比其他人更早發現哪裡不對勁。', '不過正因為沒有固定的能量錨點,反映者特別需要給自己充裕的時間做決定——至少要等一個月亮循環(約二十八天),才能知道什麼對自己是真正正確的。不是拖延,是本來就需要這個時間來沉澱。',