this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

detailed values

alice 183533d2 bee72e53

+540 -98
+2
index.html
··· 14 14 <button id="undoBtn" disabled>Undo</button> 15 15 <button id="redoBtn" disabled>Redo</button> 16 16 <button id="clearStorageBtn">Clear Storage</button> 17 + <button id="useLimitedValuesBtn">Use 8 Values (Default)</button> 18 + <button id="useAllValuesBtn">Use All Values</button> 17 19 </div> 18 20 </header> 19 21
+89
index.test.ts
··· 2 2 import { UndoManager } from "./undoManager"; 3 3 import type { AppState, ValueCard } from "./index"; 4 4 import { describe, test, expect, beforeEach } from "bun:test"; 5 + import { ALL_VALUE_DEFINITIONS, LIMITED_VALUE_DEFINITIONS, VALUES } from "./values"; // Import value counts for tests 6 + const ALL_VALUES_COUNT = VALUES.length; 7 + const LIMITED_VALUES_COUNT = 8; 5 8 6 9 // Mock necessary DOM elements and event listeners 7 10 beforeEach(() => { 8 11 // Mock window.alert to prevent blocking tests 9 12 window.alert = () => {}; // Replace alert with a non-blocking empty function 13 + // Mock window.confirm to default to true (yes) for tests, unless overridden 14 + window.confirm = () => true; 10 15 11 16 // The happy-dom environment should provide localStorage automatically. 12 17 // We still need to clear it before each test if the environment doesn't do it automatically. ··· 218 223 expect(part4State.cards.filter(c => c.column === 'additional').length).toBe(1); 219 224 }); 220 225 226 + // --- Tests for Value Set Toggling --- 227 + test('Initial state uses limited value set', () => { 228 + const state = app.undoManager.getState(); 229 + expect(state.valueSet).toBe('limited'); 230 + expect(state.cards.length).toBe(LIMITED_VALUES_COUNT); 231 + }); 232 + 233 + test('Clicking "Use All Values" switches set and resets state', () => { 234 + // Arrange: Start in default limited state 235 + let initialState = app.undoManager.getState(); 236 + expect(initialState.valueSet).toBe('limited'); 237 + // Optional: Advance state to ensure reset happens 238 + initialState.currentPart = 'part2'; 239 + initialState.finalStatements = { 1: 'test' }; 240 + app.updateState(initialState); 241 + 242 + // Act: Call the method directly instead of simulating click 243 + app.toggleValueSet(); 244 + 245 + // Assert 246 + const newState = app.undoManager.getState(); 247 + expect(newState.valueSet).toBe('all'); 248 + expect(newState.cards.length).toBe(ALL_VALUES_COUNT); 249 + expect(newState.currentPart).toBe('part1'); // Should reset to part1 250 + expect(Object.keys(newState.finalStatements).length).toBe(0); // Statements cleared 251 + }); 252 + 253 + test('Clicking "Use 8 Values" switches set back and resets state', () => { 254 + // Arrange: Start, switch to All using direct call 255 + // const buttonAll = document.getElementById('useAllValuesBtn'); 256 + // buttonAll?.click(); // Replace click simulation 257 + app.toggleValueSet(); // Call directly to set state to 'all' for setup 258 + 259 + let allState = app.undoManager.getState(); 260 + expect(allState.valueSet).toBe('all'); // Verify setup worked 261 + // Optional: Advance state to ensure reset happens 262 + allState.currentPart = 'part3'; 263 + app.updateState(allState); 264 + 265 + // Act: Call the method directly instead of simulating click 266 + app.toggleValueSet(); 267 + 268 + // Assert 269 + const newState = app.undoManager.getState(); 270 + expect(newState.valueSet).toBe('limited'); 271 + expect(newState.cards.length).toBe(LIMITED_VALUES_COUNT); 272 + expect(newState.currentPart).toBe('part1'); 273 + expect(Object.keys(newState.finalStatements).length).toBe(0); 274 + }); 275 + 276 + test('Clicking the active value set button does nothing', () => { 277 + const initialState = app.undoManager.getState(); 278 + expect(initialState.valueSet).toBe('limited'); 279 + 280 + // Act: Click the already active limited button 281 + const buttonLimited = document.getElementById('useLimitedValuesBtn'); 282 + buttonLimited?.click(); 283 + 284 + // Assert: State should not have changed 285 + const stateAfterClick = app.undoManager.getState(); 286 + expect(stateAfterClick).toEqual(initialState); 287 + }); 288 + 289 + test('Switching value set does NOT happen if confirm returns false', () => { 290 + const initialState = app.undoManager.getState(); 291 + expect(initialState.valueSet).toBe('limited'); 292 + 293 + // Arrange: Mock confirm to return false for this test 294 + const originalConfirm = window.confirm; 295 + window.confirm = () => false; 296 + 297 + // Act: Click the button to switch to all values 298 + const buttonAll = document.getElementById('useAllValuesBtn'); 299 + buttonAll?.click(); 300 + 301 + // Assert: State should not have changed 302 + const stateAfterClick = app.undoManager.getState(); 303 + expect(stateAfterClick).toEqual(initialState); 304 + 305 + // Cleanup: Restore original confirm 306 + window.confirm = originalConfirm; 307 + }); 308 + 221 309 // Add more tests for other transitions (Part 2 -> 3, 3 -> 4, etc.) 222 310 // Add tests for card movement logic (moveCard) 223 311 // Add tests for final statement input ··· 237 325 { id: 2, name: 'TEST2', column: 'unassigned', order: 1 }, 238 326 ], 239 327 finalStatements: {}, 328 + valueSet: 'limited' 240 329 }; 241 330 um = new UndoManager(initialState); 242 331 });
+92 -11
index.ts
··· 13 13 cards: ValueCard[]; 14 14 // In part 4, user can add final statements for each core value (by card id) 15 15 finalStatements: { [cardId: number]: string }; 16 + valueSet: 'limited' | 'all'; // Add state for current value set 16 17 } 17 18 18 19 // Import the UndoManager from its own file 19 20 import { UndoManager } from './undoManager'; 20 - // Import the default values from its own file 21 - import { DEFAULT_VALUES } from './values'; 21 + // Import the original VALUES array 22 + import { VALUES } from './values'; 22 23 import { debounce } from 'lodash'; // Import debounce from lodash 23 24 25 + // Define the structure based on the imported VALUES 26 + interface ValueDefinition { 27 + name: string; 28 + description: string; 29 + } 30 + 31 + // Recreate ALL_VALUES and LIMITED_VALUES based on the import 32 + const ALL_VALUE_DEFINITIONS: ValueDefinition[] = VALUES; 33 + const LIMITED_VALUE_DEFINITIONS = ALL_VALUE_DEFINITIONS.slice(0, 8); 34 + 35 + // Create a global map for easy description lookup 36 + const valueDefinitionsMap = new Map<string, string>( 37 + ALL_VALUE_DEFINITIONS.map((def: ValueDefinition) => [def.name, def.description]) 38 + ); 39 + 24 40 // Main application class 25 41 export class App { 26 42 private state: AppState; ··· 32 48 constructor() { 33 49 // Load state from localStorage or initialize default state. 34 50 const saved = localStorage.getItem(this.storageKey); 51 + let initialState: AppState; 35 52 if (saved) { 36 53 try { 37 - this.state = JSON.parse(saved) as AppState; 54 + initialState = JSON.parse(saved) as AppState; 55 + // Ensure valueSet exists in saved state, default if not 56 + if (!initialState.valueSet) { 57 + initialState.valueSet = 'limited'; 58 + } 38 59 } catch { 39 - this.state = this.defaultState(); 60 + initialState = this.defaultState('limited'); // Default to limited on error 40 61 } 41 62 } else { 42 - this.state = this.defaultState(); 63 + initialState = this.defaultState('limited'); // Default to limited initially 43 64 } 65 + this.state = initialState; // Set initial state before UndoManager 44 66 this.undoManager = new UndoManager<AppState>(this.state); 45 67 46 68 // Re-add initialization using lodash debounce ··· 55 77 this.updateUndoRedoButtons(); 56 78 } 57 79 58 - // Default state with some sample value cards. 59 - public defaultState(): AppState { 60 - const sampleCards: ValueCard[] = DEFAULT_VALUES.map((name, index) => ({ 80 + // Default state with sample value cards based on the selected set 81 + public defaultState(valueSet: 'limited' | 'all' = 'limited'): AppState { 82 + const definitionsToUse = valueSet === 'all' ? ALL_VALUE_DEFINITIONS : LIMITED_VALUE_DEFINITIONS; 83 + const sampleCards: ValueCard[] = definitionsToUse.map((definition: ValueDefinition, index: number) => ({ 61 84 id: index + 1, 62 - name, 85 + name: definition.name, // Use name from definition 63 86 column: "unassigned", 64 87 order: index, 65 88 })); ··· 67 90 currentPart: "part1", 68 91 cards: sampleCards, 69 92 finalStatements: {}, 93 + valueSet: valueSet, // Store the set used 70 94 }; 71 95 } 72 96 ··· 82 106 this.saveState(); 83 107 this.render(); 84 108 this.updateUndoRedoButtons(); 109 + } 110 + 111 + // Method to toggle between limited and all values 112 + public toggleValueSet() { 113 + const currentState = this.undoManager.getState(); 114 + const nextSet = currentState.valueSet === 'limited' ? 'all' : 'limited'; 115 + // Generate a fresh default state for the *new* set, resetting progress 116 + const newState = this.defaultState(nextSet); 117 + // Execute this change through the undo manager 118 + this.updateState(newState); 85 119 } 86 120 87 121 // Bind event listeners for UI interactions. 88 122 private bindEventListeners() { 123 + const appInstance = this; // Capture the App instance 124 + 89 125 // Navigation buttons 90 126 document.getElementById("toPart2")?.addEventListener("click", () => { 91 127 const newState = this.undoManager.getState(); ··· 173 209 this.updateState(newState); // Call updateState directly 174 210 }); 175 211 212 + // --- Add listeners for the toggle buttons --- 213 + document.getElementById("useLimitedValuesBtn")?.addEventListener("click", () => { 214 + // Use captured instance 215 + const currentSet = appInstance.undoManager.getState().valueSet; 216 + if (currentSet !== 'limited') { 217 + if (confirm("Switching value sets will reset your current progress. Are you sure?")) { 218 + appInstance.toggleValueSet(); // Use captured instance 219 + } 220 + } 221 + }); 222 + document.getElementById("useAllValuesBtn")?.addEventListener("click", () => { 223 + // Use captured instance 224 + const currentSet = appInstance.undoManager.getState().valueSet; 225 + if (currentSet !== 'all') { 226 + if (confirm("Switching value sets will reset your current progress. Are you sure?")) { 227 + appInstance.toggleValueSet(); // Use captured instance 228 + } 229 + } 230 + }); 231 + 176 232 // Undo/Redo buttons 177 233 document.getElementById("undoBtn")?.addEventListener("click", () => { 178 234 const prev = this.undoManager.undo(); ··· 244 300 } 245 301 } 246 302 247 - // Creates a draggable card element. 303 + // Creates a draggable card element, now including the description. 248 304 private createCardElement(card: ValueCard): HTMLElement { 249 305 const cardElem = document.createElement("div"); 250 306 cardElem.className = "card"; 251 307 cardElem.draggable = true; 252 - cardElem.textContent = card.name; 253 308 cardElem.dataset.cardId = card.id.toString(); 309 + 310 + // Create elements for name and description 311 + const nameElem = document.createElement("span"); 312 + nameElem.className = "card-name"; 313 + nameElem.textContent = card.name; 314 + 315 + const descriptionElem = document.createElement("span"); 316 + descriptionElem.className = "card-description"; 317 + // Look up description from the map 318 + descriptionElem.textContent = valueDefinitionsMap.get(card.name) || ""; 319 + 320 + cardElem.appendChild(nameElem); 321 + cardElem.appendChild(descriptionElem); 322 + 254 323 cardElem.addEventListener("dragstart", (e) => { 255 324 e.dataTransfer?.setData("text/plain", card.id.toString()); 256 325 }); ··· 454 523 }); 455 524 reviewContent.appendChild(list); 456 525 } 526 + } 527 + 528 + // -- Update toggle button appearance based on current state -- 529 + const limitedBtn = document.getElementById("useLimitedValuesBtn") as HTMLButtonElement | null; 530 + const allBtn = document.getElementById("useAllValuesBtn") as HTMLButtonElement | null; 531 + if (limitedBtn) { 532 + limitedBtn.classList.toggle('active', this.state.valueSet === 'limited'); 533 + limitedBtn.disabled = this.state.valueSet === 'limited'; // Disable active button 534 + } 535 + if (allBtn) { 536 + allBtn.classList.toggle('active', this.state.valueSet === 'all'); 537 + allBtn.disabled = this.state.valueSet === 'all'; // Disable active button 457 538 } 458 539 } 459 540
+2 -1
package.json
··· 18 18 "scripts": { 19 19 "dev": "parcel ./index.html", 20 20 "build": "parcel build ./index.html", 21 - "test": "bun test" 21 + "test": "bun test", 22 + "deploy": "bun run build && bunx wrangler pages deploy dist" 22 23 } 23 24 }
+20
styles.css
··· 55 55 margin: 0.5em 0; 56 56 border-radius: 4px; 57 57 cursor: grab; 58 + display: flex; 59 + flex-direction: column; 60 + align-items: center; 61 + text-align: center; 62 + padding-top: 8px; 63 + padding-bottom: 8px; 64 + } 65 + 66 + .card-name { 67 + font-weight: bold; 68 + margin-bottom: 4px; 69 + display: block; 70 + } 71 + 72 + .card-description { 73 + font-size: 0.85em; 74 + color: #555; 75 + display: block; 76 + padding-left: 4px; 77 + padding-right: 4px; 58 78 } 59 79 60 80 .values-grid {
+335 -86
values.ts
··· 1 - // Top-level constant for default values 2 - export const DEFAULT_VALUES = [ 3 - "ACCEPTANCE", 4 - "ACCURACY", 5 - "ACHIEVEMENT", 6 - "ADVENTURE", 7 - "ATTRACTIVENESS", 8 - "AUTHORITY", 9 - "AUTONOMY", 10 - "BEAUTY", 11 - "CARING", 12 - "CHALLENGE", 13 - "CHANGE", 14 - // "COMFORT", 15 - // "COMMITMENT", 16 - // "COMPASSION", 17 - // "CONTRIBUTION", 18 - // "COOPERATION", 19 - // "COURTESY", 20 - // "CREATIVITY", 21 - // "DEPENDABILITY", 22 - // "DUTY", 23 - // "ECOLOGY", 24 - // "EXCITEMENT", 25 - // "FAITHFULNESS", 26 - // "FAME", 27 - // "FAMILY", 28 - // "FITNESS", 29 - // "FLEXIBILITY", 30 - // "FORGIVENESS", 31 - // "FRIENDSHIP", 32 - // "FUN", 33 - // "GENEROSITY", 34 - // "GENUINENESS", 35 - // "GOD'S WILL", 36 - // "GROWTH", 37 - // "HEALTH", 38 - // "HELPFULNESS", 39 - // "HONESTY", 40 - // "HOPE", 41 - // "HUMILITY", 42 - // "HUMOR", 43 - // "INDEPENDENCE", 44 - // "INDUSTRY", 45 - // "INNER PEACE", 46 - // "INTIMACY", 47 - // "JUSTICE", 48 - // "KNOWLEDGE", 49 - // "LEISURE", 50 - // "LOVED", 51 - // "LOVING", 52 - // "MASTERY", 53 - // "MINDFULNESS", 54 - // "MODERATION", 55 - // "MONOGAMY", 56 - // "NONCONFORMITY", 57 - // "NURTURANCE", 58 - // "OPENNESS", 59 - // "ORDER", 60 - // "PASSION", 61 - // "PLEASURE", 62 - // "POPULARITY", 63 - // "POWER", 64 - // "PURPOSE", 65 - // "RATIONALITY", 66 - // "REALISM", 67 - // "RESPONSIBILITY", 68 - // "RISK", 69 - // "ROMANCE", 70 - // "SAFETY", 71 - // "SELF-ACCEPTANCE", 72 - // "SELF-CONTROL", 73 - // "SELF-ESTEEM", 74 - // "SELF-KNOWLEDGE", 75 - // "SERVICE", 76 - // "SEXUALITY", 77 - // "SIMPLICITY", 78 - // "SOLITUDE", 79 - // "SPIRITUALITY", 80 - // "STABILITY", 81 - // "TOLERANCE", 82 - // "TRADITION", 83 - // "VIRTUE", 84 - // "WEALTH", 85 - // "WORLD PEACE", 86 - ]; 1 + export const VALUES = [ 2 + { 3 + "name": "ACCEPTANCE", 4 + "description": "to be accepted as I am" 5 + }, 6 + { 7 + "name": "ACCURACY", 8 + "description": "to be accurate in my opinions and beliefs" 9 + }, 10 + { 11 + "name": "ACHIEVEMENT", 12 + "description": "to have important accomplishments" 13 + }, 14 + { 15 + "name": "ADVENTURE", 16 + "description": "to have new and exciting experiences" 17 + }, 18 + { 19 + "name": "ATTRACTIVENESS", 20 + "description": "to be physically attractive" 21 + }, 22 + { 23 + "name": "AUTHORITY", 24 + "description": "to be in charge of and responsible for others" 25 + }, 26 + { 27 + "name": "AUTONOMY", 28 + "description": "to be self-determined and independent" 29 + }, 30 + { 31 + "name": "BEAUTY", 32 + "description": "to appreciate beauty around me" 33 + }, 34 + { 35 + "name": "CARING", 36 + "description": "to take care of others" 37 + }, 38 + { 39 + "name": "CHALLENGE", 40 + "description": "to take on difficult tasks and problems" 41 + }, 42 + { 43 + "name": "CHANGE", 44 + "description": "to have a life full of change and variety" 45 + }, 46 + { 47 + "name": "COMFORT", 48 + "description": "to have a pleasant and comfortable life" 49 + }, 50 + { 51 + "name": "COMMITMENT", 52 + "description": "to make enduring, meaningful commitments" 53 + }, 54 + { 55 + "name": "COMPASSION", 56 + "description": "to feel and act on concern for others" 57 + }, 58 + { 59 + "name": "CONTRIBUTION", 60 + "description": "to make a lasting contribution in the world" 61 + }, 62 + { 63 + "name": "COOPERATION", 64 + "description": "to work collaboratively with others" 65 + }, 66 + { 67 + "name": "COURTESY", 68 + "description": "to be considerate and polite toward others" 69 + }, 70 + { 71 + "name": "CREATIVITY", 72 + "description": "to have new and original ideas" 73 + }, 74 + { 75 + "name": "DEPENDABILITY", 76 + "description": "to be reliable and trustworthy" 77 + }, 78 + { 79 + "name": "DUTY", 80 + "description": "to carry out my duties and obligations" 81 + }, 82 + { 83 + "name": "ECOLOGY", 84 + "description": "to live in harmony with the environment" 85 + }, 86 + { 87 + "name": "EXCITEMENT", 88 + "description": "to have a life full of thrills and stimulation" 89 + }, 90 + { 91 + "name": "FAITHFULNESS", 92 + "description": "to be loyal and true in relationships" 93 + }, 94 + { 95 + "name": "FAME", 96 + "description": "to be known and recognized" 97 + }, 98 + { 99 + "name": "FAMILY", 100 + "description": "to have a happy, loving family" 101 + }, 102 + { 103 + "name": "FITNESS", 104 + "description": "to be physically fit and strong" 105 + }, 106 + { 107 + "name": "FLEXIBILITY", 108 + "description": "to adjust to new circumstances easily" 109 + }, 110 + { 111 + "name": "FORGIVENESS", 112 + "description": "to be forgiving of others" 113 + }, 114 + { 115 + "name": "FRIENDSHIP", 116 + "description": "to have close, supportive friends" 117 + }, 118 + { 119 + "name": "FUN", 120 + "description": "to play and have fun" 121 + }, 122 + { 123 + "name": "GENEROSITY", 124 + "description": "to give what I have to others" 125 + }, 126 + { 127 + "name": "GENUINENESS", 128 + "description": "to act in a manner that is true to who I am" 129 + }, 130 + { 131 + "name": "GOD'S WILL", 132 + "description": "to seek and obey the will of God" 133 + }, 134 + { 135 + "name": "GROWTH", 136 + "description": "to keep changing and growing" 137 + }, 138 + { 139 + "name": "HEALTH", 140 + "description": "to be physically well and healthy" 141 + }, 142 + { 143 + "name": "HELPFULNESS", 144 + "description": "to be helpful to others" 145 + }, 146 + { 147 + "name": "HONESTY", 148 + "description": "to be honest and truthful" 149 + }, 150 + { 151 + "name": "HOPE", 152 + "description": "to maintain a positive and optimistic outlook" 153 + }, 154 + { 155 + "name": "HUMILITY", 156 + "description": "to be modest and unassuming" 157 + }, 158 + { 159 + "name": "HUMOR", 160 + "description": "to see the humorous side of myself and the world" 161 + }, 162 + { 163 + "name": "INDEPENDENCE", 164 + "description": "to be free from dependence on others" 165 + }, 166 + { 167 + "name": "INDUSTRY", 168 + "description": "to work hard and well at my life tasks" 169 + }, 170 + { 171 + "name": "INNER PEACE", 172 + "description": "to experience personal peace" 173 + }, 174 + { 175 + "name": "INTIMACY", 176 + "description": "to share my innermost experiences with others" 177 + }, 178 + { 179 + "name": "JUSTICE", 180 + "description": "to promote fair and equal treatment for all" 181 + }, 182 + { 183 + "name": "KNOWLEDGE", 184 + "description": "to learn and contribute valuable knowledge" 185 + }, 186 + { 187 + "name": "LEISURE", 188 + "description": "to take time to relax and enjoy" 189 + }, 190 + { 191 + "name": "LOVED", 192 + "description": "to be loved by those close to me" 193 + }, 194 + { 195 + "name": "LOVING", 196 + "description": "to give love to others" 197 + }, 198 + { 199 + "name": "MASTERY", 200 + "description": "to be competent in my everyday activities" 201 + }, 202 + { 203 + "name": "MINDFULNESS", 204 + "description": "to live consciously and mindfully of the present moment" 205 + }, 206 + { 207 + "name": "MODERATION", 208 + "description": "to avoid excesses and find a middle ground" 209 + }, 210 + { 211 + "name": "MONOGAMY", 212 + "description": "to have one close, loving relationship" 213 + }, 214 + { 215 + "name": "NONCONFORMITY", 216 + "description": "to question and challenge authority and norms" 217 + }, 218 + { 219 + "name": "NURTURANCE", 220 + "description": "to take care of and nurture others" 221 + }, 222 + { 223 + "name": "OPENNESS", 224 + "description": "to be open to new experiences, ideas, and options" 225 + }, 226 + { 227 + "name": "ORDER", 228 + "description": "to have a life that is well-ordered and organized" 229 + }, 230 + { 231 + "name": "PASSION", 232 + "description": "to have deep feelings about ideas, activities, or people" 233 + }, 234 + { 235 + "name": "PLEASURE", 236 + "description": "to feel good" 237 + }, 238 + { 239 + "name": "POPULARITY", 240 + "description": "to be well-liked by many people" 241 + }, 242 + { 243 + "name": "POWER", 244 + "description": "to have control over others" 245 + }, 246 + { 247 + "name": "PURPOSE", 248 + "description": "to have meaning and direction in my life" 249 + }, 250 + { 251 + "name": "RATIONALITY", 252 + "description": "to be guided by reason and logic" 253 + }, 254 + { 255 + "name": "REALISM", 256 + "description": "to see and act realistically and practically" 257 + }, 258 + { 259 + "name": "RESPONSIBILITY", 260 + "description": "to make and carry out responsible decisions" 261 + }, 262 + { 263 + "name": "RISK", 264 + "description": "to take risks and chances" 265 + }, 266 + { 267 + "name": "ROMANCE", 268 + "description": "to have intense, exciting love in my life" 269 + }, 270 + { 271 + "name": "SAFETY", 272 + "description": "to be safe and secure" 273 + }, 274 + { 275 + "name": "SELF-ACCEPTANCE", 276 + "description": "to accept myself as I am" 277 + }, 278 + { 279 + "name": "SELF-CONTROL", 280 + "description": "to be disciplined in my own actions" 281 + }, 282 + { 283 + "name": "SELF-ESTEEM", 284 + "description": "to feel good about myself" 285 + }, 286 + { 287 + "name": "SELF-KNOWLEDGE", 288 + "description": "to have a deep and honest understanding of myself" 289 + }, 290 + { 291 + "name": "SERVICE", 292 + "description": "to be of service to others" 293 + }, 294 + { 295 + "name": "SEXUALITY", 296 + "description": "to have an active and satisfying sex life" 297 + }, 298 + { 299 + "name": "SIMPLICITY", 300 + "description": "to live life simply, with minimal needs" 301 + }, 302 + { 303 + "name": "SOLITUDE", 304 + "description": "to have time and space where I can be apart from others" 305 + }, 306 + { 307 + "name": "SPIRITUALITY", 308 + "description": "to grow and mature spiritually" 309 + }, 310 + { 311 + "name": "STABILITY", 312 + "description": "to have a life that stays fairly consistent" 313 + }, 314 + { 315 + "name": "TOLERANCE", 316 + "description": "to accept and respect those who differ from me" 317 + }, 318 + { 319 + "name": "TRADITION", 320 + "description": "to follow respected patterns of the past" 321 + }, 322 + { 323 + "name": "VIRTUE", 324 + "description": "to live a morally pure and excellent life" 325 + }, 326 + { 327 + "name": "WEALTH", 328 + "description": "to have plenty of money" 329 + }, 330 + { 331 + "name": "WORLD PEACE", 332 + "description": "to work to promote peace in the world" 333 + } 334 + ] 335 +